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: 57 CameraFrameTest() : CameraStreamFixture(STREAM_PARAMETERS) { 58 TEST_EXTENSION_FORKING_CONSTRUCTOR; 59 60 if (!HasFatalFailure()) { 61 CreateStream(); 62 } 63 } 64 65 ~CameraFrameTest() { 66 TEST_EXTENSION_FORKING_DESTRUCTOR; 67 68 if (mDevice.get()) { 69 mDevice->waitUntilDrained(); 70 } 71 } 72 73 virtual void SetUp() { 74 TEST_EXTENSION_FORKING_SET_UP; 75 } 76 virtual void TearDown() { 77 TEST_EXTENSION_FORKING_TEAR_DOWN; 78 } 79 80 protected: 81 82 }; 83 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 CameraMetadata frameMetadata; 119 ASSERT_EQ(OK, mDevice->getNextFrame(&frameMetadata)); 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