MediaMuxer.h revision 6269d53cce5c1c9350565d3d72d92116594260cb
16269d53cce5c1c9350565d3d72d92116594260cbztenghui/* 26269d53cce5c1c9350565d3d72d92116594260cbztenghui * Copyright 2013, The Android Open Source Project 36269d53cce5c1c9350565d3d72d92116594260cbztenghui * 46269d53cce5c1c9350565d3d72d92116594260cbztenghui * Licensed under the Apache License, Version 2.0 (the "License"); 56269d53cce5c1c9350565d3d72d92116594260cbztenghui * you may not use this file except in compliance with the License. 66269d53cce5c1c9350565d3d72d92116594260cbztenghui * You may obtain a copy of the License at 76269d53cce5c1c9350565d3d72d92116594260cbztenghui * 86269d53cce5c1c9350565d3d72d92116594260cbztenghui * http://www.apache.org/licenses/LICENSE-2.0 96269d53cce5c1c9350565d3d72d92116594260cbztenghui * 106269d53cce5c1c9350565d3d72d92116594260cbztenghui * Unless required by applicable law or agreed to in writing, software 116269d53cce5c1c9350565d3d72d92116594260cbztenghui * distributed under the License is distributed on an "AS IS" BASIS, 126269d53cce5c1c9350565d3d72d92116594260cbztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136269d53cce5c1c9350565d3d72d92116594260cbztenghui * See the License for the specific language governing permissions and 146269d53cce5c1c9350565d3d72d92116594260cbztenghui * limitations under the License. 156269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 166269d53cce5c1c9350565d3d72d92116594260cbztenghui 176269d53cce5c1c9350565d3d72d92116594260cbztenghui#ifndef MEDIA_MUXER_H_ 186269d53cce5c1c9350565d3d72d92116594260cbztenghui#define MEDIA_MUXER_H_ 196269d53cce5c1c9350565d3d72d92116594260cbztenghui 206269d53cce5c1c9350565d3d72d92116594260cbztenghui#include <utils/Errors.h> 216269d53cce5c1c9350565d3d72d92116594260cbztenghui#include <utils/RefBase.h> 226269d53cce5c1c9350565d3d72d92116594260cbztenghui#include <utils/Vector.h> 236269d53cce5c1c9350565d3d72d92116594260cbztenghui#include <utils/threads.h> 246269d53cce5c1c9350565d3d72d92116594260cbztenghui 256269d53cce5c1c9350565d3d72d92116594260cbztenghuinamespace android { 266269d53cce5c1c9350565d3d72d92116594260cbztenghui 276269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct ABuffer; 286269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct AMessage; 296269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MediaAdapter; 306269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MediaBuffer; 316269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MediaSource; 326269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MetaData; 336269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MPEG4Writer; 346269d53cce5c1c9350565d3d72d92116594260cbztenghui 356269d53cce5c1c9350565d3d72d92116594260cbztenghui// MediaMuxer is used to mux multiple tracks into a video. Currently, we only 366269d53cce5c1c9350565d3d72d92116594260cbztenghui// support a mp4 file as the output. 376269d53cce5c1c9350565d3d72d92116594260cbztenghui// The expected calling order of the functions is: 386269d53cce5c1c9350565d3d72d92116594260cbztenghui// Constructor -> addTrack+ -> start -> writeSampleData+ -> stop 396269d53cce5c1c9350565d3d72d92116594260cbztenghui// If muxing operation need to be cancelled, the app is responsible for 406269d53cce5c1c9350565d3d72d92116594260cbztenghui// deleting the output file after stop. 416269d53cce5c1c9350565d3d72d92116594260cbztenghuistruct MediaMuxer : public RefBase { 426269d53cce5c1c9350565d3d72d92116594260cbztenghuipublic: 436269d53cce5c1c9350565d3d72d92116594260cbztenghui // Construct the muxer with the output file path. 446269d53cce5c1c9350565d3d72d92116594260cbztenghui MediaMuxer(const char* pathOut); 456269d53cce5c1c9350565d3d72d92116594260cbztenghui // Construct the muxer with the file descriptor. Note that the MediaMuxer 466269d53cce5c1c9350565d3d72d92116594260cbztenghui // will close this file at stop(). 476269d53cce5c1c9350565d3d72d92116594260cbztenghui MediaMuxer(int fd); 486269d53cce5c1c9350565d3d72d92116594260cbztenghui 496269d53cce5c1c9350565d3d72d92116594260cbztenghui virtual ~MediaMuxer(); 506269d53cce5c1c9350565d3d72d92116594260cbztenghui 516269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 526269d53cce5c1c9350565d3d72d92116594260cbztenghui * Add a track with its format information. This should be 536269d53cce5c1c9350565d3d72d92116594260cbztenghui * called before start(). 546269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param format the track's format. 556269d53cce5c1c9350565d3d72d92116594260cbztenghui * @return the track's index or negative number if error. 566269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 576269d53cce5c1c9350565d3d72d92116594260cbztenghui ssize_t addTrack(const sp<AMessage> &format); 586269d53cce5c1c9350565d3d72d92116594260cbztenghui 596269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 606269d53cce5c1c9350565d3d72d92116594260cbztenghui * Start muxing. Make sure all the tracks have been added before 616269d53cce5c1c9350565d3d72d92116594260cbztenghui * calling this. 626269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 636269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t start(); 646269d53cce5c1c9350565d3d72d92116594260cbztenghui 656269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 666269d53cce5c1c9350565d3d72d92116594260cbztenghui * Stop muxing. 676269d53cce5c1c9350565d3d72d92116594260cbztenghui * This method is a blocking call. Depending on how 686269d53cce5c1c9350565d3d72d92116594260cbztenghui * much data is bufferred internally, the time needed for stopping 696269d53cce5c1c9350565d3d72d92116594260cbztenghui * the muxer may be time consuming. UI thread is 706269d53cce5c1c9350565d3d72d92116594260cbztenghui * not recommended for launching this call. 716269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 726269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t stop(); 736269d53cce5c1c9350565d3d72d92116594260cbztenghui 746269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 756269d53cce5c1c9350565d3d72d92116594260cbztenghui * Send a sample buffer for muxing. 766269d53cce5c1c9350565d3d72d92116594260cbztenghui * The buffer can be reused once this method returns. Typically, 776269d53cce5c1c9350565d3d72d92116594260cbztenghui * this function won't be blocked for very long, and thus there 786269d53cce5c1c9350565d3d72d92116594260cbztenghui * is no need to use a separate thread calling this method to 796269d53cce5c1c9350565d3d72d92116594260cbztenghui * push a buffer. 806269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param buffer the incoming sample buffer. 816269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param trackIndex the buffer's track index number. 826269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param timeUs the buffer's time stamp. 836269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param flags the only supported flag for now is 846269d53cce5c1c9350565d3d72d92116594260cbztenghui * MediaCodec::BUFFER_FLAG_SYNCFRAME. 856269d53cce5c1c9350565d3d72d92116594260cbztenghui * @return OK if no error. 866269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 876269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t writeSampleData(const sp<ABuffer> &buffer, size_t trackIndex, 886269d53cce5c1c9350565d3d72d92116594260cbztenghui int64_t timeUs, uint32_t flags) ; 896269d53cce5c1c9350565d3d72d92116594260cbztenghui 906269d53cce5c1c9350565d3d72d92116594260cbztenghuiprivate: 916269d53cce5c1c9350565d3d72d92116594260cbztenghui sp<MPEG4Writer> mWriter; 926269d53cce5c1c9350565d3d72d92116594260cbztenghui Vector< sp<MediaAdapter> > mTrackList; // Each track has its MediaAdapter. 936269d53cce5c1c9350565d3d72d92116594260cbztenghui 946269d53cce5c1c9350565d3d72d92116594260cbztenghui Mutex mMuxerLock; 956269d53cce5c1c9350565d3d72d92116594260cbztenghui 966269d53cce5c1c9350565d3d72d92116594260cbztenghui enum State { 976269d53cce5c1c9350565d3d72d92116594260cbztenghui INITED, 986269d53cce5c1c9350565d3d72d92116594260cbztenghui STARTED, 996269d53cce5c1c9350565d3d72d92116594260cbztenghui STOPPED 1006269d53cce5c1c9350565d3d72d92116594260cbztenghui }; 1016269d53cce5c1c9350565d3d72d92116594260cbztenghui State mState; 1026269d53cce5c1c9350565d3d72d92116594260cbztenghui 1036269d53cce5c1c9350565d3d72d92116594260cbztenghui DISALLOW_EVIL_CONSTRUCTORS(MediaMuxer); 1046269d53cce5c1c9350565d3d72d92116594260cbztenghui}; 1056269d53cce5c1c9350565d3d72d92116594260cbztenghui 1066269d53cce5c1c9350565d3d72d92116594260cbztenghui} // namespace android 1076269d53cce5c1c9350565d3d72d92116594260cbztenghui 1086269d53cce5c1c9350565d3d72d92116594260cbztenghui#endif // MEDIA_MUXER_H_ 1096269d53cce5c1c9350565d3d72d92116594260cbztenghui 110