Home | History | Annotate | Download | only in camera
      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 
     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 
    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 
    124 private:
    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