14b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
44b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Waldo Bastian <waldo.bastian@intel.com>
2706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng *    Li Zeng <li.zeng@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_VC1.h"
324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "psb_def.h"
33c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
34e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang#include "pnw_rotate.h"
354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "vc1_header.h"
374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "vc1_defs.h"
384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/reg_io2.h"
404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/msvdx_offsets.h"
414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/msvdx_cmds_io2.h"
424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/msvdx_vec_reg_io2.h"
434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/msvdx_vec_vc1_reg_io2.h"
444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/msvdx_rendec_vc1_reg_io2.h"
454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "hwdefs/dxva_fw_ctrl.h"
464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include <stdlib.h>
484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include <stdint.h>
494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include <string.h>
504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
51b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#define VC1_Header_Parser_HW
524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define GET_SURFACE_INFO_is_defined(psb_surface) ((int) (psb_surface->extra_info[0]))
544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define SET_SURFACE_INFO_is_defined(psb_surface, val) psb_surface->extra_info[0] = (uint32_t) val;
554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define GET_SURFACE_INFO_picture_structure(psb_surface) (psb_surface->extra_info[1])
564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define SET_SURFACE_INFO_picture_structure(psb_surface, val) psb_surface->extra_info[1] = val;
574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define GET_SURFACE_INFO_picture_coding_type(psb_surface) ((int) (psb_surface->extra_info[2]))
584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define SET_SURFACE_INFO_picture_coding_type(psb_surface, val) psb_surface->extra_info[2] = (uint32_t) val;
594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define SLICEDATA_BUFFER_TYPE(type) ((type==VASliceDataBufferType)?"VASliceDataBufferType":"VAProtectedSliceDataBufferType")
614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define PIXELS_TO_MB(x)    ((x + 15) / 16)
634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define PRELOAD_BUFFER_SIZE        (4*1024)
654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define AUXMSB_BUFFER_SIZE         (1024*1024)
664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
67bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi#define HW_SUPPORTED_MAX_PICTURE_WIDTH_VC1   1920
68bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi#define HW_SUPPORTED_MAX_PICTURE_HEIGHT_VC1  1088
694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef struct {
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32ContextId;
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32SliceParams;
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32MacroblockNumber;
744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} VC1PRELOAD;
754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define FWPARSER_VC1PRELOAD_SIZE (0x60)
774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*!
794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo******************************************************************************
804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo @LUTs   VLC table selection Look-up Tables
814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo******************************************************************************/
824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Code_3x2_2x3_tiles              = 0x0,
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_0,
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_1,
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_2,
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_3,
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Chroma_DC_Diff_VLC,
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Inter_VLC,
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Intra_VLC,
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Luminance_DC_Diff_VLC,
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_Inter_VLC,
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_Intra_VLC,
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_SUBBLKPAT,
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_TTBLK,
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_TTMB,
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_I_Picture_CBPCY_VLC,
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_0,
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_1,
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_2,
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_3,
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_0,
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_1,
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_2,
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_3,
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_0,
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_1,
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_2,
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_3,
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_0,
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_1,
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_2,
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_3,
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_4,
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_5,
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_6,
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_7,
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC,
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Inter_VLC,
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Intra_VLC,
122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC,
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_SUBBLKPAT,
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_TTBLK,
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_TTMB,
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_SUBBLKPAT,
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_TTBLK,
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_TTMB,
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mid_Rate_Inter_VLC,
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mid_Rate_Intra_VLC,
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_0,
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_1,
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_2,
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_3,
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_4,
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_5,
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_6,
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_7,
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_0,
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_1,
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_2,
142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_3,
143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_0,
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_1,
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_2,
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_3,
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_0,
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_1,
1494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_One_MV_MB_2,
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_3,
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_4,
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_5,
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_6,
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_7,
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_0,
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_1,
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_2,
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_3,
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_0,
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_1,
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_2,
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_3,
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_4,
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_5,
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_6,
166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_7,
1674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} VC1_eVLCTables;
1694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 MBMODETableFLDI[][2] = {
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_0, VC1_VLC_Mixed_MV_MB_0},
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_1, VC1_VLC_Mixed_MV_MB_1},
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_2, VC1_VLC_Mixed_MV_MB_2},
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_3, VC1_VLC_Mixed_MV_MB_3},
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_4, VC1_VLC_Mixed_MV_MB_4},
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_5, VC1_VLC_Mixed_MV_MB_5},
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_6, VC1_VLC_Mixed_MV_MB_6},
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_7, VC1_VLC_Mixed_MV_MB_7},
1794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
1804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 MBMODETableFRMI[][2] = {
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_0, VC1_VLC_Interlace_Non_4MV_MB_0},
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_1, VC1_VLC_Interlace_Non_4MV_MB_1},
184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_2, VC1_VLC_Interlace_Non_4MV_MB_2},
185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_3, VC1_VLC_Interlace_Non_4MV_MB_3},
1864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
1874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 CBPCYTableProg[] = {
1894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_P_Picture_CBPCY_VLC_0,
1904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_P_Picture_CBPCY_VLC_1,
1914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_P_Picture_CBPCY_VLC_2,
1924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_P_Picture_CBPCY_VLC_3,
1934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
1944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 CBPCYTableInterlaced[] = {
1964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_0,
1974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_1,
1984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_2,
1994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_3,
2004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_4,
2014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_5,
2024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_6,
2034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlaced_CBPCY_7,
2044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 FourMVTable[] = {
2074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_FourMV_Pattern_0,
2084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_FourMV_Pattern_1,
2094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_FourMV_Pattern_2,
2104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_FourMV_Pattern_3,
2114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 Interlace2MVTable[] = {
2144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Interlace_2_MVP_Pattern_0,
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_1,
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_2,
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_3,
2184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 ProgressiveMVTable[] = {
2214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mot_Vector_Diff_VLC_0,
2224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mot_Vector_Diff_VLC_1,
2234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mot_Vector_Diff_VLC_2,
2244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mot_Vector_Diff_VLC_3,
2254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 Interlaced1RefMVTable[] = {
2284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_One_Field_Ref_Ilace_MV_0,
2294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_One_Field_Ref_Ilace_MV_1,
2304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_One_Field_Ref_Ilace_MV_2,
2314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_One_Field_Ref_Ilace_MV_3,
2324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 MVTable2RefIlace[] = {
2354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_0,
2364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_1,
2374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_2,
2384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_3,
2394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_4,
2404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_5,
2414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_6,
2424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Two_Field_Ref_Ilace_MV_7,
2434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 IntraTablePQIndexLT9[] = {
2464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Rate_Intra_VLC,
2474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Mot_Intra_VLC,
2484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mid_Rate_Intra_VLC,
2494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 InterTablePQIndexLT9[] = {
2524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Rate_Inter_VLC,
2534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Mot_Inter_VLC,
2544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mid_Rate_Inter_VLC,
2554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 IntraTablePQIndexGT8[] = {
2584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Low_Mot_Intra_VLC,
2594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Mot_Intra_VLC,
2604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mid_Rate_Intra_VLC,
2614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic IMG_UINT8 InterTablePQIndexGT8[] = {
2644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Low_Mot_Inter_VLC,
2654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_High_Mot_Inter_VLC,
2664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VC1_VLC_Mid_Rate_Inter_VLC,
2674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* TODO: Make tables const, don't polute namespace */
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunextern IMG_UINT16        gaui16vc1VlcTableData[];
2714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoextern const IMG_UINT16    gui16vc1VlcTableSize;
2724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoextern IMG_UINT16        gaui16vc1VlcIndexData[VLC_INDEX_TABLE_SIZE][3];
2734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoextern const IMG_UINT8    gui8vc1VlcIndexSize;
2744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
276bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_UINT16       gaui16Inverse[] = {256, 128, 85, 64, 51, 43, 37, 32};    /* figure 66 */
277bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BOOL         gDMVRANGE_ExtHorizontal_RemapTable[] = {0, 1, 0, 1};
278bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BOOL         gDMVRANGE_ExtVertical_RemapTable[] = {0, 0, 1, 1};
279bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BYTE         gBFRACTION_DenRemapTable[] = {2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 255, 255};
280bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BYTE         gBFRACTION_NumRemapTable[] = {1, 1, 2, 1, 3, 1, 2, 3, 4, 1, 5, 1, 2, 3, 4, 5, 6, 1, 3, 5, 7, 255, 255};
2814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define INIT_CONTEXT_VC1    context_VC1_p ctx = (context_VC1_p) obj_context->format_data;
2844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
2864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void pnw_VC1_QueryConfigAttributes(
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAProfile profile,
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAEntrypoint entrypoint,
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAConfigAttrib *attrib_list,
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
2934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
294bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi    int i;
295bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_VC1_QueryConfigAttributes\n");
296bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi
297bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi    for (i = 0; i < num_attribs; i++) {
298bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi        switch (attrib_list[i].type) {
299bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi        case VAConfigAttribMaxPictureWidth:
300bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            if ((entrypoint == VAEntrypointVLD) &&
301bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                (profile == VAProfileVC1Advanced))
302bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_WIDTH_VC1;
303bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            else
304bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
305bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            break;
306bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi        case VAConfigAttribMaxPictureHeight:
307bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            if ((entrypoint == VAEntrypointVLD) &&
308bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                (profile == VAProfileVC1Advanced))
309bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_HEIGHT_VC1;
310bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            else
311bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi                attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
312bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            break;
313bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi        default:
314bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi            break;
315bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi        }
316bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi    }
317bf7467cc67edc15c630f8b32795f9779ede68da1Gu, Wangyi
3184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
3194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus pnw_VC1_ValidateConfig(
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
3224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
3234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i;
3244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Check all attributes */
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_config->attrib_list[i].type) {
327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAConfigAttribRTFormat:
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Ignore */
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
3334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
3344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
3374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
3384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_pack_vlc_tables(uint16_t *vlc_packed_data,
3414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                     uint16_t *gaui16vc1VlcTableData,
3424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                     int gui16vc1VlcTableSize)
3434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
3444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i, j;
3454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Pack the VLC tables into 32-bit format ready for DMA into 15-bit wide RAM.        */
3474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < gui16vc1VlcTableSize; i++) {
3494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        j = i * 3;
3504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        vlc_packed_data[i] = 0;
3514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* opcode 14:12 *//* width 11:9 *//* symbol 8:0 */
3524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        vlc_packed_data[i] = ((gaui16vc1VlcTableData[j + 0]) << 12) |
3534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                             ((gaui16vc1VlcTableData[j + 1]) << 9)  |
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             (gaui16vc1VlcTableData[j + 2]);
3554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
3574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb__VC1_pack_index_table_info(uint32_t *packed_index_table,
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint16_t index_data[VLC_INDEX_TABLE_SIZE][3])
3604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
3614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t  start = 0, end = 0, length = 0, opcode = 0, width = 0;
3624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i;
3634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < VLC_INDEX_TABLE_SIZE; i++) {
3654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        start = index_data[i][2];
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (i < (VLC_INDEX_TABLE_SIZE - 1)) { //Make sure we don't exceed the bound
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            end = index_data[i+1][2];
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
3694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            end = start + 500;
3704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
3714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        length = end - start;
3724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        width = index_data[i][1];
3734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        opcode = index_data[i][0];
3744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
375c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "packed_index_table[%02d]->start = %08x length = %08x (%d)\n", i, start * 2, length * 2, length * 2);
3764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] = opcode;
3784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] <<= 3;
3794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] |= width;
3804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] <<= 9;
3814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] |= length;
3824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] <<= 16;
3834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        packed_index_table[i] |= start;
3844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
3854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
3864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb__VC1_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
3884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
3894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAStatus vaStatus = VA_STATUS_SUCCESS;
3904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3916d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_CONTEXT(obj_context);
3924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3936d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_CONFIG(obj_config);
3944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
3954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* MSVDX decode capability for VC-1:
3964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     *     SP@ML
3974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     *     MP@HL
3984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     *     AP@L3
3994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     *
4004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     * Refer to Table 253 (Limitations of profiles and levels) of SMPTE-421M
4014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     */
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Simple:
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 352)
405bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 288)) {
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Main:
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 1920)
412bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 1088)) {
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Advanced:
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 2048)
419bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 2048)) {
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return vaStatus;
4304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
4314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void pnw_VC1_DestroyContext(object_context_p obj_context);
43306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_process_slice_data(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param);
43406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_end_slice(context_DEC_p dec_ctx);
43506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_begin_slice(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param);
43606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic VAStatus pnw_VC1_process_buffer(context_DEC_p dec_ctx, object_buffer_p buffer);
4374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus pnw_VC1_CreateContext(
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
4414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
4424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAStatus vaStatus = VA_STATUS_SUCCESS;
4434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    context_VC1_p ctx;
4444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Validate flag */
4454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Validate picture dimensions */
4464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    vaStatus = psb__VC1_check_legal_picture(obj_context, obj_config);
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
448c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Warning: got invalid picture, but still let go\n");
449adb0b25fd72e16fc7b6edf701e3f67d14050e807hding        /* DEBUG_FAILURE;
450adb0b25fd72e16fc7b6edf701e3f67d14050e807hding        return vaStatus; */
451adb0b25fd72e16fc7b6edf701e3f67d14050e807hding        vaStatus = VA_STATUS_SUCCESS;
4524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx = (context_VC1_p) malloc(sizeof(struct context_VC1_s));
4556d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_ALLOCATION(ctx);
4566d37ae34fcae80f2e898b61e2506ed8e887bd16anguo
4574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(ctx, 0, sizeof(struct context_VC1_s));
4584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    obj_context->format_data = (void*) ctx;
4594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->obj_context = obj_context;
4604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->pic_params = NULL;
4614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
46206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->dec_ctx.begin_slice = psb__VC1_begin_slice;
46306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->dec_ctx.process_slice = psb__VC1_process_slice_data;
46406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->dec_ctx.end_slice = psb__VC1_end_slice;
46506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->dec_ctx.process_buffer = pnw_VC1_process_buffer;
4664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Simple:
4694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->profile = WMF_PROFILE_SIMPLE;
4704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Main:
4734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->profile = WMF_PROFILE_MAIN;
4744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
4754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Advanced:
4774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->profile = WMF_PROFILE_ADVANCED;
4784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        break;
479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
4814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ASSERT(0 == 1);
4824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        vaStatus = VA_STATUS_ERROR_UNKNOWN;
4834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
4844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
4854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    // TODO
4864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     PRELOAD_BUFFER_SIZE,
490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_vpu_only,
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->preload_buffer);
4924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        DEBUG_FAILURE;
4934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
49406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->dec_ctx.preload_buffer = &ctx->preload_buffer;
4954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
497e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        unsigned char *preload;
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 ==  psb_buffer_map(&ctx->preload_buffer, &preload)) {
4994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            memset(preload, 0, PRELOAD_BUFFER_SIZE);
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_unmap(&ctx->preload_buffer);
501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
5024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
5034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            DEBUG_FAILURE;
5044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
5054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     AUXMSB_BUFFER_SIZE,
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_vpu_only,
511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->aux_msb_buffer);
5124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        DEBUG_FAILURE;
5134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
516c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang        vaStatus = psb_buffer_create(obj_context->driver_data,
517c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang                                     512*1024,
518c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang                                     psb_bt_vpu_only,
519c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang                                     &ctx->aux_line_buffer);
520c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang        DEBUG_FAILURE;
521c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang    }
522c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang
523c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang    if (vaStatus == VA_STATUS_SUCCESS) {
524b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifdef VC1_Header_Parser_HW
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb_buffer_create(obj_context->driver_data,
526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         0xa000 * 3,  //0x8800
527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         psb_bt_vpu_only,
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         &ctx->bitplane_hw_buffer);
5294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            DEBUG_FAILURE;
530b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#else
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb_buffer_create(obj_context->driver_data,
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         0x8000,
533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         psb_bt_vpu_only,
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         &ctx->bitplane_hw_buffer);
5354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            DEBUG_FAILURE;
536b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     (gui16vc1VlcTableSize * sizeof(IMG_UINT16) + 0xfff) & ~0xfff,
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_cpu_vpu,
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->vlc_packed_table);
5454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        DEBUG_FAILURE;
5464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
548e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        uint16_t *vlc_packed_data_address;
549e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        if (0 ==  psb_buffer_map(&ctx->vlc_packed_table, (unsigned char **)&vlc_packed_data_address)) {
5504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__VC1_pack_vlc_tables(vlc_packed_data_address, gaui16vc1VlcTableData, gui16vc1VlcTableSize);
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_unmap(&ctx->vlc_packed_table);
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__VC1_pack_index_table_info(ctx->vlc_packed_index_table, gaui16vc1VlcIndexData);
553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
5544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
5554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            DEBUG_FAILURE;
5564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
5574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
55906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (vaStatus == VA_STATUS_SUCCESS) {
56006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = vld_dec_CreateContext(&ctx->dec_ctx, obj_context);
56106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
56206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    }
56306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus != VA_STATUS_SUCCESS) {
5654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pnw_VC1_DestroyContext(obj_context);
5664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
5684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return vaStatus;
5694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
5704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
5714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void pnw_VC1_DestroyContext(
572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
5734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
5744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_CONTEXT_VC1
5754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int i;
5764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
57706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    vld_dec_DestroyContext(&ctx->dec_ctx);
57806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng
579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->vlc_packed_table);
580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->aux_msb_buffer);
581c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang    psb_buffer_destroy(&ctx->aux_line_buffer);
582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->preload_buffer);
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->bitplane_hw_buffer);
5844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
5864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        free(ctx->pic_params);
5874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->pic_params = NULL;
5884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
5894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
5904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    free(obj_context->format_data);
5914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    obj_context->format_data = NULL;
5924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
5934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
5944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic uint32_t psb__vc1_get_izz_scan_index(context_VC1_p ctx)
5954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) {
5974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        // P_PICTURE_ADV_FRAME_INTERLACE
598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 3;
5994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
600dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_INTRA(ctx->pic_params->picture_fields.bits.picture_type)) {
6014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        // I-picture tables
6024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return 4;
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
6044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Assume P frame */
605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((ctx->profile == WMF_PROFILE_SIMPLE) ||
606bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->profile == WMF_PROFILE_MAIN)) {
6074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            // P-picture Simple/Main tables
608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return 0;
609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { /* Advanced profile */
610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P) {
6114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                // P-picture Advanced Progressive tables
6124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                return 1;
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* Interlaced Field */
6144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                // P-picture Advanced Field Interlaced tables
6154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                return 2;
6164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
6194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
6204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
622c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang//#define psb__trace_message(...)
6234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
624bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P(x)    psb__trace_message("PARAMS: " #x "\t= %d\n", p->x)
6254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_trace_pic_params(VAPictureParameterBufferVC1 *p)
6264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
627bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P0(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->sequence_fields.bits.x)
6284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P0(interlace);
6294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P0(syncmarker);
6304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P0(overlap);
6314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(coded_width);
6334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(coded_height);
6344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
635bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P2(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->picture_fields.bits.x)
6364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* picture_fields */
6374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P2(picture_type);
6384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P2(frame_coding_mode);
6394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P2(top_field_first);
6404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P2(is_first_field);
6414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P2(intensity_compensation);
6424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
643cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan#define P1(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->entrypoint_fields.bits.x)
644cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    P1(closed_entry);
645cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    P1(broken_link);
646cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    P1(loopfilter);
647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(conditional_overlap_flag);
6494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(fast_uvmc_flag);
6504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
651bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P3(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->range_mapping_fields.bits.x)
6524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* range_mapping_fields */
6534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P3(luma_flag);
6544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P3(luma);
6554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P3(chroma_flag);
6564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P3(chroma);
657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(b_picture_fraction);
6594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(cbp_table);
6604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(mb_mode_table);
6614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(range_reduction_frame);
6624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(rounding_control);
6634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(post_processing);
6644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(picture_resolution_index);
6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(luma_scale);
6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(luma_shift);
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(raw_coding.value);
6694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P(bitplane_present.value);
6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
671bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P4(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->reference_fields.bits.x)
6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P4(reference_distance_flag);
6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P4(reference_distance);
6744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P4(num_reference_pictures);
6754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P4(reference_field_pic_indicator);
6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
677bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P5(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->mv_fields.bits.x)
6784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(mv_mode);
6794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(mv_mode2);
680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(mv_table);
6824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(two_mv_block_pattern_table);
6834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(four_mv_switch);
6844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(four_mv_block_pattern_table);
6854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(extended_mv_flag);
6864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(extended_mv_range);
6874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(extended_dmv_flag);
6884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P5(extended_dmv_range);
6894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
690bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P6(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->pic_quantizer_fields.bits.x)
691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dquant);
6934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(quantizer);
6944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(half_qp);
6954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(pic_quantizer_scale);
6964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(pic_quantizer_type);
6974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dq_frame);
6984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dq_profile);
6994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dq_sb_edge);
7004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dq_db_edge);
7014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(dq_binary_level);
7024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P6(alt_pic_quantizer);
7034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
704bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P7(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->transform_fields.bits.x)
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(variable_sized_transform_flag);
7074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(mb_level_transform_type_flag);
7084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(frame_level_transform_type);
7094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(transform_ac_codingset_idx1);
7104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(transform_ac_codingset_idx2);
7114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    P7(intra_transform_dc_table);
7124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
713c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
7144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb__VC1_process_picture_param(context_VC1_p ctx, object_buffer_p obj_buffer)
7164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
7174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAStatus vaStatus;
7184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAPictureParameterBufferVC1 *pic_params;
719bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT8   ui8LumaScale1 = 0, ui8LumaShift1 = 0, ui8LumaScale2 = 0, ui8LumaShift2 = 0;
72055dbfaffb153fbec01e82c471b7ea5bf7bcac5femahongpe    object_surface_p obj_surface = ctx->obj_context->current_render_target;
7214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(obj_buffer->type == VAPictureParameterBufferType);
7234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(obj_buffer->num_elements == 1);
7244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(obj_buffer->size == sizeof(VAPictureParameterBufferVC1));
725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7266d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_INVALID_PARAM((obj_buffer->num_elements != 1) ||
7276d37ae34fcae80f2e898b61e2506ed8e887bd16anguo        (obj_buffer->size != sizeof(VAPictureParameterBufferVC1)));
7284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Transfer ownership of VAPictureParameterBufferVC1 data */
7304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    pic_params = (VAPictureParameterBufferVC1 *) obj_buffer->buffer_data;
731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
7324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        free(ctx->pic_params);
7334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->pic_params = pic_params;
7354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    obj_buffer->buffer_data = NULL;
7364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    obj_buffer->size = 0;
7374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
738c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & VABUF_TRACE))
739c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb__VC1_trace_pic_params(pic_params);
7404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->pic_quantizer_fields.bits.quantizer == 0) {
7424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Non uniform quantizer indicates PQINDEX > 8 */
7434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->pqindex_gt8 = (pic_params->pic_quantizer_fields.bits.pic_quantizer_type == 0);
744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
7454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* PQUANT (pic_quantizer_scale) == PQINDEX */
7464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->pqindex_gt8 = (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale > 8);
7474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*
7504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     * We decode to ctx->decoded_surface This is inloop target
7514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     * the out of loop decoded picture is stored in ctx->obj_context->current_render_target
7524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     */
753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->inloop_decoded_picture == VA_INVALID_SURFACE) {
7544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* No out of loop deblocking */
7554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->decoded_surface = ctx->obj_context->current_render_target;
756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
7574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->decoded_surface = SURFACE(pic_params->inloop_decoded_picture);
7586d37ae34fcae80f2e898b61e2506ed8e887bd16anguo        CHECK_SURFACE(ctx->decoded_surface);
7594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
76054752e65b02b1a84c491e3f9c964046faeea306eKun Wang
76154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //SET_SURFACE_INFO_picture_coding_type(ctx->decoded_surface->psb_surface, pic_params->picture_fields.bits.frame_coding_mode);
76254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    SET_SURFACE_INFO_picture_coding_type(ctx->obj_context->current_render_target->psb_surface, pic_params->picture_fields.bits.frame_coding_mode);
76354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    ctx->forward_ref_fcm =  pic_params->picture_fields.bits.frame_coding_mode;
76454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    ctx->backward_ref_fcm =  pic_params->picture_fields.bits.frame_coding_mode;
76554752e65b02b1a84c491e3f9c964046faeea306eKun Wang
7664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Lookup surfaces for backward/forward references */
7674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->forward_ref_surface = NULL;
7684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->backward_ref_surface = NULL;
769dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->forward_reference_picture != VA_INVALID_SURFACE) {
7704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->forward_ref_surface = SURFACE(pic_params->forward_reference_picture);
7714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->backward_reference_picture != VA_INVALID_SURFACE) {
7734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->backward_ref_surface = SURFACE(pic_params->backward_reference_picture);
7744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
77654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (ctx->forward_ref_surface)
7773f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ctx->forward_ref_fcm = GET_SURFACE_INFO_picture_coding_type(ctx->forward_ref_surface->psb_surface);
77854752e65b02b1a84c491e3f9c964046faeea306eKun Wang
77954752e65b02b1a84c491e3f9c964046faeea306eKun Wang    if (ctx->backward_ref_surface)
7803f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang        ctx->backward_ref_fcm = GET_SURFACE_INFO_picture_coding_type(ctx->backward_ref_surface->psb_surface);
78154752e65b02b1a84c491e3f9c964046faeea306eKun Wang
7824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0
783dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->forward_ref_surface) {
7844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* for mmu fault protection */
7854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->forward_ref_surface = ctx->decoded_surface;
7864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->backward_ref_surface) {
7884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* for mmu fault protection */
7894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->backward_ref_surface = ctx->decoded_surface;
7904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
7914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
7924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
793c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Target ref = %08x ID = %08x\n",  ctx->obj_context->current_render_target->psb_surface,  ctx->obj_context->current_render_target->surface_id);
794c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Decoded ref = %08x ID = %08x\n", ctx->decoded_surface->psb_surface, pic_params->inloop_decoded_picture);
795c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x ID = %08x\n", ctx->forward_ref_surface ? ctx->forward_ref_surface->psb_surface : 0, pic_params->forward_reference_picture);
796c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backwrd ref = %08x ID = %08x\n", ctx->backward_ref_surface ? ctx->backward_ref_surface->psb_surface : 0, pic_params->backward_reference_picture);
7974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    // NOTE: coded_width and coded_height do not have to be an exact multiple of MBs
799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->display_picture_width = pic_params->coded_width;
8014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->display_picture_height = pic_params->coded_height;
8024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->picture_width_mb = PIXELS_TO_MB(ctx->display_picture_width);
8034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->picture_height_mb = PIXELS_TO_MB(ctx->display_picture_height);
8044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->coded_picture_width = ctx->picture_width_mb * 16;
8054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->coded_picture_height = ctx->picture_height_mb * 16;
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((WMF_PROFILE_ADVANCED == ctx->profile) && (VC1_FCM_FLDI == pic_params->picture_fields.bits.frame_coding_mode)) {
8074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->picture_height_mb /= 2;
8084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->coded_picture_height = ctx->picture_height_mb * 16 * 2;
8094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
81155dbfaffb153fbec01e82c471b7ea5bf7bcac5femahongpe    if (obj_surface->share_info) {
81255dbfaffb153fbec01e82c471b7ea5bf7bcac5femahongpe        obj_surface->share_info->coded_width = ctx->coded_picture_width;
81320f2ef257b798a174166858314731050410e31f4mahongpe        obj_surface->share_info->coded_height = ctx->coded_picture_height;
81455dbfaffb153fbec01e82c471b7ea5bf7bcac5femahongpe    }
81555dbfaffb153fbec01e82c471b7ea5bf7bcac5femahongpe
8164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->size_mb = ctx->picture_width_mb * ctx->picture_height_mb;
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t colocated_size = ((ctx->size_mb + 1) * 2 + 128) * VC1_MB_PARAM_STRIDE;
8194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //uint32_t colocated_size = (ctx->size_mb + 1) * 2 * VC1_MB_PARAM_STRIDE + 0x2000;
8204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
82106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    vaStatus = vld_dec_allocate_colocated_buffer(&ctx->dec_ctx, ctx->decoded_surface, colocated_size);
82206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    vaStatus = vld_dec_allocate_colocated_buffer(&ctx->dec_ctx, ctx->obj_context->current_render_target, colocated_size);
8234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8246d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_VASTATUS();
8254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* TODO: Store top_field_first and frame_coding_mode (or even all of pic_params) for the current frame
8274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     * so that it can be referenced when the same frame is used as reference frame
8284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    */
8294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile != WMF_PROFILE_ADVANCED) {
8314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Simple and Main profiles always use progressive pictures*/
8324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pic_params->picture_fields.bits.frame_coding_mode = VC1_FCM_P;
8334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI)) {
8364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pic_params->picture_fields.bits.top_field_first = 1;
8374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
8384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->bitplane_present = 0;
840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (pic_params->picture_fields.bits.picture_type) {
841dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_I:
842dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_BI:
843dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_overflags && !pic_params->raw_coding.flags.overflags) ? 0x04 : 0;
844dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_ac_pred && !pic_params->raw_coding.flags.ac_pred) ? 0x02 : 0;
845dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_field_tx && !pic_params->raw_coding.flags.field_tx) ? 0x01 : 0;
846dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
847dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_P:
849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_mv_type_mb && !pic_params->raw_coding.flags.mv_type_mb) ? 0x04 : 0;
850dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_skip_mb && !pic_params->raw_coding.flags.skip_mb) ? 0x02 : 0;
851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
853dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_B: /* B picture */
854dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_forward_mb && !pic_params->raw_coding.flags.forward_mb) ? 0x04 : 0;
855dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_skip_mb && !pic_params->raw_coding.flags.skip_mb) ? 0x02 : 0;
856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_direct_mb && !pic_params->raw_coding.flags.direct_mb) ? 0x01 : 0;
857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
862c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "bitplane_present_flag = %02x raw_coding_flag = %02x bitplane_present = %02x\n",
863dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             pic_params->bitplane_present.value, pic_params->raw_coding.value, ctx->bitplane_present);
864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->reference_fields.bits.reference_distance_flag == 0) {
8664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pic_params->reference_fields.bits.reference_distance = 0;
8674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
8684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* conditional_overlap_flag is not always defined, but MSVDX expects it to be set in those cases anyway */
870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile == WMF_PROFILE_ADVANCED) {
871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->sequence_fields.bits.overlap == FALSE) {
8724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->condover = 0; /* No overlap smoothing */
873dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale < 9) {
8744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->condover = pic_params->conditional_overlap_flag;
875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
8764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->condover = 2;
8774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
879dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) || (pic_params->sequence_fields.bits.overlap == FALSE) || (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale < 9)) {
8804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->condover = 0; /* No overlap smoothing */
881dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
8824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->condover = 2;
8834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
8844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
8854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************** Calculate the IZZ scan index ****************************/
8874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->scan_index = psb__vc1_get_izz_scan_index(ctx);
8884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
8894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /**************************** Calculate MVMODE and MVMODE2 **************************/
8914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->mv_mode = pic_params->mv_fields.bits.mv_mode;
892dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->mv_mode == WMF_MVMODE_INTENSITY_COMPENSATION) {
8934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->mv_mode = pic_params->mv_fields.bits.mv_mode2;
8944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
8954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Neither MVMODE nor MVMODE2 are signaled at the picture level for interlaced frame pictures,
8974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo       but MVMODE can be determine for P pictures depending on the value of MV4SWITCH, and for B
8984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo       pictures it is by default 1MV mode. */
899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) && PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) && (pic_params->mv_fields.bits.four_mv_switch == 1)) {
901dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->mv_mode = WMF_MVMODE_MIXED_MV;
902dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->mv_fields.bits.mv_mode = WMF_MVMODE_MIXED_MV;
903dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
904dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->mv_mode = WMF_MVMODE_1MV;
905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->mv_fields.bits.mv_mode = WMF_MVMODE_1MV;
9064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
9074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
9084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
9094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /******************************** Calculate HALFPEL *********************************/
912dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->mv_mode == WMF_MVMODE_1MV) || (ctx->mv_mode == WMF_MVMODE_MIXED_MV)) {
9134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->half_pel = 0;
914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
9154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->half_pel = 1;
9164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
9174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
9184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* TODO: Are we using the correct size for this ? */
9204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->pull_back_x = COMPUTE_PULLBACK(pic_params->coded_width);
9214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->pull_back_y = COMPUTE_PULLBACK(pic_params->coded_height);
9224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
923dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->mv_fields.bits.extended_dmv_flag == 1) {
9244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->extend_x = gDMVRANGE_ExtHorizontal_RemapTable[pic_params->mv_fields.bits.extended_dmv_range];
9254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->extend_y = gDMVRANGE_ExtVertical_RemapTable[pic_params->mv_fields.bits.extended_dmv_range];
926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
9274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->extend_x = IMG_FALSE;
9284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->extend_y = IMG_FALSE;
9294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
9304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
931dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* B interlaced field picture and ...?? */
9324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->ui32ScaleFactor = 0;
9334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->i8FwrdRefFrmDist = 0;
9344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->i8BckwrdRefFrmDist = 0;
935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
936dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_UINT32 ui32BFractionDen;
9374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        IMG_UINT32 ui32BFractionNum;
938dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        IMG_UINT32 ui32FrameReciprocal;
940dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->b_picture_fraction > (sizeof(gBFRACTION_DenRemapTable) / sizeof(IMG_BYTE) - 1))
942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->b_picture_fraction = sizeof(gBFRACTION_DenRemapTable) / sizeof(IMG_BYTE) - 1;
9434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui32BFractionDen = gBFRACTION_DenRemapTable[pic_params->b_picture_fraction];
9454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui32BFractionNum = gBFRACTION_NumRemapTable[pic_params->b_picture_fraction];
9464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
947dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui32BFractionDen > (sizeof(gaui16Inverse) / sizeof(IMG_UINT16)))
948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32BFractionDen = sizeof(gaui16Inverse) / sizeof(IMG_UINT16);
949dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
950dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui32BFractionDen == 0) {
951c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid ui32BFractionDen value %d\n", ui32BFractionDen);
952dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32BFractionDen = 1;
953dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
954dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui32FrameReciprocal = gaui16Inverse[ui32BFractionDen - 1];
9564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui32ScaleFactor    = ui32BFractionNum * ui32FrameReciprocal;
957dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
958dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->i8FwrdRefFrmDist   = (IMG_INT8)((ctx->ui32ScaleFactor * pic_params->reference_fields.bits.reference_distance) >> 8);     /* 10.4.6.2 */
9604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->i8BckwrdRefFrmDist = pic_params->reference_fields.bits.reference_distance - ctx->i8FwrdRefFrmDist - 1;
961dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
962dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->i8BckwrdRefFrmDist < 0) {
9634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                ctx->i8BckwrdRefFrmDist = 0;
9644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
9654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
9664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
9674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Compute the mode config parameter */
9694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*
9704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo       MODE_CONFIG[1:0] =
971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        VC-1 intensity compensation flag, derived from MVMODE = Intensity compensation, and INTCOMPFIELD
972bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        00 � No intensity compensation
973bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        01 � Intensity compensation for top field
974bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10 � Intensity compensation for bottom field
975bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        11 � Intensity compensation for the frame
976dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo       MODE_CONFIG[3:2] =
978bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        VC-1 reference range scaling, derived from RANGERED, RANGEREDFRM for current frame and reference frame.
979bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        00 � No scaling
980bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        01 � Scale down
981bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10 � Scale up
982bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        11 � No scaling
9834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo     */
984dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /****************************** INTENSITY COMPENSATION ******************************/
9864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* For each NEW reference frame, rotate IC history */
9874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) &&
988bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        pic_params->picture_fields.bits.is_first_field &&
989bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) {
9904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /*
9914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo           This is the first field picture of a new frame, so move the IC params for both field
9924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo           pictures of the last frame (from position [1][0] for the first field and position [1][1] for
9934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo           the second field to positions [0][0] and [0][1] respectevely).
9944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        */
9954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        memcpy(&ctx->sICparams[0][0], &ctx->sICparams[1][0], sizeof(IC_PARAM));
996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        memcpy(&ctx->sICparams[0][1], &ctx->sICparams[1][1], sizeof(IC_PARAM));
997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
998dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        memset(&ctx->sICparams[1][0], 0, sizeof(IC_PARAM));
9994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        memset(&ctx->sICparams[1][1], 0, sizeof(IC_PARAM));
10004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
10014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
10034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui8CurrLumaScale1 = 0;
10044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui8CurrLumaShift1 = 0;
10054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui8CurrLumaScale2 = 0;
10064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui8CurrLumaShift2 = 0;
10074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1008dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FRMI) {
1009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.intensity_compensation) {
10104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                /* Intensity compensation of reference */
1011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) { // progressive picture
10124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->mode_config = 0x3;
1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaScale1 = pic_params->luma_scale & 0x3F;
10154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaShift1 = pic_params->luma_shift & 0x3F;
1016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale1 != 0 || ui8LumaShift1 != 0) {
10184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
10194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
10204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // field interlaced picture
10224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    // top field
10234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaScale1 = pic_params->luma_scale & 0x3F;
10244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaShift1 = pic_params->luma_shift & 0x3F;
1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    // bottom field
10274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaScale2 = ui8LumaScale1; /* TODO: How to keep track of top/bottom field intensity comp? */
10284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8LumaShift2 = ui8LumaShift1; /* TODO: How to keep track of top/bottom field intensity comp? */
1029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* Check what fields undergo intensity compensation */
10314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->ui8IntCompField = 0;
1032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale1 != 0 || ui8LumaShift1 != 0) {
10334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ctx->ui8IntCompField = 1;
10344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
1035dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale2 != 0 || ui8LumaShift2 != 0) {
10364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ctx->ui8IntCompField |= 2;
10374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
10384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    switch (ctx->ui8IntCompField) {
1040dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 0: /* none */
1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x0;
1042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1043dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1044dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 1: /* top */
1045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x1;
1046dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for top field
1048dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 2: /* bottom */
1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x2;
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for bottom field
1056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale2 = ui8LumaScale2;
1057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift2 = ui8LumaShift2;
1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1059dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 3: /* both */
1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x3;
1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1063dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for top field
1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
1065dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for bottom field
1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale2 = ui8LumaScale2;
1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift2 = ui8LumaShift2;
1070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
10714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
10724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1073dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
10744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                ctx->mode_config = 0;
10754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
1076dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // interlaced frame P picture
1077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.intensity_compensation) { /* iINSO */
1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config = 0x3;   // intensity compensate whole frame
1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config = 0;
10814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
10824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
1083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
10844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->mode_config = 0;
10854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
10864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
1088bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10.3.8 Intensity Compensation:
1089bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        If intensity compensation is performed on a reference field, then after decoding the field,
1090bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        the post-compensated pixel values shall be retained and shall be used when decoding the next
1091bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field. If the next field indicates that the field that was intensity compensated by the
1092bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        previous field is to have intensity compensation performed again then the post-compensated
1093bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field shall be used. Therefore, when a reference field has intensity compensation performed
1094bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        twice, the result of the first intensity compensation operation shall be used as input
1095bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        for the second intensity compensation.
10964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    */
10974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*
1098bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Don't forget point 9.1.1.4 in VC1 Spec:
10994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1100bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        If the current frame, coded as two interlace field pictures, contains at least one P or B
1101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field, and if this P or B field uses one or both field in another frame as a reference, where
1102bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        the reference frame was also coded as a interlace field pictue, then the TFF of the current
1103bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        frame and reference frame shall be the same.
11044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    */
1105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) {
1106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.top_field_first) { // top field first
1107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and bottom)
1108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
1109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    /* The second and bottom field picture of the current frame
1110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       intensity compensates the top field of the current frame. */
11114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][0].ui8LumaScale1 = ui8LumaScale1;
11124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][0].ui8LumaShift1 = ui8LumaShift1;
11134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][0].ui8IC1 = 1;
11144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The second and bottom field picture of the current frame
11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the bottom field of the previous frame. */
11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaScale2 = ui8LumaScale2;
11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaShift2 = ui8LumaShift2;
11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8IC2 = 2;
11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // first field picture (and top)
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and top field picture of the current frame
11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the top field of the previous frame. */
11264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaScale2 = ui8LumaScale1;
11274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaShift2 = ui8LumaShift1;
11284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8IC2 = 1;
11294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and top field picture of the current frame
11324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the bottom field of the previous frame. */
11334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaScale1 = ui8LumaScale2;
11344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaShift1 = ui8LumaShift2;
11354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8IC1 = 2;
11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
11374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // bottom field first
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and top)
1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The second and top field picture of the current frame
11424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the bottom field of the current frame. */
11434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][1].ui8LumaScale1 = ui8LumaScale2;
11444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][1].ui8LumaShift1 = ui8LumaShift2;
11454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[1][1].ui8IC1 = 2;
11464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The second and top field picture of the current frame
11494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the top field of the previous frame. */
11504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaScale2 = ui8LumaScale1;
11514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaShift2 = ui8LumaShift1;
11524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8IC2 = 1;
11534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // first field picture (and bottom)
1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and bottom field picture of the current frame
11574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the top field of the previous frame. */
11584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaScale1 = ui8LumaScale1;
11594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8LumaShift1 = ui8LumaShift1;
11604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][0].ui8IC1 = 1;
11614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and bottom field picture of the current frame
11644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       intensity compensates the bottom field of the previous frame. */
11654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaScale2 = ui8LumaScale2;
11664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8LumaShift2 = ui8LumaShift2;
11674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ctx->sICparams[0][1].ui8IC2 = 2;
11684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
11694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
11704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
11714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
11724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
11734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /********************************* RANGE REDUCTION **********************************/
11754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Determine the difference between the range reduction of current and reference picture */
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile == WMF_PROFILE_MAIN) {
11774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Range Reduction is only enabled for Main Profile */
11784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* The RANGEREDFRM values from the reference pictures are;
11794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psVLDContext->bRef0RangeRed
11804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psVLDContext->bRef1RangeRed */
11814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (pic_params->picture_fields.bits.picture_type) {
1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_I:
1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_BI:
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* no reference picture scaling */
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_P: /* P picture */
1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                8.3.4.11 also need to scale the previously reconstructed anchor frame prior to using it for MC if:
1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                - RANGEREDFRM == 1 and ref RANGEREDFRM flag is not signalled scale down previous reconstructed frame.
1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                - RANGEREDFRM == 0 and ref RANGEREDFRM flag is set scale up previous reconstructed frame.
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             */
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->pic_params->range_reduction_frame && !ctx->bRef0RangeRed) {
1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x1 << 2); // scale down previous reconstructed frame
1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!ctx->pic_params->range_reduction_frame && ctx->bRef0RangeRed) {
1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x2 << 2); // scale up previous reconstructed frame
1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* neither or both are set */
1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x0 << 2); // no scaling of reference
1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
12024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_B: /* B picture */
1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*
1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               8.4.4.14 RANGEREDFRM shall be the same as for the temporally subsequent anchor frame (display order)
1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               If this is set then the current decoded frame shall be scalled up similar to P frame.
1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               Scaling for the temporally (display order) preceeding frame will be applied as for P frames
1208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             */
1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->bRef0RangeRed && !ctx->bRef1RangeRed) {
1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x1 << 2);
1211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!ctx->bRef0RangeRed && ctx->bRef1RangeRed) {
1212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x2 << 2);
1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* neither or both are set */
1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x0 << 2); // no scaling of reference
1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
1219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
12204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
12224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->mode_config |= (0x0 << 2);
12234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
12254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /********************************** Slice structure *********************************/
1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VC1_FCM_FLDI == pic_params->picture_fields.bits.frame_coding_mode) {
12284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if ((pic_params->picture_fields.bits.top_field_first && pic_params->picture_fields.bits.is_first_field) ||
1229bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (!pic_params->picture_fields.bits.top_field_first && !pic_params->picture_fields.bits.is_first_field)) {
12304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            // Top field
1231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->slice_field_type = 0;
12324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->bottom_field = 0;
1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
12344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            // Bottom field
1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->slice_field_type = 1;
12364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->bottom_field = 1;
12374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
1238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
12394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        // progressive or interlaced frame
12404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->slice_field_type = 2;
12414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->bottom_field = 1;
12424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
12444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************* FCM for the reference pictures ***************************/
1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->ui8FCM_Ref0Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->ui8FCM_Ref1Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
1248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->frame_count == 0)
1249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->ui8FCM_Ref2Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) ||
1252bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) &&       /* The second B field picture in an             */
1253bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) &&    /* interlaced field coded frame shall   */
1254bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         !pic_params->picture_fields.bits.is_first_field)) {            /* reference the first field picture.   */
1255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI && !pic_params->picture_fields.bits.is_first_field) {
1256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* The current picture is the second field of the frame, then the previous field picture
12574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo               is in the same frame. Therefore the FCM of the first field is the same as the FCM of the
1258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            current field and the first field will be reference 0. */
1259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref0Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
1260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI && pic_params->picture_fields.bits.is_first_field) {
1261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* The current picture is the first field of the frame, then the previous field picture
1262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               is in a different frame and will be reference 1. */
1263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref1Pic = ctx->ui8FCM_Ref2Pic;
1264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // progresive or interlaced frame picture
1265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref1Pic = ctx->ui8FCM_Ref2Pic;
1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
12674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
12694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************* TFF for the reference pictures ***************************/
1271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->frame_count == 0) {
12724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->bTFF_FwRefFrm = pic_params->picture_fields.bits.top_field_first;
12734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->bTFF_BwRefFrm = pic_params->picture_fields.bits.top_field_first;
12744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
1275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) &&
1276bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ((ctx->pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) ||
1277bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         pic_params->picture_fields.bits.is_first_field)) {
12784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->bTFF_FwRefFrm = ctx->bTFF_BwRefFrm;
12794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
12814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1282e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    psb_CheckInterlaceRotate(ctx->obj_context, (void *)ctx->pic_params);
12830da1930627209986e8db220799a690f816494401Austin Yuan
12844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
12854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
12864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus psb__VC1_process_bitplane(context_VC1_p ctx, object_buffer_p obj_buffer)
12884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAStatus vaStatus = VA_STATUS_SUCCESS;
12904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(obj_buffer->type == VABitPlaneBufferType);
12914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(ctx->pic_params);
12926d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    /* We need to have data in the bitplane buffer */
12936d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_INVALID_PARAM((NULL == obj_buffer->psb_buffer) || (0 == obj_buffer->size));
12944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->bitplane_buffer = obj_buffer->psb_buffer;
12964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->has_bitplane = TRUE;
12974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return vaStatus;
12984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
12994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
13014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * This function extracts the information about a given table from the index of VLC tables.
13024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
13034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_extract_table_info(context_VC1_p ctx, sTableData *psInfo, int idx)
13044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
13054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT32 tmp;
13064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if (idx >= VLC_INDEX_TABLE_SIZE)
1308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        idx = VLC_INDEX_TABLE_SIZE - 1;
13094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    tmp = ctx->vlc_packed_index_table[idx];
13114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psInfo->aui16StartLocation      = (IMG_UINT16)(tmp & 0xffff);
13124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psInfo->aui16VLCTableLength     = (IMG_UINT16)((tmp >> 16) & 0x1ff);
13134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psInfo->aui16InitialWidth       = (IMG_UINT16)((tmp >> 25) & 0x7);
13144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psInfo->aui16InitialOpcode      = (IMG_UINT16)((tmp >> 28) & 0x3);
13154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
13164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
13184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * This function selects the VLD tables from the picture layer parameters.
13194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
13204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_write_VLC_tables(context_VC1_p ctx)
13214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
13224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
1323bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT16          ui16Table = 0, ui16IntraTable = 0, ui16InterTable = 0, aui16Table[3];
1324bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32          i, ui32TableNum = 0;
1325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* select the required table from the n different types
13274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            A - vc1DEC_I_Picture_CBPCY_VLC            (1)       �
13284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            B - vc1DEC_P_Picture_CBPCY_VLC_N          (4)       |
13294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            C - vc1DEC_Interlaced_CBPCY_N             (8)       |
13304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            D - vc1DEC_FourMV_Pattern_N               (4)       |
13314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            E - vc1DEC_INTERLACE_2_MVP_Pattern_N      (4)       |
13324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            F - vc1DEC_Mot_Vector_Diff_VLC_N          (4)       |   MB Layer
13334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            G - vc1DEC_One_Field_Ref_Ilace_MV_N       (4)       |
13344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            H - vc1DEC_Two_Field_Ref_Ilace_MV_N       (8)       |
1335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            I - vc1DEC_Mixed_MV_MB_N                  (8)       |
13364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            J - vc1DEC_One_MV_MB_N                    (8)       |
13374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            K - vc1DEC_INTERLACE_4MV_MB_N             (4)       |
13384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            L - vc1DEC_INTERLACE_Non_4MV_MB_N         (4)       |
13394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            M - vc1DEC_X_Rate_TTMB                    (3)       -
13404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            N - vc1DEC_X_Rate_TTBLK                   (3)       �
1341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            O - vc1DEC_X_Rate_SUBBLKPAT               (3)       |
13424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            P - vc1DEC_X_X_Inter_VLC                  (4)       |   Block Layer
13434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            Q - vc1DEC_X_X_Intra_VLC                  (4)       |
13444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            R - vc1DEC_X_Mot_Luminance_DC_Diff_VLC    (2)       |
13454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            S - vc1DEC_X_Mot_Chroma_DC_Diff_VLC       (2)       -
1346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            X - vc1DEC_Code_3x2_2x3_tiles             (1)   NOT USED    */
13484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
13504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ***********************************************************************************
13514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table A,B,C  VLC CBPCY Tables
13524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1353bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   7.1.3.1 Coded Block Pattern (CBPCY) (Variable size)[I, P,B]
13544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1355bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            CBPCY is a variable-sized syntax element that shall be present in all
1356bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            I and BI picture macroblocks, and may be present in P and B picture
1357bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            macroblocks. In P and B pictures, CBPCY shall be decoded using
1358bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            the VLC table specified by the CBPTAB syntax element as described in
1359bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            section 7.1.1.39. The CBP tables for P and B pictures are listed in
1360bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            section 11.6.
13614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1363bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   9.1.3.2 Coded Block Pattern (CBPCY) (Variable size)[I, P,B]
13644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1365bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Table 102: ICBPTAB code-table
13664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            A  vc1DEC_I_Picture_CBPCY_VLC            (1)
1368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            B  vc1DEC_P_Picture_CBPCY_VLC_N          (4)
13694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            C  vc1DEC_Interlaced_CBPCY_N             (8)
13704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ***********************************************************************************/
13724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((!pic_params->sequence_fields.bits.interlace) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P)) {
1374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
13754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = VC1_VLC_I_Picture_CBPCY_VLC;
1376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
13774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__bounds_check(pic_params->cbp_table, 4);
13784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = CBPCYTableProg[pic_params->cbp_table];
13794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
1380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else { /* Interlaced */
1381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
13824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = VC1_VLC_I_Picture_CBPCY_VLC;
1383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
13844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__bounds_check(pic_params->cbp_table, 8);
13854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = CBPCYTableInterlaced[pic_params->cbp_table];  /* LUT */
1386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
13874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
13884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
13904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
13914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
13934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************
13944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table D   VLC 4MV Pattern
13954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1396bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       Table 104: 4MVBP code-table
13974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Tables 116-119
13994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            D vc1DEC_FourMV_Pattern_N               (4)
14014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************/
14024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__bounds_check(pic_params->mv_fields.bits.four_mv_block_pattern_table, 4);
14034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui16Table = FourMVTable[pic_params->mv_fields.bits.four_mv_block_pattern_table];
14044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
14074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
14094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************************************
14104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table E  VLC 2MVBP Tables
14114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        Table 103: 2MVBP code-table
14144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for Tables 120-123
1416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        E vc1DEC_INTERLACE_2_MVP_Pattern_N      (4)
14184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ***********************************************************************************/
14194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__bounds_check(pic_params->mv_fields.bits.two_mv_block_pattern_table, 4);
14204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui16Table = Interlace2MVTable[pic_params->mv_fields.bits.two_mv_block_pattern_table];
14214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
14244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
14264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************************************
14274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table F,G,H  VLC MV Tables
14284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1429bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   MVDATA                                  Variable size   vlclbf  7.1.3.8
14304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1431bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        7.1.3.8 Motion Vector Data (MVDATA)(Variable size)[P]
14324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MVDATA is a variable sized syntax element that may be present in P picture
1434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        macroblocks. This syntax element decodes to the motion vector(s) for the
1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        macroblock. The table used to decode this syntax element is specified by the
1436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MVTAB syntax element in the picture layer as specified in section 7.1.1.38.
14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        F   vc1DEC_Mot_Vector_Diff_VLC_N          (4)
14394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1440bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   9.1.1.34        INTERLACE Motion Vector Table (IMVTAB) (2 or 3 bits)
14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1442bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Table 100:      IMVTAB code-table for P INTERLACE field picture with NUMREF = 0,
1443bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                            and for P/B INTERLACE frame pictures
14444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1445bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            IMVTAB      Motion Vector Table
1446bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            00          1-Reference Table 0
1447bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            01          1-Reference Table 1
1448bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            10          1-Reference Table 2
1449bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            11          1-Reference Table 3
14504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1451bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Table 101:      IMVTAB code-table for P INTERLACE field pictures with NUMREF = 1,
1452bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                            and for B INTERLACE field pictures
14534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1454bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            IMVTAB      Motion Vector Table
1455bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            000         2-Reference Table 0
1456bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            001         2-Reference Table 1
1457bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            010         2-Reference Table 2
1458bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            011         2-Reference Table 3
1459bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            100         2-Reference Table 4
1460bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            101         2-Reference Table 5
1461bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            110         2-Reference Table 6
1462bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            111         2-Reference Table 7
14634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        G   vc1DEC_One_Field_Ref_Ilace_MV_N       (4)
14654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        H   vc1DEC_Two_Field_Ref_Ilace_MV_N       (8)
14664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ***********************************************************************************/
1468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((!pic_params->sequence_fields.bits.interlace) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P)) {
14694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb__bounds_check(pic_params->mv_fields.bits.mv_table, 4);
14704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui16Table = ProgressiveMVTable[pic_params->mv_fields.bits.mv_table];
1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (
14734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            (
1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type) &&
1475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI)
14764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            )
1477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ||
14784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            (
1479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) &&
1480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) &&
1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->reference_fields.bits.num_reference_pictures == 0)
14824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            )
1483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ) {
14844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* One field */
14854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__bounds_check(pic_params->mv_fields.bits.mv_table, 4);
14864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = Interlaced1RefMVTable[pic_params->mv_fields.bits.mv_table];
1487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { /*if (((FCM == VC1_FCM_FLDI) && (NUMREF == 0) && (PTYPE == WMF_PTYPE_P)) || ((PTYPE == WMF_PTYPE_B) && (FCM == VC1_FCM_FLDI))) */
14884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* two field */
14894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__bounds_check(pic_params->mv_fields.bits.mv_table, 8);
14904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16Table = MVTable2RefIlace[pic_params->mv_fields.bits.mv_table];   /* LUT */
14914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
14924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
14934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
14964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
14984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************************************
14994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table I,J,K,L  VLC MBMODE Tables
15004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        I vc1DEC_Mixed_MV_MB_N                  (8)
1502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        J vc1DEC_One_MV_MB_N                    (8)
15034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        K vc1DEC_INTERLACE_4MV_MB_N             (4)
1504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        L vc1DEC_INTERLACE_Non_4MV_MB_N         (4)
15054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ***********************************************************************************/
15064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui16Table = 0;
1507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode > VC1_FCM_P)) {
1508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
1509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
15104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb__bounds_check(pic_params->mb_mode_table, 8);
15114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                /* 9.1.1.33 use MBMODETAB and MVMODE to select field interlaced tables */
15124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                ui16Table = MBMODETableFLDI[pic_params->mb_mode_table][(pic_params->mv_fields.bits.mv_mode == WMF_MVMODE_MIXED_MV) ? 1 : 0];
1513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) {
15144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb__bounds_check(pic_params->mb_mode_table, 4);
15154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                /* 9.1.1.33 use MBMODETAB and MV4SWITCH to select frame interlaced tables */
15164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                ui16Table = MBMODETableFRMI[pic_params->mb_mode_table][(pic_params->mv_fields.bits.four_mv_switch) ? 0 : 1];
15174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
15184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
15194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
15204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
1522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ui32TableNum++;
15234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
15254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************************************
15264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table M,N,O  VLC PQUANT Tables
15274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1528bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.2.10        MB-level Transform Type (TTMB)(Variable size)[P,B]
1529bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.3.15        Block-level Transform Type (TTBLK)(Variable size)[inter]
1530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1531bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.3.16        Transform sub-block pattern (SUBBLKPAT)(Variable size)[inter]
15324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            M vc1DEC_X_Rate_TTMB                    (3)
15344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            N vc1DEC_X_Rate_TTBLK                   (3)
1535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            O vc1DEC_X_Rate_SUBBLKPAT               (3)
15364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        TTBLK and TTMB P and B Pictures only
15384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ***********************************************************************************/
1540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[0] = 0;
1541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[1] = 0;
1542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[2] = 0;
1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale <= 4) {            /* high rate */
15454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[2]   = VC1_VLC_High_Rate_SUBBLKPAT;
15464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[1]   = VC1_VLC_High_Rate_TTBLK;
15474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[0]   = VC1_VLC_High_Rate_TTMB;
1548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale <= 12) {     /* med rate */
15494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[2]   = VC1_VLC_Medium_Rate_SUBBLKPAT;
15504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[1]   = VC1_VLC_Medium_Rate_TTBLK;
15514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[0]   = VC1_VLC_Medium_Rate_TTMB;
1552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {                                                     /* low rate */
15534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[2]   = VC1_VLC_Low_Rate_SUBBLKPAT;
15544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[1]   = VC1_VLC_Low_Rate_TTBLK;
15554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        aui16Table[0]   = VC1_VLC_Low_Rate_TTMB;
15564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
15574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = ui32TableNum; i < ui32TableNum + 3; i++) {
15594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[i], aui16Table[i-ui32TableNum]);
15604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
15614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ui32TableNum = ui32TableNum + 3;
15634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    {
15654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /*!
15664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ***********************************************************************************************
1567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Inter Coded Blocks
1568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
15694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        Table 54: Index/Coding Set Correspondence for PQINDEX <= 7
1570dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Y, Cb and Cr blocks
15714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1572bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table
1573bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           High Rate Inter
1574bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Inter
1575bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Inter
15764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 55: Index/Coding Set Correspondence for PQINDEX > 7
1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Y, Cb and Cr blocks
1579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1580bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table
1581bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           Low Motion Inter
1582bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Inter
1583bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Inter
15844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ----------------------------------------------------------------------------------
15864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        Intra Blocks
1587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
15884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        8 AC Coeff Coding Sets:
15894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            4 x INTRA, 4 x INTER
15904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            Y use Intra, CrCb use Inter
15924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 38: Coding Set Correspondence for PQINDEX <= 7
15944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1595bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Y blocks                                            Cb and Cr blocks
1596bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table                                   Index   Table
1597bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           High Rate Intra                 0               High Rate Inter
1598bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Intra               1               High Motion Inter
1599bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Intra                  2               Mid Rate Inter
16004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 39: Coding Set Correspondence for PQINDEX > 7
16024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1603bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Y blocks                                            Cb and Cr blocks
1604bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table                                   Index   Table
1605bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           Low Motion Intra                0               Low Motion Inter
1606bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Intra               1               High Motion Inter
1607bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Intra                  2               Mid Rate Inter
16084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        The value decoded from the DCTACFRM2 syntax element shall be used
1610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        as the coding set index for Y blocks and the value decoded from the
1611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DCTACFRM syntax element shall be used as the coding set
1612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        index for Cb and Cr blocks.
16134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            P vc1DEC_X_X_Inter_VLC
1615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Q vc1DEC_X_X_Intra_VLC
16164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        for I pictures  TRANSACFRM specifies the Inter Coding set
16194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        TRANSACFRM2 specifies the Intra Coding set
16204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        for P pictures  TRANSACFRM specifies Inter and Intra Coding set
16224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ***************************************************************************************************/
16254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        IMG_UINT32  ui32IntraCodingSetIndex = PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)
1626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                              ?  pic_params->transform_fields.bits.transform_ac_codingset_idx2
1627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                              :  pic_params->transform_fields.bits.transform_ac_codingset_idx1;
16284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        IMG_UINT32  ui32InterCodingSetIndex = pic_params->transform_fields.bits.transform_ac_codingset_idx1;
16304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* For PQINDEX < 9 the uniform quantizer should be used, as indicated by PQUANTIZER == 1 */
1632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!ctx->pqindex_gt8) {
16334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16IntraTable = IntraTablePQIndexLT9[ui32IntraCodingSetIndex];
16344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16InterTable = InterTablePQIndexLT9[ui32InterCodingSetIndex];
1635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
16364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16IntraTable = IntraTablePQIndexGT8[ui32IntraCodingSetIndex];
16374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ui16InterTable = InterTablePQIndexGT8[ui32InterCodingSetIndex];
16384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
1639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16IntraTable);
16414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui32TableNum++;
16424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16InterTable);
16444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui32TableNum++;
16454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
16464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*!
16484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ************************************************************************************
16494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    @ Table R & S  VLC TRANSDCTAB Tables
16504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                R vc1DEC_X_Mot_Luminance_DC_Diff_VLC    (2)
1652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                S vc1DEC_X_Mot_Chroma_DC_Diff_VLC       (2)
1653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1654bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       8.1.1.2 Intra Transform DC Table
1655bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            TRANSDCTAB is a one-bit syntax element that shall specify which of two
1656bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            tables is used to decode the Transform DC coefficients in intra-coded blocks.
1657bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 0, then the low motion table of Section 11.7 shall be used.
1658bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 1, then the high motion table of Section 11.7 shall be used.
1659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1660bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       8.1.1.2 Intra Transform DC Table
1661bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            TRANSDCTAB is a one-bit syntax element that shall specify which of two
1662bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            tables is used to decode the Transform DC coefficients in intra-coded blocks.
1663bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 0, then the low motion table of Section 11.7 shall be used.
1664bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 1, then the high motion table of Section 11.7 shall be used.
16654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ***********************************************************************************/
1667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->transform_fields.bits.intra_transform_dc_table == 0) {
16684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* low motion */
1669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
16704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC */
16714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui16IntraTable = VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC;
16724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC */
16744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui16InterTable = VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC;
1675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else { /* TRANSDCTAB == 1 */
16764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* high motion */
16774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* VC1_VLC_High_Mot_Luminance_DC_Diff_VLC */
16784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui16IntraTable = VC1_VLC_High_Mot_Luminance_DC_Diff_VLC;
1679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* VC1_VLC_High_Mot_Chroma_DC_Diff_VLC */
16814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ui16InterTable = VC1_VLC_High_Mot_Chroma_DC_Diff_VLC;
1682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
16834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16IntraTable);
16854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
16864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16InterTable);
16884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32TableNum++;
1689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* at the end determine how many tables have been chosen
16914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        this should be constant and equal 12 */
16924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->ui32NumTables = ui32TableNum;
16934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(ctx->ui32NumTables == 12);
16944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
16954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
16964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_build_VLC_tables(context_VC1_p ctx)
16974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
16984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1699e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
17004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint16_t RAM_location = 0;
17014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t reg_value;
17024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < ctx->ui32NumTables; i++) {
1704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (RAM_location & 0x03) {
17054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* Align */
17064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            RAM_location += 4 - (RAM_location & 0x03);
17074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
17084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->sTableInfo[i].aui16RAMLocation = RAM_location;
1709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* VLC Table */
17114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Write a LLDMA Cmd to transfer VLD Table data */
1712680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        psb_cmdbuf_dma_write_cmdbuf(cmdbuf, &ctx->vlc_packed_table,
1713680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      ctx->sTableInfo[i].aui16StartLocation * sizeof(IMG_UINT16), /* origin */
1714680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      ctx->sTableInfo[i].aui16VLCTableLength * sizeof(IMG_UINT16), /* size */
1715680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      RAM_location * sizeof(IMG_UINT32), /* destination */
1716680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      DMA_TYPE_VLC_TABLE);
1717c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "table[%02d] start_loc = %08x RAM_location = %08x | %08x\n", i, ctx->sTableInfo[i].aui16StartLocation * sizeof(IMG_UINT16), RAM_location, RAM_location * sizeof(IMG_UINT32));
17184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RAM_location += ctx->sTableInfo[i].aui16VLCTableLength;
17194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
17204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Write the vec registers with the index data for each of the tables */
1722680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
17234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0, VLC_TABLE_ADDR0, ctx->sTableInfo[0].aui16RAMLocation);
1726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0, VLC_TABLE_ADDR1, ctx->sTableInfo[1].aui16RAMLocation);
1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0), reg_value);
17284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1, VLC_TABLE_ADDR2, ctx->sTableInfo[2].aui16RAMLocation);
1731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1, VLC_TABLE_ADDR3, ctx->sTableInfo[3].aui16RAMLocation);
1732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1), reg_value);
1733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2, VLC_TABLE_ADDR4, ctx->sTableInfo[4].aui16RAMLocation);
1736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2, VLC_TABLE_ADDR5, ctx->sTableInfo[5].aui16RAMLocation);
1737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2), reg_value);
1738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3, VLC_TABLE_ADDR6, ctx->sTableInfo[6].aui16RAMLocation);
1741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3, VLC_TABLE_ADDR7, ctx->sTableInfo[7].aui16RAMLocation);
1742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3), reg_value);
17434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4, VLC_TABLE_ADDR8, ctx->sTableInfo[8].aui16RAMLocation);
1746dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4, VLC_TABLE_ADDR9, ctx->sTableInfo[9].aui16RAMLocation);
1747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4), reg_value);
17484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5, VLC_TABLE_ADDR10, ctx->sTableInfo[10].aui16RAMLocation);
1751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5, VLC_TABLE_ADDR11, ctx->sTableInfo[11].aui16RAMLocation);
1752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5), reg_value);
17534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH0, ctx->sTableInfo[0].aui16InitialWidth);
1756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH1, ctx->sTableInfo[1].aui16InitialWidth);
1757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH2, ctx->sTableInfo[2].aui16InitialWidth);
1758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH3, ctx->sTableInfo[3].aui16InitialWidth);
1759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH4, ctx->sTableInfo[4].aui16InitialWidth);
1760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH5, ctx->sTableInfo[5].aui16InitialWidth);
1761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH6, ctx->sTableInfo[6].aui16InitialWidth);
1762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH7, ctx->sTableInfo[7].aui16InitialWidth);
1763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH8, ctx->sTableInfo[8].aui16InitialWidth);
1764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH9, ctx->sTableInfo[9].aui16InitialWidth);
1765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0), reg_value);
17664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1, VLC_TABLE_INITIAL_WIDTH10, ctx->sTableInfo[10].aui16InitialWidth);
1769dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1, VLC_TABLE_INITIAL_WIDTH11, ctx->sTableInfo[11].aui16InitialWidth);
1770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1), reg_value);
1771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
1773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE0, ctx->sTableInfo[0].aui16InitialOpcode);
1774dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE1, ctx->sTableInfo[1].aui16InitialOpcode);
1775dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE2, ctx->sTableInfo[2].aui16InitialOpcode);
1776dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE3, ctx->sTableInfo[3].aui16InitialOpcode);
1777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE4, ctx->sTableInfo[4].aui16InitialOpcode);
1778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE5, ctx->sTableInfo[5].aui16InitialOpcode);
1779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE6, ctx->sTableInfo[6].aui16InitialOpcode);
1780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE7, ctx->sTableInfo[7].aui16InitialOpcode);
1781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE8, ctx->sTableInfo[8].aui16InitialOpcode);
1782dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE9, ctx->sTableInfo[9].aui16InitialOpcode);
1783dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE10, ctx->sTableInfo[10].aui16InitialOpcode);
1784dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE11, ctx->sTableInfo[11].aui16InitialOpcode);
1785dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0), reg_value);
1786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
17884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
17894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
17904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_send_rendec_params(context_VC1_p ctx, VASliceParameterBufferVC1 *slice_param)
17914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
17924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
17934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
17944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p deblock_surface = ctx->decoded_surface->psb_surface;
17954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
17964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t cmd;
17974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT32    ui32MBParamMemOffset;
17984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT8     ui8PrevLumaScale = 0, ui8PrevLumaShift = 0;
17994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT8     ui8BackLumaScale = 0, ui8BackLumaShift = 0;
18004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT8     ui8PrevBotLumaShift = 0, ui8PrevBotLumaScale = 0;
18014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    IMG_UINT8     ui8PrevIC = 0, ui8BackIC = 0, ui8PrevBotIC = 0;
18024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Align MB Parameter memory */
18044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32MBParamMemOffset  = ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) && (!pic_params->picture_fields.bits.is_first_field)) ?
1805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            (ctx->size_mb * VC1_MB_PARAM_STRIDE) : 0;
18064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32MBParamMemOffset += 0x00000fff;
18074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ui32MBParamMemOffset &= 0xfffff000;
18084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /****************************** INTENSITY COMPENSATION ******************************/
1810dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
1811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
1812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.top_field_first) { // top field first
1813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and bottom)
1814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][1].ui8IC1 == 2) {
18154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        /* The first and top field picture of the current frame
18164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                           intensity compensates the bottom field of the previous frame. */
18174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
18184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
18194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevIC = 2;
18204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
1821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // first field picture (and top)
1822dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][0].ui8IC1 == 1) {
18234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        /* The second and bottom field picture of the previous frame
18244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                           intensity compensates the top field of the previous frame. */
18254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevIC = 1;
18284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
18294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // botom field first
1831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and top)
1832dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][0].ui8IC1 == 1) {
18334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        /* The first and bottom field picture of the current frame
18344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                           intensity compensates the top field of the previous frame. */
18354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevIC = 1;
18384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    }
1839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // first field picture (and bottom)
1840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][1].ui8IC1 == 2) {
18414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        /* The second and top field picture of the previous frame
18424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                           intensity compensates the bottom field of the previous frame. */
18434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
18444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
18454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                        ui8PrevIC = 2;
1846dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    }
18474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
18484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
1849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
18504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /*
18514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                First frame - second temporally closest reference frame to the B frame
18524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                Second frame - first temporally closest reference frame to the B frame
18534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            */
1854dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.top_field_first) { // top field first
1855dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC1 == 1) {
18564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The second and bottom field of the first reference frame intensity
18574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the first and top field of the first reference frame. */
18584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevIC = 1;
18614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC2 == 1) {
18634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and top field of the second reference frame intensity
18644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the first and top field of the first reference frame. */
18654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackLumaScale = ctx->sICparams[0][0].ui8LumaScale2;
18664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackLumaShift = ctx->sICparams[0][0].ui8LumaShift2;
18674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackIC = 1;
18684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC2 == 2) {
1870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    /* The first and top field of the second reference frame intensity
18714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the second and bottom field of the first reference frame. */
18724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotLumaScale = ctx->sICparams[0][1].ui8LumaScale2;
18734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotLumaShift = ctx->sICparams[0][1].ui8LumaShift2;
18744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotIC = 2;
18754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // botom field first
1877dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC1 == 2) {
18784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The second and top field of the first reference frame intensity
18794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the first and bottom field of the first reference frame. */
18804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
18814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
18824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8BackIC = 2;
18834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1884dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC2 == 2) {
18854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    /* The first and bottom field of the second reference frame intensity
18864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the first and bottom field of the first reference frame. */
18874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotLumaScale = ctx->sICparams[0][1].ui8LumaScale2;
18884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotLumaShift = ctx->sICparams[0][1].ui8LumaShift2;
18894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevBotIC = 2;
18904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
1891dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC1 == 1) {
1892bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                    /* The first and bottom field of the second reference frame intensity
18934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                       compensates the second and top field of the first reference frame. */
18944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                    ui8PrevIC = 1;
18974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                }
18984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
18994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
19004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
19014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /************************************************************************************/
19024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 1 - VC1SEQUENCE00 */
1904dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
19054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start |= CMD_RENDEC_BLOCK_FLAG_VC1_CMD_PATCH;
19064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1907bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE00    Command: Display Picture Size (sequence) */
19084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* TODO: Can "display size" and "coded size" be different? */
19104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_HEIGHT, (ctx->display_picture_height - 1)); /* display picture size - 1 */
1911dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_WIDTH, (ctx->display_picture_width - 1));
19124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1914bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE00    Command: Coded Picture Size  (sequence) */
19154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_HEIGHT, (ctx->coded_picture_height - 1)); /* coded picture size - 1 */
1917dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_WIDTH, (ctx->coded_picture_width - 1));
19184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1920bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE01    Command: Operating Mode (sequence) */
19214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CHROMA_INTERLEAVED,   0); /* 0 = CbCr - MSVDX default */
19234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, ROW_STRIDE,           target_surface->stride_mode);
1924dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CODEC_MODE,           2); /* MODE_VC1 */
19254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CODEC_PROFILE,        ctx->profile);
19264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, ASYNC_MODE,           0/*((pPicParams->bPicDeblocked & 0x02) ? 0:1)*/); // @TODO: async mode should be synchronous or pre-load for VC1
19274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CHROMA_FORMAT,        1);
1928dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, INTERLACED, ((pic_params->picture_fields.bits.frame_coding_mode & 0x02) >> 1));           /* if progressive, INTERLACE is always 0 */
19294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, VC1_OVERLAP,          pic_params->sequence_fields.bits.overlap);
1930b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
19314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, PIC_CONDOVER,         ctx->condover);
19324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, PIC_QUANT,            pic_params->pic_quantizer_fields.bits.pic_quantizer_scale);
1933b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
19344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->obj_context->operating_mode = cmd;
19354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1938dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
19394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                  */
1941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
19424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Aux MSB buffer */
1944dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_msb_buffer, 0);
19454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1946dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
19474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 2 - VC1SLICE00 */
1949dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, MC_CACHE_CONFIGURATION));
19504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1951bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE00           Command: Cache Configuration (picture?) */
19524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE00, CONFIG_REF_OFFSET,  72);
19544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE00, CONFIG_ROW_OFFSET,  4);
19554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
1956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1957bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE01           Command: VC1 Intensity Compensation Parameter (picture or slice) */
19584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSHIFT2,  ctx->ui8CurrLumaShift2); /* INTERLACE field P pictures */
19604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSCALE2,  ctx->ui8CurrLumaScale2); /* INTERLACE field P pictures */
19614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSHIFT1,  ctx->ui8CurrLumaShift1);
19624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSCALE1,  ctx->ui8CurrLumaScale1);
19634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1965dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
19664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
196706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    vld_dec_setup_alternative_frame(ctx->obj_context);
19684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19690da1930627209986e8db220799a690f816494401Austin Yuan    if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P && CONTEXT_ROTATE(ctx->obj_context))
19704d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng        deblock_surface = ctx->obj_context->current_render_target->out_loop_surface;
19714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 3 */
1973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
19744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VC1 Luma Range Mapping Base Address */
1976dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &deblock_surface->buf, deblock_surface->buf.buffer_ofs);
19774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VC1 Chroma Range Mapping Base Address */
1979dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &deblock_surface->buf, deblock_surface->chroma_offset + deblock_surface->buf.buffer_ofs);
19804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VC1SLICE03       Range Map Control (current picture) */
19824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
19834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPUV_FLAG,  pic_params->range_mapping_fields.bits.chroma_flag /*RANGE_MAPUV_FLAG*/);
19844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPUV,       pic_params->range_mapping_fields.bits.chroma);
19854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPY_FLAG,   pic_params->range_mapping_fields.bits.luma_flag /*RANGE_MAPY_FLAG*/);
19864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPY,        pic_params->range_mapping_fields.bits.luma);
19874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Store VC1SLICE03 bits in lower bits of Range Mapping Base Address */
19904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VC1 Luma Range Mapping Base Address */
199106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    RELOC(*ctx->dec_ctx.p_range_mapping_base0, /*cmd + */deblock_surface->buf.buffer_ofs, &deblock_surface->buf);
199206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    RELOC(*ctx->dec_ctx.p_range_mapping_base1, deblock_surface->buf.buffer_ofs + deblock_surface->chroma_offset, &deblock_surface->buf);
19934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19941acf92e9a20924ee23330759a6b3f78a2c19eb43mahongpe    *ctx->dec_ctx.cmd_params |= cmd;
1995bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1 Intensity Compensation Backward/Previous     */
19964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /*
19974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            3.3.10 VC1 Intensity Compensation Backward/Previous:
19984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            The parameters applied in VC1 Intensity Compensation Parameters are the Intensity Compensation
19994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            applied to forward prediction. In the case of Interlaced P field pictures, the second field can
20004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            be Intensity Compensated relative to the first P field picture. If this is done, when decoding
20014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            B pictures the first field backward MV reference to P picture needs to be Intensity Compensated
20024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            with VC1_LUMSCALE_BACK and VC1_LUMSHIFT_BACK. (The command should contain the Intensity
20034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            Compensation parameters that were used for opposite parity field when decoding 2nd P field picture).
2004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            The parameters will only be used if VC1_BACK_INT_COMP in Slice Params command indicates
20064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            Backward Intensity Compensation is used.
20074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    */
20084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
20094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSHIFT_PREV,  ui8PrevLumaShift);
20104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSCALE_PREV,  ui8PrevLumaScale);
20114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSHIFT_BACK,  ui8BackLumaShift);
20124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSCALE_BACK,  ui8BackLumaScale);
20134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
20144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
20154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0
20164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VC1 Intensity Compensation Previous Bottom */
2017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ui8PrevBotIC) {
20184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /*
20194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            The VDMC dynamically applies intensity compensation when generating reference predicted data
20204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            for P/B fields/frames. In the case of Interlaced B field pictures, both the top field and
20214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            bottom field could be Intensity Compensated twice (if all previous P field pictures applied
20224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            separate top and bottom Intensity Compensation). If this is the case, the VC1 previous field
20234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            defined in 3.3.10 should apply to top field, whilst the parameters defined in this register
20244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            apply to the bottom field. The VC1_PREV_BOT_INT_COMP field of Slice Params command indicates
20254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            if the fields in this register are used.
20264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        */
2027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmd = 0;
2028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_, VC1_LUMSHIFT_PREV_BOT, ui8PrevBotLumaShift);
2029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_, VC1_LUMSCALE_PREV_BOT, ui8PrevBotLumaScale);
2030dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pcmdBuffer[i++] = REGISTER_OFFSET(MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_);
2031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pcmdBuffer[i++] = cmd;
20324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
20334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
2034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
20354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
20374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        Reference Picture Base Addresses
2038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        The reference picture pointers always include the current picture at first location (0) and
20404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        the oldest reference in the next location (1). For B pictures the subsequent reference
20414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        frame (display order) is 2.
20424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    */
2043dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.picture_type != WMF_PTYPE_I) && (pic_params->picture_fields.bits.picture_type != WMF_PTYPE_BI)) {
20444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* CHUNK: 4 */
2045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
2046dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /********************** CURRENT PICTURE **********************/
2048dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
2049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
20504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
20514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /*************** FORWARD REFERENCE *****************/
2052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->forward_ref_surface) {
20534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /*
20544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                In VC1, if a P field picture references both top field and bottom field, but the two fields
2055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                are stored in different frame stores, then the most recently decoded field will use reference
20564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                index 0, and the other field will use reference index 1.
2057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                Progressive P pictures use always reference index 1.
20594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            */
2060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
2061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->\
2062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                            buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
2063f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian            (ctx->forward_ref_surface->psb_surface->buf).unfence_flag = 1;
2064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
20654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
20664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /*************** BACKWARD REFERENCE *****************/
2067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->backward_ref_surface) {
2068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs);
2069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface\
2070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                            ->buf.buffer_ofs + ctx->backward_ref_surface->psb_surface->chroma_offset);
2071f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian            (ctx->backward_ref_surface->psb_surface->buf).unfence_flag = 1;
2072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
2073f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian
2074f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian        /*** fixed crc error for vc1 ***/
2075f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian        target_surface->buf.unfence_flag = 0;
2076f891a599d286e02e8d367b754cf543fc441b3fbfSun, Jian
2077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_end(cmdbuf);
20784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
20794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
20804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 5 - VC1SLICE02 */
2081dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS));
20824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start |= CMD_RENDEC_BLOCK_FLAG_VC1_SP_PATCH;
20834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2084bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE02           Command: Slice Params (picture or slice) */
20854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, SLICE_PARAMS, VC1_PREV_BOT_INT_COMP,  ui8PrevBotIC);
20884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_PREV_INT_COMP,  ui8PrevIC);
20894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_BACK_INT_COMP,  ui8BackIC);
20904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, RND_CTRL_BIT,       pic_params->rounding_control);
20914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, MODE_CONFIG,        ctx->mode_config);
2092b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
2093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, SUBPEL_FILTER_MODE, ((ctx->mv_mode == WMF_MVMODE_1MV_HALF_PEL_BILINEAR) && !(pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI)) ? 0 : 1);
2094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, SLICE_CODE_TYPE, (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_BI) ? 0 : (pic_params->picture_fields.bits.picture_type & 0x3));    /* BI is sent as I */
2095b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
20964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_FASTUVMC,       pic_params->fast_uvmc_flag);
20974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_LOOPFILTER,     pic_params->entrypoint_fields.bits.loopfilter);
20984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, SLICE_FIELD_TYPE,   ctx->slice_field_type);
20994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
2102b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifdef VC1_Header_Parser_HW
2103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, SLICE_CODE_TYPE, (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_BI) ? 0 : (pic_params->picture_fields.bits.picture_type & 0x3));
2104b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
21054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
210606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *ctx->dec_ctx.p_slice_params = cmd;
21074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* ------------------------------- Back-End Registers --------------------------------- */
21094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 6 (Back-end registers) */
2111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_SPS0));
21124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_SPS0 */
21144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
21154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_EXTENDED_DMV,   pic_params->mv_fields.bits.extended_dmv_flag);
21164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_EXTENDED_MV,    pic_params->mv_fields.bits.extended_mv_flag);
21174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_FASTUVMC,       pic_params->fast_uvmc_flag);
21184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_INTERLACE,      pic_params->sequence_fields.bits.interlace);
21194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_PROFILE,      ctx->profile);
21204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_SPS1 */
2123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
21244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS1, VC1_BE_PIC_HEIGHT_IN_MBS_LESS1, ctx->picture_height_mb - 1);
21254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_SPS2 */
2128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
21294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS2, VC1_BE_PIC_WIDTH_IN_MBS_LESS1, ctx->picture_width_mb - 1);
21304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
21334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 6b (Back-end registers) */
2135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_PPS2));
21364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start |= CMD_RENDEC_BLOCK_FLAG_VC1_BE_PATCH;
21374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_PPS2 */
2139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
214054752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF2, ctx->ui8FCM_Ref2Pic);
214154752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF1, ctx->ui8FCM_Ref1Pic);
214254752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF0, ctx->ui8FCM_Ref0Pic);
214354752e65b02b1a84c491e3f9c964046faeea306eKun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF2, ctx->backward_ref_fcm);
214454752e65b02b1a84c491e3f9c964046faeea306eKun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF1, ctx->forward_ref_fcm);
214554752e65b02b1a84c491e3f9c964046faeea306eKun Wang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF0, GET_SURFACE_INFO_picture_coding_type(ctx->decoded_surface->psb_surface));
214654752e65b02b1a84c491e3f9c964046faeea306eKun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF0, GET_SURFACE_INFO_picture_coding_type(ctx->obj_context->current_render_target->psb_surface));
21474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_COLLOCATED_SKIPPED, 0); // @TODO: Really need this?
21484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_PPS0 */
21514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2152b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
2153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_IQ_OVERLAP, ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) || (ctx->condover == 0)) ? 0 : 1);
21544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_UNIFORM_QUANTIZER, pic_params->pic_quantizer_fields.bits.pic_quantizer_type);
21554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_HALFQP,            pic_params->pic_quantizer_fields.bits.half_qp);
21564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_BFRACTION,         pic_params->b_picture_fraction);
2157b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
21584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF_FWD,           ctx->bTFF_FwRefFrm);
21594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF_BWD,           ctx->bTFF_BwRefFrm);
21604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF,               pic_params->picture_fields.bits.top_field_first);
21614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_SECOND_FIELD,      !pic_params->picture_fields.bits.is_first_field);
21624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_FCM,               pic_params->picture_fields.bits.frame_coding_mode);
2163bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_RNDCTRL,           pic_params->rounding_control);
21644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
2165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_PPS1 */
21674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2168b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
21694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_EXTEND_Y,       ctx->extend_y);
21704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_EXTEND_X,       ctx->extend_x);
2171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_QUANTIZER, (pic_params->pic_quantizer_fields.bits.pic_quantizer_type ? 0x03 /* uniform */ : 0x02 /* non-uniform */));
21724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_PQUANT,         pic_params->pic_quantizer_fields.bits.pic_quantizer_scale);
21734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_MVMODE,         pic_params->mv_fields.bits.mv_mode);
21744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_MVMODE2,        pic_params->mv_fields.bits.mv_mode2);
21754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_PTYPE,          pic_params->picture_fields.bits.picture_type);
2176b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
21774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD0 */
21804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2181b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
21824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD0, VC1_BE_BRPD,  ctx->i8BckwrdRefFrmDist);     /* 10.4.6.2 */
21834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD0, VC1_BE_FRPD,  ctx->i8FwrdRefFrmDist);
2184b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
21854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD1 */
21884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2189b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
21904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD1, VC1_BE_SCALEFACTOR, ctx->ui32ScaleFactor);  /* figure 66 */
2191b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
21924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD2 */
21954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD2, VC1_BE_PULLBACK_X, ctx->pull_back_x);
21974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD3 */
22004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD3, VC1_BE_PULLBACK_Y, ctx->pull_back_y);
22024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD4 */
22054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
22064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD4, VC1_BE_FIRST_MB_IN_SLICE_Y, slice_param->slice_vertical_position);
22074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CR_VEC_VC1_BE_MVD5 */
22104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
2211b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
2212bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_REFDIST,               pic_params->reference_fields.bits.reference_distance);
2213bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_NUMREF,                pic_params->reference_fields.bits.num_reference_pictures);
2214bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_REFFIELD,              pic_params->reference_fields.bits.reference_field_pic_indicator);
2215bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_MVRANGE,               pic_params->mv_fields.bits.extended_mv_range);
2216bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_HALFPEL_FLAG,  ctx->half_pel);
2217b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
2218bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_FRAME_CODING_MODE,       pic_params->picture_fields.bits.frame_coding_mode);
22194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_BOTTOM_FIELD_FLAG, ctx->bottom_field);
2220bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_ADVANCED_PROFILE, (ctx->profile == WMF_PROFILE_ADVANCED) ? 1 : 0);
2221bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_SCAN_INDEX,        ctx->scan_index);
22224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
22254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CHUNK: 6c (Back-end registers) */
2227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_PARAM_BASE_ADDR));
22284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2229c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_VC1: picture_type = %d\n", pic_params->picture_fields.bits.picture_type);
22304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type) || (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P)) {
223206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_buffer_p colocated_target_buffer = vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, target_surface);
22334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ASSERT(colocated_target_buffer);
2234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (colocated_target_buffer) {
22354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb_cmdbuf_rendec_write_address(cmdbuf, colocated_target_buffer, ui32MBParamMemOffset);
2236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
22374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* This is an error */
22384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb_cmdbuf_rendec_write(cmdbuf, 0);
22394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
2240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
22414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ASSERT(ctx->forward_ref_surface);
224206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb_buffer_p colocated_forward_ref_buffer = ctx->forward_ref_surface ? vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, ctx->forward_ref_surface->psb_surface) : 0;
22434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ASSERT(colocated_forward_ref_buffer);
2244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (colocated_forward_ref_buffer) {
22454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb_cmdbuf_rendec_write_address(cmdbuf, colocated_forward_ref_buffer, ui32MBParamMemOffset);
2246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
22474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* This is an error */
22484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb_cmdbuf_rendec_write(cmdbuf, 0);
22494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
22504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
22524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
22544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* CHUNK: 6d (Back-end registers) */
2255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_COLPARAM_BASE_ADDR));
22564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
22584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* CR_VEC_VC1_BE_COLPARAM_BASE_ADDR */
22594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ASSERT(ctx->forward_ref_surface);
226006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            psb_buffer_p colocated_forward_ref_buffer = ctx->forward_ref_surface ? vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, ctx->forward_ref_surface->psb_surface) : NULL;
22614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ASSERT(colocated_forward_ref_buffer);
2262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (colocated_forward_ref_buffer) {
22634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb_cmdbuf_rendec_write_address(cmdbuf, colocated_forward_ref_buffer, ui32MBParamMemOffset);
2264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
22654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                /* This is an error */
22664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb_cmdbuf_rendec_write(cmdbuf, 0);
22674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
2268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
22694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            /* CR_VEC_VC1_BE_COLPARAM_BASE_ADDR */
22704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ASSERT(ctx->backward_ref_surface);
22714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb_buffer_p colocated_backward_ref_buffer;
22724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == ctx->backward_ref_surface) {
2274c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "%s L%d Invalid backward_ref_surface handle\n", __FUNCTION__, __LINE__);
2275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return;
2276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
2277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
227806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng            colocated_backward_ref_buffer = ctx->backward_ref_surface->psb_surface ? vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, ctx->backward_ref_surface->psb_surface) : NULL;
22794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ASSERT(colocated_backward_ref_buffer);
2280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (colocated_backward_ref_buffer) {
22814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb_cmdbuf_rendec_write_address(cmdbuf, colocated_backward_ref_buffer, ui32MBParamMemOffset);
2282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
22834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                /* This is an error */
22844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                psb_cmdbuf_rendec_write(cmdbuf, 0);
22854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            }
22864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
22874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_end(cmdbuf);
22894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
22904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* psb_cmdbuf_rendec_end_block( cmdbuf ); */
22924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
22934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
22954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_load_sequence_registers(context_VC1_p ctx)
22964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
22974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
22984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t reg_value;
22994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2300680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
23014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* FE_CONTROL */
23034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL, ENTDEC_FE_PROFILE, ctx->profile);
2305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL, ENTDEC_FE_MODE, 2);  /* 2 - VC1 */
2306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL), reg_value);
23074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* FE_SPS0 */
23094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0, VC1_FE_SYNCMARKER, ctx->pic_params->sequence_fields.bits.syncmarker);
2311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0, VC1_FE_VSTRANSFORM, ctx->pic_params->transform_fields.bits.variable_sized_transform_flag);
2312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0, VC1_FE_INTERLACE, ctx->pic_params->sequence_fields.bits.interlace);
2313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0), reg_value);
23144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
23164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
23184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_load_picture_registers(context_VC1_p ctx, VASliceParameterBufferVC1 *slice_param)
23204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
23214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
23224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
23234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t reg_value;
23244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    int bEnableMVDLite = FALSE;
23254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_ENTDEC_BE_CONTROL_OFFSET);
23274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_PROFILE, ctx->profile);
2329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_MODE, 2);  /* 2 - VC1 */
2330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
2331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
23324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2333b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifdef VC1_Header_Parser_HW
2334b7a085efcf0e0c5699a485966227cdca8c13dd1ehding    psb_cmdbuf_reg_start_block(cmdbuf, CMD_REGVALPAIR_FLAG_VC1PATCH);
2335b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#else
2336b7a085efcf0e0c5699a485966227cdca8c13dd1ehding    psb_cmdbuf_reg_start_block(cmdbuf, 0);
2337b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
23384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Enable MVD lite for Progressive or FLDI P */
2340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (
23414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        (
2342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) ||
2343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (!pic_params->sequence_fields.bits.interlace) ||
2344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P))
23454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ) &&
2346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P)
2347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ) {
23484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        bEnableMVDLite = TRUE;
23494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
23504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* FE_PPS0 */
23524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_PIC_WIDTH_IN_MBS_LESS1,  ctx->picture_width_mb - 1);
23544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_PIC_HEIGHT_IN_MBS_LESS1, ctx->picture_height_mb - 1);
2355bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_FIRST_MB_IN_SLICE_Y,     slice_param->slice_vertical_position);
2356b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
23574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_PTYPE,                   pic_params->picture_fields.bits.picture_type);
2358b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
23594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_FCM,                     pic_params->picture_fields.bits.frame_coding_mode);
2360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0), reg_value);
23614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* FE_PPS1 */
23634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2364b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
23654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BP_FORMAT,     IMG_FALSE); // interleaved format
2366bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BP_PRESENT,      ctx->bitplane_present);
2367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_RAWCODINGFLAG, (pic_params->raw_coding.value & 0x7F)); // 7-bits
23684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_MVMODE,      pic_params->mv_fields.bits.mv_mode);
23694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_MVMODE2,     pic_params->mv_fields.bits.mv_mode2);
23704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_TTMBF,       pic_params->transform_fields.bits.mb_level_transform_type_flag);
23714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_TTFRM,       pic_params->transform_fields.bits.frame_level_transform_type);
23724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BFRACTION,   pic_params->b_picture_fraction);
23734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_CONDOVER,    ctx->condover);
23744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_EXTEND_X,    ctx->extend_x);
23754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_EXTEND_Y,    ctx->extend_y);
2376b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
2377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1), reg_value);
23784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
23794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* FE_PPS2 */
23804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
2381b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
2382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQXBEDGE, (pic_params->pic_quantizer_fields.bits.dq_profile == 1) ? pic_params->pic_quantizer_fields.bits.dq_db_edge : pic_params->pic_quantizer_fields.bits.dq_sb_edge);
23834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANT,            pic_params->pic_quantizer_fields.bits.dquant);
23844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_PQUANT,            pic_params->pic_quantizer_fields.bits.pic_quantizer_scale);
2385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_HALFQP,            pic_params->pic_quantizer_fields.bits.half_qp);
2386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (((ctx->profile == WMF_PROFILE_ADVANCED) && (pic_params->pic_quantizer_fields.bits.dquant != 0))
2387bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || ((ctx->profile != WMF_PROFILE_ADVANCED) && ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) || (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P))) && (pic_params->pic_quantizer_fields.bits.dquant != 0)) {
23884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_VOPDQUANT_PRESENT, 1);
2389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
23904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_VOPDQUANT_PRESENT, 0);
23914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
23924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANTFRM,         pic_params->pic_quantizer_fields.bits.dq_frame);
23934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        {
2394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            IMG_BOOL DQUANT_INFRAME = (pic_params->pic_quantizer_fields.bits.dquant == 2) ||
2395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      ((pic_params->pic_quantizer_fields.bits.dquant == 1) && pic_params->pic_quantizer_fields.bits.dq_frame) ||
2396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      ((pic_params->pic_quantizer_fields.bits.dquant == 3) && pic_params->pic_quantizer_fields.bits.dq_frame);
2397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANT_INFRAME, DQUANT_INFRAME);
23984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
23994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_ALTPQUANT,         pic_params->pic_quantizer_fields.bits.alt_pic_quantizer);
24004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQPROFILE,         pic_params->pic_quantizer_fields.bits.dq_profile);
24014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQBILEVEL,         pic_params->pic_quantizer_fields.bits.dq_binary_level);
2402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_PQINDEX_GT8,       ctx->pqindex_gt8);
24034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_TRANSACFRM,        pic_params->transform_fields.bits.transform_ac_codingset_idx1);
24044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_TRANSACFRM2,       pic_params->transform_fields.bits.transform_ac_codingset_idx2);
2405b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
24064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANT, pic_params->pic_quantizer_fields.bits.dquant);
2407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2), reg_value);
24084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* MVD_LITE0 */
24104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
24114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_MVD_LITE_ENABLE,   bEnableMVDLite);
24124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_PULLBACK_X,        ctx->pull_back_x);
24134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_PULLBACK_Y,        ctx->pull_back_y);
2414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0), reg_value);
24154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* MVD_LITE1 */
24174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    reg_value = 0;
24184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_TFF,              pic_params->picture_fields.bits.top_field_first);
2419b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
24204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_REFDIST,          pic_params->reference_fields.bits.reference_distance);
24214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_NUMREF,           pic_params->reference_fields.bits.num_reference_pictures);
24224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_REFFIELD,         pic_params->reference_fields.bits.reference_field_pic_indicator);
24234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_MVRANGE,          pic_params->mv_fields.bits.extended_mv_range);
24244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_HALFPEL_FLAG,     ctx->half_pel);
24254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        //REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_FRAME_CODING_MODE,    pic_params->picture_fields.bits.frame_coding_mode);
2426b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
24274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_BOTTOM_FIELD_FLAG,      ctx->bottom_field);
2428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_ADVANCED_PROFILE, (ctx->profile == WMF_PROFILE_ADVANCED) ? 1 : 0);
2429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1), reg_value);
24304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
24324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
24334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_setup_bitplane(context_VC1_p ctx)
24354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
24364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
24374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2438680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
24394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2440b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifdef VC1_Header_Parser_HW
2441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR0),
2442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &ctx->bitplane_hw_buffer, 0);
2443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR1),
2444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &ctx->bitplane_hw_buffer, 0xa000);
2445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR2),
2446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &ctx->bitplane_hw_buffer, 0xa000 * 2);
2447b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#else
24484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if (ctx->bitplane_present)
2449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR0),
2450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       ctx->bitplane_buffer, 0);
24514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
2452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR0), 0);
2453b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
2454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
24554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
24564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__VC1_Send_Parse_Header_Cmd(context_VC1_p ctx, IMG_BOOL new_pic)
24584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
2459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    PARSE_HEADER_CMD*       pParseHeaderCMD;
2460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
2461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
24624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    //pParseHeaderCMD                                  = (PARSE_HEADER_CMD*)mCtrlAlloc.AllocateSpace(sizeof(PARSE_HEADER_CMD));
24643f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    pParseHeaderCMD = (PARSE_HEADER_CMD*)cmdbuf->cmd_idx;
2465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->cmd_idx += sizeof(PARSE_HEADER_CMD) / sizeof(uint32_t);
24664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32Cmd                 = CMD_PARSE_HEADER;
2468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!new_pic) {
2469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pParseHeaderCMD->ui32Cmd        |= CMD_PARSE_HEADER_NEWSLICE;
2470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
24714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData  = (sVC1HeaderParser.sSeqHdr.EXTENDED_DMV&0x1)  << VC1_SEQHDR_EXTENDED_DMV;
2473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData  = (pic_params->mv_fields.bits.extended_dmv_flag) << VC1_SEQHDR_EXTENDED_DMV;
24744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.PSF&0x1)                   << VC1_SEQHDR_PSF;
2476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.psf)               << VC1_SEQHDR_PSF;
24774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.FINTERPFLAG&0x1)   << VC1_SEQHDR_FINTERPFLAG;
2479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.finterpflag) << VC1_SEQHDR_FINTERPFLAG;
24804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.TFCNTRFLAG&0x1)    << VC1_SEQHDR_TFCNTRFLAG;
2482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.tfcntrflag) << VC1_SEQHDR_TFCNTRFLAG;;
24834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.INTERLACE&0x1)             << VC1_SEQHDR_INTERLACE;
2485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.interlace)         << VC1_SEQHDR_INTERLACE;
24864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.PULLDOWN&0x1)              << VC1_SEQHDR_PULLDOWN;
2488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.pulldown)          << VC1_SEQHDR_PULLDOWN;
24894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.POSTPROCFLAG&0x1)  << VC1_SEQHDR_POSTPROCFLAG;
2491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->post_processing & 0x1)          << VC1_SEQHDR_POSTPROCFLAG;
24924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.VSTRANSFORM&0x1)   << VC1_SEQHDR_VSTRANSFORM;
2494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->transform_fields.bits.variable_sized_transform_flag) << VC1_SEQHDR_VSTRANSFORM;
24954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (rser.sSeqHdr.DQUANT&0x3)                << VC1_SEQHDR_DQUANT;
2497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->pic_quantizer_fields.bits.dquant) << VC1_SEQHDR_DQUANT;
24984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
24994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.EXTENDED_MV&0x1)   << VC1_SEQHDR_EXTENDED_MV;
2500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->mv_fields.bits.extended_mv_flag) << VC1_SEQHDR_EXTENDED_MV;
25014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.FASTUVMC&0x1)              << VC1_SEQHDR_FASTUVMC;
2503bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->fast_uvmc_flag & 0x1)                       << VC1_SEQHDR_FASTUVMC;
25044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.LOOPFILTER&0x1)    << VC1_SEQHDR_LOOPFILTER;
2506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->entrypoint_fields.bits.loopfilter) << VC1_SEQHDR_LOOPFILTER;
25074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.REFDIST_FLAG&0x1)  << VC1_SEQHDR_REFDIST_FLAG;
2509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->reference_fields.bits.reference_distance_flag) << VC1_SEQHDR_REFDIST_FLAG;
25104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.PANSCAN_FLAG&0x1)  << VC1_SEQHDR_PANSCAN_FLAG;
2512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->entrypoint_fields.bits.panscan_flag) << VC1_SEQHDR_PANSCAN_FLAG;
25134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.MAXBFRAMES&0x7)    << VC1_SEQHDR_MAXBFRAMES;
2515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.max_b_frames) << VC1_SEQHDR_MAXBFRAMES;
25164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.RANGERED&0x1)              << VC1_SEQHDR_RANGERED;
2518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.rangered) << VC1_SEQHDR_RANGERED;
25194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.SYNCMARKER&0x1)    << VC1_SEQHDR_SYNCMARKER;
2521dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.syncmarker) << VC1_SEQHDR_SYNCMARKER;
25224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.MULTIRES&0x1)              << VC1_SEQHDR_MULTIRES;
2524dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.multires) << VC1_SEQHDR_MULTIRES;
25254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.QUANTIZER&0x3)             << VC1_SEQHDR_QUANTIZER;
2527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->pic_quantizer_fields.bits.quantizer) << VC1_SEQHDR_QUANTIZER;
25284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.OVERLAP&0x1)               << VC1_SEQHDR_OVERLAP;
2530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->sequence_fields.bits.overlap) << VC1_SEQHDR_OVERLAP;
25314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (sVC1HeaderParser.sSeqHdr.PROFILE&0x3)               << VC1_SEQHDR_PROFILE;
2533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (ctx->profile) << VC1_SEQHDR_PROFILE;
25344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (msPicParam.bSecondField&0x1)                                << VC1_SEQHDR_SECONDFIELD;
2536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (!pic_params->picture_fields.bits.is_first_field) << VC1_SEQHDR_SECONDFIELD;
25374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (mpDestFrame->FrameCodingMode()&0x3)                 << VC1_SEQHDR_FCM_CURRPIC;
2539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->picture_fields.bits.frame_coding_mode & 0x3) << VC1_SEQHDR_FCM_CURRPIC;
25404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= (mui8PicType&0x3)                                              << VC1_SEQHDR_PICTYPE;
2542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->picture_fields.bits.picture_type & 0x3) << VC1_SEQHDR_PICTYPE;
25434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32SeqHdrData |= ((msPicParam.bBidirectionalAveragingMode>>4)&0x1) << VC1_SEQHDR_ICFLAG;
2545cc88982093542dba709b41bca70b3e5e5c411625Tianmi Chen    pParseHeaderCMD->ui32SeqHdrData |= (pic_params->picture_fields.bits.intensity_compensation) <<  VC1_SEQHDR_ICFLAG;
25464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32PicDimensions              = ctx->picture_width_mb;
2548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32PicDimensions         |= (ctx->picture_height_mb << 16);
25494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32BitplaneAddr[0]    = (psBitplaneHWBuffer[0]->GetTopDeviceMemAlloc())->GetDeviceVirtAddress();
25514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32BitplaneAddr[1]    = (psBitplaneHWBuffer[1]->GetTopDeviceMemAlloc())->GetDeviceVirtAddress();
25524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32BitplaneAddr[2]    = (psBitplaneHWBuffer[2]->GetTopDeviceMemAlloc())->GetDeviceVirtAddress();
2553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC(pParseHeaderCMD->ui32BitplaneAddr[0], ctx->bitplane_hw_buffer.buffer_ofs, &ctx->bitplane_hw_buffer);
2554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC(pParseHeaderCMD->ui32BitplaneAddr[1], ctx->bitplane_hw_buffer.buffer_ofs + 0xa000, &ctx->bitplane_hw_buffer);
2555bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    RELOC(pParseHeaderCMD->ui32BitplaneAddr[2], ctx->bitplane_hw_buffer.buffer_ofs + 0xa000 * 2, &ctx->bitplane_hw_buffer);
25564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
25574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo//        pParseHeaderCMD->ui32VLCTableAddr       =       psVlcPackedTableData->GetTopDeviceMemAlloc()->GetDeviceVirtAddress();
2558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC(pParseHeaderCMD->ui32VLCTableAddr, ctx->vlc_packed_table.buffer_ofs, &ctx->vlc_packed_table);
2559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
25604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pParseHeaderCMD->ui32ICParamData[0]      = ((msPicParam.wBitstreamFcodes >> 8) & 0xFF);
25614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pParseHeaderCMD->ui32ICParamData[0] |= ((msPicParam.wBitstreamPCEelements >> 8) & 0xFF) << 8;
25624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if( mpForwardRefFrame->TopFieldFirst() )
25634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                pParseHeaderCMD->ui32ICParamData[0] |= (1 << 16);
2564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    */
2565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[0]      = ((pic_params->luma_scale >> 8) & 0xFF);
2566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[0] |= ((pic_params->luma_shift >> 8) & 0xFF) << 8;
2567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->bTFF_FwRefFrm)
2568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pParseHeaderCMD->ui32ICParamData[0] |= (1 << 16);
2569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
25704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pParseHeaderCMD->ui32ICParamData[1]      = (msPicParam.wBitstreamFcodes & 0xFF);
25714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        pParseHeaderCMD->ui32ICParamData[1]     |= (msPicParam.wBitstreamPCEelements & 0xFF) << 8;
25724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if( mpDestFrame->TopFieldFirst() )
25734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                pParseHeaderCMD->ui32ICParamData[1] |= (1 << 16);
2574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    */
2575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[1]      = (pic_params->luma_scale & 0xFF);
2576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[1]     |= (pic_params->luma_shift & 0xFF) << 8;
2577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.top_field_first)
2578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pParseHeaderCMD->ui32ICParamData[1] |= (1 << 16);
25794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[0] = 0x00010000;
2581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pParseHeaderCMD->ui32ICParamData[1] = 0x00010020;
25824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
25834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
258406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_begin_slice(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param)
25854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
258606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VASliceParameterBufferVC1 *slice_param = (VASliceParameterBufferVC1 *) vld_slice_param;
258706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_VC1_p ctx = (context_VC1_p)dec_ctx;
25884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
258906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    dec_ctx->bits_offset = slice_param->macroblock_offset;
259006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    dec_ctx->SR_flags = (ctx->profile == WMF_PROFILE_ADVANCED) ? (CMD_ENABLE_RBDU_EXTRACTION | CMD_SR_VERIFY_STARTCODE) : 0;
259106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng}
25924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
259306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_process_slice_data(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param)
259406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng{
259506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    VASliceParameterBufferVC1 *slice_param = (VASliceParameterBufferVC1 *) vld_slice_param;
259606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_VC1_p ctx = (context_VC1_p)dec_ctx;
25974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
259806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb__VC1_load_sequence_registers(ctx);
25994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2600b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#ifndef VC1_Header_Parser_HW
260106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__VC1_write_VLC_tables(ctx);
260206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__VC1_build_VLC_tables(ctx);
2603b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#else
260406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__VC1_Send_Parse_Header_Cmd(ctx, ctx->is_first_slice);
2605b7a085efcf0e0c5699a485966227cdca8c13dd1ehding#endif
2606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
260706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb__VC1_load_picture_registers(ctx, slice_param);
260806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb__VC1_setup_bitplane(ctx);
260906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    psb__VC1_send_rendec_params(ctx, slice_param);
26104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
26114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
261206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic void psb__VC1_end_slice(context_DEC_p dec_ctx)
26134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
261406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_VC1_p ctx = (context_VC1_p)dec_ctx;
26154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
261606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->obj_context->first_mb = 0;
261706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (ctx->is_first_slice) {
261806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->flags |= FW_VA_RENDER_IS_FIRST_SLICE;
26194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
262006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    //if (ctx->bitplane_present)
262106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    {
262206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        ctx->obj_context->flags |= FW_VA_RENDER_VC1_BITPLANE_PRESENT;
26234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
262406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->obj_context->last_mb = ((ctx->picture_height_mb - 1) << 8) | (ctx->picture_width_mb - 1);
26254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
262606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    *(ctx->dec_ctx.slice_first_pic_last) = (ctx->obj_context->first_mb << 16) | (ctx->obj_context->last_mb);
262706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    if (psb_video_trace_fp && (psb_video_trace_level & AUXBUF_TRACE)) {
262806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__debug_schedule_hexdump("Preload buffer", &ctx->preload_buffer, 0, PRELOAD_BUFFER_SIZE);
262906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__debug_schedule_hexdump("AUXMSB buffer", &ctx->aux_msb_buffer, 0, 0x8000 /* AUXMSB_BUFFER_SIZE */);
263006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__debug_schedule_hexdump("VLC Table", &ctx->vlc_packed_table, 0, gui16vc1VlcTableSize * sizeof(IMG_UINT16));
26314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
2632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
263306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    ctx->is_first_slice = FALSE; /* Reset */
26344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
26354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
26364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus pnw_VC1_BeginPicture(
2637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
26384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
26394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_CONTEXT_VC1
2640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
26424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        free(ctx->pic_params);
26434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->pic_params = NULL;
26444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
26454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->is_first_slice = TRUE;
2646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
26474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
26484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
26494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
265006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zengstatic VAStatus pnw_VC1_process_buffer(
265106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_DEC_p dec_ctx,
265206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_buffer_p buffer)
26534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
265406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    context_VC1_p ctx = (context_VC1_p)dec_ctx;
26554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    VAStatus vaStatus = VA_STATUS_SUCCESS;
265606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    object_buffer_p obj_buffer = buffer;
2657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
265806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    switch (obj_buffer->type) {
265906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VAPictureParameterBufferType:
266006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_VC1_RenderPicture got VAPictureParameterBuffer\n");
266106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = psb__VC1_process_picture_param(ctx, obj_buffer);
266206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
266306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
2664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
266506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    case VABitPlaneBufferType:
266606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_VC1_RenderPicture got VABitPlaneBuffer\n");
266706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = psb__VC1_process_bitplane(ctx, obj_buffer);
266806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
266906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        break;
2670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
267106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    default:
267206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        vaStatus = VA_STATUS_ERROR_UNKNOWN;
267306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        DEBUG_FAILURE;
26744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
26754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
26764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return vaStatus;
26774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
26784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
26794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic VAStatus pnw_VC1_EndPicture(
2680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
26814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
26824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    INIT_CONTEXT_VC1
26834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_context_flush_cmdbuf(ctx->obj_context)) {
26854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return VA_STATUS_ERROR_UNKNOWN;
26864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
26874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
26884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(ctx->pic_params);
2689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ctx->pic_params) {
26904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        return VA_STATUS_ERROR_UNKNOWN;
26914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
26924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
26934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /********* Keep some picture parameters of the previously decoded picture ***********/
2694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(ctx->pic_params->picture_fields.bits.picture_type)) { // I or P
2695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Assume that the picture that we just decoded (the picture previous to the one that
26964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo           is about to be decoded) is the backward reference picture for a B picture. */
26974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* TODO: Make this more robust */
26984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->ui8FCM_Ref2Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
2699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
27004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* For interlaced field pictures only */
2701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((ctx->pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) || !ctx->pic_params->picture_fields.bits.is_first_field) {
27024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            ctx->bTFF_BwRefFrm = ctx->pic_params->picture_fields.bits.top_field_first;
27034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
27044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
27054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
27064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->bRef1RangeRed = ctx->bRef0RangeRed;
2707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(ctx->pic_params->picture_fields.bits.picture_type)) {
27084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        ctx->bRef0RangeRed = ctx->pic_params->range_reduction_frame;
27094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
27104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /***********************************************************************************/
27114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
27124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    free(ctx->pic_params);
27134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->pic_params = NULL;
27144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
27154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return VA_STATUS_SUCCESS;
27164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
27174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
27184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostruct format_vtable_s pnw_VC1_vtable = {
2719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
2720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_QueryConfigAttributes,
2721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
2722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_ValidateConfig,
2723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
2724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_CreateContext,
2725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
2726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_DestroyContext,
2727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
2728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_BeginPicture,
2729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
273006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    vld_dec_RenderPicture,
2731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
2732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_VC1_EndPicture
27334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo};
2734