MediaCodec.h revision 99acce4526db0f14be6e516ecb3920d5ed66877b
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project
35778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License.
65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at
75778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
85778822d86b0337407514b9372562b86edfa91cdAndreas Huber *     http://www.apache.org/licenses/LICENSE-2.0
95778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software
115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and
145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License.
155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
175778822d86b0337407514b9372562b86edfa91cdAndreas Huber#ifndef MEDIA_CODEC_H_
185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define MEDIA_CODEC_H_
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
218ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber#include <media/hardware/CryptoAPI.h>
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h>
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h>
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
265778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer;
295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage;
303f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString;
3292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase;
33ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto;
342606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct IBatteryStats;
355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer;
361a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface;
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
385778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
49c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    enum {
50c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_INPUT_AVAILABLE = 1,
51c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_AVAILABLE = 2,
52c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_ERROR = 3,
53c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_FORMAT_CHANGED = 4,
5499acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu        CB_RESOURCE_RECLAIMED = 5,
55c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    };
56c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
572606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    struct BatteryNotifier;
582606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            const sp<ALooper> &looper, const char *mime, bool encoder, status_t *err = NULL);
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            const sp<ALooper> &looper, const char *name, status_t *err = NULL);
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
671a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &nativeWindow,
681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
71c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    status_t setCallback(const sp<AMessage> &callback);
72c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
76c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
77c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
78c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
81671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // Resets the codec to the INITIALIZED state.  Can be called after an error
82671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // has occured to make the codec usable.
83671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    status_t reset();
84671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
85c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
86c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
87c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
88c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
965b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
975b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
1004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
1014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
1024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
1034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
1044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
1054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
1064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
1074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
1085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
121fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t signalEndOfInputStream();
1267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
128e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t getInputFormat(sp<AMessage> *format) const;
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1337bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer);
1347bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1357bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getInputBuffer(size_t index, sp<ABuffer> *buffer);
1367bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
137496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
138496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
139575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
140575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
141575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
142575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
143575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
144717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
145717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
146a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t setParameters(const sp<AMessage> &params);
147a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1620e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar        FLUSHED,
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
164c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
173575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
174575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
1757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatCreateInputSurface             = 'cisf',
176575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
177575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
178575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
179575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
180575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
181575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
182575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
1837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatSignalEndOfInputStream         = 'eois',
184575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
185575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
187e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        kWhatGetInputFormat                 = 'getI',
188575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
189575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
190575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
191575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
192575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
193717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
194a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        kWhatSetParameters                  = 'setP',
195c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kWhatSetCallback                    = 'setC',
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1993a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar        kFlagUsesSoftwareRenderer       = 1,
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
205ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
206aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        kFlagSawMediaServerDie          = 128,
207e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagIsEncoder                  = 256,
208e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagGatherCodecSpecificData    = 512,
209c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kFlagIsAsync                    = 1024,
21052dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan        kFlagIsComponentAllocated       = 2048,
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
214609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        uint32_t mBufferID;
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
216ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
2187bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar        sp<AMessage> mFormat;
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
22592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    sp<CodecBase> mCodec;
226717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
2273f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mReplyID;
2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
229251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    status_t mStickyError;
2301a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    sp<Surface> mNativeWindow;
2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
233e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> mInputFormat;
234c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    sp<AMessage> mCallback;
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2362606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mBatteryStatNotified;
2372606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mIsVideo;
2382606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
239671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // initial create parameters
240671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    AString mInitName;
241671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitNameIsType;
242671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitIsEncoder;
243671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
2447bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // Used only to synchronize asynchronous getBufferAndFormat
2457bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // across all the other (synchronous) buffer state change
2467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // operations, such as de/queueIn/OutputBuffer, start and
2477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // stop/flush/reset/release.
2487bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    Mutex mBufferLock;
2497bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
2543f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueInputReplyID;
2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
2573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueOutputReplyID;
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
259ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
260ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
2628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
263575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
264575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
2656507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    bool mHaveInputSurface;
2666507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    MediaCodec(const sp<ALooper> &looper);
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2723f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    static void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err);
273c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
274dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung    status_t init(const AString &name, bool nameIsType, bool encoder);
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodec();
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodecOnPort(int32_t portIndex);
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2847bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getBufferAndFormat(
2857bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            size_t portIndex, size_t index,
2867bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            sp<ABuffer> *buffer, sp<AMessage> *format);
2877bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
2883f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
2893f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
2938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
2948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
2957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t setNativeWindow(
2961a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &surface);
2977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
298575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
299575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
300c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onInputBufferAvailable();
301c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputBufferAvailable();
302749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang    void onError(status_t err, int32_t actionCode, const char *detail = NULL);
303c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputFormatChanged();
304c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
305a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t onSetParameters(const sp<AMessage> &params);
306a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
307e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
3082606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    void updateBatteryStat();
3090e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar    bool isExecuting() const;
310e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
311251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    /* called to get the last codec error when the sticky flag is set.
312251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     * if no such codec error is found, returns UNKNOWN_ERROR.
313251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     */
314251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline status_t getStickyError() const {
315251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR;
316251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
317251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
318251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline void setStickyError(status_t err) {
319251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mFlags |= kFlagStickyError;
320251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mStickyError = err;
321251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
322251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
329