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