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    /***************************************************************************
81     * Worker thread management overrides.
82     * See declarations of these methods in EmulatedCameraDevice class for
83     * information on each of these methods.
84     **************************************************************************/
85
86protected:
87    /* Implementation of the frame production routine. */
88    bool produceFrame(void* buffer, int64_t* timestamp) override;
89
90    /****************************************************************************
91     * Fake camera device private API
92     ***************************************************************************/
93
94private:
95
96    /* Draws a black and white checker board in |buffer| with the assumption
97     * that the size of buffer matches the current frame buffer size. */
98    void drawCheckerboard(void* buffer);
99
100    /* Draws a square of the given color in the current frame buffer.
101     * Param:
102     *  x, y - Coordinates of the top left corner of the square in the buffer.
103     *  size - Size of the square's side.
104     *  color - Square's color.
105     */
106    void drawSquare(void* buffer, int x, int y, int size, const YUVPixel* color);
107
108#if EFCD_ROTATE_FRAME
109    void drawSolid(void* buffer, YUVPixel* color);
110    void drawStripes(void* buffer);
111    int rotateFrame();
112#endif  // EFCD_ROTATE_FRAME
113
114    /****************************************************************************
115     * Fake camera device data members
116     ***************************************************************************/
117
118private:
119    /*
120     * Pixel colors in YUV format used when drawing the checker board.
121     */
122
123    YUVPixel    mBlackYUV;
124    YUVPixel    mWhiteYUV;
125    YUVPixel    mRedYUV;
126    YUVPixel    mGreenYUV;
127    YUVPixel    mBlueYUV;
128    YUVPixel*   mSquareColor;
129
130    /* Last time the frame has been redrawn. */
131    nsecs_t     mLastRedrawn;
132
133    /*
134     * Precalculated values related to U/V panes.
135     */
136
137    /* U pane inside the framebuffer. */
138    ptrdiff_t   mFrameUOffset;
139
140    /* V pane inside the framebuffer. */
141    ptrdiff_t   mFrameVOffset;
142
143    /* Defines byte distance between adjacent U, and V values. */
144    int         mUVStep;
145
146    /* Defines number of Us and Vs in a row inside the U/V panes.
147     * Note that if U/V panes are interleaved, this value reflects the total
148     * number of both, Us and Vs in a single row in the interleaved UV pane. */
149    int         mUVInRow;
150
151    /*
152     * Checkerboard drawing related stuff
153     */
154    nsecs_t     mLastColorChange;
155
156    double      mCheckX;
157    double      mCheckY;
158    double      mSquareX;
159    double      mSquareY;
160    double      mSquareXSpeed;
161    double      mSquareYSpeed;
162
163#if EFCD_ROTATE_FRAME
164    /* Frame rotation frequency in nanosec (currently - 3 sec) */
165    static const nsecs_t    mRotateFreq = 3000000000LL;
166
167    /* Last time the frame has rotated. */
168    nsecs_t     mLastRotatedAt;
169
170    /* Type of the frame to display in the current rotation:
171     *  0 - Checkerboard.
172     *  1 - White/Red/Green/Blue horisontal stripes
173     *  2 - Solid color. */
174    int         mCurrentFrameType;
175
176    /* Color to use to paint the solid color frame. Colors will rotate between
177     * white, red, gree, and blue each time rotation comes to the solid color
178     * frame. */
179    YUVPixel*   mCurrentColor;
180#endif  // EFCD_ROTATE_FRAME
181};
182
183}; /* namespace android */
184
185#endif  /* HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H */
186