C++程序  |  371行  |  10.59 KB

/*
 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors:
 *    Shengquan Yuan  <shengquan.yuan@intel.com>
 *    Binglin Chen <binglin.chen@intel.com>
 *    Jason Hu <jason.hu@intel.com>
 *    Zeng Li <zeng.li@intel.com>
 */

#ifndef _PSB_OVERLAY_H_
#define _PSB_OVERLAY_H_

#include <va/va.h>
#define USE_OVERLAY 1
#define USE_DISPLAY_C_SPRITE 0

/*
 * NOTE: Destination keying when enabled forces the overlay surface
 * Z order to be below the primary display. Pixels that match the key
 * value become transparent and the overlay becomes visible at that
 * pixel.
 */
#define USE_DCLRK 1
/*
 * NOTE: This is only for media player output
 */
#define USE_CLIP_FUNC 0
#define USE_SCALE_FUNC 1
#define USE_ROTATION_FUNC 0

#define Success 0

/* FIXME this will be removed later after using pvr2d */
#if 1
#define RR_Rotate_0         1
#define RR_Rotate_90        2
#define RR_Rotate_180       4
#define RR_Rotate_270       8
#endif

#define OV_HUE_DEFAULT_VALUE   0
#define OV_HUE_MIN            -30
#define OV_HUE_MAX             30

#define OV_BRIGHTNESS_DEFAULT_VALUE   0
#define OV_BRIGHTNESS_MIN            -50
#define OV_BRIGHTNESS_MAX             50

#define OV_CONTRAST_DEFAULT_VALUE     0
#define OV_CONTRAST_MIN              -100
#define OV_CONTRAST_MAX               100

#define OV_SATURATION_DEFAULT_VALUE   100
#define OV_SATURATION_MIN             0
#define OV_SATURATION_MAX             200

#define CLAMP_ATTR(a,max,min) (a>max?max:(a<min?min:a))

/*DSPCNTR - Display Control Register*/
#define DISPLAY_PLANE_ENABLE            (1<<31)
#define DISPLAY_PLANE_DISABLE           0
#define DISPPLANE_GAMMA_ENABLE          (1<<30)
#define DISPPLANE_GAMMA_DISABLE         0
#define DISPPLANE_PIXFORMAT_MASK        (0xf<<26)
#define DISPPLANE_8BPP              (0x2<<26)
#define DISPPLANE_15_16BPP          (0x4<<26)
#define DISPPLANE_16BPP             (0x5<<26)
#define DISPPLANE_32BPP_NO_ALPHA        (0x6<<26)
#define DISPPLANE_32BPP             (0x7<<26)
#define DISPPLANE_BOTTOM            (4)

/*
 * OCMD - Overlay Command Register
 */
#define OCMD_REGISTER           0x30168
#define MIRROR_MODE             (0x3<<17)
#define MIRROR_HORIZONTAL       (0x1<<17)
#define MIRROR_VERTICAL         (0x2<<17)
#define MIRROR_BOTH             (0x3<<17)
#define OV_BYTE_ORDER           (0x3<<14)
#define UV_SWAP                 (0x1<<14)
#define Y_SWAP                  (0x2<<14)
#define Y_AND_UV_SWAP           (0x3<<14)
#define SOURCE_FORMAT           (0xf<<10)
#define RGB_888                 (0x1<<10)
#define RGB_555                 (0x2<<10)
#define RGB_565                 (0x3<<10)
#define NV12                    (0xb<<10)
#define YUV_422                 (0x8<<10)
#define YUV_411                 (0x9<<10)
#define YUV_420                 (0xc<<10)
#define YUV_422_PLANAR          (0xd<<10)
#define YUV_410                 (0xe<<10)
#define TVSYNC_FLIP_PARITY      (0x1<<9)
#define TVSYNC_FLIP_ENABLE      (0x1<<7)
#define BUF_TYPE                (0x1<<5)
#define BUF_TYPE_FRAME          (0x0<<5)
#define BUF_TYPE_FIELD          (0x1<<5)
#define TEST_MODE               (0x1<<4)
#define BUFFER_SELECT           (0x3<<2)
#define BUFFER0                 (0x0<<2)
#define BUFFER1                 (0x1<<2)
#define FIELD_SELECT            (0x1<<1)
#define FIELD0                  (0x0<<1)
#define FIELD1                  (0x1<<1)
#define OVERLAY_ENABLE          0x1

#define OFC_UPDATE              0x1

