MediaCodec.h revision 4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf
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;
31ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huberstruct ICrypto;
325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SoftwareRenderer;
335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct SurfaceTextureClient;
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct MediaCodec : public AHandler {
365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum ConfigureFlags {
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURE_FLAG_ENCODE   = 1,
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum BufferFlags {
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_SYNCFRAME   = 1,
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_CODECCONFIG = 2,
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BUFFER_FLAG_EOS         = 4,
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByType(
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *mime, bool encoder);
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static sp<MediaCodec> CreateByComponentName(
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ALooper> &looper, const char *name);
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t configure(
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &format,
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<SurfaceTextureClient> &nativeWindow,
551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            const sp<ICrypto> &crypto,
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t start();
59c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
60c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Returns to a state in which the component remains allocated but
61c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // unconfigured.
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t stop();
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
64c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // Client MUST call release before releasing final reference to this
65c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    // object.
66c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    status_t release();
67c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t flush();
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t queueInputBuffer(
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index,
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset,
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size,
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs,
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags);
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    status_t queueSecureInputBuffer(
784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t index,
794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t offset,
804b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const CryptoPlugin::SubSample *subSamples,
814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size_t numSubSamples,
824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t key[16],
834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            const uint8_t iv[16],
844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            CryptoPlugin::Mode mode,
854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            int64_t presentationTimeUs,
864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            uint32_t flags);
874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs = 0ll);
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t dequeueOutputBuffer(
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *index,
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *offset,
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t *size,
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t *presentationTimeUs,
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t *flags,
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs = 0ll);
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t renderOutputBufferAndRelease(size_t index);
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t releaseOutputBuffer(size_t index);
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputFormat(sp<AMessage> *format) const;
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~MediaCodec();
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum State {
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        UNINITIALIZED,
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZING,
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        INITIALIZED,
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURING,
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CONFIGURED,
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTING,
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STARTED,
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        FLUSHING,
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        STOPPING,
121c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        RELEASING,
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexInput         = 0,
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kPortIndexOutput        = 1,
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatInit                       = 'init',
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatConfigure                  = 'conf',
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatStart                      = 'strt',
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatStop                       = 'stop',
134c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        kWhatRelease                    = 'rele',
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatDequeueInputBuffer         = 'deqI',
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatQueueInputBuffer           = 'queI',
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatDequeueOutputBuffer        = 'deqO',
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatReleaseOutputBuffer        = 'relO',
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatGetBuffers                 = 'getB',
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatFlush                      = 'flus',
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatGetOutputFormat            = 'getO',
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatDequeueInputTimedOut       = 'dITO',
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatDequeueOutputTimedOut      = 'dOTO',
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kWhatCodecNotify                = 'codc',
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    enum {
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagIsSoftwareCodec            = 1,
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputFormatChanged        = 2,
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagOutputBuffersChanged       = 4,
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagStickyError                = 8,
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueInputPending        = 16,
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        kFlagDequeueOutputPending       = 32,
154ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        kFlagIsSecure                   = 64,
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    struct BufferInfo {
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        void *mBufferID;
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<ABuffer> mData;
160ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        sp<ABuffer> mEncryptedData;
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> mNotify;
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool mOwnedByClient;
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    };
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    State mState;
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mLooper;
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> mCodecLooper;
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ACodec> mCodec;
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mReplyID;
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mFlags;
1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<SurfaceTextureClient> mNativeWindow;
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    SoftwareRenderer *mSoftRenderer;
1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> mOutputFormat;
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> mAvailPortBuffers[2];
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> mPortBuffers[2];
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueInputTimeoutGeneration;
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueInputReplyID;
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t mDequeueOutputTimeoutGeneration;
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t mDequeueOutputReplyID;
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
184ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    sp<ICrypto> mCrypto;
185ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    MediaCodec(const sp<ALooper> &looper);
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    static status_t PostAndAwaitResponse(
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<AMessage> &msg, sp<AMessage> *response);
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t init(const char *name, bool nameIsType, bool encoder);
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void setState(State newState);
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodec();
1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void returnBuffersToCodecOnPort(int32_t portIndex);
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t updateBuffers(int32_t portIndex, const sp<AMessage> &msg);
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onQueueInputBuffer(const sp<AMessage> &msg);
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t onReleaseOutputBuffer(const sp<AMessage> &msg);
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t dequeuePortBuffer(int32_t portIndex);
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueInputBuffer(uint32_t replyID, bool newRequest = false);
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool handleDequeueOutputBuffer(uint32_t replyID, bool newRequest = false);
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void cancelPendingDequeueOperations();
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber};
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber#endif  // MEDIA_CODEC_H_
211