10da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber/*
20da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * Copyright (C) 2010 The Android Open Source Project
30da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber *
40da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
50da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * you may not use this file except in compliance with the License.
60da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * You may obtain a copy of the License at
70da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber *
80da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
90da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber *
100da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * Unless required by applicable law or agreed to in writing, software
110da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
120da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * See the License for the specific language governing permissions and
140da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber * limitations under the License.
150da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber */
160da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
170da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#ifndef MPEG2TS_WRITER_H_
180da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
190da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#define MPEG2TS_WRITER_H_
200da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
210da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/foundation/ABase.h>
220da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/foundation/AHandlerReflector.h>
230da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/foundation/ALooper.h>
240da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#include <media/stagefright/MediaWriter.h>
250da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
260da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Hubernamespace android {
270da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
2859b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huberstruct ABuffer;
2959b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber
300da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huberstruct MPEG2TSWriter : public MediaWriter {
3159b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber    MPEG2TSWriter(int fd);
320da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
333e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber    MPEG2TSWriter(
343e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber            void *cookie,
353e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber            ssize_t (*write)(void *cookie, const void *data, size_t size));
363e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber
37b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    virtual status_t addSource(const sp<IMediaSource> &source);
380da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    virtual status_t start(MetaData *param = NULL);
398bcc65c753085fe3328592cceda0cf0e8f8b0a45James Dong    virtual status_t stop() { return reset(); }
400da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    virtual status_t pause();
410da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    virtual bool reachedEOS();
420da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    virtual status_t dump(int fd, const Vector<String16>& args);
430da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
440da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    void onMessageReceived(const sp<AMessage> &msg);
450da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
460da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huberprotected:
470da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    virtual ~MPEG2TSWriter();
480da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
490da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huberprivate:
500da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    enum {
510da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber        kWhatSourceNotify = 'noti'
520da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    };
530da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
540da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    struct SourceInfo;
550da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
560da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    FILE *mFile;
573e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber
583e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber    void *mWriteCookie;
593e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber    ssize_t (*mWriteFunc)(void *cookie, const void *data, size_t size);
603e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber
610da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    sp<ALooper> mLooper;
620da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    sp<AHandlerReflector<MPEG2TSWriter> > mReflector;
630da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
640da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    bool mStarted;
650da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
660da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    Vector<sp<SourceInfo> > mSources;
670da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    size_t mNumSourcesDone;
680da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
690da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    int64_t mNumTSPacketsWritten;
700da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    int64_t mNumTSPacketsBeforeMeta;
71d4e5af6bc0a012e8d43975ca8b5627631333920dPaul Fariello    int mPATContinuityCounter;
72d4e5af6bc0a012e8d43975ca8b5627631333920dPaul Fariello    int mPMTContinuityCounter;
73983995747ed3adaf25035c433df1ccbaa056a898Paul Fariello    uint32_t mCrcTable[256];
740da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
7559b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber    void init();
7659b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber
770da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    void writeTS();
780da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    void writeProgramAssociationTable();
790da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    void writeProgramMap();
800da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    void writeAccessUnit(int32_t sourceIndex, const sp<ABuffer> &buffer);
81983995747ed3adaf25035c433df1ccbaa056a898Paul Fariello    void initCrcTable();
82983995747ed3adaf25035c433df1ccbaa056a898Paul Fariello    uint32_t crc32(const uint8_t *start, size_t length);
830da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
843e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber    ssize_t internalWrite(const void *data, size_t size);
858bcc65c753085fe3328592cceda0cf0e8f8b0a45James Dong    status_t reset();
863e1763ecdf14769a534f75e94a56785f63174b47Andreas Huber
870da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MPEG2TSWriter);
880da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber};
890da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
900da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber}  // namespace android
910da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber
920da4dab0a45a2bc1d95cbc6ef6a4850ed2569584Andreas Huber#endif  // MPEG2TS_WRITER_H_
93