/*
* OVADD - Overlay Register Update Address Register
*/
#define OVADD_PIPE_A           (0x0<<6)
#define OVADD_PIPE_B           (0x2<<6)
#define OVADD_PIPE_C           (0x1<<6)
#define LOAD_IEP_BW_EXPANSION  (0x1<<4)
#define LOAD_IEP_BS_SCC                (0x1<<3)
#define LOAD_IEP_CSC           (0x1<<2)
#define LOAD_IEP_DEBUG         (0x1<<1)
#define LOAD_COEFFICEINT       (0x1<<0)

/* OCONFIG register */
#define CC_OUT_8BIT             (0x1<<3)
#define OVERLAY_PIPE_MASK       (0x1<<18)
#define OVERLAY_PIPE_A          (0x0<<18)
#define OVERLAY_PIPE_B          (0x1<<18)
#define IEP_LITE_BYPASS                (0x1<<27)
#define OVERLAY_C_PIPE_MASK      (0x3<<17)
#define OVERLAY_C_PIPE_A         (0x0<<17)
#define OVERLAY_C_PIPE_B         (0x2<<17)
#define OVERLAY_C_PIPE_C         (0x1<<17)
#define GAMMA2_ENBL             (0x1<<16)
#define ZORDER_TOP             (0x0<<15)
#define ZORDER_BOTTOM          (0x1<<15)
#define CSC_MODE_BT709          (0x1<<5)
#define CSC_MODE_BT601          (0x0<<5)
#define CSC_BYPASS             (0x1<<4)
#define THREE_LINE_BUFFERS      (0x1<<0)
#define TWO_LINE_BUFFERS        (0x0<<0)

/* DCLRKM register */
#define DEST_KEY_ENABLE         (0x1<<31)
#define CONST_ALPHA_ENABLE      (0x1<<30)

/* Polyphase filter coefficients */
#define N_HORIZ_Y_TAPS          5
#define N_VERT_Y_TAPS           3
#define N_HORIZ_UV_TAPS         3
#define N_VERT_UV_TAPS          3
#define N_PHASES                17
#define MAX_TAPS                5

/* Filter cutoff frequency limits. */
#define MIN_CUTOFF_FREQ         1.0
#define MAX_CUTOFF_FREQ         3.0

#define RGB16ToColorKey(c) \
(((c & 0xF800) << 8) | ((c & 0x07E0) << 5) | ((c & 0x001F) << 3))

#define RGB15ToColorKey(c) \
(((c & 0x7c00) << 9) | ((c & 0x03E0) << 6) | ((c & 0x001F) << 3))

typedef struct {
    uint32_t x1;
    uint32_t x2;
    uint32_t y1;
    uint32_t y2;
} BoxRec, *BoxPtr;

typedef struct {
    uint32_t OBUF_0Y;
    uint32_t OBUF_1Y;
    uint32_t OBUF_0U;
    uint32_t OBUF_0V;
    uint32_t OBUF_1U;
    uint32_t OBUF_1V;
    uint32_t OSTRIDE;
    uint32_t YRGB_VPH;
    uint32_t UV_VPH;
    uint32_t HORZ_PH;
    uint32_t INIT_PHS;
    uint32_t DWINPOS;
    uint32_t DWINSZ;
    uint32_t SWIDTH;
    uint32_t SWIDTHSW;
    uint32_t SHEIGHT;
    uint32_t YRGBSCALE;
    uint32_t UVSCALE;
    uint32_t OCLRC0;
    uint32_t OCLRC1;
    uint32_t DCLRKV;
    uint32_t DCLRKM;
    uint32_t SCHRKVH;
    uint32_t SCHRKVL;
    uint32_t SCHRKEN;
    uint32_t OCONFIG;
    uint32_t OCMD;
    uint32_t RESERVED1;                 /* 0x6C */
    uint32_t OSTART_0Y;                 /* for i965 */
    uint32_t OSTART_1Y;         /* for i965 */
    uint32_t OSTART_0U;
    uint32_t OSTART_0V;
    uint32_t OSTART_1U;
    uint32_t OSTART_1V;
    uint32_t OTILEOFF_0Y;
    uint32_t OTILEOFF_1Y;
    uint32_t OTILEOFF_0U;
    uint32_t OTILEOFF_0V;
    uint32_t OTILEOFF_1U;
    uint32_t OTILEOFF_1V;
    uint32_t FASTHSCALE;                        /* 0xA0 */
    uint32_t UVSCALEV;                  /* 0xA4 */

    uint32_t RESERVEDC[(0x200 - 0xA8) / 4];                /* 0xA8 - 0x1FC */
    uint16_t Y_VCOEFS[N_VERT_Y_TAPS * N_PHASES];                   /* 0x200 */
    uint16_t RESERVEDD[0x100 / 2 - N_VERT_Y_TAPS * N_PHASES];
    uint16_t Y_HCOEFS[N_HORIZ_Y_TAPS * N_PHASES];                  /* 0x300 */
    uint16_t RESERVEDE[0x200 / 2 - N_HORIZ_Y_TAPS * N_PHASES];
    uint16_t UV_VCOEFS[N_VERT_UV_TAPS * N_PHASES];                 /* 0x500 */
    uint16_t RESERVEDF[0x100 / 2 - N_VERT_UV_TAPS * N_PHASES];
    uint16_t UV_HCOEFS[N_HORIZ_UV_TAPS * N_PHASES];        /* 0x600 */
    uint16_t RESERVEDG[0xa00 / 2 - N_HORIZ_UV_TAPS * N_PHASES];
    uint32_t IEP_SPACE[(0x3401c - 0x31000)/4];
} I830OverlayRegRec, *I830OverlayRegPtr;


