MediaCodec.h revision 717fd3d4328abf524978ce9c125ab8ae8d6bffad
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
215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/ISurfaceTexture.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 ACodec;
305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct AMessage;
315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huberstruct AString;
32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto;
335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer;
345778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SurfaceTextureClient;
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *mime, bool encoder);
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *name);
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<SurfaceTextureClient> &nativeWindow,
561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
60c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
61c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
62c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
65c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
66c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
67c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
68c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
765b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
804b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
885b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            uint32_t flags,
895b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber            AString *errorDetailMsg = NULL);
904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
109496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    status_t requestIDRFrame();
110496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
111575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // Notification will be posted once there "is something to do", i.e.
112575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // an input/output buffer has become available, a format change is
113575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    // pending, an error is pending.
114575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void requestActivityNotification(const sp<AMessage> &notify);
115575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
116717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t getName(AString *componentName) const;
117717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
133c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
142575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatInit                           = 'init',
143575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatConfigure                      = 'conf',
144575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStart                          = 'strt',
145575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatStop                           = 'stop',
146575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRelease                        = 'rele',
147575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputBuffer             = 'deqI',
148575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatQueueInputBuffer               = 'queI',
149575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputBuffer            = 'deqO',
150575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatReleaseOutputBuffer            = 'relO',
151575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetBuffers                     = 'getB',
152575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatFlush                          = 'flus',
153575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatGetOutputFormat                = 'getO',
154575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueInputTimedOut           = 'dITO',
155575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatDequeueOutputTimedOut          = 'dOTO',
156575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatCodecNotify                    = 'codc',
157575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestIDRFrame                = 'ridr',
158575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        kWhatRequestActivityNotification    = 'racN',
159717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        kWhatGetName                        = 'getN',
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagIsSoftwareCodec            = 1,
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
169ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        void *mBufferID;
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
175ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ACodec> mCodec;
184717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    AString mComponentName;
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mReplyID;
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<SurfaceTextureClient> mNativeWindow;
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueInputReplyID;
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueOutputReplyID;
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
200ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
201ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
2028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    List<sp<ABuffer> > mCSD;
2038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
204575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> mActivityNotify;
205575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    MediaCodec(const sp<ALooper> &looper);
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t init(const char *name, bool nameIsType, bool encoder);
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodec();
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodecOnPort(int32_t portIndex);
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    void extractCSD(const sp<AMessage> &format);
2268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    status_t queueCSDInputBuffer(size_t bufferIndex);
2278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
2287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t setNativeWindow(
2297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            const sp<SurfaceTextureClient> &surfaceTextureClient);
2307541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
231575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    void postActivityNotificationIfPossible();
232575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
239