MediaMuxer.h revision 4f1732b8068970b368a89271158ca29daf25650e
1/* 2 * Copyright 2013, 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 MEDIA_MUXER_H_ 18#define MEDIA_MUXER_H_ 19 20#include <utils/Errors.h> 21#include <utils/RefBase.h> 22#include <utils/Vector.h> 23#include <utils/threads.h> 24 25namespace android { 26 27struct ABuffer; 28struct AMessage; 29struct MediaAdapter; 30struct MediaBuffer; 31struct MediaSource; 32struct MetaData; 33struct MPEG4Writer; 34 35// MediaMuxer is used to mux multiple tracks into a video. Currently, we only 36// support a mp4 file as the output. 37// The expected calling order of the functions is: 38// Constructor -> addTrack+ -> start -> writeSampleData+ -> stop 39// If muxing operation need to be cancelled, the app is responsible for 40// deleting the output file after stop. 41struct MediaMuxer : public RefBase { 42public: 43 // Construct the muxer with the output file path. 44 MediaMuxer(const char* pathOut); 45 // Construct the muxer with the file descriptor. Note that the MediaMuxer 46 // will close this file at stop(). 47 MediaMuxer(int fd); 48 49 virtual ~MediaMuxer(); 50 51 /** 52 * Add a track with its format information. This should be 53 * called before start(). 54 * @param format the track's format. 55 * @return the track's index or negative number if error. 56 */ 57 ssize_t addTrack(const sp<AMessage> &format); 58 59 /** 60 * Start muxing. Make sure all the tracks have been added before 61 * calling this. 62 */ 63 status_t start(); 64 65 /** 66 * Stop muxing. 67 * This method is a blocking call. Depending on how 68 * much data is bufferred internally, the time needed for stopping 69 * the muxer may be time consuming. UI thread is 70 * not recommended for launching this call. 71 */ 72 status_t stop(); 73 74 /** 75 * Send a sample buffer for muxing. 76 * The buffer can be reused once this method returns. Typically, 77 * this function won't be blocked for very long, and thus there 78 * is no need to use a separate thread calling this method to 79 * push a buffer. 80 * @param buffer the incoming sample buffer. 81 * @param trackIndex the buffer's track index number. 82 * @param timeUs the buffer's time stamp. 83 * @param flags the only supported flag for now is 84 * MediaCodec::BUFFER_FLAG_SYNCFRAME. 85 * @return OK if no error. 86 */ 87 status_t writeSampleData(const sp<ABuffer> &buffer, size_t trackIndex, 88 int64_t timeUs, uint32_t flags) ; 89 90private: 91 sp<MPEG4Writer> mWriter; 92 Vector< sp<MediaAdapter> > mTrackList; // Each track has its MediaAdapter. 93 94 Mutex mMuxerLock; 95 96 enum State { 97 INITED, 98 STARTED, 99 STOPPED 100 }; 101 State mState; 102 103 DISALLOW_EVIL_CONSTRUCTORS(MediaMuxer); 104}; 105 106} // namespace android 107 108#endif // MEDIA_MUXER_H_ 109 110