• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <gtest/gtest.h>
18 
19 #define LOG_TAG "CameraFrameTest"
20 //#define LOG_NDEBUG 0
21 #include <utils/Log.h>
22 
23 #include "hardware/hardware.h"
24 #include "hardware/camera2.h"
25 
26 #include <common/CameraDeviceBase.h>
27 #include <utils/StrongPointer.h>
28 #include <gui/CpuConsumer.h>
29 #include <gui/Surface.h>
30 
31 #include <unistd.h>
32 
33 #include "CameraStreamFixture.h"
34 #include "TestExtensions.h"
35 
36 #define CAMERA_FRAME_TIMEOUT    1000000000 //nsecs (1 secs)
37 #define CAMERA_HEAP_COUNT       2 //HALBUG: 1 means registerBuffers fails
38 #define CAMERA_FRAME_DEBUGGING  0
39 
40 using namespace android;
41 using namespace android::camera2;
42 
43 namespace android {
44 namespace camera2 {
45 namespace tests {
46 
47 static CameraStreamParams STREAM_PARAMETERS = {
48     /*mFormat*/     CAMERA_STREAM_AUTO_CPU_FORMAT,
49     /*mHeapCount*/  CAMERA_HEAP_COUNT
50 };
51 
52 class CameraFrameTest
53     : public ::testing::TestWithParam<int>,
54       public CameraStreamFixture {
55 
56 public:
CameraFrameTest()57     CameraFrameTest() : CameraStreamFixture(STREAM_PARAMETERS) {
58         TEST_EXTENSION_FORKING_CONSTRUCTOR;
59 
60         if (!HasFatalFailure()) {
61             CreateStream();
62         }
63     }
64 
~CameraFrameTest()65     ~CameraFrameTest() {
66         TEST_EXTENSION_FORKING_DESTRUCTOR;
67 
68         if (mDevice.get()) {
69             mDevice->waitUntilDrained();
70         }
71     }
72 
SetUp()73     virtual void SetUp() {
74         TEST_EXTENSION_FORKING_SET_UP;
75     }
TearDown()76     virtual void TearDown() {
77         TEST_EXTENSION_FORKING_TEAR_DOWN;
78     }
79 
80 protected:
81 
82 };
83 
TEST_P(CameraFrameTest,GetFrame)84 TEST_P(CameraFrameTest, GetFrame) {
85 
86     TEST_EXTENSION_FORKING_INIT;
87 
88     /* Submit a PREVIEW type request, then wait until we get the frame back */
89     CameraMetadata previewRequest;
90     ASSERT_EQ(OK, mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
91                                                 &previewRequest));
92     {
93         Vector<int32_t> outputStreamIds;
94         outputStreamIds.push(mStreamId);
95         ASSERT_EQ(OK, previewRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
96                                             outputStreamIds));
97         if (CAMERA_FRAME_DEBUGGING) {
98             int frameCount = 0;
99             ASSERT_EQ(OK, previewRequest.update(ANDROID_REQUEST_FRAME_COUNT,
100                                                 &frameCount, 1));
101         }
102     }
103 
104     if (CAMERA_FRAME_DEBUGGING) {
105         previewRequest.dump(STDOUT_FILENO);
106     }
107 
108     for (int i = 0; i < GetParam(); ++i) {
109         ALOGV("Submitting capture request %d", i);
110         CameraMetadata tmpRequest = previewRequest;
111         ASSERT_EQ(OK, mDevice->capture(tmpRequest));
112     }
113 
114     for (int i = 0; i < GetParam(); ++i) {
115         ALOGV("Reading capture request %d", i);
116         ASSERT_EQ(OK, mDevice->waitForNextFrame(CAMERA_FRAME_TIMEOUT));
117 
118         CaptureResult result;
119         ASSERT_EQ(OK, mDevice->getNextResult(&result));
120 
121         // wait for buffer to be available
122         ASSERT_EQ(OK, mFrameListener->waitForFrame(CAMERA_FRAME_TIMEOUT));
123         ALOGV("We got the frame now");
124 
125         // mark buffer consumed so producer can re-dequeue it
126         CpuConsumer::LockedBuffer imgBuffer;
127         ASSERT_EQ(OK, mCpuConsumer->lockNextBuffer(&imgBuffer));
128         ASSERT_EQ(OK, mCpuConsumer->unlockBuffer(imgBuffer));
129     }
130 
131 }
132 
133 //FIXME: dont hardcode stream params, and also test multistream
134 INSTANTIATE_TEST_CASE_P(FrameParameterCombinations, CameraFrameTest,
135     testing::Range(1, 10));
136 
137 
138 }
139 }
140 }
141