MPEG4Writer.h revision b4d5320bda29cd9694461c9b61d0211f801ff0af
1/* 2 * Copyright (C) 2009 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 MPEG4_WRITER_H_ 18 19#define MPEG4_WRITER_H_ 20 21#include <stdio.h> 22 23#include <media/stagefright/MediaWriter.h> 24#include <utils/List.h> 25#include <utils/threads.h> 26 27namespace android { 28 29class MediaBuffer; 30class MediaSource; 31class MetaData; 32 33class MPEG4Writer : public MediaWriter { 34public: 35 MPEG4Writer(const char *filename); 36 MPEG4Writer(int fd); 37 38 virtual status_t addSource(const sp<MediaSource> &source); 39 virtual status_t start(MetaData *param = NULL); 40 virtual status_t stop(); 41 virtual status_t pause(); 42 virtual bool reachedEOS(); 43 virtual status_t dump(int fd, const Vector<String16>& args); 44 45 void beginBox(const char *fourcc); 46 void writeInt8(int8_t x); 47 void writeInt16(int16_t x); 48 void writeInt32(int32_t x); 49 void writeInt64(int64_t x); 50 void writeCString(const char *s); 51 void writeFourcc(const char *fourcc); 52 void write(const void *data, size_t size); 53 void endBox(); 54 uint32_t interleaveDuration() const { return mInterleaveDurationUs; } 55 status_t setInterleaveDuration(uint32_t duration); 56 int32_t getTimeScale() const { return mTimeScale; } 57 58protected: 59 virtual ~MPEG4Writer(); 60 61private: 62 class Track; 63 64 FILE *mFile; 65 bool mUse4ByteNalLength; 66 bool mUse32BitOffset; 67 bool mPaused; 68 bool mStarted; 69 off_t mOffset; 70 off_t mMdatOffset; 71 uint8_t *mMoovBoxBuffer; 72 off_t mMoovBoxBufferOffset; 73 bool mWriteMoovBoxToMemory; 74 off_t mFreeBoxOffset; 75 bool mStreamableFile; 76 off_t mEstimatedMoovBoxSize; 77 uint32_t mInterleaveDurationUs; 78 int32_t mTimeScale; 79 int64_t mStartTimestampUs; 80 81 Mutex mLock; 82 83 List<Track *> mTracks; 84 85 List<off_t> mBoxes; 86 87 void setStartTimestampUs(int64_t timeUs); 88 int64_t getStartTimestampUs(); // Not const 89 status_t startTracks(MetaData *params); 90 size_t numTracks(); 91 int64_t estimateMoovBoxSize(int32_t bitRate); 92 93 struct Chunk { 94 Track *mTrack; // Owner 95 int64_t mTimeStampUs; // Timestamp of the 1st sample 96 List<MediaBuffer *> mSamples; // Sample data 97 98 // Convenient constructor 99 Chunk(Track *track, int64_t timeUs, List<MediaBuffer *> samples) 100 : mTrack(track), mTimeStampUs(timeUs), mSamples(samples) { 101 } 102 103 }; 104 struct ChunkInfo { 105 Track *mTrack; // Owner 106 List<Chunk> mChunks; // Remaining chunks to be written 107 }; 108 109 bool mIsFirstChunk; 110 volatile bool mDone; // Writer thread is done? 111 pthread_t mThread; // Thread id for the writer 112 List<ChunkInfo> mChunkInfos; // Chunk infos 113 Condition mChunkReadyCondition; // Signal that chunks are available 114 115 // Writer thread handling 116 status_t startWriterThread(); 117 void stopWriterThread(); 118 static void *ThreadWrapper(void *me); 119 void threadFunc(); 120 121 // Buffer a single chunk to be written out later. 122 void bufferChunk(const Chunk& chunk); 123 124 // Write all buffered chunks from all tracks 125 void writeChunks(); 126 127 // Write a chunk if there is one 128 status_t writeOneChunk(); 129 130 // Write the first chunk from the given ChunkInfo. 131 void writeFirstChunk(ChunkInfo* info); 132 133 // Adjust other track media clock (presumably wall clock) 134 // based on audio track media clock with the drift time. 135 int64_t mDriftTimeUs; 136 void setDriftTimeUs(int64_t driftTimeUs); 137 int64_t getDriftTimeUs(); 138 139 // Return whether the nal length is 4 bytes or 2 bytes 140 // Only makes sense for H.264/AVC 141 bool useNalLengthFour(); 142 143 void lock(); 144 void unlock(); 145 146 // Acquire lock before calling these methods 147 off_t addSample_l(MediaBuffer *buffer); 148 off_t addLengthPrefixedSample_l(MediaBuffer *buffer); 149 150 inline size_t write(const void *ptr, size_t size, size_t nmemb, FILE* stream); 151 bool exceedsFileSizeLimit(); 152 bool use32BitFileOffset() const; 153 bool exceedsFileDurationLimit(); 154 void trackProgressStatus(const Track* track, int64_t timeUs, status_t err = OK); 155 156 MPEG4Writer(const MPEG4Writer &); 157 MPEG4Writer &operator=(const MPEG4Writer &); 158}; 159 160} // namespace android 161 162#endif // MPEG4_WRITER_H_ 163