#define Degree (2*PI / 360.0)
#define PI 3.1415927


typedef struct {
    uint8_t sign;
    uint16_t mantissa;
    uint8_t exponent;
} coeffRec, *coeffPtr;

typedef struct _ov_psb_fixed32 {
    union {
        struct {
            unsigned short Fraction;
            short Value;
        };
        long ll;
    };
} ov_psb_fixed32;

typedef struct _psb_subpictureKeyRec {
    struct _psb_subpictureKeyRec *next;
    unsigned int subpic_id;

    int subpic_dstx;
    int subpic_dsty;
    int subpic_dstw;
    int subpic_dsth;
} psb_subpictureKeyRec, *psb_subpictureKeyPtr;

typedef struct _PsbPortPrivRec {
    int curBuf;
    int is_mfld;
    /*subpicture*/
    int subpicture_enabled;
    int subpic_clear_flag;
    unsigned int subpicture_enable_mask;
    psb_subpictureKeyRec clear_key[6];

    /*overlay status*/
    int overlayA_pipeId;
    int overlayC_pipeId;
    int overlayA_enabled;
    int overlayC_enabled;

    /*window attribute*/
    int last_num_clipbox;
    VARectangle last_clipbox[16];
    int x11_window_width;
    int x11_window_height;
    int display_width;
    int display_height;
    int extend_display_width;
    int extend_display_height;

    /* used to check downscale*/
    short width_save;
    short height_save;

    /* information of display attribute */
    ov_psb_fixed32 brightness;
    ov_psb_fixed32 contrast;
    ov_psb_fixed32 saturation;
    ov_psb_fixed32 hue;

    unsigned char * p_iep_lite_context;

    /* hwoverlay */
    uint32_t gamma0;
    uint32_t gamma1;
    uint32_t gamma2;
    uint32_t gamma3;
    uint32_t gamma4;
    uint32_t gamma5;
    uint32_t colorKey;

    int oneLineMode;
    int scaleRatio;
    int rotation;

    struct _WsbmBufferObject *wsbo[2];
    uint32_t YBuf0offset;
    uint32_t UBuf0offset;
    uint32_t VBuf0offset;
    uint32_t YBuf1offset;
    uint32_t UBuf1offset;
    uint32_t VBuf1offset;
    unsigned char *regmap[2];
} PsbPortPrivRec, *PsbPortPrivPtr;


int psb_coverlay_init(VADriverContextP ctx);
int psb_coverlay_stop(VADriverContextP ctx);
int psb_coverlay_exit(VADriverContextP ctx);

VAStatus psb_putsurface_overlay(
    VADriverContextP ctx,
    VASurfaceID surface,
    short srcx,
    short srcy,
    unsigned short srcw,
    unsigned short srch,
    short destx,
    short desty,
    unsigned short destw,
    unsigned short desth,
    unsigned int flags, /* de-interlacing flags */
    int overlayId,
    int pipeId
);

enum pipe_id_t {
    PIPEA = 0,
    PIPEB,
    PIPEC,
};

enum overlay_id_t {
    OVERLAY_A = 0,
    OVERLAY_C,
};

#endif /* _PSB_OVERLAY_H_ */