blob: 2923de9c431cb476cd8bf7849780d1eabb53f9b0 [file] [log] [blame]
Igor Murashkine302ee32012-11-05 11:14:49 -08001/*
2 * Copyright (C) 2012 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_NDEBUG 0
18#define LOG_TAG "CameraMetadataTestFunctional"
19#include "cutils/log.h"
20#include "cutils/properties.h"
21#include "utils/Errors.h"
22
23#include "gtest/gtest.h"
24#include "system/camera_metadata.h"
25#include "hardware/hardware.h"
26#include "hardware/camera2.h"
27
Eino-Ville Talvala48bb03f2013-07-25 17:09:14 -070028#include "common/CameraDeviceBase.h"
Igor Murashkine302ee32012-11-05 11:14:49 -080029#include "utils/StrongPointer.h"
30
31#include <gui/CpuConsumer.h>
Mathias Agopiancc501112013-02-14 17:34:35 -080032#include <gui/Surface.h>
Igor Murashkine302ee32012-11-05 11:14:49 -080033
34#include <string>
Igor Murashkineab33fc2012-11-06 17:02:54 -080035
Igor Murashkine302ee32012-11-05 11:14:49 -080036#include "CameraStreamFixture.h"
Igor Murashkineab33fc2012-11-06 17:02:54 -080037#include "TestExtensions.h"
Igor Murashkine302ee32012-11-05 11:14:49 -080038
39namespace android {
40namespace camera2 {
41namespace tests {
42
43//FIXME: dont hardcode
44static CameraStreamParams METADATA_STREAM_PARAMETERS = {
Igor Murashkine302ee32012-11-05 11:14:49 -080045 /*mFormat*/ HAL_PIXEL_FORMAT_YCrCb_420_SP,
46 /*mHeapCount*/ 2
47};
48
Igor Murashkineab33fc2012-11-06 17:02:54 -080049class CameraMetadataTest
Igor Murashkine302ee32012-11-05 11:14:49 -080050 : public ::testing::Test,
51 public CameraStreamFixture {
52
53public:
Igor Murashkineab33fc2012-11-06 17:02:54 -080054 CameraMetadataTest()
Igor Murashkine302ee32012-11-05 11:14:49 -080055 : CameraStreamFixture(METADATA_STREAM_PARAMETERS) {
Igor Murashkineab33fc2012-11-06 17:02:54 -080056 TEST_EXTENSION_FORKING_CONSTRUCTOR;
Igor Murashkine302ee32012-11-05 11:14:49 -080057 }
58
Igor Murashkineab33fc2012-11-06 17:02:54 -080059 ~CameraMetadataTest() {
60 TEST_EXTENSION_FORKING_DESTRUCTOR;
Igor Murashkine302ee32012-11-05 11:14:49 -080061 }
62
63 int GetTypeFromTag(uint32_t tag) const {
64 return get_camera_metadata_tag_type(tag);
65 }
66
67 int GetTypeFromStaticTag(uint32_t tag) const {
68 const CameraMetadata& staticInfo = mDevice->info();
69 camera_metadata_ro_entry entry = staticInfo.find(tag);
70 return entry.type;
71 }
72
Igor Murashkin3d991c82013-04-18 10:09:16 -070073 int GetEntryCountFromStaticTag(uint32_t tag) const {
74 const CameraMetadata& staticInfo = mDevice->info();
75 camera_metadata_ro_entry entry = staticInfo.find(tag);
76 return entry.count;
77 }
78
79 bool HasElementInArrayFromStaticTag(uint32_t tag, int32_t element) const {
80 const CameraMetadata& staticInfo = mDevice->info();
81 camera_metadata_ro_entry entry = staticInfo.find(tag);
82 for (size_t i = 0; i < entry.count; ++i) {
83 if (entry.data.i32[i] == element)
84 return true;
85 }
86 return false;
87 }
88
Igor Murashkine302ee32012-11-05 11:14:49 -080089protected:
90
91};
92
Igor Murashkineab33fc2012-11-06 17:02:54 -080093TEST_F(CameraMetadataTest, types) {
Igor Murashkine302ee32012-11-05 11:14:49 -080094
Igor Murashkineab33fc2012-11-06 17:02:54 -080095 TEST_EXTENSION_FORKING_INIT;
Igor Murashkine302ee32012-11-05 11:14:49 -080096
97 //FIXME: set this up in an external file of some sort (xml?)
98 {
99 char value[PROPERTY_VALUE_MAX];
100 property_get("ro.build.id", value, "");
101 std::string str_value(value);
102
103 if (str_value == "manta")
104 {
105 EXPECT_EQ(TYPE_BYTE,
106 GetTypeFromStaticTag(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO));
107 EXPECT_EQ(TYPE_BYTE,
108 GetTypeFromStaticTag(ANDROID_QUIRKS_USE_ZSL_FORMAT));
109 EXPECT_EQ(TYPE_BYTE,
110 GetTypeFromStaticTag(ANDROID_QUIRKS_METERING_CROP_REGION));
111 }
112 }
113
114 /*
115 TODO:
116 go through all static metadata and make sure all fields we expect
117 that are there, ARE there.
118
119 dont worry about the type as its enforced by the metadata api
120 we can probably check the range validity though
121 */
122
123 if (0) {
124 camera_metadata_ro_entry entry;
125 EXPECT_EQ(TYPE_BYTE, entry.type);
126 EXPECT_EQ(TYPE_INT32, entry.type);
127 EXPECT_EQ(TYPE_FLOAT, entry.type);
128 EXPECT_EQ(TYPE_INT64, entry.type);
129 EXPECT_EQ(TYPE_DOUBLE, entry.type);
130 EXPECT_EQ(TYPE_RATIONAL, entry.type);
131 }
132}
133
Igor Murashkin3d991c82013-04-18 10:09:16 -0700134TEST_F(CameraMetadataTest, RequiredFormats) {
135 TEST_EXTENSION_FORKING_INIT;
136
137 EXPECT_TRUE(
138 HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
139 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
140
141 EXPECT_TRUE(
142 HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
143 HAL_PIXEL_FORMAT_BLOB)); // JPEG
144
Eino-Ville Talvala4c543a12013-06-25 18:12:19 -0700145 if (getDeviceVersion() < CAMERA_DEVICE_API_VERSION_3_0) {
146 // HAL2 can support either flexible YUV or YV12 + NV21
147 if (!HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
148 HAL_PIXEL_FORMAT_YCbCr_420_888)) {
Igor Murashkin3d991c82013-04-18 10:09:16 -0700149
Eino-Ville Talvala4c543a12013-06-25 18:12:19 -0700150 EXPECT_TRUE(
151 HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
152 HAL_PIXEL_FORMAT_YCrCb_420_SP)); // NV21
153
154 EXPECT_TRUE(
155 HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
156 HAL_PIXEL_FORMAT_YV12));
157 }
158 } else {
159 // HAL3 must support flexible YUV
160 EXPECT_TRUE(HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
161 HAL_PIXEL_FORMAT_YCbCr_420_888));
162 }
163
Igor Murashkin3d991c82013-04-18 10:09:16 -0700164}
165
166TEST_F(CameraMetadataTest, SaneResolutions) {
167 TEST_EXTENSION_FORKING_INIT;
168
169 // Iff there are listed raw resolutions, the format should be available
170 int rawResolutionsCount =
Eino-Ville Talvala4c543a12013-06-25 18:12:19 -0700171 GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_RAW_SIZES);
Igor Murashkin3d991c82013-04-18 10:09:16 -0700172 EXPECT_EQ(rawResolutionsCount > 0,
173 HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
174 HAL_PIXEL_FORMAT_RAW_SENSOR));
175
176 // Required processed sizes.
177 int processedSizeCount =
178 GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
179 EXPECT_NE(0, processedSizeCount);
180 EXPECT_EQ(0, processedSizeCount % 2); // multiple of 2 (w,h)
181
182 // Required JPEG sizes
183 int jpegSizeCount =
184 GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
185 EXPECT_NE(0, jpegSizeCount);
186 EXPECT_EQ(0, jpegSizeCount % 2); // multiple of 2 (w,h)
187
188}
189
Igor Murashkine302ee32012-11-05 11:14:49 -0800190}
191}
192}