RepeaterSource.h revision a556c4822fc205db0d27834ba5b637c351d73ffa
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
31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~RepeaterSource();
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatRead,
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    Mutex mLock;
40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    Condition mCondition;
41d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
4277245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    bool mStarted;
4377245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<MediaSource> mSource;
45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    double mRateHz;
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<ALooper> mLooper;
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<AHandlerReflector<RepeaterSource> > mReflector;
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    MediaBuffer *mBuffer;
51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t mResult;
524a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    int64_t mLastBufferUpdateUs;
53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t mStartTimeUs;
55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mFrameCount;
56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void postRead();
58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(RepeaterSource);
60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif // REPEATER_SOURCE_H_
65