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
21dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <memory>
22dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <vector>
23dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber#include <media/hardware/CryptoAPI.h>
265b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar#include <media/MediaCodecInfo.h>
2767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu#include <media/MediaResource.h>
28db1221479a7ffe7094c51c463bbd36522ed106abRay Essick#include <media/MediaAnalyticsItem.h>
295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AHandler.h>
3090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar#include <media/stagefright/FrameRenderTracker.h>
315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Vector.h>
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
335778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct ABuffer;
365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage;
373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString;
39dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass BufferChannelBase;
4092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnarstruct CodecBase;
41be8f14c64b3af442dc1341ea9bf1ca68e56dd824Colin Crossclass IBatteryStats;
42c481b5012a5f6cf72e5e93b36f1ed4c9169916f2Jeff Tinkerstruct ICrypto;
437e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kimclass MediaCodecBuffer;
44ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass IMemory;
4567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerClient;
4667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wuclass IResourceManagerService;
47d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface;
4861c2351da89cb281b2dfd56c6c6779ccb4bc1172Dan Willemsenclass SoftwareRenderer;
49be8f14c64b3af442dc1341ea9bf1ca68e56dd824Colin Crossclass Surface;
509dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace media {
519dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangclass IDescrambler;
529dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang};
539dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangusing namespace media;
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
555778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
66c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    enum {
67c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_INPUT_AVAILABLE = 1,
68c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_AVAILABLE = 2,
69c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_ERROR = 3,
70c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        CB_OUTPUT_FORMAT_CHANGED = 4,
7199acce4526db0f14be6e516ecb3920d5ed66877bRonghua Wu        CB_RESOURCE_RECLAIMED = 5,
72c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    };
73c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
7468845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu    static const pid_t kNoPid = -1;
75f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia    static const uid_t kNoUid = -1;
7668845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
786fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar            const sp<ALooper> &looper, const AString &mime, bool encoder, status_t *err = NULL,
79f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia            pid_t pid = kNoPid, uid_t uid = kNoUid);
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
826fc17d1a7c5d2fb117491b2e9f66c6236b526508Lajos Molnar            const sp<ALooper> &looper, const AString &name, status_t *err = NULL,
83f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia            pid_t pid = kNoPid, uid_t uid = kNoUid);
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
85d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    static sp<PersistentSurface> CreatePersistentInputSurface();
86d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
875b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    // utility method to query capabilities
885b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    static status_t QueryCapabilities(
895b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            const AString &name, const AString &mime, bool isEncoder,
905b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */);
915b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
941a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian            const sp<Surface> &nativeWindow,
951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
989dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    status_t configure(
999dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            const sp<AMessage> &format,
1009dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            const sp<Surface> &nativeWindow,
1019dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            const sp<ICrypto> &crypto,
1029dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            const sp<IDescrambler> &descrambler,
1039dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            uint32_t flags);
1049dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
105cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    status_t releaseCrypto();
106cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
107c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    status_t setCallback(const sp<AMessage> &callback);
108c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
10990fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    status_t setOnFrameRenderedNotification(const sp<AMessage> &notify);
11090fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
1117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
1127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1138f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    status_t setInputSurface(const sp<PersistentSurface> &surface);
114d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
116c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
117c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
118c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
121671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // Resets the codec to the INITIALIZED state.  Can be called after an error
122671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // has occured to make the codec usable.
123671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    status_t reset();
124671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
125c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
126c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
127c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
128c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
1365b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1375b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1394b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
1404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
1414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
1424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
1434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
1444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
1454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
1464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
14718cb1eca504817b5b144a023ae2792d90e74c9a5Jeff Tinker            const CryptoPlugin::Pattern &pattern,
1484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
1495b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
1505b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
1514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
162fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t signalEndOfInputStream();
1677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
169e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t getInputFormat(sp<AMessage> *format) const;
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1717e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim    status_t getInputBuffers(Vector<sp<MediaCodecBuffer> > *buffers) const;
1727e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim    status_t getOutputBuffers(Vector<sp<MediaCodecBuffer> > *buffers) const;
1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1747e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim    status_t getOutputBuffer(size_t index, sp<MediaCodecBuffer> *buffer);
1757bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1767e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim    status_t getInputBuffer(size_t index, sp<MediaCodecBuffer> *buffer);
1777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
1781dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t setSurface(const sp<Surface> &nativeWindow);
1791dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar
180496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
181496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
182575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
183575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
184575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
185575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
187717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
188717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
189afb43f76821e6a63e17e6484289a40430ada6978Ray Essick    status_t getMetrics(MediaAnalyticsItem * &reply);
190db1221479a7ffe7094c51c463bbd36522ed106abRay Essick
191a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t setParameters(const sp<AMessage> &params);
192a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
19390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // Create a MediaCodec notification message from a list of rendered or dropped render infos
19490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // by adding rendered frame information to a base notification message. Returns the number
19590fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    // of frames that were rendered.
19690fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    static size_t CreateFramesRenderedMessage(
19740d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh            const std::list<FrameRenderTracker::Info> &done, sp<AMessage> &msg);
19890fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
20447a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    // used by ResourceManagerClient
2054b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    status_t reclaim(bool force = false);
20647a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    friend struct ResourceManagerClient;
20747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu
20847a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wuprivate:
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
2180e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar        FLUSHED,
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
229575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
230575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
2311dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar        kWhatSetSurface                     = 'sSur',
2327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatCreateInputSurface             = 'cisf',
2338f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang        kWhatSetInputSurface                = 'sisf',
234575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
235575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
236575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
237575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
238575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
239575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
240575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
2417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        kWhatSignalEndOfInputStream         = 'eois',
242575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
243575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
244575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
245e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        kWhatGetInputFormat                 = 'getI',
246575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
247575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
248575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
249575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
250575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
251717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
252a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        kWhatSetParameters                  = 'setP',
253c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kWhatSetCallback                    = 'setC',
25490fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar        kWhatSetNotification                = 'setN',
255cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania        kWhatDrmReleaseCrypto               = 'rDrm',
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
2593a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar        kFlagUsesSoftwareRenderer       = 1,
2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
265ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
266aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        kFlagSawMediaServerDie          = 128,
267e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        kFlagIsEncoder                  = 256,
268fd44d8e2f2d37184f7add67125657f3fbfb5a085Wonsik Kim        // 512 skipped
269c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang        kFlagIsAsync                    = 1024,
27052dfbee90cc3c4426428318e06a92774f5201198Praveen Chavan        kFlagIsComponentAllocated       = 2048,
2718b23759763dbf11b0c628a7e62dc5b3dea7dc188Lajos Molnar        kFlagPushBlankBuffersOnShutdown = 4096,
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
275dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        BufferInfo();
276dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
2777e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim        sp<MediaCodecBuffer> mData;
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
28167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    struct ResourceManagerServiceProxy : public IBinder::DeathRecipient {
28268845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu        ResourceManagerServiceProxy(pid_t pid);
28367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        ~ResourceManagerServiceProxy();
28467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
28567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void init();
28667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
28767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        // implements DeathRecipient
28867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        virtual void binderDied(const wp<IBinder>& /*who*/);
28967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
29067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void addResource(
29167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                int64_t clientId,
29240d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh                const sp<IResourceManagerClient> &client,
29367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu                const Vector<MediaResource> &resources);
29467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
29567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        void removeResource(int64_t clientId);
29667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
29737c8924c508a7c9b8bd3c8ce80fc005070531902Ronghua Wu        bool reclaimResource(const Vector<MediaResource> &resources);
29867e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
29967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    private:
30067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        Mutex mLock;
30167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu        sp<IResourceManagerService> mService;
30268845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu        pid_t mPid;
30367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    };
30467e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
306f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia    uid_t mUid;
30747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    bool mReleasedByResourceManager;
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
31092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    sp<CodecBase> mCodec;
311717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
3123f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mReplyID;
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
314251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    status_t mStickyError;
315f06cc24ce7aeb5ff6f45b770a15286c95f8cc9ffLajos Molnar    sp<Surface> mSurface;
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
31790fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar
318db1221479a7ffe7094c51c463bbd36522ed106abRay Essick    MediaAnalyticsItem *mAnalyticsItem;
319db1221479a7ffe7094c51c463bbd36522ed106abRay Essick
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
321e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> mInputFormat;
322c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    sp<AMessage> mCallback;
32390fcf68fd29f3cb695bd53a830ad984cb7d430c0Lajos Molnar    sp<AMessage> mOnFrameRenderedNotification;
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
32567e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<IResourceManagerClient> mResourceManagerClient;
32667e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<ResourceManagerServiceProxy> mResourceManagerService;
32767e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3282606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mBatteryStatNotified;
3292606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    bool mIsVideo;
33067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoWidth;
33167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    int32_t mVideoHeight;
332505aab41c0e8e79a49d4506344fcd9d220d5965bChong Zhang    int32_t mRotationDegrees;
3332606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang
334671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    // initial create parameters
335671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    AString mInitName;
336671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitNameIsType;
337671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar    bool mInitIsEncoder;
338671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar
33967e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    // configure parameter
34067e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    sp<AMessage> mConfigureMsg;
34167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
3427bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // Used only to synchronize asynchronous getBufferAndFormat
3437bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // across all the other (synchronous) buffer state change
3447bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // operations, such as de/queueIn/OutputBuffer, start and
3457bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    // stop/flush/reset/release.
3467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    Mutex mBufferLock;
3477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
349dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::vector<BufferInfo> mPortBuffers[2];
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
3523f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueInputReplyID;
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
3553f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDequeueOutputReplyID;
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
357ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
358ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
3599dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    sp<IDescrambler> mDescrambler;
3609dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
3618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
3628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
363575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
364575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3656507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden    bool mHaveInputSurface;
3663d66eb4128aebef31bb0fa44c4d53d6122294a26Chong Zhang    bool mHavePendingInputBuffers;
3676507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
368dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::shared_ptr<BufferChannelBase> mBufferChannel;
369dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
370f2ae3e19080938db8cbf29a963fd744a3964fcc2Wei Jia    MediaCodec(const sp<ALooper> &looper, pid_t pid, uid_t uid);
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3725b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar    static sp<CodecBase> GetCodecBase(const AString &name, bool nameIsType = false);
3735b05e49e6550cb2abf1a88272d6cd460b8957176Lajos Molnar
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
37747a2e875bdd2bd25cb8500208940ff1488b01e08Ronghua Wu    void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err);
378c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
379dc9f58dc23a86d0635fd8601d1cbc8d47bab0303Andy Hung    status_t init(const AString &name, bool nameIsType, bool encoder);
3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
38286b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu    void returnBuffersToCodec(bool isReclaim = false);
38386b997dcf1101cdd259460fb4f82204200a9a993Ronghua Wu    void returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim = false);
3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3897bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar    status_t getBufferAndFormat(
3907bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar            size_t portIndex, size_t index,
3917e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            sp<MediaCodecBuffer> *buffer, sp<AMessage> *format);
3927bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar
3933f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueInputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3943f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool handleDequeueOutputBuffer(const sp<AReplyToken> &replyID, bool newRequest = false);
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
3988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
3998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
4001dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t handleSetSurface(const sp<Surface> &surface);
4011dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t connectToSurface(const sp<Surface> &surface);
4021dcdfead2971c1fa7c02f24ba86f706890c9f99eLajos Molnar    status_t disconnectFromSurface();
4037541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
4043b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool hasCryptoOrDescrambler() {
4053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return mCrypto != NULL || mDescrambler != NULL;
4063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
4073b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
408575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
409575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
410c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onInputBufferAvailable();
411c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputBufferAvailable();
412749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang    void onError(status_t err, int32_t actionCode, const char *detail = NULL);
413c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang    void onOutputFormatChanged();
414c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang
415a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    status_t onSetParameters(const sp<AMessage> &params);
416a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
4177e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim    status_t amendOutputFormatWithCodecSpecificData(const sp<MediaCodecBuffer> &buffer);
4182606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang    void updateBatteryStat();
4190e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar    bool isExecuting() const;
420e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
42167e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu    uint64_t getGraphicBufferSize();
422ea15fd29af81490311af9e12949b43524c39400eRonghua Wu    void addResource(MediaResource::Type type, MediaResource::SubType subtype, uint64_t value);
42367e7f543c7f1c4fe4ee1989ceb0aebe44a63b49eRonghua Wu
4244b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    bool hasPendingBuffer(int portIndex);
4254b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu    bool hasPendingBuffer();
4264b710f086070fabe022b3a1f474bfcbec842b8fcRonghua Wu
427251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    /* called to get the last codec error when the sticky flag is set.
428251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     * if no such codec error is found, returns UNKNOWN_ERROR.
429251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung     */
430251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline status_t getStickyError() const {
431251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        return mStickyError != 0 ? mStickyError : UNKNOWN_ERROR;
432251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
433251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
434251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    inline void setStickyError(status_t err) {
435251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mFlags |= kFlagStickyError;
436251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung        mStickyError = err;
437251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung    }
438251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung
439cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania    void onReleaseCrypto(const sp<AMessage>& msg);
440cefac14261a32fb856b0d1ab31541787112e306eHassan Shojania
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
447