/*
* Copyright (c) 2011 Intel Corporation. All Rights Reserved.
* Copyright (c) Imagination Technologies Limited, UK
*
* 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:
* Waldo Bastian <waldo.bastian@intel.com>
*
*/
#ifndef _VC1_HEADER_H_
#define _VC1_HEADER_H_
#include "psb_def.h"
#include "tng_vld_dec.h"
#include <img_types.h>
/* Picture header parameters */
typedef struct _vc1PicHeader_ {
/* TTMBF signals whether transform type coding is enabled at the frame or macroblock level. */
IMG_UINT8 TTMBF; /* PICTURE_LAYER::TTMBF - 1 bit */
/* TTFRM signals the transform type used to transform the 8x8 pixel error signal in predicted blocks. */
IMG_UINT8 TTFRM; /* PICTURE_LAYER::TTFRM - 2 bits */
/*
BFRACTION signals a fraction that may take on a limited set of fractional values between 0 and 1,
denoting the relative temporal position of the B frame within the interval formed by its anchors.
*/
IMG_UINT8 BFRACTION; /* PICTURE_LAYER::BFRACTION - 2 bits */
/*
CONDOVER affects overlap smoothing in advanced profile.
*/
IMG_UINT8 CONDOVER; /* PICTURE_LAYER::CONDOVER - 2 bits */
/*
TRANSACFRM shall provide the index that selects the coding set used to decode the
Transform AC coefficients for the Cb, Cr blocks.
*/
IMG_UINT8 TRANSACFRM; /* PICTURE_LAYER::TRANSACFRM - 2 bits */
/*
TRANSACFRM2 shall provide the index that selects the coding set used to decode the
Transform AC coefficients for the Y blocks.
*/
IMG_UINT8 TRANSACFRM2; /* PICTURE_LAYER::TRANSACFRM2 - 2 bits */
/*
MVMODE syntax element shall signal one of four motion vector coding modes,
or the intensity compensation mode.
*/
IMG_UINT8 MVMODE; /* PICTURE_LAYER::MVMODE - 2 bits */
IMG_UINT8 MVMODE2; /* PICTURE_LAYER::MVMODE2 - 2 bits */
/* These are needed just for finding out what VLC tables are used in the current picture */
IMG_UINT8 MV4SWITCH; /* PICTURE_LAYER::MV4SWITCH - 1 bit */
IMG_UINT8 CBPTAB; /* PICTURE_LAYER::CBPTAB - 2 bits */
IMG_UINT8 ICBPTAB; /* PICTURE_LAYER::ICBPTAB - 3 bits */
IMG_UINT8 MVTAB; /* PICTURE_LAYER::MVTAB - 2 bits */
IMG_UINT8 IMVTAB; /* PICTURE_LAYER::IMVTAB - 3 bits */
IMG_UINT8 MV4BPTAB; /* PICTURE_LAYER::4MVBPTAB - 2 bits */
IMG_UINT8 MV2BPTAB; /* PICTURE_LAYER::2MVBPTAB - 2 bits */
IMG_UINT8 MBMODETAB; /* PICTURE_LAYER::MBMODETAB - 3 bits */
IMG_UINT8 TRANSDCTAB; /* PICTURE_LAYER::TRANSDCTAB - 1 bits */
/* PQINDEX is used in VLD and the hardware actually only needs to know if it is greater than 8 or not. */
IMG_UINT8 PQINDEX; /* PICTURE_LAYER::PQINDEX - 5 bits */
/*
HALFQP syntax element allows the picture quantizer to be expressed in half step increments.
If HALFQP == 1, then the picture quantizer step size shall be equal to PQUANT + 1/2. If
HALFQP == 0, then the picture quantizer step size shall be equal to PQUANT.
*/
IMG_UINT8 HALFQP; /* PICTURE_LAYER::HALFQP - 1 bit */
IMG_UINT8 bNonUniformQuantizer;
IMG_UINT8 VOPDQUANT_Present;
IMG_UINT8 bDQUANT_InFrame; // Indicates whether quantisation can be specified at a MB level
/* If DQUANTFRM == 0, then the current picture shall only be quantized with PQUANT. */
IMG_UINT8 DQUANTFRM; /* VOPDQUANT::DQUANTFRM - 1 bit */
/* DQPROFILE specifies where it is allowable to change quantization step sizes within the current picture. */
IMG_UINT8 DQPROFILE; /* VOPDQUANT::DQPROFILE - 2 bits */
/*
DQBILEVEL determines the number of possible quantization step sizes which can be
used by each macroblock in the frame.
*/
IMG_UINT8 DQBILEVEL; /* VOPDQUANT::DQBILEVEL - 1 bit */
/* DQDBEDGE specifies which two edges will be quantized with ALTPQUANT when DQPROFILE == 'Double Edge'. */
IMG_UINT8 DQDBEDGE; /* VOPDQUANT::DQDBEDGE - 2 bits */
/* DQSBEDGE specifies which edge will be quantized with ALTPQUANT when DQPROFILE == 'Single Edge'. */
IMG_UINT8 DQSBEDGE; /* VOPDQUANT::DQSBEDGE - 2 bits */
IMG_UINT8 ALTPQUANT; /* VOPDQUANT::ALTPQUANT - 5 bits */
/* REFDIST defines the number of frames between the current frame and the reference frame. */
IMG_UINT8 REFDIST; /* PICTURE_LAYER::REFDIST - 1 bit */
/*
If NUMREF == 0, then the current interlace P field picture shall reference one field. If
NUMREF == 1, then the current interlace P field picture shall reference the two temporally
closest (in display order) I or P field pictures.
*/
IMG_UINT8 NUMREF; /* PICTURE_LAYER::NUMREF - 1 bit */
/*
If REFFIELD == 1, then the second most temporally recent interlace I or P field picture
shall be used as reference.
*/
IMG_UINT8 REFFIELD; /* PICTURE_LAYER::REFFIELD - 1 bit */
/* MVRANGE specifies the motion vector range. */
IMG_UINT8 MVRANGE; /* PICTURE_LAYER::MVRANGE - 2 bits */
/*
DMVRANGE indicates if the extended range for motion vector differential is used in the
vertical, horizontal, both or none of the components of the motion vector.
*/
IMG_UINT8 DMVRANGE; /* PICTURE_LAYER::DMVRANGE - 2 bits */
/* BitplanePresent indicates which bitplanes are present in the picture header */
IMG_UINT8 BP_PRESENT;
/* RawCodingFlag signals whether the bitplanes are coded in raw mode (bit set to 1) or not (set to 0) */
IMG_UINT8 RAWCODINGFLAG;
} vc1PicHeader;
/* Sequence header parameters */
typedef struct _vc1SeqHeader_ {
IMG_UINT8 POSTPROCFLAG;
IMG_UINT8 PULLDOWN;
IMG_UINT8 INTERLACE;
IMG_UINT8 TFCNTRFLAG;
IMG_UINT8 FINTERPFLAG;
IMG_UINT8 PSF;
IMG_UINT8 EXTENDED_DMV;
IMG_UINT8 PANSCAN_FLAG;
IMG_UINT8 REFDIST_FLAG;
IMG_UINT8 LOOPFILTER;
IMG_UINT8 FASTUVMC;
IMG_UINT8 EXTENDED_MV;
IMG_UINT8 DQUANT;
IMG_UINT8 VSTRANSFORM;
IMG_UINT8 QUANTIZER;
IMG_UINT8 MULTIRES;
IMG_UINT8 SYNCMARKER;
IMG_UINT8 RANGERED;
IMG_UINT8 MAXBFRAMES;
IMG_UINT8 OVERLAP;
IMG_UINT8 PROFILE;
} vc1SeqHeader;
//! Maximum number of VLC tables for MB/block layer decode
#define MAX_VLC_TABLES (12)
typedef struct { // Information about VLC tables
IMG_UINT16 aui16StartLocation; //!< Byte offset within the packed VLC tables array
IMG_UINT16 aui16VLCTableLength; //!< Length of the table in number of bytes
IMG_UINT16 aui16RAMLocation; //!< Location of the VLC table in the destination buffer
IMG_UINT16 aui16InitialWidth;
IMG_UINT16 aui16InitialOpcode;
} sTableData;
typedef struct { // Information about the intensity compensation history of previous pictures
IMG_UINT8 ui8LumaScale1;
IMG_UINT8 ui8LumaShift1;
IMG_UINT8 ui8LumaScale2;
IMG_UINT8 ui8LumaShift2;
/* Indication of what fields undergo intensity compensation */
IMG_UINT8 ui8IC1; // 1 - IC top field, 2 - IC bottom field, 3 - IC both fields
IMG_UINT8 ui8IC2;
} IC_PARAM;
#define VLC_INDEX_TABLE_SIZE 83
struct context_VC1_s {
struct context_DEC_s dec_ctx;
object_context_p obj_context; /* back reference */
uint32_t profile;
/* Picture parameters */
VAPictureParameterBufferVC1 *pic_params;
object_surface_p forward_ref_surface;
object_surface_p backward_ref_surface;
object_surface_p decoded_surface;
uint32_t display_picture_width; /* in pixels */
uint32_t display_picture_height; /* in pixels */
uint32_t coded_picture_width; /* in pixels */
uint32_t coded_picture_height; /* in pixels */
uint32_t picture_width_mb; /* in macroblocks */
uint32_t picture_height_mb; /* in macroblocks */
uint32_t size_mb; /* in macroblocks */
IMG_BOOL is_first_slice;
uint32_t scan_index;
uint32_t slice_field_type;
uint8_t bitplane_present; /* Required bitplanes */
IMG_BOOL has_bitplane; /* Whether a bitplane was passed to the driver */
IMG_BOOL bottom_field;
IMG_BOOL half_pel;
IMG_BOOL extend_x;
IMG_BOOL extend_y;
uint8_t mode_config;
uint32_t pull_back_x;
uint32_t pull_back_y;
uint8_t condover; /* Adjusted local version of conditional_overlap_flag */
uint8_t mv_mode; /* Adjusted local version of mv_mode / mv_mode2 */
IMG_BOOL pqindex_gt8; /* Flag to indicate PQINDEX > 8 */
/* TODO:
LOOPFILTER
*/
/*
CurrPic is the picture currently being decoded.
Ref0Pic is the most recent forward reference picture (only used when decoding interlaced field pictures and
the reference picture is in the same frame as the current picture).
Ref1Pic can either be the most recent forward reference picture (when decoding interlaced frame or
progressive pictures) or the 2nd most recent reference picture (when decoding interlaced field pictures).
Ref2Pic is the most recent backward reference picture (only used when decoding B pictures).
*/
IMG_UINT8 ui8FCM_Ref0Pic; /* Used */
IMG_UINT8 ui8FCM_Ref1Pic; /* Used */
IMG_UINT8 ui8FCM_Ref2Pic; /* Used */
IMG_BOOL bTFF_FwRefFrm; /* Used */
IMG_BOOL bTFF_BwRefFrm; /* Used */
IMG_BOOL bRef0RangeRed; /* RangeRed flag */
IMG_BOOL bRef1RangeRed;
IMG_UINT8 ui8IntCompField; /* Used, replace with local var? */
IMG_UINT8 ui8MVmode; /* TODO: Fix, differs slightly from pic_params->mv_mode! */
IMG_INT8 i8FwrdRefFrmDist; /* Used */
IMG_INT8 i8BckwrdRefFrmDist; /* Used */
IMG_UINT32 ui32ScaleFactor; /* Used */
/* IC parameters in current picture */
IMG_UINT8 ui8CurrLumaScale1;
IMG_UINT8 ui8CurrLumaShift1;
IMG_UINT8 ui8CurrLumaScale2;
IMG_UINT8 ui8CurrLumaShift2;
/* Information about the intensity compensation history of previous pictures */
IC_PARAM sICparams[2][2];
/* VLC table information */
IMG_UINT32 ui32NumTables; /* VLC table accumulator */
sTableData sTableInfo[MAX_VLC_TABLES]; /* structure of VLC table information */
/* Split buffers */
int split_buffer_pending;
/* List of VASliceParameterBuffers */
object_buffer_p *slice_param_list;
int slice_param_list_size;
int slice_param_list_idx;
/* VLC packed data */
struct psb_buffer_s vlc_packed_table;
uint32_t vlc_packed_index_table[VLC_INDEX_TABLE_SIZE];
/* Preload buffer */
struct psb_buffer_s preload_buffer;
/* CoLocated buffers */
struct psb_buffer_s *colocated_buffers;
int colocated_buffers_size;
int colocated_buffers_idx;
/* Aux MSB buffer */
struct psb_buffer_s aux_msb_buffer;
struct psb_buffer_s aux_line_buffer;
psb_buffer_p bitplane_buffer;
struct psb_buffer_s bitplane_hw_buffer; /* For hw parase */
uint32_t *p_range_mapping_base; /* pointer to ui32RangeMappingBase in CMD_HEADER_VC1 */
uint32_t *p_range_mapping_base1;
uint32_t *p_slice_params; /* pointer to ui32SliceParams in CMD_HEADER_VC1 */
uint32_t *slice_first_pic_last;
uint32_t *alt_output_flags;
uint32_t forward_ref_fcm;
uint32_t backward_ref_fcm;
};
typedef struct context_VC1_s *context_VC1_p;
/* VC1 Sequence Header Data Bit Positions Within 32 bit Command Word */
#define VC1_SEQHDR_EXTENDED_DMV 0
#define VC1_SEQHDR_PSF 1
#define VC1_SEQHDR_SECONDFIELD 2
#define VC1_SEQHDR_FINTERPFLAG 3
#define VC1_SEQHDR_TFCNTRFLAG 4
#define VC1_SEQHDR_INTERLACE 5
#define VC1_SEQHDR_PULLDOWN 6
#define VC1_SEQHDR_POSTPROCFLAG 7
#define VC1_SEQHDR_VSTRANSFORM 8
#define VC1_SEQHDR_DQUANT 9
#define VC1_SEQHDR_EXTENDED_MV 11
#define VC1_SEQHDR_FASTUVMC 12
#define VC1_SEQHDR_LOOPFILTER 13
#define VC1_SEQHDR_REFDIST_FLAG 14
#define VC1_SEQHDR_PANSCAN_FLAG 15
#define VC1_SEQHDR_MAXBFRAMES 16
#define VC1_SEQHDR_RANGERED 19
#define VC1_SEQHDR_SYNCMARKER 20
#define VC1_SEQHDR_MULTIRES 21
#define VC1_SEQHDR_QUANTIZER 22
#define VC1_SEQHDR_OVERLAP 24
#define VC1_SEQHDR_PROFILE 25
#define VC1_SEQHDR_PICTYPE 27
#define VC1_SEQHDR_ICFLAG 29
#define VC1_SEQHDR_FCM_CURRPIC 30
#if 0
/****************************************************************************************/
/* Local Context */
/****************************************************************************************/
typedef struct {
VA_CONTEXT sVAContext; /* Must be the first Item */
const char *pszHandleType;
VA_PictureParameters sPicParamVC1;
vc1PicHeader sPicHdr;
vc1SeqHeader sSeqHdr;
VA_SliceInfo *pSliceCtrl;
PVRSRV_CLIENT_MEM_INFO *psAuxMSBBuffer;
PVRSRV_CLIENT_MEM_INFO *hVlcPackedTableData;
PVRSRV_CLIENT_MEM_INFO *psCoLocatedData;
PVRSRV_CLIENT_MEM_INFO *psPreloadBuffer;
#if (!VC1_INTERLEAVED_BITPLANE || VC1_BITPLANE_HARDWARE)
PVRSRV_CLIENT_MEM_INFO *hBitplaneData[3];
IMG_UINT8 *pui8BitplaneData[3];
#else
PVRSRV_CLIENT_MEM_INFO *hBitplaneData;
IMG_UINT8 *pui8BitplaneData;
#endif
#ifdef VC1_LLDMA
CMD_BUFFER sCmdBuff;
#else
PVRSRV_CLIENT_MEM_INFO *psRenderCommandBuffer;
#endif
PVRSRV_CLIENT_MEM_INFO *psStatusBuffer;
IMG_UINT32 *pui32CmdBuffer;
IMG_UINT32 *pui32CmdBufferBase;
IMG_UINT32 ui32CoLocatedSlot;
/* Status report */
IMG_BOOL bBetweenBeginAndEnd;
IMG_UINT32 ui32StatusWof;
IMG_UINT32 ui32StatusRof;
IMG_UINT32 ui32DevPhysStatusAddr;
SGX_DDSURFDATA* psDecodeSurfData;
SGX_DDSURFDATA* psDeblockSurfData;
SGX_DDSURFDATA* psForwardRefSurfData;
SGX_DDSURFDATA* psBackwardRefSurfData;
} VC1VLDContext;
#endif
/*
******************************************************************************
Extern global variables
******************************************************************************/
extern vc1PicHeader *psPicHdr;
extern vc1SeqHeader *psSeqHdr;
#endif /* _VC1_HEADER_H_ */