| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H |
| #define HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H |
| |
| /* |
| * Contains declaration of a class EmulatedFakeCameraDevice that encapsulates |
| * a fake camera device. |
| */ |
| |
| #include "Converters.h" |
| #include "EmulatedCameraDevice.h" |
| |
| /* This is used for debugging format / conversion issues. If EFCD_ROTATE_FRAME is |
| * set to 0, the frame content will be always the "checkerboard". Otherwise, if |
| * EFCD_ROTATE_FRAME is set to a non-zero value, the frame content will "rotate" |
| * from a "checkerboard" frame to a "white/red/green/blue stripes" frame, to a |
| * "white/red/green/blue" frame. Frame content rotation helps finding bugs in |
| * format conversions. |
| */ |
| #define EFCD_ROTATE_FRAME 0 |
| |
| namespace android { |
| |
| class EmulatedFakeCamera; |
| |
| /* Encapsulates a fake camera device. |
| * Fake camera device emulates a camera device by providing frames containing |
| * a black and white checker board, moving diagonally towards the 0,0 corner. |
| * There is also a green, or red square that bounces inside the frame, changing |
| * its color when bouncing off the 0,0 corner. |
| */ |
| class EmulatedFakeCameraDevice : public EmulatedCameraDevice { |
| public: |
| /* Constructs EmulatedFakeCameraDevice instance. */ |
| explicit EmulatedFakeCameraDevice(EmulatedFakeCamera* camera_hal); |
| |
| /* Destructs EmulatedFakeCameraDevice instance. */ |
| ~EmulatedFakeCameraDevice(); |
| |
| /*************************************************************************** |
| * Emulated camera device abstract interface implementation. |
| * See declarations of these methods in EmulatedCameraDevice class for |
| * information on each of these methods. |
| **************************************************************************/ |
| |
| public: |
| /* Connects to the camera device. |
| * Since there is no real device to connect to, this method does nothing, |
| * but changes the state. |
| */ |
| status_t connectDevice(); |
| |
| /* Disconnects from the camera device. |
| * Since there is no real device to disconnect from, this method does |
| * nothing, but changes the state. |
| */ |
| status_t disconnectDevice(); |
| |
| /* Starts the camera device. */ |
| status_t startDevice(int width, int height, uint32_t pix_fmt); |
| |
| /* Stops the camera device. */ |
| status_t stopDevice(); |
| |
| /* Gets current preview fame into provided buffer. */ |
| status_t getPreviewFrame(void* buffer); |
| |
| /*************************************************************************** |
| * Worker thread management overrides. |
| * See declarations of these methods in EmulatedCameraDevice class for |
| * information on each of these methods. |
| **************************************************************************/ |
| |
| protected: |
| /* Implementation of the worker thread routine. |
| * This method simply sleeps for a period of time defined by the FPS property |
| * of the fake camera (simulating frame frequency), and then calls emulated |
| * camera's onNextFrameAvailable method. |
| */ |
| bool inWorkerThread(); |
| |
| /**************************************************************************** |
| * Fake camera device private API |
| ***************************************************************************/ |
| |
| private: |
| |
| /* Draws a black and white checker board in the current frame buffer. */ |
| void drawCheckerboard(); |
| |
| /* Draws a square of the given color in the current frame buffer. |
| * Param: |
| * x, y - Coordinates of the top left corner of the square in the buffer. |
| * size - Size of the square's side. |
| * color - Square's color. |
| */ |
| void drawSquare(int x, int y, int size, const YUVPixel* color); |
| |
| #if EFCD_ROTATE_FRAME |
| void drawSolid(YUVPixel* color); |
| void drawStripes(); |
| int rotateFrame(); |
| #endif // EFCD_ROTATE_FRAME |
| |
| /**************************************************************************** |
| * Fake camera device data members |
| ***************************************************************************/ |
| |
| private: |
| /* |
| * Pixel colors in YUV format used when drawing the checker board. |
| */ |
| |
| YUVPixel mBlackYUV; |
| YUVPixel mWhiteYUV; |
| YUVPixel mRedYUV; |
| YUVPixel mGreenYUV; |
| YUVPixel mBlueYUV; |
| |
| /* Last time the frame has been redrawn. */ |
| nsecs_t mLastRedrawn; |
| |
| /* |
| * Precalculated values related to U/V panes. |
| */ |
| |
| /* U pane inside the framebuffer. */ |
| uint8_t* mFrameU; |
| |
| /* V pane inside the framebuffer. */ |
| uint8_t* mFrameV; |
| |
| /* Defines byte distance between adjacent U, and V values. */ |
| int mUVStep; |
| |
| /* Defines number of Us and Vs in a row inside the U/V panes. |
| * Note that if U/V panes are interleaved, this value reflects the total |
| * number of both, Us and Vs in a single row in the interleaved UV pane. */ |
| int mUVInRow; |
| |
| /* Total number of each, U, and V elements in the framebuffer. */ |
| int mUVTotalNum; |
| |
| /* |
| * Checkerboard drawing related stuff |
| */ |
| |
| int mCheckX; |
| int mCheckY; |
| int mCcounter; |
| |
| /* Emulated FPS (frames per second). |
| * We will emulate 50 FPS. */ |
| static const int mEmulatedFPS = 50; |
| |
| /* Defines time (in nanoseconds) between redrawing the checker board. |
| * We will redraw the checker board every 15 milliseconds. */ |
| static const nsecs_t mRedrawAfter = 15000000LL; |
| |
| #if EFCD_ROTATE_FRAME |
| /* Frame rotation frequency in nanosec (currently - 3 sec) */ |
| static const nsecs_t mRotateFreq = 3000000000LL; |
| |
| /* Last time the frame has rotated. */ |
| nsecs_t mLastRotatedAt; |
| |
| /* Type of the frame to display in the current rotation: |
| * 0 - Checkerboard. |
| * 1 - White/Red/Green/Blue horisontal stripes |
| * 2 - Solid color. */ |
| int mCurrentFrameType; |
| |
| /* Color to use to paint the solid color frame. Colors will rotate between |
| * white, red, gree, and blue each time rotation comes to the solid color |
| * frame. */ |
| YUVPixel* mCurrentColor; |
| #endif // EFCD_ROTATE_FRAME |
| }; |
| |
| }; /* namespace android */ |
| |
| #endif /* HW_EMULATOR_CAMERA_EMULATED_FAKE_CAMERA_DEVICE_H */ |