MediaCodec.h revision 5b8987e7de9d04b09153f329c680d2316cdb44ec
1f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten/*
2f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Copyright 2012, The Android Open Source Project
3f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten *
4f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * you may not use this file except in compliance with the License.
6f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * You may obtain a copy of the License at
7f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten *
8f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten *     http://www.apache.org/licenses/LICENSE-2.0
9f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten *
10f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * See the License for the specific language governing permissions and
14f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten * limitations under the License.
15f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten */
16f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
17f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#ifndef MEDIA_CODEC_H_
18f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
19f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#define MEDIA_CODEC_H_
20f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
21f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <gui/ISurfaceTexture.h>
22f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <media/hardware/CryptoAPI.h>
23f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <media/stagefright/foundation/AHandler.h>
24f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#include <utils/Vector.h>
25f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
26f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastennamespace android {
27f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
28f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct ABuffer;
29f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct ACodec;
30f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct AMessage;
31f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct AString;
32e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kastenstruct ICrypto;
33f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenstruct SoftwareRenderer;
34f9715e43ea73361321663514c44129c939c5db2fGlenn Kastenstruct SurfaceTextureClient;
35e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
36e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kastenstruct MediaCodec : public AHandler {
37e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    enum ConfigureFlags {
38e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        CONFIGURE_FLAG_ENCODE   = 1,
39f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    };
40e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
41e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    enum BufferFlags {
42f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        BUFFER_FLAG_SYNCFRAME   = 1,
43e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        BUFFER_FLAG_CODECCONFIG = 2,
44f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        BUFFER_FLAG_EOS         = 4,
45f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    };
46f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
47f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    static sp<MediaCodec> CreateByType(
48f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const sp<ALooper> &looper, const char *mime, bool encoder);
49f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
50f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    static sp<MediaCodec> CreateByComponentName(
51f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const sp<ALooper> &looper, const char *name);
52f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
53f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t configure(
54f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const sp<AMessage> &format,
55f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const sp<SurfaceTextureClient> &nativeWindow,
56f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const sp<ICrypto> &crypto,
57f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            uint32_t flags);
58f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
59f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t start();
60f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
61f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    // Returns to a state in which the component remains allocated but
62f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    // unconfigured.
63f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t stop();
64f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
65f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    // Client MUST call release before releasing final reference to this
66e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    // object.
67e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    status_t release();
68f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
69f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t flush();
70f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
71f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t queueInputBuffer(
725115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten            size_t index,
73f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t offset,
74f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t size,
75f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            int64_t presentationTimeUs,
76f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            uint32_t flags,
77f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            AString *errorDetailMsg = NULL);
78f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
79f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t queueSecureInputBuffer(
80f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t index,
81f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t offset,
82f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const CryptoPlugin::SubSample *subSamples,
83f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t numSubSamples,
84f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const uint8_t key[16],
85f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            const uint8_t iv[16],
86f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            CryptoPlugin::Mode mode,
87f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            int64_t presentationTimeUs,
88f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            uint32_t flags,
894dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten            AString *errorDetailMsg = NULL);
904dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten
914dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
92f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
93f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t dequeueOutputBuffer(
94f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t *index,
95f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t *offset,
96f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten            size_t *size,
97e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten            int64_t *presentationTimeUs,
98e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten            uint32_t *flags,
99e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten            int64_t timeoutUs = 0ll);
100e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
101e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    status_t renderOutputBufferAndRelease(size_t index);
102e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    status_t releaseOutputBuffer(size_t index);
103e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
104f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t getOutputFormat(sp<AMessage> *format) const;
105e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
106e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
10757c4e6f7464d458eb52d209c2a63524913d6406dGlenn Kasten    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
108e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
109d330ee46022f34da76d14d0c4d2910526ecc2321Andy Hungprotected:
11057c4e6f7464d458eb52d209c2a63524913d6406dGlenn Kasten    virtual ~MediaCodec();
111f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    virtual void onMessageReceived(const sp<AMessage> &msg);
112e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
113f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kastenprivate:
114f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    enum State {
115f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        UNINITIALIZED,
116f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        INITIALIZING,
117e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        INITIALIZED,
118e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        CONFIGURING,
119e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        CONFIGURED,
120f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        STARTING,
121f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        STARTED,
122f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        FLUSHING,
123f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        STOPPING,
124e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        RELEASING,
125e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    };
126f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
127f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    enum {
128e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kPortIndexInput         = 0,
1295115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten        kPortIndexOutput        = 1,
1305115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten    };
131e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
132e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    enum {
133f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kWhatInit                       = 'init',
134f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kWhatConfigure                  = 'conf',
135f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kWhatStart                      = 'strt',
1360a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung        kWhatStop                       = 'stop',
1370a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung        kWhatRelease                    = 'rele',
1380a01c2fb68e6f35905de8dfaf938d099cd48587dAndy Hung        kWhatDequeueInputBuffer         = 'deqI',
139e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatQueueInputBuffer           = 'queI',
140e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatDequeueOutputBuffer        = 'deqO',
141e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatReleaseOutputBuffer        = 'relO',
142e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatGetBuffers                 = 'getB',
143e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatFlush                      = 'flus',
144e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatGetOutputFormat            = 'getO',
145f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kWhatDequeueInputTimedOut       = 'dITO',
146e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatDequeueOutputTimedOut      = 'dOTO',
147e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kWhatCodecNotify                = 'codc',
148e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    };
149e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
150e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    enum {
151e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kFlagIsSoftwareCodec            = 1,
152f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kFlagOutputFormatChanged        = 2,
153e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten        kFlagOutputBuffersChanged       = 4,
154f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kFlagStickyError                = 8,
155f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kFlagDequeueInputPending        = 16,
156f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kFlagDequeueOutputPending       = 32,
157f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        kFlagIsSecure                   = 64,
158f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    };
159f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
160f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    struct BufferInfo {
1614dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten        void *mBufferID;
1624dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten        sp<ABuffer> mData;
1634dd03b5b68dcd8eb5f5ffe2cfe93d26b8f08b848Glenn Kasten        sp<ABuffer> mEncryptedData;
164f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        sp<AMessage> mNotify;
165f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten        bool mOwnedByClient;
166f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    };
167e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
168e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    State mState;
169f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    sp<ALooper> mLooper;
170f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    sp<ALooper> mCodecLooper;
171d79072e9dff59f767cce2cda1caab80ce5a0815bGlenn Kasten    sp<ACodec> mCodec;
172f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    uint32_t mReplyID;
173f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    uint32_t mFlags;
174f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    sp<SurfaceTextureClient> mNativeWindow;
175f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    SoftwareRenderer *mSoftRenderer;
176e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    sp<AMessage> mOutputFormat;
177e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
178e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    List<size_t> mAvailPortBuffers[2];
179f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    Vector<BufferInfo> mPortBuffers[2];
180f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
181e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    int32_t mDequeueInputTimeoutGeneration;
182f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    uint32_t mDequeueInputReplyID;
183f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
184e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    int32_t mDequeueOutputTimeoutGeneration;
185f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    uint32_t mDequeueOutputReplyID;
186f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
187f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    sp<ICrypto> mCrypto;
188e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
189e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    MediaCodec(const sp<ALooper> &looper);
190e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
1915115777127bb4d2d50833537e09054dcdffdfc76Glenn Kasten    static status_t PostAndAwaitResponse(
192e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten            const sp<AMessage> &msg, sp<AMessage> *response);
193f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
194e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten    status_t init(const char *name, bool nameIsType, bool encoder);
195e4a7ce250cb94a00aa2f76e5edca1c4479dc5401Glenn Kasten
196f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    void setState(State newState);
197f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    void returnBuffersToCodec();
198f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    void returnBuffersToCodecOnPort(int32_t portIndex);
199f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
200f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t onQueueInputBuffer(const sp<AMessage> &msg);
201f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
202f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    ssize_t dequeuePortBuffer(int32_t portIndex);
203f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
204f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
205f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
206f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    void cancelPendingDequeueOperations();
207f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
208f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
209f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten};
210f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
211f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten}  // namespace android
212f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten
213f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten#endif  // MEDIA_CODEC_H_
214f91df1b368a140abd37c80b204bd48d78778cc43Glenn Kasten