summaryrefslogtreecommitdiff
path: root/v3/EmulatedFakeCameraDevice.h (plain)
blob: f66f076475da929ff1ff6128346946920a56ae94
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 0
36
37namespace android {
38
39class 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 */
47class EmulatedFakeCameraDevice : public EmulatedCameraDevice {
48public:
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
61public:
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
89protected:
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
101private:
102
103 /* Draws a black and white checker board in the current frame buffer. */
104 void drawCheckerboard();
105
106 /* Draws a square of the given color in the current frame buffer.
107 * Param:
108 * x, y - Coordinates of the top left corner of the square in the buffer.
109 * size - Size of the square's side.
110 * color - Square's color.
111 */
112 void drawSquare(int x, int y, int size, const YUVPixel* color);
113
114#if EFCD_ROTATE_FRAME
115 void drawSolid(YUVPixel* color);
116 void drawStripes();
117 int rotateFrame();
118#endif // EFCD_ROTATE_FRAME
119
120 /****************************************************************************
121 * Fake camera device data members
122 ***************************************************************************/
123
124private:
125 /*
126 * Pixel colors in YUV format used when drawing the checker board.
127 */
128
129 YUVPixel mBlackYUV;
130 YUVPixel mWhiteYUV;
131 YUVPixel mRedYUV;
132 YUVPixel mGreenYUV;
133 YUVPixel mBlueYUV;
134
135 /* Last time the frame has been redrawn. */
136 nsecs_t mLastRedrawn;
137
138 /*
139 * Precalculated values related to U/V panes.
140 */
141
142 /* U pane inside the framebuffer. */
143 uint8_t* mFrameU;
144
145 /* V pane inside the framebuffer. */
146 uint8_t* mFrameV;
147
148 /* Defines byte distance between adjacent U, and V values. */
149 int mUVStep;
150
151 /* Defines number of Us and Vs in a row inside the U/V panes.
152 * Note that if U/V panes are interleaved, this value reflects the total
153 * number of both, Us and Vs in a single row in the interleaved UV pane. */
154 int mUVInRow;
155
156 /* Total number of each, U, and V elements in the framebuffer. */
157 int mUVTotalNum;
158
159 /*
160 * Checkerboard drawing related stuff
161 */
162
163 int mCheckX;
164 int mCheckY;
165 int mCcounter;
166
167 /* Emulated FPS (frames per second).
168 * We will emulate 50 FPS. */
169 static const int mEmulatedFPS = 50;
170
171 /* Defines time (in nanoseconds) between redrawing the checker board.
172 * We will redraw the checker board every 15 milliseconds. */
173 static const nsecs_t mRedrawAfter = 15000000LL;
174
175#if EFCD_ROTATE_FRAME
176 /* Frame rotation frequency in nanosec (currently - 3 sec) */
177 static const nsecs_t mRotateFreq = 3000000000LL;
178
179 /* Last time the frame has rotated. */
180 nsecs_t mLastRotatedAt;
181
182 /* Type of the frame to display in the current rotation:
183 * 0 - Checkerboard.
184 * 1 - White/Red/Green/Blue horisontal stripes
185 * 2 - Solid color. */
186 int mCurrentFrameType;
187
188 /* Color to use to paint the solid color frame. Colors will rotate between
189 * white, red, gree, and blue each time rotation comes to the solid color
190 * frame. */
191 YUVPixel* mCurrentColor;
192#endif // EFCD_ROTATE_FRAME
193};
194
195}; /* namespace android */
196
197#endif /* HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H */
198