Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
      3  * Copyright (c) Imagination Technologies Limited, UK
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors:
     26  *    Elaine Wang <elaine.wang (at) intel.com>
     27  *    Zeng Li <zeng.li (at) intel.com>
     28  *
     29  */
     30 
     31 #include "img_types.h"
     32 #include "psb_drv_video.h"
     33 #include "psb_surface.h"
     34 #include "pnw_cmdbuf.h"
     35 #include "pnw_hostjpeg.h"
     36 #include "pnw_hostheader.h"
     37 
     38 #define TOPAZ_PIC_PARAMS_VERBOSE 0
     39 
     40 #define MAX_SLICES_PER_PICTURE 72
     41 #define MAX_TOPAZ_CORES        4
     42 #define MAX_TOPAZ_CMD_COUNT    (0x1000)
     43 
     44 #define TH_SKIP_IPE                     6
     45 #define TH_INTER                        60
     46 #define TH_INTER_QP                     10
     47 #define TH_INTER_MAX_LEVEL      1500
     48 #define TH_SKIP_SPE                     6
     49 #define SPE_ZERO_THRESHOLD      6
     50 
     51 #define MAX_NUM_CORES 2
     52 
     53 
     54 /* defines used for the second 32 bit word of the coded data header */
     55 /* the average Qp used in this frame */
     56 #define RC_STATUS_FRAME_AVE_QP_MASK             0x0ff
     57 /* At least one slice in this frame was large enough for the firmware to
     58  * try to reduce it by increasing Qp or skipping MBs */
     59 #define RC_STATUS_FLAG_LARGE_SLICE              0x100
     60 /* At least one slice in this frame was larger than the slice limit */
     61 #define RC_STATUS_FLAG_SLICE_OVERFLOW   0x200
     62 /* The peak bitrate was exceeded for this frame (VCM only) */
     63 #define RC_STATUS_FLAG_BITRATE_OVERFLOW 0x400
     64 #define SKIP_NEXT_FRAME                 0x800   /* The next frame should be skipped */
     65 
     66 #define IS_H264_ENC(codec) \
     67     (IMG_CODEC_H264_CBR == (codec) || IMG_CODEC_H264_VCM == (codec))
     68 
     69 /* commands for topaz,shared with user space driver */
     70 enum drm_pnw_topaz_cmd {
     71     /* Common Commands */
     72     MTX_CMDID_NULL,
     73     MTX_CMDID_SHUTDOWN,
     74 
     75     /* Video Commands */
     76     MTX_CMDID_START_PIC,
     77     MTX_CMDID_DO_HEADER,
     78     MTX_CMDID_ENCODE_SLICE,
     79     MTX_CMDID_END_PIC,
     80     MTX_CMDID_FLUSH,
     81 
     82     /* JPEG Commands */
     83     MTX_CMDID_SETQUANT,  //!< (data: #JPEG_MTX_QUANT_TABLE)\n
     84     MTX_CMDID_RESET_ENCODE, //!< (no data)\n
     85     MTX_CMDID_ISSUEBUFF, //!< (data: #MTX_ISSUE_BUFFERS)\n
     86     MTX_CMDID_SETUP,    //!< (data: #JPEG_MTX_DMA_SETUP)\n\n
     87 
     88     /* SW Commands */
     89     MTX_CMDID_PAD = 0x7a, //!< Will be ignored by kernel
     90     MTX_CMDID_SW_WRITEREG = 0x7b,
     91     MTX_CMDID_SW_LEAVE_LOWPOWER = 0x7c,
     92     MTX_CMDID_SW_ENTER_LOWPOWER = 0x7e,
     93     MTX_CMDID_SW_NEW_CODEC = 0x7f
     94 };
     95 
     96 
     97 /* codecs topaz supports,shared with user space driver */
     98 enum drm_pnw_topaz_codec {
     99     IMG_CODEC_JPEG = 0,
    100     IMG_CODEC_H264_NO_RC,
    101     IMG_CODEC_H264_VBR,
    102     IMG_CODEC_H264_CBR,
    103     IMG_CODEC_H263_NO_RC,
    104     IMG_CODEC_H263_VBR,
    105     IMG_CODEC_H263_CBR,
    106     IMG_CODEC_MPEG4_NO_RC,
    107     IMG_CODEC_MPEG4_VBR,
    108     IMG_CODEC_MPEG4_CBR,
    109     IMG_CODEC_H264_VCM,     //!< H264 low constant bitrate (video conferencing mode)
    110     IMG_CODEC_NUM
    111 };
    112 
    113 typedef struct _RC_PARAMS_ {
    114     IMG_UINT32  BitsPerSecond;
    115     IMG_UINT32  InitialQp;
    116     IMG_UINT32  BUSize;
    117     IMG_UINT32  FrameRate;
    118     IMG_UINT32  BufferSize;
    119     IMG_UINT32  IntraFreq;
    120     IMG_UINT16  IDRFreq;
    121     IMG_UINT16   MinQP;
    122     IMG_BOOL    RCEnable;
    123     IMG_BOOL    FrameSkip;
    124 
    125     IMG_UINT8   Slices;
    126     IMG_UINT32   InitialLevel;
    127     IMG_INT32   InitialDelay;
    128     IMG_INT8    QCPOffset;
    129 
    130     IMG_BOOL    bDisableFrameSkipping;
    131     IMG_BOOL    bDisableBitStuffing;
    132     IMG_BOOL    bBitrateChanged;
    133 } IMG_RC_PARAMS;
    134 
    135 /*!
    136 *****************************************************************************
    137 *
    138 * @Description    Struct describing rate control input parameters
    139 *
    140 * @Brief          Rate control input parameters
    141 *
    142 ****************************************************************************/
    143 typedef struct {
    144     IMG_UINT8   SeInitQP;               /* Initial QP for Sequence */
    145     IMG_UINT8   MinQPVal;               /* Minimum QP value to use */
    146     IMG_UINT8   MaxQPVal;               /* Maximum QP value to use */
    147 
    148     IMG_UINT8   MBPerRow;               /* Number of MBs Per Row */
    149     IMG_UINT16  MBPerFrm;               /* Number of MBs Per Frame */
    150     IMG_UINT16  MBPerBU;                /* Number of MBs Per BU */
    151     IMG_UINT16  BUPerFrm;               /* Number of BUs Per Frame */
    152 
    153     IMG_UINT16  IntraPeriod;    /* Intra frame frequency */
    154 
    155     IMG_INT32   BitsPerFrm;             /* Bits Per Frame */
    156     IMG_INT32   BitsPerBU;              /* Bits Per BU */
    157     IMG_INT32   BitsPerMB;              /* Bits Per MB */
    158 
    159     IMG_INT32   BitRate;                        /* Bit Rate (bps) */
    160     IMG_INT32   BufferSize;             /* Size of Buffer */
    161     IMG_INT32   InitialLevel;   /* Initial Level of Buffer */
    162     IMG_INT32   InitialDelay;   /* Initial Delay of Buffer */
    163 
    164     IMG_UINT8   ScaleFactor;            /* Scale Factor (H264 only) */
    165 
    166     /* Bitrate that should be targetted as a fraction of 128
    167      * relative to maximum bitrate i32BitRate (VCM mode only)*/
    168     IMG_UINT8   VCMBitrateMargin;
    169 
    170     IMG_UINT8   HalfFrameRate;  /* Half Frame Rate (MP4 only) */
    171     IMG_UINT8   FCode;                  /* F Code (MP4 only) */
    172 
    173     /* TO BE DELETED -- ONCE MP4 RC CODE IS OPTIMISED */
    174     IMG_INT32   BitsPerGOP;             /* Bits Per GOP (MP4 only) */
    175     IMG_UINT16  AvQPVal;                /* Average QP in Current Picture */
    176     IMG_UINT16  MyInitQP;               /* Initial Quantizer */
    177 
    178     /* The number of bits of margin to leave before forcing
    179      * skipped macroblocks (VCM mode only)*/
    180     IMG_INT32   ForeceSkipMargin;
    181 
    182     /* A constant used in rate control =
    183      * (GopSize/(BufferSize-InitialLevel))*256 */
    184     IMG_UINT32  RCScaleFactor;
    185 
    186     /* Only used in peak constrained VBR */
    187     IMG_INT32 TransferRate;
    188     IMG_INT32 MaxFrameSize;
    189 } IN_RC_PARAMS;
    190 
    191 typedef enum _TH_SKIP_SCALE_ {
    192     TH_SKIP_0 = 0,
    193     TH_SKIP_12 = 1,
    194     TH_SKIP_24 = 2
    195 } TH_SKIP_SCALE;
    196 
    197 struct context_ENC_s {
    198     object_context_p obj_context; /* back reference */
    199 
    200     IMG_UINT32       NumCores; /* Number of encode cores in Penwell */
    201     IMG_UINT32       ParallelCores; /* Number of cores to use */
    202     IMG_INT32       BelowParamsBufIdx;
    203     IMG_INT16       RawWidth;
    204     IMG_INT16       RawHeight;
    205 
    206     IMG_UINT16       Width;  /* ~0xf & (RawWidth + 0xf)*/
    207     IMG_UINT16       Height;     /* ~0xf & (RawHeight + 0xf */
    208 
    209     IMG_UINT16       Slices;
    210     enum drm_pnw_topaz_codec eCodec;
    211     IMG_FORMAT      eFormat;
    212     unsigned int    FCode;
    213     IMG_RC_PARAMS   sRCParams;
    214     IMG_INT32       AccessUnitNum;
    215     IMG_UINT32      CmdCount;
    216     IMG_UINT32      LastSync[2][MAX_TOPAZ_CORES];
    217     IMG_INT32       FrmIdx;
    218     IMG_BOOL        SliceHeaderReady[MAX_SLICES_PER_PICTURE];
    219 
    220     IMG_UINT32      InBuffer; /* total coded data in Byte */
    221 
    222     IMG_INT16       HeightMinus16MinusLRBTopOffset;
    223     IMG_INT16       HeightMinus32MinusLRBTopOffset;
    224     IMG_INT16       HeightMinusLRB_TopAndBottom_OffsetsPlus16;
    225     IMG_INT16       HeightMinusLRBSearchHeight;
    226     IMG_UINT32      IPEControl;
    227     IMG_BOOL        SyncSequencer;
    228 
    229     IMG_UINT32       SliceToCore;  /* Core number to send current slice to */
    230     IMG_INT32       LastSliceNum[MAX_TOPAZ_CORES]; /* Slice number of last slice sent to core */
    231 
    232     object_surface_p    src_surface;
    233     object_surface_p    ref_surface;
    234     object_surface_p    dest_surface;/* reconstructed surface */
    235     object_buffer_p     coded_buf;
    236 
    237     /* save previous settings */
    238     object_surface_p    previous_src_surface;
    239     object_surface_p    previous_ref_surface;
    240     object_surface_p    previous_dest_surface; /* reconstructed surface */
    241 
    242     /* point to the place in cmdbuf following START_PIC, the initial_qp will fill into it later */
    243     uint32_t *initial_qp_in_cmdbuf;
    244 
    245 
    246     /* global topaz_params buffer shared by every cmdbuffer
    247      * it is because filling InParams for every MB is very time-consuming
    248      * and in most cases, we can reuse previous frames buffer
    249      */
    250     /* 0 and 1 are for in_parms, 2 is for bellow and above params*/
    251 
    252     struct psb_buffer_s topaz_in_params_I;
    253     struct psb_buffer_s topaz_in_params_P;
    254 
    255     struct psb_buffer_s topaz_below_params; /* MB MVs read & written by HW */
    256     struct psb_buffer_s topaz_above_params; /* MB MVs read & written by HW */
    257 
    258     uint32_t topaz_buffer_size;
    259     uint32_t in_params_size;
    260     uint32_t below_params_size;
    261     uint32_t above_params_size;
    262 
    263     /* offset in topaz_param buffer */
    264     uint32_t in_params_ofs;
    265 
    266     uint32_t below_params_ofs;
    267     uint32_t above_params_ofs;
    268 
    269     uint32_t pic_params_size;
    270 
    271     uint32_t header_buffer_size;
    272 
    273     uint32_t seq_header_ofs;
    274     uint32_t pic_header_ofs;
    275     uint32_t eoseq_header_ofs;
    276     uint32_t eostream_header_ofs;
    277     uint32_t slice_header_ofs;
    278     /*HRD SEI header*/
    279     uint32_t aud_header_ofs;
    280     uint32_t sei_buf_prd_ofs;
    281     uint32_t sei_pic_tm_ofs;
    282     uint32_t sei_pic_fpa_ofs;
    283     uint32_t sei_pic_data_size;
    284 
    285     uint32_t sliceparam_buffer_size;
    286 
    287     IN_RC_PARAMS in_params_cache; /* following frames reuse the first frame's IN_RC_PARAMS, cache it */
    288     TH_SKIP_SCALE THSkip;
    289     uint32_t pic_params_flags;
    290 
    291     VAEncSliceParameterBuffer *slice_param_cache;
    292     uint16_t slice_param_num;
    293 
    294     IMG_UINT16 MPEG4_vop_time_increment_resolution;
    295 
    296     /* saved information for FrameSkip redo */
    297     uint32_t MPEG4_vop_time_increment_frameskip;
    298     uint32_t MPEG4_picture_type_frameskip;
    299     uint8_t profile_idc;
    300 
    301     uint8_t force_idr_h264;
    302 
    303     /*If only one slice, it's zero. Otherwise it indicates size of parted coded_buf per slice*/
    304     uint32_t coded_buf_per_slice;
    305 
    306     /*JPEG context*/
    307     TOPAZSC_JPEG_ENCODER_CONTEXT *jpeg_ctx;
    308 
    309     /*H264 SEI_INSERTION*/
    310     IMG_BOOL bInserHRDParams;
    311 
    312     uint32_t max_slice_size;
    313     unsigned char *save_seq_header_p;
    314 
    315     IMG_INT16 num_air_mbs;
    316     IMG_INT16 air_threshold;
    317 
    318     uint32_t buffer_size;
    319     uint32_t initial_buffer_fullness;
    320 
    321     H264_VUI_PARAMS VUI_Params;
    322     IMG_BOOL bInsertVUI;
    323 
    324     /*H264 idr_pic_id field in slice header*/
    325     uint16_t idr_pic_id;
    326     unsigned char none_vcl_nal;
    327 
    328     /*Keep growing and won't be reset on IDR frame*/
    329     uint32_t raw_frame_count;
    330 };
    331 
    332 typedef struct context_ENC_s *context_ENC_p;
    333 
    334 /*#define BELOW_PARAMS_SIZE 8*/
    335 
    336 #define HEADER_SIZE             128*2
    337 
    338 #define BELOW_PARAMS_SIZE       16
    339 #define REGION_TYPE_2D          1
    340 #define REGION_TYPE_LINEAR      0
    341 #define REGION_TYPE_2DREF       3
    342 
    343 
    344 #define MAX_RESIDUAL_PER_MB_H264        1260
    345 #define ISINTER_FLAGS           0x1
    346 #define ISH264_FLAGS            0x2
    347 #define ISMPEG4_FLAGS           0x4
    348 #define ISH263_FLAGS            0x8
    349 #define DEBLOCK_FRAME           0x10
    350 #define ISRC_FLAGS              0x20
    351 #define ISCBR_FLAGS             0x40
    352 #define ISVCM_FLAGS             0x80
    353 #define ISVBR_FLAGS             0x100
    354 #define ISCFS_FLAGS             0x200
    355 #define INTERLEAVE_TARGET       0x400
    356 #define FIRST_FRAME             0x800
    357 #define SYNC_SEQUENCER          0x1000
    358 #define DEBLOCK_SLICE           0x2000
    359 #define DISABLE_FRAME_SKIPPING  0x4000 //!< Flag indicatest that frame skipping should be disabled.
    360 #define DISABLE_BIT_STUFFING    0x8000 //!< Flag indicates that bit stuffing should be disabled.
    361 
    362 #define SPE_EDGE_LEFT   1       /* ->bMinXRealEdge*/
    363 #define SPE_EDGE_RIGHT  2       /* ->bMaxXRealEdge*/
    364 #define SPE_EDGE_TOP    4   /* ->bMinYRealEdge*/
    365 #define SPE_EDGE_BOTTOM 8       /* ->bMaxYRealEdge*/
    366 
    367 #define BPH_SEI_NAL_INITIAL_CPB_REMOVAL_DELAY_SIZE 23
    368 #define PTH_SEI_NAL_CPB_REMOVAL_DELAY_SIZE 23
    369 #define PTH_SEI_NAL_DPB_OUTPUT_DELAY_SIZE 7
    370 
    371 #define FW_TOKEN_USED 0
    372 #define NOT_USED_BY_TOPAZ 0
    373 
    374 typedef struct {
    375     /* Transferred into the input params area of the macroblock parameter structure*/
    376     IMG_BYTE    CurBlockAddr;
    377     IMG_BYTE    IPEMin[2];
    378     IMG_BYTE    IPEMax[2];
    379     IMG_BYTE    RealEdge;  /*bMinXRealEdge, bMaxXRealEdge, bMinXRealEdge and bMinYRealEdge*/
    380     /* Surrounding block availability */
    381     IMG_BYTE    MVValid;
    382     IMG_BYTE    ParamsValid;
    383     IMG_BYTE     bySliceQP;
    384     IMG_BYTE     bySliceQPC;
    385 
    386     IMG_BYTE     Reserved[6]; /* This is padding to make the transfers 16 bytes aligned*/
    387     /* Transferred into the SW communication section of the macroblock
    388      * parameter structure We shall EDMA the whole lot of this into eiob
    389      * in one go, and then use two TDMA's to put it into seperate locations
    390      * within the macroblock structure
    391      */
    392     IMG_UINT32   IPEControl;
    393     IMG_UINT32   SPEControl;
    394     IMG_UINT32   JMCompControl;
    395     IMG_UINT32   VLCControl;
    396 } MTX_CURRENT_IN_PARAMS;
    397 
    398 typedef struct { /* corresponding bytes inside the MB_IN structure: */
    399     IMG_BYTE    BlockSizes;              /****************/
    400     IMG_BYTE    IntraMode;               /*              */
    401     IMG_BYTE    Intra4x4ModesBottom[2];  /*              */
    402     IMG_BYTE    CodeType;                /*  [64 : 71]   */
    403     IMG_BYTE    Reserved2;               /*              */
    404     /*IMG_BYTE   SAD;*/
    405     IMG_BYTE    QPy;                     /*              */
    406     IMG_BYTE    QPc;                     /****************/
    407 
    408     IMG_BYTE    Reserved3[8];    /* This is padding to make the transfers 16 byte aligned*/
    409 
    410     IMG_UINT16  LumaSubBlockCoded;      /****************/
    411     IMG_BYTE    ChromaSubBlockCoded;    /*              */
    412     IMG_BYTE    LumaChromaDCCoded;      /*              */
    413     /*  [129 : 143] */
    414     IMG_BYTE    Lambda;                 /*              */
    415     IMG_BYTE    Reserved[3];            /*              */
    416     /*              */
    417     IMG_BYTE    Intra4x4ModeDeltas[8];  /****************/
    418 
    419     /* Motion vectors */
    420     IMG_UINT16  IntegerMV[16][2];      /* [207 : 144]  */
    421     /* input region from host */
    422 } MTX_CURRENT_OUT_PARAMS;
    423 
    424 
    425 typedef struct _PIC_PARAMS_ {
    426     IMG_UINT32          SrcYBase;
    427     IMG_UINT32          SrcUBase;
    428     IMG_UINT32          SrcVBase;
    429     IMG_UINT32          DstYBase;
    430     IMG_UINT32          DstUVBase;
    431 
    432     IMG_UINT16          SrcYStride;
    433     IMG_UINT16          SrcUVStride;
    434     IMG_UINT16          SrcYRowStride;
    435     IMG_UINT16          SrcUVRowStride;
    436 
    437     IMG_UINT16          DstYStride;
    438     IMG_UINT16          DstUVStride;
    439 
    440     IMG_UINT32          CodedBase;
    441 
    442     IMG_UINT32          BelowParamsInBase;
    443     IMG_UINT32          BelowParamsOutBase;
    444 
    445     IMG_UINT32          AboveParamsBase;
    446 
    447     IMG_UINT16          Width;
    448     IMG_UINT16          Height;
    449     IMG_UINT32          Flags;
    450 
    451     IN_RC_PARAMS        sInParams;
    452 
    453     IMG_UINT16          SearchWidth;
    454     IMG_UINT16          SearchHeight;
    455 
    456     IMG_UINT16          NumSlices;                      //!< Number of slices in the picture
    457 
    458     IMG_BOOL16 		IsPerSliceOutput;
    459     // SEI_INSERTION
    460     IMG_UINT64          ClockDivBitrate;
    461     IMG_UINT32          MaxBufferMultClockDivBitrate;
    462 } PIC_PARAMS;
    463 
    464 typedef enum {
    465     INTRA_MB_OFF = 0,
    466     INTRA_MB_AIR = 1,
    467     INTRA_MB_SCANNING = 2
    468 } INTRA_MB_OPERATION_MODE;
    469 
    470 /* ScanningIntraParams */
    471 #define SCANNING_INTRA_MODE_MASK        (0x0000000f)
    472 #define SCANNING_INTRA_MODE_SHIFT       (0)
    473 #define SCANNING_INTRA_WIDTH_MASK       (0x000000f0)
    474 #define SCANNING_INTRA_WIDTH_SHIFT      (4)
    475 #define SCANNING_INTRA_WIDTH_MAX        (15)
    476 #define SCANNING_INTRA_STEP_MASK        (0x00000f00)
    477 #define SCANNING_INTRA_STEP_SHIFT       (8)
    478 #define SCANNING_INTRA_STEP_MAX         (15)
    479 
    480 #define MTX_FLAG_WB_SKIPFRAME   (0x00000002)
    481 #define MTX_FLAG_RC_MASK                (0xFFFF0000)
    482 #define MTX_FLAG_RC_PICPARAM    (0x00010000)
    483 #define MTX_FLAG_RC_SLICEPARAM  (0x00020000)
    484 #define MTX_FLAG_RC_BUPARAM             (0x00040000)
    485 #define MTX_FLAG_RC_GETBUPARAM  (0x00080000)
    486 #define MTX_FLAG_RC_FRM_LEN         (0x00100000)
    487 
    488 
    489 /* This holds the data that is needed at the start of a slice
    490  */
    491 typedef struct _SLICE_PARAMS_ {
    492 
    493     IMG_UINT16  SliceStartRowNum;
    494     IMG_UINT16  SliceHeight; /*Height of slice in pixels*/
    495 
    496     IMG_UINT32  RefYBase;
    497     IMG_UINT32  RefUVBase;
    498     IMG_UINT16  RefYStride;
    499     IMG_UINT16  RefUVStride;
    500     IMG_UINT16  RefYRowStride;
    501     IMG_UINT16  RefUVRowStride;
    502 
    503     IMG_UINT32  HostCtx;  /*Host context to insert into coded data header*/
    504     IMG_UINT32  Flags;
    505     IMG_UINT32  MaxSliceSize;
    506     IMG_UINT32  FCode; /*FCode value MP4 only*/
    507 
    508     /*Pointer to array of MTX_CURRENT_IN_PARAMS for each MB*/
    509     IMG_UINT32  InParamsBase;
    510 
    511     /*Maximum number of Adaptive intra refresh macroblocks for this slice*/
    512     IMG_INT16   NumAirMBs;
    513 
    514     /*Theshold value used in Adaptive intra refresh calculation.*/
    515     IMG_INT16   AirThreshold;
    516     IMG_UINT32  ScanningIntraParams;
    517 } SLICE_PARAMS;
    518 
    519 enum {
    520     CBR = 0,
    521     VBR
    522 } eRCMode;
    523 
    524 enum {
    525     EH263 = 0,
    526     EMpeg4 = 1,
    527     EH264 = 2,
    528     EHJpeg = 3
    529 } eEncodingFormat;
    530 #define VAEncSliceParameter_Equal(src, dst)                             \
    531     (((src)->start_row_number == (dst)->start_row_number)               \
    532      && ((src)->slice_height == (dst)->slice_height)                    \
    533      && ((src)->slice_flags.bits.is_intra == (dst)->slice_flags.bits.is_intra) \
    534      && ((src)->slice_flags.bits.disable_deblocking_filter_idc == (dst)->slice_flags.bits.disable_deblocking_filter_idc))
    535 
    536 #define VAEncSliceParameter_LightEqual(src, dst)                             \
    537     (((src)->start_row_number == (dst)->start_row_number)               \
    538      && ((src)->slice_height == (dst)->slice_height)                    \
    539      && ((src)->slice_flags.bits.disable_deblocking_filter_idc == (dst)->slice_flags.bits.disable_deblocking_filter_idc))
    540 
    541 
    542 
    543 #define SURFACE_INFO_SKIP_FLAG_SETTLED 0X80000000
    544 #define GET_SURFACE_INFO_skipped_flag(psb_surface) ((int) (psb_surface->extra_info[5]))
    545 #define SET_SURFACE_INFO_skipped_flag(psb_surface, value) psb_surface->extra_info[5] = (SURFACE_INFO_SKIP_FLAG_SETTLED | value)
    546 #define CLEAR_SURFACE_INFO_skipped_flag(psb_surface) psb_surface->extra_info[5] = 0
    547 
    548 VAStatus pnw_CreateContext(object_context_p obj_context,
    549                            object_config_p obj_config,
    550                            unsigned char is_JPEG);
    551 
    552 
    553 void pnw__setup_rcdata(context_ENC_p ctx, PIC_PARAMS *psPicParams, IMG_RC_PARAMS *rc_params);
    554 
    555 void pnw_DestroyContext(
    556     object_context_p obj_context
    557 );
    558 
    559 VAStatus pnw_BeginPicture(context_ENC_p ctx);
    560 VAStatus pnw_EndPicture(context_ENC_p ctx);
    561 
    562 void pnw_setup_slice_params(
    563     context_ENC_p  ctx, IMG_UINT16 YSliceStartPos,
    564     IMG_UINT16 SliceHeight, IMG_BOOL IsIntra,
    565     IMG_BOOL  VectorsValid, int bySliceQP);
    566 
    567 IMG_UINT32 pnw__send_encode_slice_params(
    568     context_ENC_p ctx,
    569     IMG_BOOL IsIntra,
    570     IMG_UINT16 CurrentRow,
    571     IMG_UINT8  DeblockIDC,
    572     IMG_UINT32 FrameNum,
    573     IMG_UINT16 SliceHeight,
    574     IMG_UINT16 CurrentSlice);
    575 
    576 VAStatus pnw_RenderPictureParameter(context_ENC_p ctx, int core);
    577 
    578 
    579 void pnw_reset_encoder_params(context_ENC_p ctx);
    580 unsigned int pnw__get_ipe_control(enum drm_pnw_topaz_codec  eEncodingFormat);
    581 
    582 
    583 VAStatus pnw_set_bias(context_ENC_p ctx, int core);
    584 
    585