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