1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2017, The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef CODEC2_BUFFER_H_ 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #define CODEC2_BUFFER_H_ 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <C2Buffer.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <C2Config.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <media/hardware/VideoAPI.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ABuffer.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaCodecBuffer.h> 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker namespace android { 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker namespace hardware { 32*ec779b8eSAndroid Build Coastguard Worker class HidlMemory; 33*ec779b8eSAndroid Build Coastguard Worker namespace cas { 34*ec779b8eSAndroid Build Coastguard Worker namespace native { 35*ec779b8eSAndroid Build Coastguard Worker namespace V1_0 { 36*ec779b8eSAndroid Build Coastguard Worker struct SharedBuffer; 37*ec779b8eSAndroid Build Coastguard Worker } // namespace V1_0 38*ec779b8eSAndroid Build Coastguard Worker } // namespace native 39*ec779b8eSAndroid Build Coastguard Worker } // namespace cas 40*ec779b8eSAndroid Build Coastguard Worker namespace drm { 41*ec779b8eSAndroid Build Coastguard Worker namespace V1_0 { 42*ec779b8eSAndroid Build Coastguard Worker struct SharedBuffer; 43*ec779b8eSAndroid Build Coastguard Worker } // namespace V1_0 44*ec779b8eSAndroid Build Coastguard Worker } // namespace drm 45*ec779b8eSAndroid Build Coastguard Worker } // namespace hardware 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker class Codec2Buffer : public MediaCodecBuffer { 48*ec779b8eSAndroid Build Coastguard Worker public: 49*ec779b8eSAndroid Build Coastguard Worker using MediaCodecBuffer::MediaCodecBuffer; 50*ec779b8eSAndroid Build Coastguard Worker ~Codec2Buffer() override = default; 51*ec779b8eSAndroid Build Coastguard Worker getImageData()52*ec779b8eSAndroid Build Coastguard Worker sp<ABuffer> getImageData() const { return mImageData; } 53*ec779b8eSAndroid Build Coastguard Worker clearC2BufferRefs()54*ec779b8eSAndroid Build Coastguard Worker virtual void clearC2BufferRefs() {} 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker protected: 57*ec779b8eSAndroid Build Coastguard Worker /** 58*ec779b8eSAndroid Build Coastguard Worker * canCopy() implementation for linear buffers. 59*ec779b8eSAndroid Build Coastguard Worker */ 60*ec779b8eSAndroid Build Coastguard Worker bool canCopyLinear(const std::shared_ptr<C2Buffer> &buffer) const; 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker /** 63*ec779b8eSAndroid Build Coastguard Worker * copy() implementation for linear buffers. 64*ec779b8eSAndroid Build Coastguard Worker */ 65*ec779b8eSAndroid Build Coastguard Worker bool copyLinear(const std::shared_ptr<C2Buffer> &buffer); 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker /** 68*ec779b8eSAndroid Build Coastguard Worker * sets MediaImage data for flexible graphic buffers 69*ec779b8eSAndroid Build Coastguard Worker */ 70*ec779b8eSAndroid Build Coastguard Worker void setImageData(const sp<ABuffer> &imageData); 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker sp<ABuffer> mImageData; 73*ec779b8eSAndroid Build Coastguard Worker }; 74*ec779b8eSAndroid Build Coastguard Worker 75*ec779b8eSAndroid Build Coastguard Worker /** 76*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation on top of local linear buffer. This cannot 77*ec779b8eSAndroid Build Coastguard Worker * cross process boundary so asC2Buffer() returns only nullptr. 78*ec779b8eSAndroid Build Coastguard Worker */ 79*ec779b8eSAndroid Build Coastguard Worker class LocalLinearBuffer : public Codec2Buffer { 80*ec779b8eSAndroid Build Coastguard Worker public: 81*ec779b8eSAndroid Build Coastguard Worker using Codec2Buffer::Codec2Buffer; 82*ec779b8eSAndroid Build Coastguard Worker asC2Buffer()83*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override { return nullptr; } 84*ec779b8eSAndroid Build Coastguard Worker bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override; 85*ec779b8eSAndroid Build Coastguard Worker bool copy(const std::shared_ptr<C2Buffer> &buffer) override; 86*ec779b8eSAndroid Build Coastguard Worker }; 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker /** 89*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation to be used only as a dummy wrapper around a 90*ec779b8eSAndroid Build Coastguard Worker * C2Buffer object. 91*ec779b8eSAndroid Build Coastguard Worker */ 92*ec779b8eSAndroid Build Coastguard Worker class DummyContainerBuffer : public Codec2Buffer { 93*ec779b8eSAndroid Build Coastguard Worker public: 94*ec779b8eSAndroid Build Coastguard Worker DummyContainerBuffer( 95*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 96*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Buffer> &buffer = nullptr); 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 99*ec779b8eSAndroid Build Coastguard Worker void clearC2BufferRefs() override; 100*ec779b8eSAndroid Build Coastguard Worker bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override; 101*ec779b8eSAndroid Build Coastguard Worker bool copy(const std::shared_ptr<C2Buffer> &buffer) override; 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker private: 104*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> mBufferRef; 105*ec779b8eSAndroid Build Coastguard Worker }; 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker /** 108*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around C2LinearBlock. 109*ec779b8eSAndroid Build Coastguard Worker */ 110*ec779b8eSAndroid Build Coastguard Worker class LinearBlockBuffer : public Codec2Buffer { 111*ec779b8eSAndroid Build Coastguard Worker public: 112*ec779b8eSAndroid Build Coastguard Worker /** 113*ec779b8eSAndroid Build Coastguard Worker * Allocate a new LinearBufferBlock wrapping around C2LinearBlock object. 114*ec779b8eSAndroid Build Coastguard Worker * 115*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 116*ec779b8eSAndroid Build Coastguard Worker * \param block C2LinearBlock object to wrap around. 117*ec779b8eSAndroid Build Coastguard Worker * \return LinearBlockBuffer object with writable mapping. 118*ec779b8eSAndroid Build Coastguard Worker * nullptr if unsuccessful. 119*ec779b8eSAndroid Build Coastguard Worker */ 120*ec779b8eSAndroid Build Coastguard Worker static sp<LinearBlockBuffer> Allocate( 121*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, const std::shared_ptr<C2LinearBlock> &block); 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker virtual ~LinearBlockBuffer() = default; 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 126*ec779b8eSAndroid Build Coastguard Worker bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override; 127*ec779b8eSAndroid Build Coastguard Worker bool copy(const std::shared_ptr<C2Buffer> &buffer) override; 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker private: 130*ec779b8eSAndroid Build Coastguard Worker LinearBlockBuffer( 131*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 132*ec779b8eSAndroid Build Coastguard Worker C2WriteView &&writeView, 133*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2LinearBlock> &block); 134*ec779b8eSAndroid Build Coastguard Worker LinearBlockBuffer() = delete; 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker C2WriteView mWriteView; 137*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> mBlock; 138*ec779b8eSAndroid Build Coastguard Worker }; 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker /** 141*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around C2ConstLinearBlock. 142*ec779b8eSAndroid Build Coastguard Worker */ 143*ec779b8eSAndroid Build Coastguard Worker class ConstLinearBlockBuffer : public Codec2Buffer { 144*ec779b8eSAndroid Build Coastguard Worker public: 145*ec779b8eSAndroid Build Coastguard Worker /** 146*ec779b8eSAndroid Build Coastguard Worker * Allocate a new ConstLinearBlockBuffer wrapping around C2Buffer object. 147*ec779b8eSAndroid Build Coastguard Worker * 148*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 149*ec779b8eSAndroid Build Coastguard Worker * \param buffer linear C2Buffer object to wrap around. 150*ec779b8eSAndroid Build Coastguard Worker * \return ConstLinearBlockBuffer object with readable mapping. 151*ec779b8eSAndroid Build Coastguard Worker * nullptr if unsuccessful. 152*ec779b8eSAndroid Build Coastguard Worker */ 153*ec779b8eSAndroid Build Coastguard Worker static sp<ConstLinearBlockBuffer> Allocate( 154*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, const std::shared_ptr<C2Buffer> &buffer); 155*ec779b8eSAndroid Build Coastguard Worker 156*ec779b8eSAndroid Build Coastguard Worker virtual ~ConstLinearBlockBuffer() = default; 157*ec779b8eSAndroid Build Coastguard Worker 158*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 159*ec779b8eSAndroid Build Coastguard Worker void clearC2BufferRefs() override; 160*ec779b8eSAndroid Build Coastguard Worker 161*ec779b8eSAndroid Build Coastguard Worker private: 162*ec779b8eSAndroid Build Coastguard Worker ConstLinearBlockBuffer( 163*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 164*ec779b8eSAndroid Build Coastguard Worker C2ReadView &&readView, 165*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Buffer> &buffer); 166*ec779b8eSAndroid Build Coastguard Worker ConstLinearBlockBuffer() = delete; 167*ec779b8eSAndroid Build Coastguard Worker 168*ec779b8eSAndroid Build Coastguard Worker C2ReadView mReadView; 169*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> mBufferRef; 170*ec779b8eSAndroid Build Coastguard Worker }; 171*ec779b8eSAndroid Build Coastguard Worker 172*ec779b8eSAndroid Build Coastguard Worker /** 173*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around C2GraphicBlock. 174*ec779b8eSAndroid Build Coastguard Worker * 175*ec779b8eSAndroid Build Coastguard Worker * This object exposes the underlying bits via accessor APIs and "image-data" 176*ec779b8eSAndroid Build Coastguard Worker * metadata, created automatically at allocation time. 177*ec779b8eSAndroid Build Coastguard Worker */ 178*ec779b8eSAndroid Build Coastguard Worker class GraphicBlockBuffer : public Codec2Buffer { 179*ec779b8eSAndroid Build Coastguard Worker public: 180*ec779b8eSAndroid Build Coastguard Worker /** 181*ec779b8eSAndroid Build Coastguard Worker * Allocate a new GraphicBlockBuffer wrapping around C2GraphicBlock object. 182*ec779b8eSAndroid Build Coastguard Worker * If |block| is not in good color formats, it allocates YV12 local buffer 183*ec779b8eSAndroid Build Coastguard Worker * and copies the content over at asC2Buffer(). 184*ec779b8eSAndroid Build Coastguard Worker * 185*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 186*ec779b8eSAndroid Build Coastguard Worker * \param block C2GraphicBlock object to wrap around. 187*ec779b8eSAndroid Build Coastguard Worker * \param alloc a function to allocate backing ABuffer if needed. 188*ec779b8eSAndroid Build Coastguard Worker * \return GraphicBlockBuffer object with writable mapping. 189*ec779b8eSAndroid Build Coastguard Worker * nullptr if unsuccessful. 190*ec779b8eSAndroid Build Coastguard Worker */ 191*ec779b8eSAndroid Build Coastguard Worker static sp<GraphicBlockBuffer> Allocate( 192*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 193*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2GraphicBlock> &block, 194*ec779b8eSAndroid Build Coastguard Worker std::function<sp<ABuffer>(size_t)> alloc); 195*ec779b8eSAndroid Build Coastguard Worker 196*ec779b8eSAndroid Build Coastguard Worker virtual ~GraphicBlockBuffer() = default; 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 199*ec779b8eSAndroid Build Coastguard Worker 200*ec779b8eSAndroid Build Coastguard Worker private: 201*ec779b8eSAndroid Build Coastguard Worker GraphicBlockBuffer( 202*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 203*ec779b8eSAndroid Build Coastguard Worker const sp<ABuffer> &buffer, 204*ec779b8eSAndroid Build Coastguard Worker C2GraphicView &&view, 205*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2GraphicBlock> &block, 206*ec779b8eSAndroid Build Coastguard Worker const sp<ABuffer> &imageData, 207*ec779b8eSAndroid Build Coastguard Worker bool wrapped); 208*ec779b8eSAndroid Build Coastguard Worker GraphicBlockBuffer() = delete; 209*ec779b8eSAndroid Build Coastguard Worker imageData()210*ec779b8eSAndroid Build Coastguard Worker inline MediaImage2 *imageData() { return (MediaImage2 *)mImageData->data(); } 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker C2GraphicView mView; 213*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2GraphicBlock> mBlock; 214*ec779b8eSAndroid Build Coastguard Worker const bool mWrapped; 215*ec779b8eSAndroid Build Coastguard Worker }; 216*ec779b8eSAndroid Build Coastguard Worker 217*ec779b8eSAndroid Build Coastguard Worker /** 218*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around VideoNativeMetadata. 219*ec779b8eSAndroid Build Coastguard Worker */ 220*ec779b8eSAndroid Build Coastguard Worker class GraphicMetadataBuffer : public Codec2Buffer { 221*ec779b8eSAndroid Build Coastguard Worker public: 222*ec779b8eSAndroid Build Coastguard Worker /** 223*ec779b8eSAndroid Build Coastguard Worker * Construct a new GraphicMetadataBuffer with local linear buffer for 224*ec779b8eSAndroid Build Coastguard Worker * VideoNativeMetadata. 225*ec779b8eSAndroid Build Coastguard Worker * 226*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 227*ec779b8eSAndroid Build Coastguard Worker */ 228*ec779b8eSAndroid Build Coastguard Worker GraphicMetadataBuffer( 229*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, const std::shared_ptr<C2Allocator> &alloc); 230*ec779b8eSAndroid Build Coastguard Worker virtual ~GraphicMetadataBuffer() = default; 231*ec779b8eSAndroid Build Coastguard Worker 232*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 233*ec779b8eSAndroid Build Coastguard Worker 234*ec779b8eSAndroid Build Coastguard Worker private: 235*ec779b8eSAndroid Build Coastguard Worker GraphicMetadataBuffer() = delete; 236*ec779b8eSAndroid Build Coastguard Worker 237*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Allocator> mAlloc; 238*ec779b8eSAndroid Build Coastguard Worker }; 239*ec779b8eSAndroid Build Coastguard Worker 240*ec779b8eSAndroid Build Coastguard Worker /** 241*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around graphic C2Buffer object. 242*ec779b8eSAndroid Build Coastguard Worker * 243*ec779b8eSAndroid Build Coastguard Worker * This object exposes the underlying bits via accessor APIs and "image-data" 244*ec779b8eSAndroid Build Coastguard Worker * metadata, created automatically at allocation time. 245*ec779b8eSAndroid Build Coastguard Worker */ 246*ec779b8eSAndroid Build Coastguard Worker class ConstGraphicBlockBuffer : public Codec2Buffer { 247*ec779b8eSAndroid Build Coastguard Worker public: 248*ec779b8eSAndroid Build Coastguard Worker /** 249*ec779b8eSAndroid Build Coastguard Worker * Allocate a new ConstGraphicBlockBuffer wrapping around C2Buffer object. 250*ec779b8eSAndroid Build Coastguard Worker * If |buffer| is not in good color formats, it allocates YV12 local buffer 251*ec779b8eSAndroid Build Coastguard Worker * and copies the content of |buffer| over to expose. 252*ec779b8eSAndroid Build Coastguard Worker * 253*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 254*ec779b8eSAndroid Build Coastguard Worker * \param buffer graphic C2Buffer object to wrap around. 255*ec779b8eSAndroid Build Coastguard Worker * \param alloc a function to allocate backing ABuffer if needed. 256*ec779b8eSAndroid Build Coastguard Worker * \return ConstGraphicBlockBuffer object with readable mapping. 257*ec779b8eSAndroid Build Coastguard Worker * nullptr if unsuccessful. 258*ec779b8eSAndroid Build Coastguard Worker */ 259*ec779b8eSAndroid Build Coastguard Worker static sp<ConstGraphicBlockBuffer> Allocate( 260*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 261*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Buffer> &buffer, 262*ec779b8eSAndroid Build Coastguard Worker std::function<sp<ABuffer>(size_t)> alloc); 263*ec779b8eSAndroid Build Coastguard Worker 264*ec779b8eSAndroid Build Coastguard Worker /** 265*ec779b8eSAndroid Build Coastguard Worker * Allocate a new ConstGraphicBlockBuffer which allocates YV12 local buffer 266*ec779b8eSAndroid Build Coastguard Worker * and copies the content of |buffer| over to expose. 267*ec779b8eSAndroid Build Coastguard Worker * 268*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 269*ec779b8eSAndroid Build Coastguard Worker * \param alloc a function to allocate backing ABuffer if needed. 270*ec779b8eSAndroid Build Coastguard Worker * \return ConstGraphicBlockBuffer object with no wrapping buffer. 271*ec779b8eSAndroid Build Coastguard Worker */ 272*ec779b8eSAndroid Build Coastguard Worker static sp<ConstGraphicBlockBuffer> AllocateEmpty( 273*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 274*ec779b8eSAndroid Build Coastguard Worker std::function<sp<ABuffer>(size_t)> alloc); 275*ec779b8eSAndroid Build Coastguard Worker 276*ec779b8eSAndroid Build Coastguard Worker virtual ~ConstGraphicBlockBuffer() = default; 277*ec779b8eSAndroid Build Coastguard Worker 278*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 279*ec779b8eSAndroid Build Coastguard Worker void clearC2BufferRefs() override; 280*ec779b8eSAndroid Build Coastguard Worker bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override; 281*ec779b8eSAndroid Build Coastguard Worker bool copy(const std::shared_ptr<C2Buffer> &buffer) override; 282*ec779b8eSAndroid Build Coastguard Worker 283*ec779b8eSAndroid Build Coastguard Worker private: 284*ec779b8eSAndroid Build Coastguard Worker ConstGraphicBlockBuffer( 285*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 286*ec779b8eSAndroid Build Coastguard Worker const sp<ABuffer> &aBuffer, 287*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<const C2GraphicView> &&view, 288*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2Buffer> &buffer, 289*ec779b8eSAndroid Build Coastguard Worker const sp<ABuffer> &imageData, 290*ec779b8eSAndroid Build Coastguard Worker bool wrapped); 291*ec779b8eSAndroid Build Coastguard Worker ConstGraphicBlockBuffer() = delete; 292*ec779b8eSAndroid Build Coastguard Worker 293*ec779b8eSAndroid Build Coastguard Worker sp<ABuffer> mImageData; 294*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<const C2GraphicView> mView; 295*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> mBufferRef; 296*ec779b8eSAndroid Build Coastguard Worker const bool mWrapped; 297*ec779b8eSAndroid Build Coastguard Worker }; 298*ec779b8eSAndroid Build Coastguard Worker 299*ec779b8eSAndroid Build Coastguard Worker /** 300*ec779b8eSAndroid Build Coastguard Worker * MediaCodecBuffer implementation wraps around C2LinearBlock for component 301*ec779b8eSAndroid Build Coastguard Worker * and IMemory for client. Underlying C2LinearBlock won't be mapped for secure 302*ec779b8eSAndroid Build Coastguard Worker * usecases.. 303*ec779b8eSAndroid Build Coastguard Worker */ 304*ec779b8eSAndroid Build Coastguard Worker class EncryptedLinearBlockBuffer : public Codec2Buffer { 305*ec779b8eSAndroid Build Coastguard Worker public: 306*ec779b8eSAndroid Build Coastguard Worker /** 307*ec779b8eSAndroid Build Coastguard Worker * Construct a new EncryptedLinearBufferBlock wrapping around C2LinearBlock 308*ec779b8eSAndroid Build Coastguard Worker * object and writable IMemory region. 309*ec779b8eSAndroid Build Coastguard Worker * 310*ec779b8eSAndroid Build Coastguard Worker * \param format mandatory buffer format for MediaCodecBuffer 311*ec779b8eSAndroid Build Coastguard Worker * \param block C2LinearBlock object to wrap around. 312*ec779b8eSAndroid Build Coastguard Worker * \param memory IMemory object to store encrypted content. 313*ec779b8eSAndroid Build Coastguard Worker * \param heapSeqNum Heap sequence number from ICrypto; -1 if N/A 314*ec779b8eSAndroid Build Coastguard Worker */ 315*ec779b8eSAndroid Build Coastguard Worker EncryptedLinearBlockBuffer( 316*ec779b8eSAndroid Build Coastguard Worker const sp<AMessage> &format, 317*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<C2LinearBlock> &block, 318*ec779b8eSAndroid Build Coastguard Worker const sp<IMemory> &memory, 319*ec779b8eSAndroid Build Coastguard Worker int32_t heapSeqNum = -1); 320*ec779b8eSAndroid Build Coastguard Worker EncryptedLinearBlockBuffer() = delete; 321*ec779b8eSAndroid Build Coastguard Worker 322*ec779b8eSAndroid Build Coastguard Worker virtual ~EncryptedLinearBlockBuffer() = default; 323*ec779b8eSAndroid Build Coastguard Worker 324*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2Buffer> asC2Buffer() override; 325*ec779b8eSAndroid Build Coastguard Worker 326*ec779b8eSAndroid Build Coastguard Worker /** 327*ec779b8eSAndroid Build Coastguard Worker * Fill the source buffer structure with appropriate value based on 328*ec779b8eSAndroid Build Coastguard Worker * internal IMemory object. 329*ec779b8eSAndroid Build Coastguard Worker * 330*ec779b8eSAndroid Build Coastguard Worker * \param source source buffer structure to fill. 331*ec779b8eSAndroid Build Coastguard Worker */ 332*ec779b8eSAndroid Build Coastguard Worker void fillSourceBuffer( 333*ec779b8eSAndroid Build Coastguard Worker hardware::drm::V1_0::SharedBuffer *source); 334*ec779b8eSAndroid Build Coastguard Worker void fillSourceBuffer( 335*ec779b8eSAndroid Build Coastguard Worker hardware::cas::native::V1_0::SharedBuffer *source); 336*ec779b8eSAndroid Build Coastguard Worker 337*ec779b8eSAndroid Build Coastguard Worker /** 338*ec779b8eSAndroid Build Coastguard Worker * Copy the content of |decrypted| into C2LinearBlock inside. This shall 339*ec779b8eSAndroid Build Coastguard Worker * only be called in non-secure usecases. 340*ec779b8eSAndroid Build Coastguard Worker * 341*ec779b8eSAndroid Build Coastguard Worker * \param decrypted decrypted content to copy from. 342*ec779b8eSAndroid Build Coastguard Worker * \param length length of the content 343*ec779b8eSAndroid Build Coastguard Worker * \return true if successful 344*ec779b8eSAndroid Build Coastguard Worker * false otherwise. 345*ec779b8eSAndroid Build Coastguard Worker */ 346*ec779b8eSAndroid Build Coastguard Worker bool copyDecryptedContent(const sp<IMemory> &decrypted, size_t length); 347*ec779b8eSAndroid Build Coastguard Worker 348*ec779b8eSAndroid Build Coastguard Worker /** 349*ec779b8eSAndroid Build Coastguard Worker * Copy the content of internal IMemory object into C2LinearBlock inside. 350*ec779b8eSAndroid Build Coastguard Worker * This shall only be called in non-secure usecases. 351*ec779b8eSAndroid Build Coastguard Worker * 352*ec779b8eSAndroid Build Coastguard Worker * \param length length of the content 353*ec779b8eSAndroid Build Coastguard Worker * \return true if successful 354*ec779b8eSAndroid Build Coastguard Worker * false otherwise. 355*ec779b8eSAndroid Build Coastguard Worker */ 356*ec779b8eSAndroid Build Coastguard Worker bool copyDecryptedContentFromMemory(size_t length); 357*ec779b8eSAndroid Build Coastguard Worker 358*ec779b8eSAndroid Build Coastguard Worker /** 359*ec779b8eSAndroid Build Coastguard Worker * Return native handle of secure buffer understood by ICrypto. 360*ec779b8eSAndroid Build Coastguard Worker * 361*ec779b8eSAndroid Build Coastguard Worker * \return secure buffer handle 362*ec779b8eSAndroid Build Coastguard Worker */ 363*ec779b8eSAndroid Build Coastguard Worker native_handle_t *handle() const; 364*ec779b8eSAndroid Build Coastguard Worker 365*ec779b8eSAndroid Build Coastguard Worker class MappedBlock { 366*ec779b8eSAndroid Build Coastguard Worker public: 367*ec779b8eSAndroid Build Coastguard Worker explicit MappedBlock(const std::shared_ptr<C2LinearBlock> &block); 368*ec779b8eSAndroid Build Coastguard Worker virtual ~MappedBlock(); 369*ec779b8eSAndroid Build Coastguard Worker bool copyDecryptedContent(const sp<IMemory> &decrypted, size_t length); 370*ec779b8eSAndroid Build Coastguard Worker private: 371*ec779b8eSAndroid Build Coastguard Worker C2WriteView mView; 372*ec779b8eSAndroid Build Coastguard Worker }; 373*ec779b8eSAndroid Build Coastguard Worker 374*ec779b8eSAndroid Build Coastguard Worker void getMappedBlock(std::unique_ptr<MappedBlock> * const mappedBlock) const; 375*ec779b8eSAndroid Build Coastguard Worker 376*ec779b8eSAndroid Build Coastguard Worker private: 377*ec779b8eSAndroid Build Coastguard Worker 378*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2LinearBlock> mBlock; 379*ec779b8eSAndroid Build Coastguard Worker sp<IMemory> mMemory; 380*ec779b8eSAndroid Build Coastguard Worker sp<hardware::HidlMemory> mHidlMemory; 381*ec779b8eSAndroid Build Coastguard Worker int32_t mHeapSeqNum; 382*ec779b8eSAndroid Build Coastguard Worker }; 383*ec779b8eSAndroid Build Coastguard Worker 384*ec779b8eSAndroid Build Coastguard Worker /** 385*ec779b8eSAndroid Build Coastguard Worker * Get HDR metadata from Gralloc4 handle. 386*ec779b8eSAndroid Build Coastguard Worker * 387*ec779b8eSAndroid Build Coastguard Worker * \param[in] handle handle of the allocation 388*ec779b8eSAndroid Build Coastguard Worker * \param[out] staticInfo HDR static info to be filled. Ignored if null; 389*ec779b8eSAndroid Build Coastguard Worker * if |handle| is invalid or does not contain the metadata, 390*ec779b8eSAndroid Build Coastguard Worker * the shared_ptr is reset. 391*ec779b8eSAndroid Build Coastguard Worker * \param[out] dynamicInfo HDR dynamic info to be filled. Ignored if null; 392*ec779b8eSAndroid Build Coastguard Worker * if |handle| is invalid or does not contain the metadata, 393*ec779b8eSAndroid Build Coastguard Worker * the shared_ptr is reset. 394*ec779b8eSAndroid Build Coastguard Worker * \return C2_OK if successful 395*ec779b8eSAndroid Build Coastguard Worker */ 396*ec779b8eSAndroid Build Coastguard Worker c2_status_t GetHdrMetadataFromGralloc4Handle( 397*ec779b8eSAndroid Build Coastguard Worker const C2Handle *const handle, 398*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2StreamHdrStaticMetadataInfo::input> *staticInfo, 399*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<C2StreamHdrDynamicMetadataInfo::input> *dynamicInfo); 400*ec779b8eSAndroid Build Coastguard Worker 401*ec779b8eSAndroid Build Coastguard Worker /** 402*ec779b8eSAndroid Build Coastguard Worker * Set metadata to Gralloc4 handle. 403*ec779b8eSAndroid Build Coastguard Worker * 404*ec779b8eSAndroid Build Coastguard Worker * \param[in] dataSpace Dataspace to set. 405*ec779b8eSAndroid Build Coastguard Worker * \param[in] staticInfo HDR static info to set. Ignored if null or invalid. 406*ec779b8eSAndroid Build Coastguard Worker * \param[in] dynamicInfo HDR dynamic info to set. Ignored if null or invalid. 407*ec779b8eSAndroid Build Coastguard Worker * \param[out] handle handle of the allocation. 408*ec779b8eSAndroid Build Coastguard Worker * \return C2_OK if successful 409*ec779b8eSAndroid Build Coastguard Worker */ 410*ec779b8eSAndroid Build Coastguard Worker c2_status_t SetMetadataToGralloc4Handle( 411*ec779b8eSAndroid Build Coastguard Worker const android_dataspace_t dataSpace, 412*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const C2StreamHdrStaticMetadataInfo::output> &staticInfo, 413*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<const C2StreamHdrDynamicMetadataInfo::output> &dynamicInfo, 414*ec779b8eSAndroid Build Coastguard Worker const C2Handle *const handle); 415*ec779b8eSAndroid Build Coastguard Worker 416*ec779b8eSAndroid Build Coastguard Worker } // namespace android 417*ec779b8eSAndroid Build Coastguard Worker 418*ec779b8eSAndroid Build Coastguard Worker #endif // CODEC2_BUFFER_H_ 419