1 /*
2 * Copyright (C) 2019 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 #define LOG_TAG "ZslBufferManagerTests"
18 #include <log/log.h>
19
20 #include <gtest/gtest.h>
21 #include <zsl_buffer_manager.h>
22
23 namespace android {
24 namespace google_camera_hal {
25
26 static const uint32_t kDataBytes = 256;
27 static const uint32_t kNumEntries = 10;
28 static const uint32_t kMaxBufferDepth = 16;
29
30 static constexpr HalBufferDescriptor kRawBufferDescriptor = {
31 .width = 4032,
32 .height = 3024,
33 .format = HAL_PIXEL_FORMAT_RAW10,
34 .immediate_num_buffers = kMaxBufferDepth,
35 .max_num_buffers = kMaxBufferDepth,
36 };
37
SetMetadata(std::unique_ptr<HalCameraMetadata> & hal_metadata)38 static void SetMetadata(std::unique_ptr<HalCameraMetadata>& hal_metadata) {
39 // Set current BOOT_TIME timestamp in nanoseconds
40 struct timespec ts;
41 if (clock_gettime(CLOCK_BOOTTIME, &ts) == 0) {
42 static const int64_t kNsPerSec = 1000000000;
43 int64_t buffer_timestamp = ts.tv_sec * kNsPerSec + ts.tv_nsec;
44 status_t res =
45 hal_metadata->Set(ANDROID_SENSOR_TIMESTAMP, &buffer_timestamp, 1);
46 ASSERT_EQ(res, OK) << "Set ANDROID_SENSOR_TIMESTAMP failed";
47 }
48 }
49
50 // Test ZslBufferManager AllocateBuffer.
TEST(ZslBufferManagerTests,AllocateBuffer)51 TEST(ZslBufferManagerTests, AllocateBuffer) {
52 auto manager = std::make_unique<ZslBufferManager>();
53 ASSERT_NE(manager, nullptr) << "Create ZslBufferManager failed.";
54
55 status_t res = manager->AllocateBuffers(kRawBufferDescriptor);
56 ASSERT_EQ(res, OK) << "AllocateBuffers failed: " << strerror(res);
57 }
58
59 // Test ZslBufferManager GetEmptyBuffer.
TEST(ZslBufferManagerTests,GetEmptyBuffer)60 TEST(ZslBufferManagerTests, GetEmptyBuffer) {
61 auto manager = std::make_unique<ZslBufferManager>();
62 ASSERT_NE(manager, nullptr) << "Create ZslBufferManager failed.";
63
64 status_t res = manager->AllocateBuffers(kRawBufferDescriptor);
65 ASSERT_EQ(res, OK) << "AllocateBuffers failed: " << strerror(res);
66 buffer_handle_t buffer;
67 for (uint32_t i = 0; i < kMaxBufferDepth; i++) {
68 buffer = manager->GetEmptyBuffer();
69 ASSERT_NE(buffer, kInvalidBufferHandle) << "GetEmptyBuffer failed: " << i;
70 }
71 // If get buffer number is greater than allocation, it will get nullptr.
72 buffer = manager->GetEmptyBuffer();
73 ASSERT_EQ(buffer, kInvalidBufferHandle) << "GetEmptyBuffer is not nullptr";
74 }
75
76 // Test ZslBufferManager fill buffers.
77 // For realtime pipeline case, get the buffer
78 // and then return buffer with metadata.
TEST(ZslBufferManagerTests,FillBuffers)79 TEST(ZslBufferManagerTests, FillBuffers) {
80 static const uint32_t kTestCycle = 50;
81 auto manager = std::make_unique<ZslBufferManager>();
82 ASSERT_NE(manager, nullptr) << "Creating ZslBufferManager failed.";
83
84 status_t res = manager->AllocateBuffers(kRawBufferDescriptor);
85 ASSERT_EQ(res, OK) << "AllocateBuffers failed: " << strerror(res);
86
87 // Fill the zsl buffers
88 for (uint32_t i = 0; i < kTestCycle; i++) {
89 // Get empty buffer and check whether buffer is nullptr or not
90 buffer_handle_t empty_buffer = manager->GetEmptyBuffer();
91 ASSERT_NE(empty_buffer, kInvalidBufferHandle)
92 << "GetEmptyBuffer failed at: " << i;
93
94 StreamBuffer stream_buffer;
95 stream_buffer.buffer = empty_buffer;
96 // Return the buffer with metadata.
97 res = manager->ReturnFilledBuffer(i, stream_buffer);
98 ASSERT_EQ(res, OK) << "ReturnFilledBuffer failed: " << strerror(res);
99 auto metadata = HalCameraMetadata::Create(kNumEntries, kDataBytes);
100 res = manager->ReturnMetadata(i, metadata.get());
101 ASSERT_EQ(res, OK) << "ReturnMetadata failed: " << strerror(res);
102 }
103 }
104
105 // Test ZslBufferManager GetMostRecentZslBuffers and ReturnZslBuffers
106 // For offline pipeline case, get most recent filled zsl buffers
107 // and then return zsl buffers.
TEST(ZslBufferManagerTests,GetRecentBuffers)108 TEST(ZslBufferManagerTests, GetRecentBuffers) {
109 static const uint32_t kTestCycle = 2;
110 static const uint32_t kGetTotalBufferNum = 10;
111 static const uint32_t kRequireMinBufferNum = 3;
112 auto manager = std::make_unique<ZslBufferManager>();
113 ASSERT_NE(manager, nullptr) << "Creating ZslBufferManager failed.";
114
115 status_t res = manager->AllocateBuffers(kRawBufferDescriptor);
116 ASSERT_EQ(res, OK) << "AllocateBuffers failed: " << strerror(res);
117
118 StreamBuffer stream_buffer[kMaxBufferDepth];
119
120 // Fill the zsl buffers
121 uint32_t frame_index = 0;
122 for (uint32_t j = 0; j < kTestCycle; j++) {
123 // Fill the zsl buffers
124 for (uint32_t i = 0; i < kMaxBufferDepth; i++) {
125 // Get empty buffer and check whether buffer is nullptr or not
126 buffer_handle_t empty_buffer = manager->GetEmptyBuffer();
127 ASSERT_NE(empty_buffer, kInvalidBufferHandle)
128 << "GetEmptyBuffer failed at: " << i;
129 stream_buffer[i].buffer = empty_buffer;
130 // Return the buffer with metadata.
131 res = manager->ReturnFilledBuffer(frame_index, stream_buffer[i]);
132 ASSERT_EQ(res, OK) << "ReturnFilledBuffer failed: " << strerror(res);
133
134 auto metadata = HalCameraMetadata::Create(kNumEntries, kDataBytes);
135 SetMetadata(metadata);
136 res = manager->ReturnMetadata(frame_index, metadata.get());
137 ASSERT_EQ(res, OK) << "ReturnMetadata failed: " << strerror(res);
138 frame_index++;
139 }
140
141 // Get filled zsl buffers and return filled buffers
142 std::vector<ZslBufferManager::ZslBuffer> filled_buffers;
143 manager->GetMostRecentZslBuffers(&filled_buffers, kGetTotalBufferNum,
144 kRequireMinBufferNum);
145 ASSERT_EQ(filled_buffers.size(), (uint32_t)kGetTotalBufferNum)
146 << "GetMostRecentZslBuffers failed.";
147
148 // Check the zsl buffer frame number meet the most recent
149 // For the test case (kTestCycle = 0), fill frame_number (0 ~ 15)
150 // And GetMostRecentZslBuffers will get frame_number (6 ~ 15)
151 for (uint32_t k = 0; k < kGetTotalBufferNum; k++) {
152 ASSERT_EQ(filled_buffers[k].frame_number,
153 frame_index - kGetTotalBufferNum + k)
154 << "GetMostRecentZslBuffers data failed at " << k;
155 }
156 manager->ReturnZslBuffers(std::move(filled_buffers));
157 }
158 }
159
160 // Test ZslBufferManager ReturnMetadata.
161 // If allocated_metadata_ size is greater than kMaxAllcatedMetadataSize(100),
162 // ReturnMetadata() will return error and not allocate new metadata.
TEST(ZslBufferManagerTests,ReturnMetadata)163 TEST(ZslBufferManagerTests, ReturnMetadata) {
164 static const uint32_t kTestCycle = 100;
165 auto manager = std::make_unique<ZslBufferManager>();
166 ASSERT_NE(manager, nullptr) << "Creating ZslBufferManager failed.";
167 status_t res;
168 // Normal ReturnMetadata
169 // when zsl buffer manager allocated_metadata_ size < 100
170 for (uint32_t i = 0; i < kTestCycle; i++) {
171 auto metadata = HalCameraMetadata::Create(kNumEntries, kDataBytes);
172 res = manager->ReturnMetadata(i, metadata.get());
173 ASSERT_EQ(res, OK) << "ReturnMetadata failed: " << strerror(res)
174 << " at:" << i;
175 }
176
177 // Abnormal ReturnMetadata
178 // when zsl buffer manager allocated_metadata_ size >= 100
179 for (uint32_t i = kTestCycle; i < kTestCycle + 20; i++) {
180 auto metadata = HalCameraMetadata::Create(kNumEntries, kDataBytes);
181 res = manager->ReturnMetadata(i, metadata.get());
182 ASSERT_EQ(res, OK) << "ReturnMetadata failed: " << strerror(res)
183 << " at:" << i;
184 }
185 }
186
TEST(ZslBufferManagerTests,PendingBuffer)187 TEST(ZslBufferManagerTests, PendingBuffer) {
188 auto manager = std::make_unique<ZslBufferManager>();
189 ASSERT_NE(manager, nullptr) << "Creating ZslBufferManager failed.";
190 bool empty = manager->IsPendingBufferEmpty();
191 ASSERT_EQ(empty, true) << "Pending buffer is not empty.";
192
193 std::vector<ZslBufferManager::ZslBuffer> filled_buffers;
194 ZslBufferManager::ZslBuffer zsl_buffer;
195 filled_buffers.push_back(std::move(zsl_buffer));
196 manager->AddPendingBuffers(filled_buffers);
197
198 // Pending buffer is not empty after call AddPendingBuffers.
199 empty = manager->IsPendingBufferEmpty();
200 ASSERT_EQ(empty, false) << "Pending buffer is empty after AddPendingBuffers.";
201
202 status_t res = manager->CleanPendingBuffers(&filled_buffers);
203 ASSERT_EQ(res, OK) << "CleanPendingBuffers failed.";
204
205 empty = manager->IsPendingBufferEmpty();
206 ASSERT_EQ(empty, true)
207 << "Pending buffer is not empty after CleanPendingBuffers.";
208 }
209
210 } // namespace google_camera_hal
211 } // namespace android
212