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