blob: 5a04d0c0e85bcdda5b0157619962fdf54e2477df [file] [log] [blame]
Jiwen 'Steve' Cai2e06c1c2018-07-30 21:35:32 -07001#include <private/dvr/buffer_hub_defs.h>
Fan Xu74df4902018-09-20 16:40:51 -07002#include <private/dvr/buffer_node.h>
Jiwen 'Steve' Cai2e06c1c2018-07-30 21:35:32 -07003
4namespace android {
5namespace dvr {
6
7BufferNode::BufferNode(IonBuffer buffer, IonBuffer metadata_buffer,
8 size_t user_metadata_size)
9 : buffer_(std::move(buffer)),
10 metadata_buffer_(std::move(metadata_buffer)),
11 user_metadata_size_(user_metadata_size) {}
12
13// Allocates a new BufferNode.
14BufferNode::BufferNode(uint32_t width, uint32_t height, uint32_t layer_count,
15 uint32_t format, uint64_t usage,
16 size_t user_metadata_size)
17 : user_metadata_size_(user_metadata_size) {
18 // The size the of metadata buffer is used as the "width" parameter during
19 // allocation. Thus it cannot overflow uint32_t.
20 if (user_metadata_size_ >= (std::numeric_limits<uint32_t>::max() -
21 BufferHubDefs::kMetadataHeaderSize)) {
22 ALOGE(
23 "DetachedBufferChannel::DetachedBufferChannel: metadata size too big.");
24 return;
25 }
26
27 if (int ret = buffer_.Alloc(width, height, layer_count, format, usage)) {
28 ALOGE(
29 "DetachedBufferChannel::DetachedBufferChannel: Failed to allocate "
30 "buffer: %s",
31 strerror(-ret));
32 return;
33 }
34
35 // Buffer metadata has two parts: 1) a fixed sized metadata header; and 2)
36 // user requested metadata.
37 const size_t size = BufferHubDefs::kMetadataHeaderSize + user_metadata_size_;
38 if (int ret = metadata_buffer_.Alloc(size,
39 /*height=*/1,
40 /*layer_count=*/1,
41 BufferHubDefs::kMetadataFormat,
42 BufferHubDefs::kMetadataUsage)) {
43 ALOGE(
44 "DetachedBufferChannel::DetachedBufferChannel: Failed to allocate "
45 "metadata: %s",
46 strerror(-ret));
47 return;
48 }
49}
50
51} // namespace dvr
52} // namespace android