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