MediaCodec.h revision 1dcdfead2971c1fa7c02f24ba86f706890c9f99e
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>
2367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#include <media/MediaResource.h>
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h>
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h>
265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
275778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer;
305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage;
313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString;
3392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase;
342606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct IBatteryStats;
35c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto;
36ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory;
37c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct MemoryDealer;
3867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient;
3967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService;
405778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer;
411a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopianstruct Surface;
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
435778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
54c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    enum {
55c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_INPUT_AVAILABLE = 1,
56c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_AVAILABLE = 2,
57c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_ERROR = 3,
58c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_FORMAT_CHANGED = 4,
5999acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu        CB_RESOURCE_RECLAIMED = 5,
60c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    };
61c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
622606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    struct BatteryNotifier;
632606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            const sp<ALooper> &looper, const char *mime, bool encoder, status_t *err = NULL);
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung            const sp<ALooper> &looper, const char *name, status_t *err = NULL);
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
721a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &nativeWindow,
731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
76c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    status_t setCallback(const sp<AMessage> &callback);
77c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
81c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
82c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
83c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
86671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // Resets the codec to the INITIALIZED state.  Can be called after an error
87671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // has occured to make the codec usable.
88671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    status_t reset();
89671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
90c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
91c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
92c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
93c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
1015b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1025b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
1054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
1064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
1074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
1084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
1094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
1104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
1114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
1124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
1135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
126fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t signalEndOfInputStream();
1317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
133e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t getInputFormat(sp<AMessage> *format) const;
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
135e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar    status_t getWidevineLegacyBuffers(Vector<sp<ABuffer> > *buffers) const;
136e6109e2f10b43c2cc2561c6fd6633b5f988bd7a9Lajos Molnar
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1407bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer);
1417bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1427bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getInputBuffer(size_t index, sp<ABuffer> *buffer);
1437bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
1441dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t setSurface(const sp<Surface> &nativeWindow);
1451dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
146496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
147496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
148575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
149575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
150575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
151575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
152575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
153717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
154717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
155a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t setParameters(const sp<AMessage> &params);
156a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1710e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar        FLUSHED,
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
173c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
182575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
183575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
1841dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar        kWhatSetSurface                     = 'sSur',
1857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatCreateInputSurface             = 'cisf',
186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
187575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
188575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
189575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
190575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
191575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
192575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
1937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatSignalEndOfInputStream         = 'eois',
194575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
195575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
196575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
197e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        kWhatGetInputFormat                 = 'getI',
198575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
199575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
200575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
201575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
202575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
203717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
204a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        kWhatSetParameters                  = 'setP',
205c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kWhatSetCallback                    = 'setC',
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
2093a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar        kFlagUsesSoftwareRenderer       = 1,
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
215ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
216aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        kFlagSawMediaServerDie          = 128,
217e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagIsEncoder                  = 256,
218e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagGatherCodecSpecificData    = 512,
219c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kFlagIsAsync                    = 1024,
22052dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan        kFlagIsComponentAllocated       = 2048,
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
224609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        uint32_t mBufferID;
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
226ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
227c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker        sp<IMemory> mSharedEncryptedBuffer;
2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
2297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar        sp<AMessage> mFormat;
2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
23367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    struct ResourceManagerServiceProxy : public IBinder::DeathRecipient {
23467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        ResourceManagerServiceProxy();
23567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        ~ResourceManagerServiceProxy();
23667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
23767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void init();
23867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
23967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // implements DeathRecipient
24067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        virtual void binderDied(const wp<IBinder>& /*who*/);
24167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
24267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void addResource(
24367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                int pid,
24467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                int64_t clientId,
24567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                const sp<IResourceManagerClient> client,
24667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                const Vector<MediaResource> &resources);
24767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
24867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void removeResource(int64_t clientId);
24967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
25067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        bool reclaimResource(int callingPid, const Vector<MediaResource> &resources);
25167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
25267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    private:
25367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        Mutex mLock;
25467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        sp<IResourceManagerService> mService;
25567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    };
25667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
26092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    sp<CodecBase> mCodec;
261717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
2623f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mReplyID;
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
264251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    status_t mStickyError;
265f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar    sp<Surface> mSurface;
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
268e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> mInputFormat;
269c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    sp<AMessage> mCallback;
270c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinker    sp<MemoryDealer> mDealer;
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
27267e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<IResourceManagerClient> mResourceManagerClient;
27367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<ResourceManagerServiceProxy> mResourceManagerService;
27467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
2752606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mBatteryStatNotified;
2762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mIsVideo;
27767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoWidth;
27867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoHeight;
2792606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
280671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // initial create parameters
281671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    AString mInitName;
282671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitNameIsType;
283671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitIsEncoder;
284671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // configure parameter
28667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<AMessage> mConfigureMsg;
28767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
2887bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // Used only to synchronize asynchronous getBufferAndFormat
2897bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // across all the other (synchronous) buffer state change
2907bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // operations, such as de/queueIn/OutputBuffer, start and
2917bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // stop/flush/reset/release.
2927bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    Mutex mBufferLock;
2937bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
2983f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueInputReplyID;
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
3013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueOutputReplyID;
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
303ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
304ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
3058ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
3068ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
307575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
308575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3096507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    bool mHaveInputSurface;
3103d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang    bool mHavePendingInputBuffers;
3116507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    MediaCodec(const sp<ALooper> &looper);
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3173f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    static void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err);
318c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
319dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung    status_t init(const AString &name, bool nameIsType, bool encoder);
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodec();
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodecOnPort(int32_t portIndex);
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getBufferAndFormat(
3307bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            size_t portIndex, size_t index,
3317bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            sp<ABuffer> *buffer, sp<AMessage> *format);
3327bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
3333f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3343f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
3388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
3398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
3401dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t handleSetSurface(const sp<Surface> &surface);
3411dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t connectToSurface(const sp<Surface> &surface);
3421dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t disconnectFromSurface();
3437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
344575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
345575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
346c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onInputBufferAvailable();
347c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputBufferAvailable();
348749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang    void onError(status_t err, int32_t actionCode, const char *detail = NULL);
349c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputFormatChanged();
350c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
351a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t onSetParameters(const sp<AMessage> &params);
352a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
353e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
3542606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    void updateBatteryStat();
3550e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar    bool isExecuting() const;
356e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
35767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    uint64_t getGraphicBufferSize();
358c721e71f4d7e3cd4fc9332fd55fb6942f54cec39Ronghua Wu    void addResource(const String8 &type, const String8 &subtype, uint64_t value);
35967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
360251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    /* called to get the last codec error when the sticky flag is set.
361251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     * if no such codec error is found, returns UNKNOWN_ERROR.
362251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     */
363251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline status_t getStickyError() const {
364251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR;
365251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
366251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
367251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline void setStickyError(status_t err) {
368251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mFlags |= kFlagStickyError;
369251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mStickyError = err;
370251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
371251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
378