1 /* 2 * Copyright (C) 2011 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 #ifndef HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H 18 #define HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H 19 20 /* 21 * Contains declaration of a class EmulatedFakeCameraDevice that encapsulates 22 * a fake camera device. 23 */ 24 25 #include "Converters.h" 26 #include "EmulatedCameraDevice.h" 27 28 /* This is used for debugging format / conversion issues. If EFCD_ROTATE_FRAME is 29 * set to 0, the frame content will be always the "checkerboard". Otherwise, if 30 * EFCD_ROTATE_FRAME is set to a non-zero value, the frame content will "rotate" 31 * from a "checkerboard" frame to a "white/red/green/blue stripes" frame, to a 32 * "white/red/green/blue" frame. Frame content rotation helps finding bugs in 33 * format conversions. 34 */ 35 #define EFCD_ROTATE_FRAME 1 36 37 namespace android { 38 39 class EmulatedFakeCamera; 40 41 /* Encapsulates a fake camera device. 42 * Fake camera device emulates a camera device by providing frames containing 43 * a black and white checker board, moving diagonally towards the 0,0 corner. 44 * There is also a green, or red square that bounces inside the frame, changing 45 * its color when bouncing off the 0,0 corner. 46 */ 47 class EmulatedFakeCameraDevice : public EmulatedCameraDevice { 48 public: 49 /* Constructs EmulatedFakeCameraDevice instance. */ 50 explicit EmulatedFakeCameraDevice(EmulatedFakeCamera* camera_hal); 51 52 /* Destructs EmulatedFakeCameraDevice instance. */ 53 ~EmulatedFakeCameraDevice(); 54 55 /*************************************************************************** 56 * Emulated camera device abstract interface implementation. 57 * See declarations of these methods in EmulatedCameraDevice class for 58 * information on each of these methods. 59 **************************************************************************/ 60 61 public: 62 /* Connects to the camera device. 63 * Since there is no real device to connect to, this method does nothing, 64 * but changes the state. 65 */ 66 status_t connectDevice(); 67 68 /* Disconnects from the camera device. 69 * Since there is no real device to disconnect from, this method does 70 * nothing, but changes the state. 71 */ 72 status_t disconnectDevice(); 73 74 /* Starts the camera device. */ 75 status_t startDevice(int width, int height, uint32_t pix_fmt); 76 77 /* Stops the camera device. */ 78 status_t stopDevice(); 79 80 /* Gets current preview fame into provided buffer. */ 81 status_t getPreviewFrame(void* buffer); 82 83 /*************************************************************************** 84 * Worker thread management overrides. 85 * See declarations of these methods in EmulatedCameraDevice class for 86 * information on each of these methods. 87 **************************************************************************/ 88 89 protected: 90 /* Implementation of the worker thread routine. 91 * This method simply sleeps for a period of time defined by the FPS property 92 * of the fake camera (simulating frame frequency), and then calls emulated 93 * camera's onNextFrameAvailable method. 94 */ 95 bool inWorkerThread(); 96 97 /**************************************************************************** 98 * Fake camera device private API 99 ***************************************************************************/ 100 101 private: 102 /* Draws a black and white checker board in the current frame buffer. */ 103 void drawCheckerboard(); 104 105 /* Draws a square of the given color in the current frame buffer. 106 * Param: 107 * x, y - Coordinates of the top left corner of the square in the buffer. 108 * size - Size of the square's side. 109 * color - Square's color. 110 */ 111 void drawSquare(int x, int y, int size, const YUVPixel* color); 112 113 #if EFCD_ROTATE_FRAME 114 void drawSolid(YUVPixel* color); 115 void drawStripes(); 116 int rotateFrame(); 117 #endif // EFCD_ROTATE_FRAME 118 119 /**************************************************************************** 120 * Fake camera device data members 121 ***************************************************************************/ 122 123 private: 124 /* 125 * Pixel colors in YUV format used when drawing the checker board. 126 */ 127 128 YUVPixel mBlackYUV; 129 YUVPixel mWhiteYUV; 130 YUVPixel mRedYUV; 131 YUVPixel mGreenYUV; 132 YUVPixel mBlueYUV; 133 134 /* Last time the frame has been redrawn. */ 135 nsecs_t mLastRedrawn; 136 137 /* 138 * Precalculated values related to U/V panes. 139 */ 140 141 /* U pane inside the framebuffer. */ 142 uint8_t* mFrameU; 143 144 /* V pane inside the framebuffer. */ 145 uint8_t* mFrameV; 146 147 /* Defines byte distance between adjacent U, and V values. */ 148 int mUVStep; 149 150 /* Defines number of Us and Vs in a row inside the U/V panes. 151 * Note that if U/V panes are interleaved, this value reflects the total 152 * number of both, Us and Vs in a single row in the interleaved UV pane. */ 153 int mUVInRow; 154 155 /* Total number of each, U, and V elements in the framebuffer. */ 156 int mUVTotalNum; 157 158 /* 159 * Checkerboard drawing related stuff 160 */ 161 162 int mCheckX; 163 int mCheckY; 164 int mCcounter; 165 166 /* Emulated FPS (frames per second). 167 * We will emulate 50 FPS. */ 168 static const int mEmulatedFPS = 50; 169 170 /* Defines time (in nanoseconds) between redrawing the checker board. 171 * We will redraw the checker board every 15 milliseconds. */ 172 static const nsecs_t mRedrawAfter = 15000000LL; 173 174 #if EFCD_ROTATE_FRAME 175 /* Frame rotation frequency in nanosec (currently - 3 sec) */ 176 static const nsecs_t mRotateFreq = 3000000000LL; 177 178 /* Last time the frame has rotated. */ 179 nsecs_t mLastRotatedAt; 180 181 /* Type of the frame to display in the current rotation: 182 * 0 - Checkerboard. 183 * 1 - White/Red/Green/Blue horisontal stripes 184 * 2 - Solid color. */ 185 int mCurrentFrameType; 186 187 /* Color to use to paint the solid color frame. Colors will rotate between 188 * white, red, gree, and blue each time rotation comes to the solid color 189 * frame. */ 190 YUVPixel* mCurrentColor; 191 #endif // EFCD_ROTATE_FRAME 192 }; 193 194 }; /* namespace android */ 195 196 #endif /* HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H */ 197