1 /*
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 #include <iostream>
18 #include <iomanip>
19 #include <gtest/gtest.h>
20 
21 #define LOG_TAG "CameraStreamTest"
22 #define LOG_NDEBUG 0
23 #include <utils/Log.h>
24 
25 #include "hardware/hardware.h"
26 #include "hardware/camera2.h"
27 
28 #include <utils/StrongPointer.h>
29 #include <gui/CpuConsumer.h>
30 #include <gui/Surface.h>
31 
32 #include <device2/Camera2Device.h>
33 
34 #include "CameraStreamFixture.h"
35 #include "TestExtensions.h"
36 
37 using namespace android;
38 using namespace android::camera2;
39 
40 namespace android {
41 namespace camera2 {
42 namespace tests {
43 
44 class CameraStreamTest
45     : public ::testing::TestWithParam<CameraStreamParams>,
46       public CameraStreamFixture {
47 
48 public:
CameraStreamTest()49     CameraStreamTest() : CameraStreamFixture(GetParam()) {
50         TEST_EXTENSION_FORKING_CONSTRUCTOR;
51     }
52 
~CameraStreamTest()53     ~CameraStreamTest() {
54         TEST_EXTENSION_FORKING_DESTRUCTOR;
55     }
56 
SetUp()57     virtual void SetUp() {
58         TEST_EXTENSION_FORKING_SET_UP;
59     }
TearDown()60     virtual void TearDown() {
61         TEST_EXTENSION_FORKING_TEAR_DOWN;
62     }
63 
64 protected:
65 
66 };
67 
TEST_P(CameraStreamTest,CreateStream)68 TEST_P(CameraStreamTest, CreateStream) {
69 
70     TEST_EXTENSION_FORKING_INIT;
71 
72     /** Make sure the format requested is supported. PASS this test if it's not
73       * not supported.
74       *
75       * TODO: would be nice of not running this test in the first place
76       *       somehow.
77       */
78     {
79         camera_metadata_ro_entry availableFormats =
80             GetStaticEntry(ANDROID_SCALER_AVAILABLE_FORMATS);
81 
82         bool hasFormat = false;
83         for (size_t i = 0; i < availableFormats.count; ++i) {
84             if (availableFormats.data.i32[i] == GetParam().mFormat) {
85                 hasFormat = true;
86                 break;
87             }
88         }
89 
90         if (!hasFormat) {
91             const ::testing::TestInfo* const test_info =
92                 ::testing::UnitTest::GetInstance()->current_test_info();
93             std::cerr << "Skipping test "
94                       << test_info->test_case_name() << "."
95                       << test_info->name()
96                       << " because the format was not available: "
97                       << GetParam() << std::endl;
98             return;
99         }
100     }
101 
102     ASSERT_NO_FATAL_FAILURE(CreateStream());
103     ASSERT_NO_FATAL_FAILURE(DeleteStream());
104 }
105 
106 //TODO: use a combinatoric generator
107 static CameraStreamParams TestParameters[] = {
108     {
109         /*mFormat*/    HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
110         /*mHeapCount*/ 1
111     },
112     {
113         /*mFormat*/    HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
114         /*mHeapCount*/ 2
115     },
116     {
117         /*mFormat*/    HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
118         /*mHeapCount*/ 3
119     },
120     {
121         /*mFormat*/    HAL_PIXEL_FORMAT_YCrCb_420_SP, // NV21
122         /*mHeapCount*/ 1
123     },
124     {
125         /*mFormat*/    HAL_PIXEL_FORMAT_YCrCb_420_SP,
126         /*mHeapCount*/ 2
127     },
128     {
129         /*mFormat*/    HAL_PIXEL_FORMAT_YCrCb_420_SP,
130         /*mHeapCount*/ 3
131     },
132     {
133         /*mFormat*/    HAL_PIXEL_FORMAT_YV12,
134         /*mHeapCount*/ 1
135     },
136     {
137         /*mFormat*/    HAL_PIXEL_FORMAT_YV12,
138         /*mHeapCount*/ 2
139     },
140     {
141         /*mFormat*/    HAL_PIXEL_FORMAT_YV12,
142         /*mHeapCount*/ 3
143     },
144     {
145         /*mFormat*/    HAL_PIXEL_FORMAT_Y8,
146         /*mHeapCount*/ 1
147     },
148     {
149         /*mFormat*/    HAL_PIXEL_FORMAT_Y8,
150         /*mHeapCount*/ 2
151     },
152     {
153         /*mFormat*/    HAL_PIXEL_FORMAT_Y8,
154         /*mHeapCount*/ 3
155     },
156     {
157         /*mFormat*/    HAL_PIXEL_FORMAT_Y16,
158         /*mHeapCount*/ 1
159     },
160     {
161         /*mFormat*/    HAL_PIXEL_FORMAT_Y16,
162         /*mHeapCount*/ 2
163     },
164     {
165         /*mFormat*/    HAL_PIXEL_FORMAT_Y16,
166         /*mHeapCount*/ 3
167     },
168     {
169         /*mFormat*/    HAL_PIXEL_FORMAT_RAW_SENSOR,
170         /*mHeapCount*/ 1
171     },
172     {
173         /*mFormat*/    HAL_PIXEL_FORMAT_RAW_SENSOR,
174         /*mHeapCount*/ 2
175     },
176     {
177         /*mFormat*/    HAL_PIXEL_FORMAT_RAW_SENSOR,
178         /*mHeapCount*/ 3
179     },
180 };
181 
182 INSTANTIATE_TEST_CASE_P(StreamParameterCombinations, CameraStreamTest,
183     testing::ValuesIn(TestParameters));
184 
185 
186 }
187 }
188 }
189