xref: /aosp_15_r20/frameworks/av/media/codec2/sfplugin/Codec2Buffer.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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