1c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber/*
2c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * Copyright (C) 2010 The Android Open Source Project
3c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber *
4c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * you may not use this file except in compliance with the License.
6c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * You may obtain a copy of the License at
7c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber *
8c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber *
10c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * See the License for the specific language governing permissions and
14c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber * limitations under the License.
15c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber */
16c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
17c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#ifndef MPEG2TS_WRITER_H_
18c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
19c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#define MPEG2TS_WRITER_H_
20c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
21c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#include <media/stagefright/foundation/ABase.h>
22c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#include <media/stagefright/foundation/AHandlerReflector.h>
23c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#include <media/stagefright/foundation/ALooper.h>
24c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#include <media/stagefright/MediaWriter.h>
25c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
26c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Hubernamespace android {
27c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
289adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huberstruct ABuffer;
299adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber
30c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huberstruct MPEG2TSWriter : public MediaWriter {
319adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber    MPEG2TSWriter(int fd);
32c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    MPEG2TSWriter(const char *filename);
33c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
34c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual status_t addSource(const sp<MediaSource> &source);
35c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual status_t start(MetaData *param = NULL);
36c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual status_t stop();
37c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual status_t pause();
38c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual bool reachedEOS();
39c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual status_t dump(int fd, const Vector<String16>& args);
40c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
41c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    void onMessageReceived(const sp<AMessage> &msg);
42c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
43c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huberprotected:
44c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    virtual ~MPEG2TSWriter();
45c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
46c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huberprivate:
47c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    enum {
48c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber        kWhatSourceNotify = 'noti'
49c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    };
50c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
51c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    struct SourceInfo;
52c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
53c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    FILE *mFile;
54c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    sp<ALooper> mLooper;
55c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    sp<AHandlerReflector<MPEG2TSWriter> > mReflector;
56c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
57c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    bool mStarted;
58c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
59c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    Vector<sp<SourceInfo> > mSources;
60c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    size_t mNumSourcesDone;
61c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
62c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    int64_t mNumTSPacketsWritten;
63c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    int64_t mNumTSPacketsBeforeMeta;
64c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
659adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber    void init();
669adf466021d37a5062d7d3361e14bfd9e7ffeba6Andreas Huber
67c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    void writeTS();
68c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    void writeProgramAssociationTable();
69c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    void writeProgramMap();
70c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    void writeAccessUnit(int32_t sourceIndex, const sp<ABuffer> &buffer);
71c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
72c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSWriter);
73c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber};
74c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
75c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber}  // namespace android
76c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber
77c751eccad38cf46d7478eca85beefecd2c2b4c3bAndreas Huber#endif  // MPEG2TS_WRITER_H_
78