MediaCodec.h revision c5619c7a6dcc1137fde7520351ad5284e3e958ab
18225b7c95185dfbfe67da105df4402430784393cRobert Sesek/*
28225b7c95185dfbfe67da105df4402430784393cRobert Sesek * Copyright 2012, The Android Open Source Project
38225b7c95185dfbfe67da105df4402430784393cRobert Sesek *
48225b7c95185dfbfe67da105df4402430784393cRobert Sesek * Licensed under the Apache License, Version 2.0 (the "License");
58225b7c95185dfbfe67da105df4402430784393cRobert Sesek * you may not use this file except in compliance with the License.
68225b7c95185dfbfe67da105df4402430784393cRobert Sesek * You may obtain a copy of the License at
78225b7c95185dfbfe67da105df4402430784393cRobert Sesek *
88225b7c95185dfbfe67da105df4402430784393cRobert Sesek *     http://www.apache.org/licenses/LICENSE-2.0
98225b7c95185dfbfe67da105df4402430784393cRobert Sesek *
108225b7c95185dfbfe67da105df4402430784393cRobert Sesek * Unless required by applicable law or agreed to in writing, software
118225b7c95185dfbfe67da105df4402430784393cRobert Sesek * distributed under the License is distributed on an "AS IS" BASIS,
128225b7c95185dfbfe67da105df4402430784393cRobert Sesek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138225b7c95185dfbfe67da105df4402430784393cRobert Sesek * See the License for the specific language governing permissions and
148225b7c95185dfbfe67da105df4402430784393cRobert Sesek * limitations under the License.
158225b7c95185dfbfe67da105df4402430784393cRobert Sesek */
168225b7c95185dfbfe67da105df4402430784393cRobert Sesek
178225b7c95185dfbfe67da105df4402430784393cRobert Sesek#ifndef MEDIA_CODEC_H_
188225b7c95185dfbfe67da105df4402430784393cRobert Sesek
198225b7c95185dfbfe67da105df4402430784393cRobert Sesek#define MEDIA_CODEC_H_
208225b7c95185dfbfe67da105df4402430784393cRobert Sesek
218225b7c95185dfbfe67da105df4402430784393cRobert Sesek#include <gui/IGraphicBufferProducer.h>
228225b7c95185dfbfe67da105df4402430784393cRobert Sesek#include <media/hardware/CryptoAPI.h>
238225b7c95185dfbfe67da105df4402430784393cRobert Sesek#include <media/stagefright/foundation/AHandler.h>
248225b7c95185dfbfe67da105df4402430784393cRobert Sesek#include <utils/Vector.h>
258225b7c95185dfbfe67da105df4402430784393cRobert Sesek
268225b7c95185dfbfe67da105df4402430784393cRobert Seseknamespace android {
278225b7c95185dfbfe67da105df4402430784393cRobert Sesek
288225b7c95185dfbfe67da105df4402430784393cRobert Sesekstruct ABuffer;
293879ecc891bcfce91662db6d0823c96770058df5Narayan Kamathstruct AMessage;
30a352d2473a8bf5d5cb711ea5ef1591604e2bef94Narayan Kamathstruct AString;
313879ecc891bcfce91662db6d0823c96770058df5Narayan Kamathstruct CodecBase;
328225b7c95185dfbfe67da105df4402430784393cRobert Sesekstruct ICrypto;
338225b7c95185dfbfe67da105df4402430784393cRobert Sesekstruct SoftwareRenderer;
3454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesekstruct Surface;
358225b7c95185dfbfe67da105df4402430784393cRobert Sesek
368225b7c95185dfbfe67da105df4402430784393cRobert Sesekstruct MediaCodec : public AHandler {
378225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum ConfigureFlags {
388225b7c95185dfbfe67da105df4402430784393cRobert Sesek        CONFIGURE_FLAG_ENCODE   = 1,
398225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
408225b7c95185dfbfe67da105df4402430784393cRobert Sesek
418225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum BufferFlags {
428225b7c95185dfbfe67da105df4402430784393cRobert Sesek        BUFFER_FLAG_SYNCFRAME   = 1,
438225b7c95185dfbfe67da105df4402430784393cRobert Sesek        BUFFER_FLAG_CODECCONFIG = 2,
448225b7c95185dfbfe67da105df4402430784393cRobert Sesek        BUFFER_FLAG_EOS         = 4,
458225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
468225b7c95185dfbfe67da105df4402430784393cRobert Sesek
478225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum {
488225b7c95185dfbfe67da105df4402430784393cRobert Sesek        CB_INPUT_AVAILABLE = 1,
498225b7c95185dfbfe67da105df4402430784393cRobert Sesek        CB_OUTPUT_AVAILABLE = 2,
5054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek        CB_ERROR = 3,
5154e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek        CB_OUTPUT_FORMAT_CHANGED = 4,
5254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    };
5354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
5454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    static sp<MediaCodec> CreateByType(
5554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const sp<ALooper> &looper, const char *mime, bool encoder);
5654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
5754e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    static sp<MediaCodec> CreateByComponentName(
5854e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const sp<ALooper> &looper, const char *name);
5954e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
6054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t configure(
6154e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const sp<AMessage> &format,
6254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const sp<Surface> &nativeWindow,
6354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const sp<ICrypto> &crypto,
6454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            uint32_t flags);
6554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
6654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t setCallback(const sp<AMessage> &callback);
6754e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
6854e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer);
6954e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
703879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath    status_t start();
713879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath
723879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath    // Returns to a state in which the component remains allocated but
733879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath    // unconfigured.
7454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t stop();
7554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
7654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    // Client MUST call release before releasing final reference to this
7754e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    // object.
7854e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t release();
7954e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
8054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t flush();
8154e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
8254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t queueInputBuffer(
8354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            size_t index,
8454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            size_t offset,
853879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            size_t size,
863879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            int64_t presentationTimeUs,
873879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            uint32_t flags,
883879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            AString *errorDetailMsg = NULL);
893879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath
903879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath    status_t queueSecureInputBuffer(
913879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            size_t index,
923879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            size_t offset,
933879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            const CryptoPlugin::SubSample *subSamples,
9454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            size_t numSubSamples,
9554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const uint8_t key[16],
9654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            const uint8_t iv[16],
9754e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            CryptoPlugin::Mode mode,
983879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            int64_t presentationTimeUs,
993879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            uint32_t flags,
1003879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            AString *errorDetailMsg = NULL);
1013879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath
10254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
10354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
10454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t dequeueOutputBuffer(
10554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            size_t *index,
10654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            size_t *offset,
1073879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            size_t *size,
1083879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            int64_t *presentationTimeUs,
1093879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath            uint32_t *flags,
11054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek            int64_t timeoutUs = 0ll);
11154e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
11254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t renderOutputBufferAndRelease(size_t index, int64_t timestampNs);
11354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t renderOutputBufferAndRelease(size_t index);
11454e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t releaseOutputBuffer(size_t index);
11554e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
11654e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t signalEndOfInputStream();
11754e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
11854e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t getOutputFormat(sp<AMessage> *format) const;
11954e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t getInputFormat(sp<AMessage> *format) const;
12054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek
12154e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
12254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1238225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1248225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t getOutputBuffer(size_t index, sp<ABuffer> *buffer);
1258225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t getOutputFormat(size_t index, sp<AMessage> *format);
1268225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t getInputBuffer(size_t index, sp<ABuffer> *buffer);
1278225b7c95185dfbfe67da105df4402430784393cRobert Sesek
12884b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    status_t requestIDRFrame();
1298225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1308225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // Notification will be posted once there "is something to do", i.e.
1318225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // an input/output buffer has become available, a format change is
13254e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    // pending, an error is pending.
13354e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    void requestActivityNotification(const sp<AMessage> &notify);
1348225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1358225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t getName(AString *componentName) const;
1368225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1378225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t setParameters(const sp<AMessage> &params);
1388225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1398225b7c95185dfbfe67da105df4402430784393cRobert Sesekprotected:
14054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek    virtual ~MediaCodec();
14184b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    virtual void onMessageReceived(const sp<AMessage> &msg);
14284b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath
1438225b7c95185dfbfe67da105df4402430784393cRobert Sesekprivate:
1448225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum State {
1458225b7c95185dfbfe67da105df4402430784393cRobert Sesek        UNINITIALIZED,
1468225b7c95185dfbfe67da105df4402430784393cRobert Sesek        INITIALIZING,
1478225b7c95185dfbfe67da105df4402430784393cRobert Sesek        INITIALIZED,
1488225b7c95185dfbfe67da105df4402430784393cRobert Sesek        CONFIGURING,
1498225b7c95185dfbfe67da105df4402430784393cRobert Sesek        CONFIGURED,
1508225b7c95185dfbfe67da105df4402430784393cRobert Sesek        STARTING,
1518225b7c95185dfbfe67da105df4402430784393cRobert Sesek        STARTED,
1528225b7c95185dfbfe67da105df4402430784393cRobert Sesek        FLUSHING,
1538225b7c95185dfbfe67da105df4402430784393cRobert Sesek        STOPPING,
1548225b7c95185dfbfe67da105df4402430784393cRobert Sesek        RELEASING,
1558225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
1568225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1578225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum {
1588225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kPortIndexInput         = 0,
1598225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kPortIndexOutput        = 1,
16084b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    };
1618225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1628225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum {
1638225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatInit                           = 'init',
1648225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatConfigure                      = 'conf',
1653879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath        kWhatCreateInputSurface             = 'cisf',
1663879ecc891bcfce91662db6d0823c96770058df5Narayan Kamath        kWhatStart                          = 'strt',
1678225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatStop                           = 'stop',
1688225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatRelease                        = 'rele',
1698225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatDequeueInputBuffer             = 'deqI',
17054e387ddbe6a0462bc8e9e15c7c7b3463adfcb24Robert Sesek        kWhatQueueInputBuffer               = 'queI',
17184b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath        kWhatDequeueOutputBuffer            = 'deqO',
1728225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatReleaseOutputBuffer            = 'relO',
1738225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatSignalEndOfInputStream         = 'eois',
1748225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatGetBuffers                     = 'getB',
1758225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatFlush                          = 'flus',
1768225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatGetOutputFormat                = 'getO',
1778225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatGetInputFormat                 = 'getI',
1788225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatDequeueInputTimedOut           = 'dITO',
1798225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatDequeueOutputTimedOut          = 'dOTO',
18084b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath        kWhatCodecNotify                    = 'codc',
1818225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatRequestIDRFrame                = 'ridr',
1828225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatRequestActivityNotification    = 'racN',
1838225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatGetName                        = 'getN',
1848225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatSetParameters                  = 'setP',
1858225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kWhatSetCallback                    = 'setC',
1868225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
1878225b7c95185dfbfe67da105df4402430784393cRobert Sesek
1888225b7c95185dfbfe67da105df4402430784393cRobert Sesek    enum {
1898225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagIsSoftwareCodec            = 1,
1908225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagOutputFormatChanged        = 2,
1918225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagOutputBuffersChanged       = 4,
1928225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagStickyError                = 8,
1938225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagDequeueInputPending        = 16,
1948225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagDequeueOutputPending       = 32,
1958225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagIsSecure                   = 64,
1968225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagSawMediaServerDie          = 128,
1978225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagIsEncoder                  = 256,
19884b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath        kFlagGatherCodecSpecificData    = 512,
1998225b7c95185dfbfe67da105df4402430784393cRobert Sesek        kFlagIsAsync                    = 1024,
2008225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
2018225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2028225b7c95185dfbfe67da105df4402430784393cRobert Sesek    struct BufferInfo {
2038225b7c95185dfbfe67da105df4402430784393cRobert Sesek        uint32_t mBufferID;
2048225b7c95185dfbfe67da105df4402430784393cRobert Sesek        sp<ABuffer> mData;
2058225b7c95185dfbfe67da105df4402430784393cRobert Sesek        sp<ABuffer> mEncryptedData;
2068225b7c95185dfbfe67da105df4402430784393cRobert Sesek        sp<AMessage> mNotify;
2078225b7c95185dfbfe67da105df4402430784393cRobert Sesek        sp<AMessage> mFormat;
2088225b7c95185dfbfe67da105df4402430784393cRobert Sesek        bool mOwnedByClient;
2098225b7c95185dfbfe67da105df4402430784393cRobert Sesek    };
2108225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2118225b7c95185dfbfe67da105df4402430784393cRobert Sesek    State mState;
2128225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<ALooper> mLooper;
2138225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<ALooper> mCodecLooper;
2148225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<CodecBase> mCodec;
2158225b7c95185dfbfe67da105df4402430784393cRobert Sesek    AString mComponentName;
2168225b7c95185dfbfe67da105df4402430784393cRobert Sesek    uint32_t mReplyID;
217a352d2473a8bf5d5cb711ea5ef1591604e2bef94Narayan Kamath    uint32_t mFlags;
2188225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<Surface> mNativeWindow;
2198225b7c95185dfbfe67da105df4402430784393cRobert Sesek    SoftwareRenderer *mSoftRenderer;
2208225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<AMessage> mOutputFormat;
2218225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<AMessage> mInputFormat;
2228225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<AMessage> mCallback;
2238225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2248225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // Used only to synchronize asynchronous getBufferAndFormat
2258225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // across all the other (synchronous) buffer state change
2268225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // operations, such as de/queueIn/OutputBuffer, start and
2278225b7c95185dfbfe67da105df4402430784393cRobert Sesek    // stop/flush/reset/release.
2288225b7c95185dfbfe67da105df4402430784393cRobert Sesek    Mutex mBufferLock;
2298225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2308225b7c95185dfbfe67da105df4402430784393cRobert Sesek    List<size_t> mAvailPortBuffers[2];
2318225b7c95185dfbfe67da105df4402430784393cRobert Sesek    Vector<BufferInfo> mPortBuffers[2];
2328225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2338225b7c95185dfbfe67da105df4402430784393cRobert Sesek    int32_t mDequeueInputTimeoutGeneration;
2348225b7c95185dfbfe67da105df4402430784393cRobert Sesek    uint32_t mDequeueInputReplyID;
23584b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath
2368225b7c95185dfbfe67da105df4402430784393cRobert Sesek    int32_t mDequeueOutputTimeoutGeneration;
2378225b7c95185dfbfe67da105df4402430784393cRobert Sesek    uint32_t mDequeueOutputReplyID;
2388225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2398225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<ICrypto> mCrypto;
2408225b7c95185dfbfe67da105df4402430784393cRobert Sesek
24184b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    List<sp<ABuffer> > mCSD;
2428225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2438225b7c95185dfbfe67da105df4402430784393cRobert Sesek    sp<AMessage> mActivityNotify;
2448225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2458225b7c95185dfbfe67da105df4402430784393cRobert Sesek    bool mHaveInputSurface;
2468225b7c95185dfbfe67da105df4402430784393cRobert Sesek
24784b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    MediaCodec(const sp<ALooper> &looper);
2488225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2498225b7c95185dfbfe67da105df4402430784393cRobert Sesek    static status_t PostAndAwaitResponse(
2508225b7c95185dfbfe67da105df4402430784393cRobert Sesek            const sp<AMessage> &msg, sp<AMessage> *response);
2518225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2528225b7c95185dfbfe67da105df4402430784393cRobert Sesek    static void PostReplyWithError(int32_t replyID, int32_t err);
25384b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath
2548225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t init(const char *name, bool nameIsType, bool encoder);
2558225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2568225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void setState(State newState);
2578225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void returnBuffersToCodec();
2588225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void returnBuffersToCodecOnPort(int32_t portIndex);
25984b55115354f3c2c9531f251f9d126bb7a06988dNarayan Kamath    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
2608225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t onQueueInputBuffer(const sp<AMessage> &msg);
2618225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
2628225b7c95185dfbfe67da105df4402430784393cRobert Sesek    ssize_t dequeuePortBuffer(int32_t portIndex);
2638225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2648225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t getBufferAndFormat(
2658225b7c95185dfbfe67da105df4402430784393cRobert Sesek            size_t portIndex, size_t index,
2668225b7c95185dfbfe67da105df4402430784393cRobert Sesek            sp<ABuffer> *buffer, sp<AMessage> *format);
2678225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2688225b7c95185dfbfe67da105df4402430784393cRobert Sesek    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2698225b7c95185dfbfe67da105df4402430784393cRobert Sesek    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2708225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void cancelPendingDequeueOperations();
2718225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2728225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void extractCSD(const sp<AMessage> &format);
2738225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t queueCSDInputBuffer(size_t bufferIndex);
2748225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2758225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t setNativeWindow(
2768225b7c95185dfbfe67da105df4402430784393cRobert Sesek            const sp<Surface> &surface);
2778225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2788225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void postActivityNotificationIfPossible();
2798225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2808225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void onInputBufferAvailable();
2818225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void onOutputBufferAvailable();
2828225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void onError(int32_t actionCode, status_t err);
2838225b7c95185dfbfe67da105df4402430784393cRobert Sesek    void onOutputFormatChanged();
2848225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2858225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t onSetParameters(const sp<AMessage> &params);
2868225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2878225b7c95185dfbfe67da105df4402430784393cRobert Sesek    status_t amendOutputFormatWithCodecSpecificData(const sp<ABuffer> &buffer);
2888225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2898225b7c95185dfbfe67da105df4402430784393cRobert Sesek    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2908225b7c95185dfbfe67da105df4402430784393cRobert Sesek};
2918225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2928225b7c95185dfbfe67da105df4402430784393cRobert Sesek}  // namespace android
2938225b7c95185dfbfe67da105df4402430784393cRobert Sesek
2948225b7c95185dfbfe67da105df4402430784393cRobert Sesek#endif  // MEDIA_CODEC_H_
2958225b7c95185dfbfe67da105df4402430784393cRobert Sesek