blob: dc788cd87e11a21fa35d623a2074ac1bb10fc146 [file] [log] [blame]
Pawin Vongmasa36653902018-11-15 00:10:25 -08001/*
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
Pawin Vongmasa36653902018-11-15 00:10:25 -080023#include <binder/IMemory.h>
24#include <media/hardware/VideoAPI.h>
Wonsik Kimc48ddcf2019-02-11 16:16:57 -080025#include <media/stagefright/foundation/ABuffer.h>
Pawin Vongmasa36653902018-11-15 00:10:25 -080026#include <media/MediaCodecBuffer.h>
Pawin Vongmasa36653902018-11-15 00:10:25 -080027
28namespace android {
29
Wonsik Kim41d83432020-04-27 16:40:49 -070030namespace hardware {
31class HidlMemory;
32namespace cas {
33namespace native {
34namespace V1_0 {
35struct SharedBuffer;
36} // namespace V1_0
37} // namespace native
38} // namespace cas
39namespace drm {
40namespace V1_0 {
41struct SharedBuffer;
42} // namespace V1_0
43} // namespace drm
44} // namespace hardware
45
Pawin Vongmasa36653902018-11-15 00:10:25 -080046/**
47 * Copies a graphic view into a media image.
48 *
49 * \param imgBase base of MediaImage
50 * \param img MediaImage data
51 * \param view graphic view
52 *
53 * \return OK on success
54 */
55status_t ImageCopy(uint8_t *imgBase, const MediaImage2 *img, const C2GraphicView &view);
56
57/**
58 * Copies a media image into a graphic view.
59 *
60 * \param view graphic view
61 * \param imgBase base of MediaImage
62 * \param img MediaImage data
63 *
64 * \return OK on success
65 */
66status_t ImageCopy(C2GraphicView &view, const uint8_t *imgBase, const MediaImage2 *img);
67
68class Codec2Buffer : public MediaCodecBuffer {
69public:
70 using MediaCodecBuffer::MediaCodecBuffer;
71 ~Codec2Buffer() override = default;
72
Wonsik Kimc48ddcf2019-02-11 16:16:57 -080073 sp<ABuffer> getImageData() const { return mImageData; }
74
Wonsik Kimf9b32122020-04-02 11:30:17 -070075 virtual void clearC2BufferRefs() {}
76
Pawin Vongmasa36653902018-11-15 00:10:25 -080077protected:
78 /**
79 * canCopy() implementation for linear buffers.
80 */
81 bool canCopyLinear(const std::shared_ptr<C2Buffer> &buffer) const;
82
83 /**
84 * copy() implementation for linear buffers.
85 */
86 bool copyLinear(const std::shared_ptr<C2Buffer> &buffer);
87
88 /**
89 * sets MediaImage data for flexible graphic buffers
90 */
91 void setImageData(const sp<ABuffer> &imageData);
Wonsik Kimc48ddcf2019-02-11 16:16:57 -080092
93 sp<ABuffer> mImageData;
Pawin Vongmasa36653902018-11-15 00:10:25 -080094};
95
96/**
97 * MediaCodecBuffer implementation on top of local linear buffer. This cannot
98 * cross process boundary so asC2Buffer() returns only nullptr.
99 */
100class LocalLinearBuffer : public Codec2Buffer {
101public:
102 using Codec2Buffer::Codec2Buffer;
103
104 std::shared_ptr<C2Buffer> asC2Buffer() override { return nullptr; }
105 bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
106 bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
107};
108
109/**
110 * MediaCodecBuffer implementation to be used only as a dummy wrapper around a
111 * C2Buffer object.
112 */
113class DummyContainerBuffer : public Codec2Buffer {
114public:
115 DummyContainerBuffer(
116 const sp<AMessage> &format,
117 const std::shared_ptr<C2Buffer> &buffer = nullptr);
118
119 std::shared_ptr<C2Buffer> asC2Buffer() override;
Wonsik Kimf9b32122020-04-02 11:30:17 -0700120 void clearC2BufferRefs() override;
Pawin Vongmasa36653902018-11-15 00:10:25 -0800121 bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
122 bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
123
124private:
125 std::shared_ptr<C2Buffer> mBufferRef;
126};
127
128/**
129 * MediaCodecBuffer implementation wraps around C2LinearBlock.
130 */
131class LinearBlockBuffer : public Codec2Buffer {
132public:
133 /**
134 * Allocate a new LinearBufferBlock wrapping around C2LinearBlock object.
135 *
136 * \param format mandatory buffer format for MediaCodecBuffer
137 * \param block C2LinearBlock object to wrap around.
138 * \return LinearBlockBuffer object with writable mapping.
139 * nullptr if unsuccessful.
140 */
141 static sp<LinearBlockBuffer> Allocate(
142 const sp<AMessage> &format, const std::shared_ptr<C2LinearBlock> &block);
143
144 virtual ~LinearBlockBuffer() = default;
145
146 std::shared_ptr<C2Buffer> asC2Buffer() override;
147 bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
148 bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
149
150private:
151 LinearBlockBuffer(
152 const sp<AMessage> &format,
153 C2WriteView &&writeView,
154 const std::shared_ptr<C2LinearBlock> &block);
155 LinearBlockBuffer() = delete;
156
157 C2WriteView mWriteView;
158 std::shared_ptr<C2LinearBlock> mBlock;
159};
160
161/**
162 * MediaCodecBuffer implementation wraps around C2ConstLinearBlock.
163 */
164class ConstLinearBlockBuffer : public Codec2Buffer {
165public:
166 /**
167 * Allocate a new ConstLinearBlockBuffer wrapping around C2Buffer object.
168 *
169 * \param format mandatory buffer format for MediaCodecBuffer
170 * \param buffer linear C2Buffer object to wrap around.
171 * \return ConstLinearBlockBuffer object with readable mapping.
172 * nullptr if unsuccessful.
173 */
174 static sp<ConstLinearBlockBuffer> Allocate(
175 const sp<AMessage> &format, const std::shared_ptr<C2Buffer> &buffer);
176
177 virtual ~ConstLinearBlockBuffer() = default;
178
179 std::shared_ptr<C2Buffer> asC2Buffer() override;
Wonsik Kimf9b32122020-04-02 11:30:17 -0700180 void clearC2BufferRefs() override;
Pawin Vongmasa36653902018-11-15 00:10:25 -0800181
182private:
183 ConstLinearBlockBuffer(
184 const sp<AMessage> &format,
185 C2ReadView &&readView,
186 const std::shared_ptr<C2Buffer> &buffer);
187 ConstLinearBlockBuffer() = delete;
188
189 C2ReadView mReadView;
190 std::shared_ptr<C2Buffer> mBufferRef;
191};
192
193/**
194 * MediaCodecBuffer implementation wraps around C2GraphicBlock.
195 *
196 * This object exposes the underlying bits via accessor APIs and "image-data"
197 * metadata, created automatically at allocation time.
198 */
199class GraphicBlockBuffer : public Codec2Buffer {
200public:
201 /**
202 * Allocate a new GraphicBlockBuffer wrapping around C2GraphicBlock object.
203 * If |block| is not in good color formats, it allocates YV12 local buffer
204 * and copies the content over at asC2Buffer().
205 *
206 * \param format mandatory buffer format for MediaCodecBuffer
207 * \param block C2GraphicBlock object to wrap around.
208 * \param alloc a function to allocate backing ABuffer if needed.
209 * \return GraphicBlockBuffer object with writable mapping.
210 * nullptr if unsuccessful.
211 */
212 static sp<GraphicBlockBuffer> Allocate(
213 const sp<AMessage> &format,
214 const std::shared_ptr<C2GraphicBlock> &block,
215 std::function<sp<ABuffer>(size_t)> alloc);
216
Pawin Vongmasa36653902018-11-15 00:10:25 -0800217 virtual ~GraphicBlockBuffer() = default;
218
Wonsik Kim5ecf3832019-04-18 10:28:58 -0700219 std::shared_ptr<C2Buffer> asC2Buffer() override;
220
Pawin Vongmasa36653902018-11-15 00:10:25 -0800221private:
222 GraphicBlockBuffer(
223 const sp<AMessage> &format,
224 const sp<ABuffer> &buffer,
225 C2GraphicView &&view,
226 const std::shared_ptr<C2GraphicBlock> &block,
227 const sp<ABuffer> &imageData,
228 bool wrapped);
229 GraphicBlockBuffer() = delete;
230
231 inline MediaImage2 *imageData() { return (MediaImage2 *)mImageData->data(); }
232
233 C2GraphicView mView;
234 std::shared_ptr<C2GraphicBlock> mBlock;
Pawin Vongmasa36653902018-11-15 00:10:25 -0800235 const bool mWrapped;
236};
237
238/**
239 * MediaCodecBuffer implementation wraps around VideoNativeMetadata.
240 */
241class GraphicMetadataBuffer : public Codec2Buffer {
242public:
243 /**
244 * Construct a new GraphicMetadataBuffer with local linear buffer for
245 * VideoNativeMetadata.
246 *
247 * \param format mandatory buffer format for MediaCodecBuffer
248 */
249 GraphicMetadataBuffer(
250 const sp<AMessage> &format, const std::shared_ptr<C2Allocator> &alloc);
Wonsik Kim5ecf3832019-04-18 10:28:58 -0700251 virtual ~GraphicMetadataBuffer() = default;
Pawin Vongmasa36653902018-11-15 00:10:25 -0800252
253 std::shared_ptr<C2Buffer> asC2Buffer() override;
254
Pawin Vongmasa36653902018-11-15 00:10:25 -0800255private:
256 GraphicMetadataBuffer() = delete;
257
258 std::shared_ptr<C2Allocator> mAlloc;
259};
260
261/**
262 * MediaCodecBuffer implementation wraps around graphic C2Buffer object.
263 *
264 * This object exposes the underlying bits via accessor APIs and "image-data"
265 * metadata, created automatically at allocation time.
266 */
267class ConstGraphicBlockBuffer : public Codec2Buffer {
268public:
269 /**
270 * Allocate a new ConstGraphicBlockBuffer wrapping around C2Buffer object.
271 * If |buffer| is not in good color formats, it allocates YV12 local buffer
272 * and copies the content of |buffer| over to expose.
273 *
274 * \param format mandatory buffer format for MediaCodecBuffer
275 * \param buffer graphic C2Buffer object to wrap around.
276 * \param alloc a function to allocate backing ABuffer if needed.
277 * \return ConstGraphicBlockBuffer object with readable mapping.
278 * nullptr if unsuccessful.
279 */
280 static sp<ConstGraphicBlockBuffer> Allocate(
281 const sp<AMessage> &format,
282 const std::shared_ptr<C2Buffer> &buffer,
283 std::function<sp<ABuffer>(size_t)> alloc);
284
285 /**
286 * Allocate a new ConstGraphicBlockBuffer which allocates YV12 local buffer
287 * and copies the content of |buffer| over to expose.
288 *
289 * \param format mandatory buffer format for MediaCodecBuffer
290 * \param alloc a function to allocate backing ABuffer if needed.
291 * \return ConstGraphicBlockBuffer object with no wrapping buffer.
292 */
293 static sp<ConstGraphicBlockBuffer> AllocateEmpty(
294 const sp<AMessage> &format,
295 std::function<sp<ABuffer>(size_t)> alloc);
296
Wonsik Kim5ecf3832019-04-18 10:28:58 -0700297 virtual ~ConstGraphicBlockBuffer() = default;
298
Pawin Vongmasa36653902018-11-15 00:10:25 -0800299 std::shared_ptr<C2Buffer> asC2Buffer() override;
Wonsik Kimf9b32122020-04-02 11:30:17 -0700300 void clearC2BufferRefs() override;
Pawin Vongmasa36653902018-11-15 00:10:25 -0800301 bool canCopy(const std::shared_ptr<C2Buffer> &buffer) const override;
302 bool copy(const std::shared_ptr<C2Buffer> &buffer) override;
303
Pawin Vongmasa36653902018-11-15 00:10:25 -0800304private:
305 ConstGraphicBlockBuffer(
306 const sp<AMessage> &format,
307 const sp<ABuffer> &aBuffer,
308 std::unique_ptr<const C2GraphicView> &&view,
309 const std::shared_ptr<C2Buffer> &buffer,
310 const sp<ABuffer> &imageData,
311 bool wrapped);
312 ConstGraphicBlockBuffer() = delete;
313
314 sp<ABuffer> mImageData;
315 std::unique_ptr<const C2GraphicView> mView;
316 std::shared_ptr<C2Buffer> mBufferRef;
317 const bool mWrapped;
318};
319
320/**
321 * MediaCodecBuffer implementation wraps around C2LinearBlock for component
322 * and IMemory for client. Underlying C2LinearBlock won't be mapped for secure
323 * usecases..
324 */
325class EncryptedLinearBlockBuffer : public Codec2Buffer {
326public:
327 /**
328 * Construct a new EncryptedLinearBufferBlock wrapping around C2LinearBlock
329 * object and writable IMemory region.
330 *
331 * \param format mandatory buffer format for MediaCodecBuffer
332 * \param block C2LinearBlock object to wrap around.
333 * \param memory IMemory object to store encrypted content.
334 * \param heapSeqNum Heap sequence number from ICrypto; -1 if N/A
335 */
336 EncryptedLinearBlockBuffer(
337 const sp<AMessage> &format,
338 const std::shared_ptr<C2LinearBlock> &block,
339 const sp<IMemory> &memory,
340 int32_t heapSeqNum = -1);
341 EncryptedLinearBlockBuffer() = delete;
342
343 virtual ~EncryptedLinearBlockBuffer() = default;
344
345 std::shared_ptr<C2Buffer> asC2Buffer() override;
346
347 /**
348 * Fill the source buffer structure with appropriate value based on
349 * internal IMemory object.
350 *
351 * \param source source buffer structure to fill.
352 */
Robert Shih895fba92019-07-16 16:29:44 -0700353 void fillSourceBuffer(
354 hardware::drm::V1_0::SharedBuffer *source);
Pawin Vongmasa36653902018-11-15 00:10:25 -0800355 void fillSourceBuffer(
356 hardware::cas::native::V1_0::SharedBuffer *source);
357
358 /**
359 * Copy the content of |decrypted| into C2LinearBlock inside. This shall
360 * only be called in non-secure usecases.
361 *
362 * \param decrypted decrypted content to copy from.
363 * \param length length of the content
364 * \return true if successful
365 * false otherwise.
366 */
367 bool copyDecryptedContent(const sp<IMemory> &decrypted, size_t length);
368
369 /**
370 * Copy the content of internal IMemory object into C2LinearBlock inside.
371 * This shall only be called in non-secure usecases.
372 *
373 * \param length length of the content
374 * \return true if successful
375 * false otherwise.
376 */
377 bool copyDecryptedContentFromMemory(size_t length);
378
379 /**
380 * Return native handle of secure buffer understood by ICrypto.
381 *
382 * \return secure buffer handle
383 */
384 native_handle_t *handle() const;
385
386private:
387
388 std::shared_ptr<C2LinearBlock> mBlock;
389 sp<IMemory> mMemory;
390 sp<hardware::HidlMemory> mHidlMemory;
391 int32_t mHeapSeqNum;
392};
393
394} // namespace android
395
396#endif // CODEC2_BUFFER_H_