1dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim/*
2dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * Copyright 2016, The Android Open Source Project
3dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *
4dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * you may not use this file except in compliance with the License.
6dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * You may obtain a copy of the License at
7dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *
8dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim *
10dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * Unless required by applicable law or agreed to in writing, software
11dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * See the License for the specific language governing permissions and
14dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * limitations under the License.
15dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim */
16dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
17dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#ifndef A_BUFFER_CHANNEL_H_
18dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
19dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#define A_BUFFER_CHANNEL_H_
20dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
21dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <map>
22dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <memory>
23dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <mutex>
24dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <vector>
25dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
26dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <media/openmax/OMX_Types.h>
27dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <media/stagefright/CodecBase.h>
28dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <media/ICrypto.h>
29dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#include <media/IOMX.h>
30dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
31dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimnamespace android {
32dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
33dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim/**
34dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim * BufferChannelBase implementation for ACodec.
35dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim */
36dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimclass ACodecBufferChannel : public BufferChannelBase {
37dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimpublic:
38dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    struct BufferAndId {
39dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        sp<MediaCodecBuffer> mBuffer;
40dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        IOMX::buffer_id mBufferId;
41dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    };
42dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
43dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    struct BufferInfo {
44dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        BufferInfo(
45dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim                const sp<MediaCodecBuffer> &buffer,
46dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim                IOMX::buffer_id bufferId,
47dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim                const sp<IMemory> &sharedEncryptedBuffer);
48dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
49dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        BufferInfo() = delete;
50dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
51dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        // Buffer facing MediaCodec and its clients.
52dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        const sp<MediaCodecBuffer> mClientBuffer;
53dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        // Buffer facing CodecBase.
54dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        const sp<MediaCodecBuffer> mCodecBuffer;
55dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        // OMX buffer ID.
56dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        const IOMX::buffer_id mBufferId;
57dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        // Encrypted buffer in case of secure input.
58dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim        const sp<IMemory> mSharedEncryptedBuffer;
59dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    };
60dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
61dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    ACodecBufferChannel(
62dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const sp<AMessage> &inputBufferFilled, const sp<AMessage> &outputBufferDrained);
63d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang    virtual ~ACodecBufferChannel();
64dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
65dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // BufferChannelBase interface
66dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t queueInputBuffer(const sp<MediaCodecBuffer> &buffer) override;
67dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t queueSecureInputBuffer(
68dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const sp<MediaCodecBuffer> &buffer,
69dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            bool secure,
70dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const uint8_t *key,
71dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const uint8_t *iv,
72dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            CryptoPlugin::Mode mode,
73dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            CryptoPlugin::Pattern pattern,
74dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const CryptoPlugin::SubSample *subSamples,
75dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            size_t numSubSamples,
76dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            AString *errorDetailMsg) override;
77dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t renderOutputBuffer(
78dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim            const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
79dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) override;
80dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
81dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    virtual void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
82dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
83dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // Methods below are interface for ACodec to use.
84dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
85dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
86dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Set input buffer array.
87dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
88dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param array     Newly allocated buffers. Empty if buffers are
89dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *                  deallocated.
90dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
914a9ab2a382558941ea7fe92324a3d97848686ca8Dongwon Kang    void setInputBufferArray(const std::vector<BufferAndId> &array);
92dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
93dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Set output buffer array.
94dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
95dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param array     Newly allocated buffers. Empty if buffers are
96dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *                  deallocated.
97dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
98dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    void setOutputBufferArray(const std::vector<BufferAndId> &array);
99dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
100dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Request MediaCodec to fill the specified input buffer.
101dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
102dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param bufferId  ID of the buffer, assigned by underlying component.
103dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
104dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    void fillThisBuffer(IOMX::buffer_id bufferID);
105dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    /**
106dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * Request MediaCodec to drain the specified output buffer.
107dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     *
108dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param bufferId  ID of the buffer, assigned by underlying component.
109dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     * @param omxFlags  flags associated with this buffer (e.g. EOS).
110dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim     */
111dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    void drainThisBuffer(IOMX::buffer_id bufferID, OMX_U32 omxFlags);
112dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
113dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kimprivate:
114dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    const sp<AMessage> mInputBufferFilled;
115dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    const sp<AMessage> mOutputBufferDrained;
116dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
117dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    sp<MemoryDealer> mDealer;
118a53d6553fce1818bdf87833f93633c93ad1b5915Jeff Tinker    sp<IMemory> mDecryptDestination;
1196dcab2bafd847be84c2c2230bbd04af9c45c491eChong Zhang    int32_t mHeapSeqNum;
120dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
121dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // These should only be accessed via std::atomic_* functions.
122dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    //
123dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // Note on thread safety: since the vector and BufferInfo are const, it's
124dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // safe to read them at any thread once the shared_ptr object is atomically
125dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // obtained. Inside BufferInfo, mBufferId and mSharedEncryptedBuffer are
126dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // immutable objects. We write internal states of mClient/CodecBuffer when
127dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    // the caller has given up the reference, so that access is also safe.
128dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::shared_ptr<const std::vector<const BufferInfo>> mInputBuffers;
129dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim    std::shared_ptr<const std::vector<const BufferInfo>> mOutputBuffers;
1303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
131d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang    sp<MemoryDealer> makeMemoryDealer(size_t heapSize);
132d07c92742fc5801cab8e99801f591365986acbe9Chong Zhang
1333b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    bool hasCryptoOrDescrambler() {
1343b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        return mCrypto != NULL || mDescrambler != NULL;
1353b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    }
136dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim};
137dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
138dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim}  // namespace android
139dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim
140dff26e5f53b248fd8cc6605850240c7e7c5438dcWonsik Kim#endif  // A_BUFFER_CHANNEL_H_
141