MediaCodec.h revision 92cd05b8f2e994aabcdda5d7454c96a707dc9579
14c2d66379753e2b7680811726424026b9e54b18aFelipe Leme/*
24c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * Copyright 2012, The Android Open Source Project
34c2d66379753e2b7680811726424026b9e54b18aFelipe Leme *
44c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
54c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * you may not use this file except in compliance with the License.
64c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * You may obtain a copy of the License at
74c2d66379753e2b7680811726424026b9e54b18aFelipe Leme *
84c2d66379753e2b7680811726424026b9e54b18aFelipe Leme *     http://www.apache.org/licenses/LICENSE-2.0
94c2d66379753e2b7680811726424026b9e54b18aFelipe Leme *
104c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * Unless required by applicable law or agreed to in writing, software
114c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
124c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * See the License for the specific language governing permissions and
144c2d66379753e2b7680811726424026b9e54b18aFelipe Leme * limitations under the License.
154c2d66379753e2b7680811726424026b9e54b18aFelipe Leme */
164c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
1775876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme#ifndef MEDIA_CODEC_H_
1875876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme
1975876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme#define MEDIA_CODEC_H_
20f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme
2175876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme#include <gui/IGraphicBufferProducer.h>
2275876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme#include <media/hardware/CryptoAPI.h>
234c2d66379753e2b7680811726424026b9e54b18aFelipe Leme#include <media/stagefright/foundation/AHandler.h>
244c2d66379753e2b7680811726424026b9e54b18aFelipe Leme#include <utils/Vector.h>
254c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
264c2d66379753e2b7680811726424026b9e54b18aFelipe Lemenamespace android {
274c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2846b85da716a32f285fe1222e9978beacc8697d09Felipe Lemestruct ABuffer;
294c2d66379753e2b7680811726424026b9e54b18aFelipe Lemestruct AMessage;
30fd8affa8840d2d9f7f320201521a702919c677ffFelipe Lemestruct AString;
31fd8affa8840d2d9f7f320201521a702919c677ffFelipe Lemestruct CodecBase;
324c2d66379753e2b7680811726424026b9e54b18aFelipe Lemestruct ICrypto;
33fd8affa8840d2d9f7f320201521a702919c677ffFelipe Lemestruct SoftwareRenderer;
344c2d66379753e2b7680811726424026b9e54b18aFelipe Lemestruct Surface;
354c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
36d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Lemestruct MediaCodec : public AHandler {
37d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme    enum ConfigureFlags {
38fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme        CONFIGURE_FLAG_ENCODE   = 1,
394c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    };
4047e9be2d71c5eca9002e289c98e8bbc20dffc073Felipe Leme
4147e9be2d71c5eca9002e289c98e8bbc20dffc073Felipe Leme    enum BufferFlags {
4247e9be2d71c5eca9002e289c98e8bbc20dffc073Felipe Leme        BUFFER_FLAG_SYNCFRAME   = 1,
43d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme        BUFFER_FLAG_CODECCONFIG = 2,
444c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        BUFFER_FLAG_EOS         = 4,
4546b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    };
46009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme
474c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    static sp<MediaCodec> CreateByType(
48009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme            const sp<ALooper> &looper, const char *mime, bool encoder);
494c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
504c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    static sp<MediaCodec> CreateByComponentName(
514c2d66379753e2b7680811726424026b9e54b18aFelipe Leme            const sp<ALooper> &looper, const char *name);
524c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
534c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t configure(
544c2d66379753e2b7680811726424026b9e54b18aFelipe Leme            const sp<AMessage> &format,
554c2d66379753e2b7680811726424026b9e54b18aFelipe Leme            const sp<Surface> &nativeWindow,
564c2d66379753e2b7680811726424026b9e54b18aFelipe Leme            const sp<ICrypto> &crypto,
5775876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme            uint32_t flags);
5875876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme
5975876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
6075876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme
6175876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme    status_t start();
6275876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme
6375876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme    // Returns to a state in which the component remains allocated but
6475876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme    // unconfigured.
6575876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme    status_t stop();
6646b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
6746b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    // Client MUST call release before releasing final reference to this
687447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    // object.
697447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t release();
7046b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
7146b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    status_t flush();
7246b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
73f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme    status_t queueInputBuffer(
7446b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            size_t index,
7546b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            size_t offset,
76f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            size_t size,
77f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            int64_t presentationTimeUs,
7846b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            uint32_t flags,
7946b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            AString *errorDetailMsg = NULL);
80f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme
81f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme    status_t queueSecureInputBuffer(
82f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            size_t index,
83f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            size_t offset,
84f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            const CryptoPlugin::SubSample *subSamples,
85f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            size_t numSubSamples,
8646b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            const uint8_t key[16],
8746b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            const uint8_t iv[16],
88f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            CryptoPlugin::Mode mode,
89f029297f673ae06d219bd727a318a48b885db6fdFelipe Leme            int64_t presentationTimeUs,
9046b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            uint32_t flags,
9146b85da716a32f285fe1222e9978beacc8697d09Felipe Leme            AString *errorDetailMsg = NULL);
9246b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
9346b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
947447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
957447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t dequeueOutputBuffer(
967447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            size_t *index,
977447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            size_t *offset,
987447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            size_t *size,
997447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            int64_t *presentationTimeUs,
1007447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            uint32_t *flags,
1017447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme            int64_t timeoutUs = 0ll);
1027447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1037447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1047447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t renderOutputBufferAndRelease(size_t index);
1057447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t releaseOutputBuffer(size_t index);
1067447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1077447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t signalEndOfInputStream();
1087447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1097447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t getOutputFormat(sp<AMessage> *format) const;
1107447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t getInputFormat(sp<AMessage> *format) const;
1117447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1127447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1137447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1147447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1157447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    status_t requestIDRFrame();
1167447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
11746b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    // Notification will be posted once there "is something to do", i.e.
1187447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    // an input/output buffer has become available, a format change is
11946b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    // pending, an error is pending.
12046b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    void requestActivityNotification(const sp<AMessage> &notify);
12146b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
12246b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    status_t getName(AString *componentName) const;
12346b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
12446b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    status_t setParameters(const sp<AMessage> &params);
12546b85da716a32f285fe1222e9978beacc8697d09Felipe Leme
12646b85da716a32f285fe1222e9978beacc8697d09Felipe Lemeprotected:
12746b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    virtual ~MediaCodec();
12846b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    virtual void onMessageReceived(const sp<AMessage> &msg);
1297447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1307447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Lemeprivate:
13146b85da716a32f285fe1222e9978beacc8697d09Felipe Leme    enum State {
13246b85da716a32f285fe1222e9978beacc8697d09Felipe Leme        UNINITIALIZED,
1337447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        INITIALIZING,
1347447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        INITIALIZED,
1357447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        CONFIGURING,
1367447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        CONFIGURED,
1374c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        STARTING,
1384c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        STARTED,
13946b85da716a32f285fe1222e9978beacc8697d09Felipe Leme        FLUSHING,
1404c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        STOPPING,
141d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme        RELEASING,
1427447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    };
1439a523aed06ef962f67385ac88191b08dc91059f4Felipe Leme
144009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme    enum {
1454c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kPortIndexInput         = 0,
1464c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kPortIndexOutput        = 1,
1474c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    };
1489a523aed06ef962f67385ac88191b08dc91059f4Felipe Leme
1494c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    enum {
1504c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatInit                           = 'init',
1514c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatConfigure                      = 'conf',
1529a523aed06ef962f67385ac88191b08dc91059f4Felipe Leme        kWhatCreateInputSurface             = 'cisf',
1534c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatStart                          = 'strt',
1544c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatStop                           = 'stop',
1554c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatRelease                        = 'rele',
1564c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatDequeueInputBuffer             = 'deqI',
1574c2d66379753e2b7680811726424026b9e54b18aFelipe Leme        kWhatQueueInputBuffer               = 'queI',
158cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatDequeueOutputBuffer            = 'deqO',
159cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatReleaseOutputBuffer            = 'relO',
160cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatSignalEndOfInputStream         = 'eois',
161cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatGetBuffers                     = 'getB',
162cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatFlush                          = 'flus',
163cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatGetOutputFormat                = 'getO',
164cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatGetInputFormat                 = 'getI',
165cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatDequeueInputTimedOut           = 'dITO',
166cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatDequeueOutputTimedOut          = 'dOTO',
167cef0298e2540e6ad8c2728e6fcc007247c68aac0Felipe Leme        kWhatCodecNotify                    = 'codc',
168009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kWhatRequestIDRFrame                = 'ridr',
1697447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        kWhatRequestActivityNotification    = 'racN',
170009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kWhatGetName                        = 'getN',
171009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kWhatSetParameters                  = 'setP',
1727447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    };
1737447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
1747447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    enum {
175009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kFlagIsSoftwareCodec            = 1,
176009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kFlagOutputFormatChanged        = 2,
1777447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        kFlagOutputBuffersChanged       = 4,
1787447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        kFlagStickyError                = 8,
179d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme        kFlagDequeueInputPending        = 16,
1807447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme        kFlagDequeueOutputPending       = 32,
181d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme        kFlagIsSecure                   = 64,
182009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kFlagSawMediaServerDie          = 128,
1839a523aed06ef962f67385ac88191b08dc91059f4Felipe Leme        kFlagIsEncoder                  = 256,
184009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        kFlagGatherCodecSpecificData    = 512,
1857447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    };
186d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme
187d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme    struct BufferInfo {
188009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        uint32_t mBufferID;
189009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        sp<ABuffer> mData;
190009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme        sp<ABuffer> mEncryptedData;
19175876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme        sp<AMessage> mNotify;
19275876a2c0649b8cde36329ca0a1dc6e349af6493Felipe Leme        bool mOwnedByClient;
193009ecbbd3fcfd06735b0102f0342fc7e60166d9bFelipe Leme    };
194d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme
195d80e6b6109c52d57ebba675c1f97fcb2ca1d93c5Felipe Leme    State mState;
1964c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<ALooper> mLooper;
1974c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<ALooper> mCodecLooper;
1984c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<CodecBase> mCodec;
199fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    AString mComponentName;
2004c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    uint32_t mReplyID;
2014c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    uint32_t mFlags;
2024c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<Surface> mNativeWindow;
2034c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    SoftwareRenderer *mSoftRenderer;
2044c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<AMessage> mOutputFormat;
2054c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<AMessage> mInputFormat;
2064c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2077447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    List<size_t> mAvailPortBuffers[2];
2084c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    Vector<BufferInfo> mPortBuffers[2];
2094c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2104c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    int32_t mDequeueInputTimeoutGeneration;
2114c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    uint32_t mDequeueInputReplyID;
2124c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2137447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    int32_t mDequeueOutputTimeoutGeneration;
2144c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    uint32_t mDequeueOutputReplyID;
2154c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
216fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    sp<ICrypto> mCrypto;
2177447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
2184c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    List<sp<ABuffer> > mCSD;
2194c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2204c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    sp<AMessage> mActivityNotify;
221fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme
2224c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    bool mHaveInputSurface;
2237447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
224fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    MediaCodec(const sp<ALooper> &looper);
225fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme
226fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    static status_t PostAndAwaitResponse(
227fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme            const sp<AMessage> &msg, sp<AMessage> *response);
228fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme
229fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    status_t init(const char *name, bool nameIsType, bool encoder);
2307447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
231fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    void setState(State newState);
2324c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    void returnBuffersToCodec();
233fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme    void returnBuffersToCodecOnPort(int32_t portIndex);
2344c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2354c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2364c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2377447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    ssize_t dequeuePortBuffer(int32_t portIndex);
2384c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2394c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2404c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2414c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    void cancelPendingDequeueOperations();
242fd8affa8840d2d9f7f320201521a702919c677ffFelipe Leme
2437447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme    void extractCSD(const sp<AMessage> &format);
2444c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t queueCSDInputBuffer(size_t bufferIndex);
2454c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2464c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t setNativeWindow(
2474c2d66379753e2b7680811726424026b9e54b18aFelipe Leme            const sp<Surface> &surface);
2484c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2494c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    void postActivityNotificationIfPossible();
2507447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
2514c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t onSetParameters(const sp<AMessage> &params);
2527447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme
2534c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
2544c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2554c2d66379753e2b7680811726424026b9e54b18aFelipe Leme    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2564c2d66379753e2b7680811726424026b9e54b18aFelipe Leme};
2574c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2584c2d66379753e2b7680811726424026b9e54b18aFelipe Leme}  // namespace android
2594c2d66379753e2b7680811726424026b9e54b18aFelipe Leme
2607447d7c3d74b28f1a071b1d3503212cc8ad08d68Felipe Leme#endif  // MEDIA_CODEC_H_
2614c2d66379753e2b7680811726424026b9e54b18aFelipe Leme