RepeaterSource.h revision d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480c
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
25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprotected:
26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    virtual ~RepeaterSource();
27d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberprivate:
29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    enum {
30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        kWhatRead,
31d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    };
32d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    Mutex mLock;
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    Condition mCondition;
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<MediaSource> mSource;
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    double mRateHz;
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<ALooper> mLooper;
40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    sp<AHandlerReflector<RepeaterSource> > mReflector;
41d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
42d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    MediaBuffer *mBuffer;
43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t mResult;
44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
45d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t mStartTimeUs;
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int32_t mFrameCount;
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    void postRead();
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(RepeaterSource);
51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber};
52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif // REPEATER_SOURCE_H_
56