MediaMuxer.h revision 11287471298193ff51ffb429686f5d63a84a621b
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: 43afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui // Please update media/java/android/media/MediaMuxer.java if the 44afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui // SampleFlags is updated. 45afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui enum SampleFlags { 46afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui SAMPLE_FLAG_SYNC = 1, 47afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui }; 48afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui 49afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui // Please update media/java/android/media/MediaMuxer.java if the 50afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui // OutputFormat is updated. 51afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui enum OutputFormat { 52afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui OUTPUT_FORMAT_MPEG_4 = 0, 53afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui OUTPUT_FORMAT_LIST_END // must be last - used to validate format type 54afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui }; 55afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui 566269d53cce5c1c9350565d3d72d92116594260cbztenghui // Construct the muxer with the output file path. 57afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui MediaMuxer(const char *path, OutputFormat format); 58afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui 596269d53cce5c1c9350565d3d72d92116594260cbztenghui // Construct the muxer with the file descriptor. Note that the MediaMuxer 606269d53cce5c1c9350565d3d72d92116594260cbztenghui // will close this file at stop(). 61afde4e56566af19b36f1fe5e7aa7f226bf1703ddztenghui MediaMuxer(int fd, OutputFormat format); 626269d53cce5c1c9350565d3d72d92116594260cbztenghui 636269d53cce5c1c9350565d3d72d92116594260cbztenghui virtual ~MediaMuxer(); 646269d53cce5c1c9350565d3d72d92116594260cbztenghui 656269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 666269d53cce5c1c9350565d3d72d92116594260cbztenghui * Add a track with its format information. This should be 676269d53cce5c1c9350565d3d72d92116594260cbztenghui * called before start(). 686269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param format the track's format. 696269d53cce5c1c9350565d3d72d92116594260cbztenghui * @return the track's index or negative number if error. 706269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 716269d53cce5c1c9350565d3d72d92116594260cbztenghui ssize_t addTrack(const sp<AMessage> &format); 726269d53cce5c1c9350565d3d72d92116594260cbztenghui 736269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 746269d53cce5c1c9350565d3d72d92116594260cbztenghui * Start muxing. Make sure all the tracks have been added before 756269d53cce5c1c9350565d3d72d92116594260cbztenghui * calling this. 766269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 776269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t start(); 786269d53cce5c1c9350565d3d72d92116594260cbztenghui 796269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 8011287471298193ff51ffb429686f5d63a84a621bztenghui * Set the orientation hint. 8111287471298193ff51ffb429686f5d63a84a621bztenghui * @param degrees The rotation degrees. It has to be either 0, 8211287471298193ff51ffb429686f5d63a84a621bztenghui * 90, 180 or 270. 8311287471298193ff51ffb429686f5d63a84a621bztenghui * @return OK if no error. 8411287471298193ff51ffb429686f5d63a84a621bztenghui */ 8511287471298193ff51ffb429686f5d63a84a621bztenghui status_t setOrientationHint(int degrees); 8611287471298193ff51ffb429686f5d63a84a621bztenghui 8711287471298193ff51ffb429686f5d63a84a621bztenghui /** 886269d53cce5c1c9350565d3d72d92116594260cbztenghui * Stop muxing. 896269d53cce5c1c9350565d3d72d92116594260cbztenghui * This method is a blocking call. Depending on how 906269d53cce5c1c9350565d3d72d92116594260cbztenghui * much data is bufferred internally, the time needed for stopping 916269d53cce5c1c9350565d3d72d92116594260cbztenghui * the muxer may be time consuming. UI thread is 926269d53cce5c1c9350565d3d72d92116594260cbztenghui * not recommended for launching this call. 9311287471298193ff51ffb429686f5d63a84a621bztenghui * @return OK if no error. 946269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 956269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t stop(); 966269d53cce5c1c9350565d3d72d92116594260cbztenghui 976269d53cce5c1c9350565d3d72d92116594260cbztenghui /** 986269d53cce5c1c9350565d3d72d92116594260cbztenghui * Send a sample buffer for muxing. 996269d53cce5c1c9350565d3d72d92116594260cbztenghui * The buffer can be reused once this method returns. Typically, 1006269d53cce5c1c9350565d3d72d92116594260cbztenghui * this function won't be blocked for very long, and thus there 1016269d53cce5c1c9350565d3d72d92116594260cbztenghui * is no need to use a separate thread calling this method to 1026269d53cce5c1c9350565d3d72d92116594260cbztenghui * push a buffer. 1036269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param buffer the incoming sample buffer. 1046269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param trackIndex the buffer's track index number. 1056269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param timeUs the buffer's time stamp. 1066269d53cce5c1c9350565d3d72d92116594260cbztenghui * @param flags the only supported flag for now is 1076269d53cce5c1c9350565d3d72d92116594260cbztenghui * MediaCodec::BUFFER_FLAG_SYNCFRAME. 1086269d53cce5c1c9350565d3d72d92116594260cbztenghui * @return OK if no error. 1096269d53cce5c1c9350565d3d72d92116594260cbztenghui */ 1106269d53cce5c1c9350565d3d72d92116594260cbztenghui status_t writeSampleData(const sp<ABuffer> &buffer, size_t trackIndex, 1116269d53cce5c1c9350565d3d72d92116594260cbztenghui int64_t timeUs, uint32_t flags) ; 1126269d53cce5c1c9350565d3d72d92116594260cbztenghui 1136269d53cce5c1c9350565d3d72d92116594260cbztenghuiprivate: 1146269d53cce5c1c9350565d3d72d92116594260cbztenghui sp<MPEG4Writer> mWriter; 1156269d53cce5c1c9350565d3d72d92116594260cbztenghui Vector< sp<MediaAdapter> > mTrackList; // Each track has its MediaAdapter. 11611287471298193ff51ffb429686f5d63a84a621bztenghui sp<MetaData> mFileMeta; // Metadata for the whole file. 1176269d53cce5c1c9350565d3d72d92116594260cbztenghui 1186269d53cce5c1c9350565d3d72d92116594260cbztenghui Mutex mMuxerLock; 1196269d53cce5c1c9350565d3d72d92116594260cbztenghui 1206269d53cce5c1c9350565d3d72d92116594260cbztenghui enum State { 12111287471298193ff51ffb429686f5d63a84a621bztenghui UNINITIALIZED, 12211287471298193ff51ffb429686f5d63a84a621bztenghui INITIALIZED, 1236269d53cce5c1c9350565d3d72d92116594260cbztenghui STARTED, 1246269d53cce5c1c9350565d3d72d92116594260cbztenghui STOPPED 1256269d53cce5c1c9350565d3d72d92116594260cbztenghui }; 1266269d53cce5c1c9350565d3d72d92116594260cbztenghui State mState; 1276269d53cce5c1c9350565d3d72d92116594260cbztenghui 1286269d53cce5c1c9350565d3d72d92116594260cbztenghui DISALLOW_EVIL_CONSTRUCTORS(MediaMuxer); 1296269d53cce5c1c9350565d3d72d92116594260cbztenghui}; 1306269d53cce5c1c9350565d3d72d92116594260cbztenghui 1316269d53cce5c1c9350565d3d72d92116594260cbztenghui} // namespace android 1326269d53cce5c1c9350565d3d72d92116594260cbztenghui 1336269d53cce5c1c9350565d3d72d92116594260cbztenghui#endif // MEDIA_MUXER_H_ 1346269d53cce5c1c9350565d3d72d92116594260cbztenghui 135