ACodecBufferChannel.h revision 4a9ab2a382558941ea7fe92324a3d97848686ca8
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