Home | History | Annotate | Download | only in hardware
      1 /*
      2  * Copyright (C) 2008 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 ANDROID_OVERLAY_INTERFACE_H
     18 #define ANDROID_OVERLAY_INTERFACE_H
     19 
     20 #include <cutils/native_handle.h>
     21 
     22 #include <hardware/hardware.h>
     23 
     24 #include <stdint.h>
     25 #include <sys/cdefs.h>
     26 #include <sys/types.h>
     27 
     28 __BEGIN_DECLS
     29 
     30 /**
     31  * The id of this module
     32  */
     33 #define OVERLAY_HARDWARE_MODULE_ID "overlay"
     34 
     35 /**
     36  * Name of the overlay device to open
     37  */
     38 #define OVERLAY_HARDWARE_CONTROL    "control"
     39 #define OVERLAY_HARDWARE_DATA       "data"
     40 
     41 /*****************************************************************************/
     42 
     43 /* possible overlay formats */
     44 enum {
     45     OVERLAY_FORMAT_RGBA_8888    = HAL_PIXEL_FORMAT_RGBA_8888,
     46     OVERLAY_FORMAT_RGB_565      = HAL_PIXEL_FORMAT_RGB_565,
     47     OVERLAY_FORMAT_BGRA_8888    = HAL_PIXEL_FORMAT_BGRA_8888,
     48     OVERLAY_FORMAT_YCbYCr_422_I = 0x14,
     49     OVERLAY_FORMAT_CbYCrY_422_I = 0x16,
     50     OVERLAY_FORMAT_DEFAULT      = 99    // The actual color format is determined
     51                                         // by the overlay
     52 };
     53 
     54 /* values for copybit_set_parameter(OVERLAY_TRANSFORM) */
     55 enum {
     56     /* flip source image horizontally */
     57     OVERLAY_TRANSFORM_FLIP_H    = HAL_TRANSFORM_FLIP_H,
     58     /* flip source image vertically */
     59     OVERLAY_TRANSFORM_FLIP_V    = HAL_TRANSFORM_FLIP_V,
     60     /* rotate source image 90 degrees */
     61     OVERLAY_TRANSFORM_ROT_90    = HAL_TRANSFORM_ROT_90,
     62     /* rotate source image 180 degrees */
     63     OVERLAY_TRANSFORM_ROT_180   = HAL_TRANSFORM_ROT_180,
     64     /* rotate source image 270 degrees */
     65     OVERLAY_TRANSFORM_ROT_270   = HAL_TRANSFORM_ROT_270
     66 };
     67 
     68 /* names for setParameter() */
     69 enum {
     70     /* rotation of the source image in degrees (0 to 359) */
     71     OVERLAY_ROTATION_DEG  = 1,
     72     /* enable or disable dithering */
     73     OVERLAY_DITHER        = 3,
     74     /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */
     75     OVERLAY_TRANSFORM    = 4,
     76 };
     77 
     78 /* enable/disable value setParameter() */
     79 enum {
     80     OVERLAY_DISABLE = 0,
     81     OVERLAY_ENABLE  = 1
     82 };
     83 
     84 /* names for get() */
     85 enum {
     86     /* Maximum amount of minification supported by the hardware*/
     87     OVERLAY_MINIFICATION_LIMIT      = 1,
     88     /* Maximum amount of magnification supported by the hardware */
     89     OVERLAY_MAGNIFICATION_LIMIT     = 2,
     90     /* Number of fractional bits support by the overlay scaling engine */
     91     OVERLAY_SCALING_FRAC_BITS       = 3,
     92     /* Supported rotation step in degrees. */
     93     OVERLAY_ROTATION_STEP_DEG       = 4,
     94     /* horizontal alignment in pixels */
     95     OVERLAY_HORIZONTAL_ALIGNMENT    = 5,
     96     /* vertical alignment in pixels */
     97     OVERLAY_VERTICAL_ALIGNMENT      = 6,
     98     /* width alignment restrictions. negative number for max. power-of-two */
     99     OVERLAY_WIDTH_ALIGNMENT         = 7,
    100     /* height alignment restrictions. negative number for max. power-of-two */
    101     OVERLAY_HEIGHT_ALIGNMENT        = 8,
    102 };
    103 
    104 /*****************************************************************************/
    105 
    106 /* opaque reference to an Overlay kernel object */
    107 typedef const native_handle* overlay_handle_t;
    108 
    109 typedef struct overlay_t {
    110     uint32_t            w;
    111     uint32_t            h;
    112     int32_t             format;
    113     uint32_t            w_stride;
    114     uint32_t            h_stride;
    115     uint32_t            reserved[3];
    116     /* returns a reference to this overlay's handle (the caller doesn't
    117      * take ownership) */
    118     overlay_handle_t    (*getHandleRef)(struct overlay_t* overlay);
    119     uint32_t            reserved_procs[7];
    120 } overlay_t;
    121 
    122 typedef void* overlay_buffer_t;
    123 
    124 /*****************************************************************************/
    125 
    126 /**
    127  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
    128  * and the fields of this data structure must begin with hw_module_t
    129  * followed by module specific information.
    130  */
    131 struct overlay_module_t {
    132     struct hw_module_t common;
    133 };
    134 
    135 /*****************************************************************************/
    136 
    137 /**
    138  * Every device data structure must begin with hw_device_t
    139  * followed by module specific public methods and attributes.
    140  */
    141 
    142 struct overlay_control_device_t {
    143     struct hw_device_t common;
    144 
    145     /* get static informations about the capabilities of the overlay engine */
    146     int (*get)(struct overlay_control_device_t *dev, int name);
    147 
    148     /* creates an overlay matching the given parameters as closely as possible.
    149      * returns an error if no more overlays are available. The actual
    150      * size and format is returned in overlay_t. */
    151     overlay_t* (*createOverlay)(struct overlay_control_device_t *dev,
    152             uint32_t w, uint32_t h, int32_t format);
    153 
    154     /* destroys an overlay. This call releases all
    155      * resources associated with overlay_t and make it invalid */
    156     void (*destroyOverlay)(struct overlay_control_device_t *dev,
    157             overlay_t* overlay);
    158 
    159     /* set position and scaling of the given overlay as closely as possible.
    160      * if scaling cannot be performed, overlay must be centered. */
    161     int (*setPosition)(struct overlay_control_device_t *dev,
    162             overlay_t* overlay,
    163             int x, int y, uint32_t w, uint32_t h);
    164 
    165     /* returns the actual position and size of the overlay */
    166     int (*getPosition)(struct overlay_control_device_t *dev,
    167             overlay_t* overlay,
    168             int* x, int* y, uint32_t* w, uint32_t* h);
    169 
    170     /* sets configurable parameters for this overlay. returns an error if not
    171      * supported. */
    172     int (*setParameter)(struct overlay_control_device_t *dev,
    173             overlay_t* overlay, int param, int value);
    174 
    175     int (*stage)(struct overlay_control_device_t *dev, overlay_t* overlay);
    176     int (*commit)(struct overlay_control_device_t *dev, overlay_t* overlay);
    177 };
    178 
    179 
    180 struct overlay_data_device_t {
    181     struct hw_device_t common;
    182 
    183     /* initialize the overlay from the given handle. this associates this
    184      * overlay data module to its control module */
    185     int (*initialize)(struct overlay_data_device_t *dev,
    186             overlay_handle_t handle);
    187 
    188     /* can be called to change the width and height of the overlay. */
    189     int (*resizeInput)(struct overlay_data_device_t *dev,
    190             uint32_t w, uint32_t h);
    191 
    192     int (*setCrop)(struct overlay_data_device_t *dev,
    193             uint32_t x, uint32_t y, uint32_t w, uint32_t h) ;
    194 
    195     int (*getCrop)(struct overlay_data_device_t *dev,
    196        uint32_t* x, uint32_t* y, uint32_t* w, uint32_t* h) ;
    197 
    198     int (*setParameter)(struct overlay_data_device_t *dev,
    199             int param, int value);
    200 
    201     /* blocks until an overlay buffer is available and return that buffer. */
    202     int (*dequeueBuffer)(struct overlay_data_device_t *dev,
    203 		         overlay_buffer_t *buf);
    204 
    205     /* release the overlay buffer and post it */
    206     int (*queueBuffer)(struct overlay_data_device_t *dev,
    207             overlay_buffer_t buffer);
    208 
    209     /* returns the address of a given buffer if supported, NULL otherwise. */
    210     void* (*getBufferAddress)(struct overlay_data_device_t *dev,
    211             overlay_buffer_t buffer);
    212 
    213     int (*getBufferCount)(struct overlay_data_device_t *dev);
    214 };
    215 
    216 
    217 /*****************************************************************************/
    218 
    219 /** convenience API for opening and closing a device */
    220 
    221 static inline int overlay_control_open(const struct hw_module_t* module,
    222         struct overlay_control_device_t** device) {
    223     return module->methods->open(module,
    224             OVERLAY_HARDWARE_CONTROL, (struct hw_device_t**)device);
    225 }
    226 
    227 static inline int overlay_control_close(struct overlay_control_device_t* device) {
    228     return device->common.close(&device->common);
    229 }
    230 
    231 static inline int overlay_data_open(const struct hw_module_t* module,
    232         struct overlay_data_device_t** device) {
    233     return module->methods->open(module,
    234             OVERLAY_HARDWARE_DATA, (struct hw_device_t**)device);
    235 }
    236 
    237 static inline int overlay_data_close(struct overlay_data_device_t* device) {
    238     return device->common.close(&device->common);
    239 }
    240 
    241 __END_DECLS
    242 
    243 #endif  // ANDROID_OVERLAY_INTERFACE_H
    244