1343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih/*
2343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Copyright (C) 2014 The Android Open Source Project
3343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih *
4343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Licensed under the Apache License, Version 2.0 (the "License");
5343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * you may not use this file except in compliance with the License.
6343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * You may obtain a copy of the License at
7343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih *
8343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih *      http://www.apache.org/licenses/LICENSE-2.0
9343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih *
10343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Unless required by applicable law or agreed to in writing, software
11343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * distributed under the License is distributed on an "AS IS" BASIS,
12343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * See the License for the specific language governing permissions and
14343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * limitations under the License.
15343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih */
16343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
17343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#ifndef WEBMFRAMETHREAD_H_
18343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#define WEBMFRAMETHREAD_H_
19343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
20343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include "WebmFrame.h"
21343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include "LinkedBlockingQueue.h"
22343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
23343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <media/stagefright/FileSource.h>
24343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <media/stagefright/MediaSource.h>
25343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
26343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <utils/List.h>
27343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <utils/Errors.h>
28343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
29343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <pthread.h>
30343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
31343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihnamespace android {
32343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
33343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameThread : public LightRefBase<WebmFrameThread> {
34343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihpublic:
35343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual void run() = 0;
36343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual bool running() { return false; }
37343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual status_t start();
38343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual status_t pause() { return OK; }
39343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual status_t resume() { return OK; }
40343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual status_t stop();
41343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual ~WebmFrameThread() { stop(); }
42343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    static void *wrap(void *arg);
43343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
44343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihprotected:
45343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameThread()
46343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih        : mThread(0) {
47343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    }
48343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
49343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihprivate:
50343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    pthread_t mThread;
51343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    DISALLOW_EVIL_CONSTRUCTORS(WebmFrameThread);
52343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih};
53343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
54343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih//=================================================================================================
55343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
56343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameSourceThread;
57343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameSinkThread : public WebmFrameThread {
58343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihpublic:
59343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameSinkThread(
60343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            const int& fd,
61343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            const uint64_t& off,
62343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            sp<WebmFrameSourceThread> videoThread,
63343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            sp<WebmFrameSourceThread> audioThread,
64343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            List<sp<WebmElement> >& cues);
65343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
66343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameSinkThread(
67343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            const int& fd,
68343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            const uint64_t& off,
69343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            LinkedBlockingQueue<const sp<WebmFrame> >& videoSource,
70343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            LinkedBlockingQueue<const sp<WebmFrame> >& audioSource,
71343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            List<sp<WebmElement> >& cues);
72343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
73343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void run();
74343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    bool running() {
75343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih        return !mDone;
76343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    }
77343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t start();
78343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t stop();
79343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
80343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihprivate:
81343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    const int& mFd;
82343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    const uint64_t& mSegmentDataStart;
83343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    LinkedBlockingQueue<const sp<WebmFrame> >& mVideoFrames;
84343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    LinkedBlockingQueue<const sp<WebmFrame> >& mAudioFrames;
85343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    List<sp<WebmElement> >& mCues;
86343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
87343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mDone;
88343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
89343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    static void initCluster(
90343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            List<const sp<WebmFrame> >& frames,
91343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            uint64_t& clusterTimecodeL,
92343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            List<sp<WebmElement> >& children);
93343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void writeCluster(List<sp<WebmElement> >& children);
94343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void flushFrames(List<const sp<WebmFrame> >& frames, bool last);
95343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih};
96343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
97343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih//=================================================================================================
98343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
99343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameSourceThread : public WebmFrameThread {
100343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihpublic:
101343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameSourceThread(int type, LinkedBlockingQueue<const sp<WebmFrame> >& sink);
102343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    virtual int64_t getDurationUs() = 0;
103343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihprotected:
104343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    const int mType;
105343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    LinkedBlockingQueue<const sp<WebmFrame> >& mSink;
106343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
107343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    friend class WebmFrameSinkThread;
108343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih};
109343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
110343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih//=================================================================================================
111343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
112343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameEmptySourceThread : public WebmFrameSourceThread {
113343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihpublic:
114343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameEmptySourceThread(int type, LinkedBlockingQueue<const sp<WebmFrame> >& sink)
115343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih        : WebmFrameSourceThread(type, sink) {
116343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    }
117343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void run() { mSink.push(WebmFrame::EOS); }
118343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    int64_t getDurationUs() { return 0; }
119343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih};
120343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
121343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih//=================================================================================================
122343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
123343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihclass WebmFrameMediaSourceThread: public WebmFrameSourceThread {
124343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihpublic:
125343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    WebmFrameMediaSourceThread(
126b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen            const sp<IMediaSource>& source,
127343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            int type,
128343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            LinkedBlockingQueue<const sp<WebmFrame> >& sink,
129343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            uint64_t timeCodeScale,
130343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            int64_t startTimeRealUs,
131343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            int32_t startTimeOffsetMs,
132343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            int numPeers,
133343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih            bool realTimeRecording);
134343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
135343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void run();
136343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t start();
137343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t resume();
138343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t pause();
139343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    status_t stop();
140343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    int64_t getDurationUs() {
141343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih        return mTrackDurationUs;
142343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    }
143343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
144343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihprivate:
145b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    const sp<IMediaSource> mSource;
146343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    const uint64_t mTimeCodeScale;
147343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    uint64_t mStartTimeUs;
148343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
149343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mDone;
150343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mPaused;
151343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mResumed;
152343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mStarted;
153343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    volatile bool mReachedEOS;
154343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    int64_t mTrackDurationUs;
155343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
156343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih    void clearFlags();
157343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih};
158343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih} /* namespace android */
159343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih
160343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#endif /* WEBMFRAMETHREAD_H_ */
161