1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef WEBMWRITER_H_
18#define WEBMWRITER_H_
19
20#include "WebmConstants.h"
21#include "WebmFrameThread.h"
22#include "LinkedBlockingQueue.h"
23
24#include <media/stagefright/MediaSource.h>
25#include <media/stagefright/MediaWriter.h>
26
27#include <utils/Errors.h>
28#include <utils/Mutex.h>
29#include <utils/StrongPointer.h>
30
31#include <stdint.h>
32
33using namespace webm;
34
35namespace android {
36
37class WebmWriter : public MediaWriter {
38public:
39    WebmWriter(int fd);
40    ~WebmWriter() { reset(); }
41
42
43    virtual status_t addSource(const sp<IMediaSource> &source);
44    virtual status_t start(MetaData *param = NULL);
45    virtual status_t stop();
46    virtual status_t pause();
47    virtual bool reachedEOS();
48
49    virtual void setStartTimeOffsetMs(int ms) { mStartTimeOffsetMs = ms; }
50    virtual int32_t getStartTimeOffsetMs() const { return mStartTimeOffsetMs; }
51
52private:
53    int mFd;
54    status_t mInitCheck;
55
56    uint64_t mTimeCodeScale;
57    int64_t mStartTimestampUs;
58    int32_t mStartTimeOffsetMs;
59
60    uint64_t mSegmentOffset;
61    uint64_t mSegmentDataStart;
62    uint64_t mInfoOffset;
63    uint64_t mInfoSize;
64    uint64_t mTracksOffset;
65    uint64_t mCuesOffset;
66
67    bool mPaused;
68    bool mStarted;
69    bool mIsFileSizeLimitExplicitlyRequested;
70    bool mIsRealTimeRecording;
71    bool mStreamableFile;
72    uint64_t mEstimatedCuesSize;
73
74    Mutex mLock;
75    List<sp<WebmElement> > mCuePoints;
76
77    enum {
78        kAudioIndex     =  0,
79        kVideoIndex     =  1,
80        kMaxStreams     =  2,
81    };
82
83    struct WebmStream {
84        int mType;
85        const char *mName;
86        sp<WebmElement> (*mMakeTrack)(const sp<MetaData>&);
87
88        sp<IMediaSource> mSource;
89        sp<WebmElement> mTrackEntry;
90        sp<WebmFrameSourceThread> mThread;
91        LinkedBlockingQueue<const sp<WebmFrame> > mSink;
92
93        WebmStream()
94            : mType(kInvalidType),
95              mName("Invalid"),
96              mMakeTrack(NULL) {
97        }
98
99        WebmStream(int type, const char *name, sp<WebmElement> (*makeTrack)(const sp<MetaData>&))
100            : mType(type),
101              mName(name),
102              mMakeTrack(makeTrack) {
103        }
104
105        WebmStream &operator=(const WebmStream &other) {
106            mType = other.mType;
107            mName = other.mName;
108            mMakeTrack = other.mMakeTrack;
109            return *this;
110        }
111    };
112    WebmStream mStreams[kMaxStreams];
113    Vector<sp<WebmElement>> mStreamsInOrder;
114
115    sp<WebmFrameSinkThread> mSinkThread;
116
117    size_t numTracks();
118    uint64_t estimateCuesSize(int32_t bitRate);
119    void initStream(size_t idx);
120    void release();
121    status_t reset();
122
123    static sp<WebmElement> videoTrack(const sp<MetaData>& md);
124    static sp<WebmElement> audioTrack(const sp<MetaData>& md);
125
126    DISALLOW_EVIL_CONSTRUCTORS(WebmWriter);
127};
128
129} /* namespace android */
130#endif /* WEBMWRITER_H_ */
131