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( 126343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const sp<MediaSource>& 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: 145343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const sp<MediaSource> 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