17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
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>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_VC1.h"
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_surface.h"
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
35f31d5416a60f83e184b0906a7ec77ba021840531hding#include "psb_drv_debug.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "vc1_header.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "vc1_defs.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h"
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h"
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h"
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_vc1_reg_io2.h"
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_vc1_reg_io2.h"
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h"
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdint.h>
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define GET_SURFACE_INFO_is_defined(psb_surface) ((int) (psb_surface->extra_info[0]))
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SET_SURFACE_INFO_is_defined(psb_surface, val) psb_surface->extra_info[0] = (uint32_t) val;
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define GET_SURFACE_INFO_picture_structure(psb_surface) (psb_surface->extra_info[1])
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SET_SURFACE_INFO_picture_structure(psb_surface, val) psb_surface->extra_info[1] = val;
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define GET_SURFACE_INFO_picture_coding_type(psb_surface) ((int) (psb_surface->extra_info[2]))
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SET_SURFACE_INFO_picture_coding_type(psb_surface, val) psb_surface->extra_info[2] = (uint32_t) val;
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3]))
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val;
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SLICEDATA_BUFFER_TYPE(type) ((type==VASliceDataBufferType)?"VASliceDataBufferType":"VAProtectedSliceDataBufferType")
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PIXELS_TO_MB(x)    ((x + 15) / 16)
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PRELOAD_BUFFER_SIZE        (4*1024)
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define AUXMSB_BUFFER_SIZE         (1024*1024)
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
69dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef struct {
70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32ContextId;
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32SliceParams;
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    IMG_UINT32              ui32MacroblockNumber;
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} VC1PRELOAD;
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*!
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang******************************************************************************
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang @LUTs   VLC table selection Look-up Tables
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang******************************************************************************/
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Code_3x2_2x3_tiles              = 0x0,
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_0,
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_1,
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_2,
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_FourMV_Pattern_3,
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Chroma_DC_Diff_VLC,
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Inter_VLC,
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Intra_VLC,
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Mot_Luminance_DC_Diff_VLC,
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_Inter_VLC,
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_Intra_VLC,
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_SUBBLKPAT,
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_TTBLK,
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_High_Rate_TTMB,
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_I_Picture_CBPCY_VLC,
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_0,
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_1,
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_2,
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_3,
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_0,
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_1,
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_2,
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_4MV_MB_3,
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_0,
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_1,
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_2,
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_Non_4MV_MB_3,
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_0,
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_1,
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_2,
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_3,
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_4,
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_5,
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_6,
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlaced_CBPCY_7,
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC,
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Inter_VLC,
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Intra_VLC,
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC,
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_SUBBLKPAT,
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_TTBLK,
122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Low_Rate_TTMB,
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_SUBBLKPAT,
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_TTBLK,
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Medium_Rate_TTMB,
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mid_Rate_Inter_VLC,
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mid_Rate_Intra_VLC,
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_0,
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_1,
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_2,
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_3,
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_4,
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_5,
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_6,
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mixed_MV_MB_7,
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_0,
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_1,
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_2,
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Mot_Vector_Diff_VLC_3,
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_0,
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_1,
142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_2,
143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_Field_Ref_Ilace_MV_3,
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_0,
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_1,
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_One_MV_MB_2,
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_3,
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_4,
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_5,
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_6,
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_One_MV_MB_7,
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_0,
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_1,
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_2,
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_P_Picture_CBPCY_VLC_3,
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_0,
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_1,
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_2,
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_3,
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_4,
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_5,
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_6,
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Two_Field_Ref_Ilace_MV_7,
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} VC1_eVLCTables;
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 MBMODETableFLDI[][2] = {
168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_0, VC1_VLC_Mixed_MV_MB_0},
169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_1, VC1_VLC_Mixed_MV_MB_1},
170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_2, VC1_VLC_Mixed_MV_MB_2},
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_3, VC1_VLC_Mixed_MV_MB_3},
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_4, VC1_VLC_Mixed_MV_MB_4},
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_5, VC1_VLC_Mixed_MV_MB_5},
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_6, VC1_VLC_Mixed_MV_MB_6},
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_One_MV_MB_7, VC1_VLC_Mixed_MV_MB_7},
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 MBMODETableFRMI[][2] = {
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_0, VC1_VLC_Interlace_Non_4MV_MB_0},
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_1, VC1_VLC_Interlace_Non_4MV_MB_1},
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_2, VC1_VLC_Interlace_Non_4MV_MB_2},
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    {VC1_VLC_Interlace_4MV_MB_3, VC1_VLC_Interlace_Non_4MV_MB_3},
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 CBPCYTableProg[] = {
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_P_Picture_CBPCY_VLC_0,
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_P_Picture_CBPCY_VLC_1,
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_P_Picture_CBPCY_VLC_2,
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_P_Picture_CBPCY_VLC_3,
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 CBPCYTableInterlaced[] = {
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_0,
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_1,
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_2,
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_3,
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_4,
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_5,
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_6,
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlaced_CBPCY_7,
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 FourMVTable[] = {
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_FourMV_Pattern_0,
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_FourMV_Pattern_1,
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_FourMV_Pattern_2,
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_FourMV_Pattern_3,
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 Interlace2MVTable[] = {
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Interlace_2_MVP_Pattern_0,
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_1,
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_2,
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VC1_VLC_Interlace_2_MVP_Pattern_3,
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 ProgressiveMVTable[] = {
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mot_Vector_Diff_VLC_0,
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mot_Vector_Diff_VLC_1,
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mot_Vector_Diff_VLC_2,
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mot_Vector_Diff_VLC_3,
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 Interlaced1RefMVTable[] = {
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_One_Field_Ref_Ilace_MV_0,
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_One_Field_Ref_Ilace_MV_1,
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_One_Field_Ref_Ilace_MV_2,
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_One_Field_Ref_Ilace_MV_3,
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 MVTable2RefIlace[] = {
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_0,
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_1,
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_2,
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_3,
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_4,
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_5,
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_6,
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Two_Field_Ref_Ilace_MV_7,
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 IntraTablePQIndexLT9[] = {
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Rate_Intra_VLC,
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Mot_Intra_VLC,
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mid_Rate_Intra_VLC,
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 InterTablePQIndexLT9[] = {
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Rate_Inter_VLC,
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Mot_Inter_VLC,
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mid_Rate_Inter_VLC,
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 IntraTablePQIndexGT8[] = {
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Low_Mot_Intra_VLC,
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Mot_Intra_VLC,
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mid_Rate_Intra_VLC,
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic IMG_UINT8 InterTablePQIndexGT8[] = {
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Low_Mot_Inter_VLC,
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_High_Mot_Inter_VLC,
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VC1_VLC_Mid_Rate_Inter_VLC,
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* TODO: Make tables const, don't polute namespace */
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunextern IMG_UINT16        gaui16vc1VlcTableData[];
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangextern const IMG_UINT16    gui16vc1VlcTableSize;
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangextern IMG_UINT16        gaui16vc1VlcIndexData[VLC_INDEX_TABLE_SIZE][3];
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangextern const IMG_UINT8    gui8vc1VlcIndexSize;
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
273bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_UINT16       gaui16Inverse[] = {256, 128, 85, 64, 51, 43, 37, 32};    /* figure 66 */
274bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BOOL         gDMVRANGE_ExtHorizontal_RemapTable[] = {0, 1, 0, 1};
275bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic IMG_BOOL         gDMVRANGE_ExtVertical_RemapTable[] = {0, 0, 1, 1};
276bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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};
277bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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};
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define INIT_CONTEXT_VC1    context_VC1_p ctx = (context_VC1_p) obj_context->format_data;
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_VC1_QueryConfigAttributes(
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAProfile profile,
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAEntrypoint entrypoint,
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAConfigAttrib *attrib_list,
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* No VC1 specific attributes */
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_VC1_ValidateConfig(
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check all attributes */
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_config->attrib_list[i].type) {
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAConfigAttribRTFormat:
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Ignore */
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_pack_vlc_tables(uint16_t *vlc_packed_data,
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                     uint16_t *gaui16vc1VlcTableData,
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                     int gui16vc1VlcTableSize)
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i, j;
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Pack the VLC tables into 32-bit format ready for DMA into 15-bit wide RAM.        */
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < gui16vc1VlcTableSize; i++) {
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        j = i * 3;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* opcode 14:12 *//* width 11:9 *//* symbol 8:0 */
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vlc_packed_data[i] = ((gaui16vc1VlcTableData[j + 0]) << 12) |
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                             ((gaui16vc1VlcTableData[j + 1]) << 9)  |
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             (gaui16vc1VlcTableData[j + 2]);
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb__VC1_pack_index_table_info(uint32_t *packed_index_table,
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint16_t index_data[VLC_INDEX_TABLE_SIZE][3])
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t  start = 0, end = 0, length = 0, opcode = 0, width = 0;
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < VLC_INDEX_TABLE_SIZE; i++) {
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        start = index_data[i][2];
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (i < (VLC_INDEX_TABLE_SIZE - 1)) { //Make sure we don't exceed the bound
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            end = index_data[i+1][2];
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            end = start + 500;
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        length = end - start;
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        width = index_data[i][1];
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        opcode = index_data[i][0];
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
349c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "packed_index_table[%02d]->start = %08x length = %08x (%d)\n", i, start * 2, length * 2, length * 2);
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] = opcode;
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] <<= 3;
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] |= width;
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] <<= 9;
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] |= length;
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] <<= 16;
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        packed_index_table[i] |= start;
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_config) {
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* MSVDX decode capability for VC-1:
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *     SP@ML
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *     MP@HL
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *     AP@L3
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     *
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * Refer to Table 253 (Limitations of profiles and levels) of SMPTE-421M
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Simple:
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 352)
387bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 288)) {
388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Main:
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 1920)
394bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 1088)) {
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Advanced:
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 2048)
401bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 2048)) {
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_VC1_DestroyContext(object_context_p obj_context);
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_VC1_CreateContext(
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    context_VC1_p ctx;
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Validate flag */
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Validate picture dimensions */
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = psb__VC1_check_legal_picture(obj_context, obj_config);
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4302befccec034c13d34746a9e87149889d59ac767bFei Jiang    ctx = (context_VC1_p) calloc(1, sizeof(struct context_VC1_s));
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx) {
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4362befccec034c13d34746a9e87149889d59ac767bFei Jiang
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->format_data = (void*) ctx;
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->obj_context = obj_context;
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->pic_params = NULL;
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->split_buffer_pending = FALSE;
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->slice_param_list_size = 8;
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size);
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->slice_param_list_idx = 0;
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_list) {
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->colocated_buffers_size = obj_context->num_render_targets;
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->colocated_buffers_idx = 0;
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size);
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->colocated_buffers) {
4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Simple:
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->profile = WMF_PROFILE_SIMPLE;
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Main:
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->profile = WMF_PROFILE_MAIN;
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileVC1Advanced:
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->profile = WMF_PROFILE_ADVANCED;
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        break;
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(0 == 1);
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // TODO
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     PRELOAD_BUFFER_SIZE,
483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_vpu_only,
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->preload_buffer);
4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     AUXMSB_BUFFER_SIZE,
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_vpu_only,
492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->aux_msb_buffer);
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     gui16vc1VlcTableSize * sizeof(IMG_UINT16),
499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_cpu_vpu,
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->vlc_packed_table);
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        void *vlc_packed_data_address;
505e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        if (0 ==  psb_buffer_map(&ctx->vlc_packed_table, (unsigned char **)&vlc_packed_data_address)) {
506e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            psb__VC1_pack_vlc_tables((unsigned short *)vlc_packed_data_address, gaui16vc1VlcTableData, gui16vc1VlcTableSize);
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_unmap(&ctx->vlc_packed_table);
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__VC1_pack_index_table_info(ctx->vlc_packed_index_table, gaui16vc1VlcIndexData);
509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus != VA_STATUS_SUCCESS) {
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_VC1_DestroyContext(obj_context);
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_VC1_DestroyContext(
523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_VC1
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->vlc_packed_table);
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->aux_msb_buffer);
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->preload_buffer);
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free(ctx->pic_params);
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->pic_params = NULL;
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->slice_param_list) {
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free(ctx->slice_param_list);
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->slice_param_list = NULL;
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->colocated_buffers) {
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (i = 0; i < ctx->colocated_buffers_idx; ++i)
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_destroy(&(ctx->colocated_buffers[i]));
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free(ctx->colocated_buffers);
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->colocated_buffers = NULL;
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(obj_context->format_data);
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->format_data = NULL;
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic VAStatus psb__VC1_allocate_colocated_buffer(context_VC1_p ctx, object_surface_p obj_surface, uint32_t size)
555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_surface_p surface = obj_surface->psb_surface;
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
558c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1: Allocationg colocated buffer for surface %08x\n", surface);
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!GET_SURFACE_INFO_colocated_index(surface)) {
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        VAStatus vaStatus;
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p buf;
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        int index = ctx->colocated_buffers_idx;
564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (index >= ctx->colocated_buffers_size) {
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return VA_STATUS_ERROR_UNKNOWN;
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf = &(ctx->colocated_buffers[index]);
568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VA_STATUS_SUCCESS != vaStatus) {
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return vaStatus;
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->colocated_buffers_idx++;
573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic psb_buffer_p psb__VC1_lookup_colocated_buffer(context_VC1_p ctx, psb_surface_p surface)
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
580c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1: Looking up colocated buffer for surface %08x\n", surface);
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int index = GET_SURFACE_INFO_colocated_index(surface);
582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!index) {
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t psb__vc1_get_izz_scan_index(context_VC1_p ctx)
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) {
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // P_PICTURE_ADV_FRAME_INTERLACE
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 3;
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_INTRA(ctx->pic_params->picture_fields.bits.picture_type)) {
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // I-picture tables
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 4;
597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Assume P frame */
599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((ctx->profile == WMF_PROFILE_SIMPLE) ||
600bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (ctx->profile == WMF_PROFILE_MAIN)) {
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // P-picture Simple/Main tables
602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return 0;
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { /* Advanced profile */
604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P) {
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                // P-picture Advanced Progressive tables
6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                return 1;
607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* Interlaced Field */
6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                // P-picture Advanced Field Interlaced tables
6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                return 2;
6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
616c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang//#define psb__trace_message(...)
617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
618bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P(x)    psb__trace_message("PARAMS: " #x "\t= %d\n", p->x)
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_trace_pic_params(VAPictureParameterBufferVC1 *p)
6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
621bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P0(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->sequence_fields.bits.x)
6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P0(interlace);
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P0(syncmarker);
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P0(overlap);
6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(coded_width);
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(coded_height);
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
629bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P2(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->picture_fields.bits.x)
6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* picture_fields */
6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P2(picture_type);
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P2(frame_coding_mode);
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P2(top_field_first);
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P2(is_first_field);
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P2(intensity_compensation);
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
637bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P4(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->entrypoint_fields.bits.x)
6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(closed_entry);
6397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(broken_link);
6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(loopfilter);
641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(conditional_overlap_flag);
6437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(fast_uvmc_flag);
6447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
645bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P3(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->range_mapping_fields.bits.x)
6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* range_mapping_fields */
6477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P3(luma_flag);
6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P3(luma);
6497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P3(chroma_flag);
6507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P3(chroma);
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(b_picture_fraction);
6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(cbp_table);
6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(mb_mode_table);
6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(range_reduction_frame);
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(rounding_control);
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(post_processing);
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(picture_resolution_index);
6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(luma_scale);
6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(luma_shift);
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(raw_coding.value);
6637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P(bitplane_present.value);
6647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
665bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P4(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->reference_fields.bits.x)
6667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(reference_distance_flag);
6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(reference_distance);
6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(num_reference_pictures);
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P4(reference_field_pic_indicator);
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
671bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P5(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->mv_fields.bits.x)
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(mv_mode);
6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(mv_mode2);
674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(mv_table);
6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(two_mv_block_pattern_table);
6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(four_mv_switch);
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(four_mv_block_pattern_table);
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(extended_mv_flag);
6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(extended_mv_range);
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(extended_dmv_flag);
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P5(extended_dmv_range);
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
684bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P6(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->pic_quantizer_fields.bits.x)
685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dquant);
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(quantizer);
6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(half_qp);
6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(pic_quantizer_scale);
6907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(pic_quantizer_type);
6917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dq_frame);
6927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dq_profile);
6937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dq_sb_edge);
6947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dq_db_edge);
6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(dq_binary_level);
6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P6(alt_pic_quantizer);
6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
698bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define P7(x)   psb__trace_message("PARAMS: " #x "\t= %d\n", p->transform_fields.bits.x)
699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(variable_sized_transform_flag);
7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(mb_level_transform_type_flag);
7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(frame_level_transform_type);
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(transform_ac_codingset_idx1);
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(transform_ac_codingset_idx2);
7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    P7(intra_transform_dc_table);
7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_process_picture_param(context_VC1_p ctx, object_buffer_p obj_buffer)
7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus;
7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAPictureParameterBufferVC1 *pic_params;
712bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT8   ui8LumaScale1 = 0, ui8LumaShift1 = 0, ui8LumaScale2 = 0, ui8LumaShift2 = 0;
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VAPictureParameterBufferType);
7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->num_elements == 1);
7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->size == sizeof(VAPictureParameterBufferVC1));
717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((obj_buffer->num_elements != 1) ||
719bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAPictureParameterBufferVC1))) {
7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Transfer ownership of VAPictureParameterBufferVC1 data */
7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pic_params = (VAPictureParameterBufferVC1 *) obj_buffer->buffer_data;
727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free(ctx->pic_params);
7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->pic_params = pic_params;
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->buffer_data = NULL;
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_buffer->size = 0;
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
734c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & VABUF_TRACE))
735c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb__VC1_trace_pic_params(pic_params);
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->pic_quantizer_fields.bits.quantizer == 0) {
7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Non uniform quantizer indicates PQINDEX > 8 */
7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->pqindex_gt8 = (pic_params->pic_quantizer_fields.bits.pic_quantizer_type == 0);
740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* PQUANT (pic_quantizer_scale) == PQINDEX */
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->pqindex_gt8 = (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale > 8);
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * We decode to ctx->decoded_surface
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * the out of loop decoded picture is stored in ctx->obj_context->current_render_target
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->inloop_decoded_picture == VA_INVALID_SURFACE) {
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* No out of loop deblocking */
7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->decoded_surface = ctx->obj_context->current_render_target;
752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->decoded_surface = SURFACE(pic_params->inloop_decoded_picture);
754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->decoded_surface) {
7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_INVALID_SURFACE;
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return vaStatus;
7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Lookup surfaces for backward/forward references */
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->forward_ref_surface = NULL;
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->backward_ref_surface = NULL;
763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->forward_reference_picture != VA_INVALID_SURFACE) {
7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->forward_ref_surface = SURFACE(pic_params->forward_reference_picture);
7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->backward_reference_picture != VA_INVALID_SURFACE) {
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->backward_ref_surface = SURFACE(pic_params->backward_reference_picture);
7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->forward_ref_surface) {
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* for mmu fault protection */
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->forward_ref_surface = ctx->decoded_surface;
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
775dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->backward_ref_surface) {
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* for mmu fault protection */
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->backward_ref_surface = ctx->decoded_surface;
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
781c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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);
782c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Decoded ref = %08x ID = %08x\n", ctx->decoded_surface->psb_surface, pic_params->inloop_decoded_picture);
783c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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);
784c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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);
7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // NOTE: coded_width and coded_height do not have to be an exact multiple of MBs
787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->display_picture_width = pic_params->coded_width;
7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->display_picture_height = pic_params->coded_height;
7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->picture_width_mb = PIXELS_TO_MB(ctx->display_picture_width);
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->picture_height_mb = PIXELS_TO_MB(ctx->display_picture_height);
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->coded_picture_width = ctx->picture_width_mb * 16;
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->coded_picture_height = ctx->picture_height_mb * 16;
794dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((WMF_PROFILE_ADVANCED == ctx->profile) && (VC1_FCM_FLDI == pic_params->picture_fields.bits.frame_coding_mode)) {
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->picture_height_mb /= 2;
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->coded_picture_height = ctx->picture_height_mb * 16 * 2;
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->size_mb = ctx->picture_width_mb * ctx->picture_height_mb;
800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t colocated_size = (ctx->size_mb + 1) * 2 * VC1_MB_PARAM_STRIDE + 0x2000;
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = psb__VC1_allocate_colocated_buffer(ctx, ctx->decoded_surface, colocated_size);
8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    vaStatus = psb__VC1_allocate_colocated_buffer(ctx, ctx->obj_context->current_render_target, colocated_size);
8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Store top_field_first and frame_coding_mode (or even all of pic_params) for the current frame
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * so that it can be referenced when the same frame is used as reference frame
8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile != WMF_PROFILE_ADVANCED) {
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Simple and Main profiles always use progressive pictures*/
8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pic_params->picture_fields.bits.frame_coding_mode = VC1_FCM_P;
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI)) {
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pic_params->picture_fields.bits.top_field_first = 1;
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->bitplane_present = 0;
825dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (pic_params->picture_fields.bits.picture_type) {
826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_I:
827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_BI:
828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_overflags && !pic_params->raw_coding.flags.overflags) ? 0x04 : 0;
829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_ac_pred && !pic_params->raw_coding.flags.ac_pred) ? 0x02 : 0;
830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_field_tx && !pic_params->raw_coding.flags.field_tx) ? 0x01 : 0;
831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
832dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_P:
834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_mv_type_mb && !pic_params->raw_coding.flags.mv_type_mb) ? 0x04 : 0;
835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_skip_mb && !pic_params->raw_coding.flags.skip_mb) ? 0x02 : 0;
836dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
837dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case WMF_PTYPE_B: /* B picture */
839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_forward_mb && !pic_params->raw_coding.flags.forward_mb) ? 0x04 : 0;
840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_skip_mb && !pic_params->raw_coding.flags.skip_mb) ? 0x02 : 0;
841dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->bitplane_present |= (pic_params->bitplane_present.flags.bp_direct_mb && !pic_params->raw_coding.flags.direct_mb) ? 0x01 : 0;
842dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
843dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
844dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
845dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
846dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
847c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "bitplane_present_flag = %02x raw_coding_flag = %02x bitplane_present = %02x\n",
848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             pic_params->bitplane_present.value, pic_params->raw_coding.value, ctx->bitplane_present);
849dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
850dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->reference_fields.bits.reference_distance_flag == 0) {
8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pic_params->reference_fields.bits.reference_distance = 0;
8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* conditional_overlap_flag is not always defined, but MSVDX expects it to be set in those cases anyway */
855dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile == WMF_PROFILE_ADVANCED) {
856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->sequence_fields.bits.overlap == FALSE) {
8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->condover = 0; /* No overlap smoothing */
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale < 9) {
8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->condover = pic_params->conditional_overlap_flag;
860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->condover = 2;
8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
863dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        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)) {
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->condover = 0; /* No overlap smoothing */
866dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->condover = 2;
8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************** Calculate the IZZ scan index ****************************/
8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->scan_index = psb__vc1_get_izz_scan_index(ctx);
8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /**************************** Calculate MVMODE and MVMODE2 **************************/
8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->mv_mode = pic_params->mv_fields.bits.mv_mode;
877dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->mv_mode == WMF_MVMODE_INTENSITY_COMPENSATION) {
8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->mv_mode = pic_params->mv_fields.bits.mv_mode2;
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Neither MVMODE nor MVMODE2 are signaled at the picture level for interlaced frame pictures,
8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang       but MVMODE can be determine for P pictures depending on the value of MV4SWITCH, and for B
8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang       pictures it is by default 1MV mode. */
884dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) && PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) && (pic_params->mv_fields.bits.four_mv_switch == 1)) {
886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->mv_mode = WMF_MVMODE_MIXED_MV;
887dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->mv_fields.bits.mv_mode = WMF_MVMODE_MIXED_MV;
888dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
889dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->mv_mode = WMF_MVMODE_1MV;
890dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->mv_fields.bits.mv_mode = WMF_MVMODE_1MV;
8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /******************************** Calculate HALFPEL *********************************/
897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((ctx->mv_mode == WMF_MVMODE_1MV) || (ctx->mv_mode == WMF_MVMODE_MIXED_MV)) {
8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->half_pel = 0;
899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->half_pel = 1;
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Are we using the correct size for this ? */
9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->pull_back_x = COMPUTE_PULLBACK(pic_params->coded_width);
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->pull_back_y = COMPUTE_PULLBACK(pic_params->coded_height);
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
908dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->mv_fields.bits.extended_dmv_flag == 1) {
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->extend_x = gDMVRANGE_ExtHorizontal_RemapTable[pic_params->mv_fields.bits.extended_dmv_range];
9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->extend_y = gDMVRANGE_ExtVertical_RemapTable[pic_params->mv_fields.bits.extended_dmv_range];
911dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->extend_x = IMG_FALSE;
9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->extend_y = IMG_FALSE;
9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
916dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* B interlaced field picture and ...?? */
9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->ui32ScaleFactor = 0;
9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->i8FwrdRefFrmDist = 0;
9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->i8BckwrdRefFrmDist = 0;
920dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_UINT32 ui32BFractionDen;
922437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        IMG_UINT32 ui32BFractionNum;
923dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
924437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        IMG_UINT32 ui32FrameReciprocal;
925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->b_picture_fraction > (sizeof(gBFRACTION_DenRemapTable) / sizeof(IMG_BYTE) - 1))
927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pic_params->b_picture_fraction = sizeof(gBFRACTION_DenRemapTable) / sizeof(IMG_BYTE) - 1;
928437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
929437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ui32BFractionDen = gBFRACTION_DenRemapTable[pic_params->b_picture_fraction];
930437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ui32BFractionNum = gBFRACTION_NumRemapTable[pic_params->b_picture_fraction];
931437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
932dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui32BFractionDen > (sizeof(gaui16Inverse) / sizeof(IMG_UINT16)))
933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32BFractionDen = sizeof(gaui16Inverse) / sizeof(IMG_UINT16);
934dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui32BFractionDen == 0) {
936c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "Invalid ui32BFractionDen value %d\n", ui32BFractionDen);
937dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32BFractionDen = 1;
938dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
939dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
940437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ui32FrameReciprocal = gaui16Inverse[ui32BFractionDen - 1];
9417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui32ScaleFactor    = ui32BFractionNum * ui32FrameReciprocal;
942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
943dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
9447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->i8FwrdRefFrmDist   = (IMG_INT8)((ctx->ui32ScaleFactor * pic_params->reference_fields.bits.reference_distance) >> 8);     /* 10.4.6.2 */
9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->i8BckwrdRefFrmDist = pic_params->reference_fields.bits.reference_distance - ctx->i8FwrdRefFrmDist - 1;
946dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
947dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->i8BckwrdRefFrmDist < 0) {
9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ctx->i8BckwrdRefFrmDist = 0;
9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Compute the mode config parameter */
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang       MODE_CONFIG[1:0] =
956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        VC-1 intensity compensation flag, derived from MVMODE = Intensity compensation, and INTCOMPFIELD
957bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        00 � No intensity compensation
958bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        01 � Intensity compensation for top field
959bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10 � Intensity compensation for bottom field
960bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        11 � Intensity compensation for the frame
961dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang       MODE_CONFIG[3:2] =
963bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        VC-1 reference range scaling, derived from RANGERED, RANGEREDFRM for current frame and reference frame.
964bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        00 � No scaling
965bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        01 � Scale down
966bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10 � Scale up
967bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        11 � No scaling
9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /****************************** INTENSITY COMPENSATION ******************************/
9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* For each NEW reference frame, rotate IC history */
9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) &&
973bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        pic_params->picture_fields.bits.is_first_field &&
974bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) {
9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang           This is the first field picture of a new frame, so move the IC params for both field
9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang           pictures of the last frame (from position [1][0] for the first field and position [1][1] for
9787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang           the second field to positions [0][0] and [0][1] respectevely).
9797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        */
9807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memcpy(&ctx->sICparams[0][0], &ctx->sICparams[1][0], sizeof(IC_PARAM));
981dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        memcpy(&ctx->sICparams[0][1], &ctx->sICparams[1][1], sizeof(IC_PARAM));
982dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        memset(&ctx->sICparams[1][0], 0, sizeof(IC_PARAM));
9847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memset(&ctx->sICparams[1][1], 0, sizeof(IC_PARAM));
9857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
987dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
9887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui8CurrLumaScale1 = 0;
9897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui8CurrLumaShift1 = 0;
9907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui8CurrLumaScale2 = 0;
9917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui8CurrLumaShift2 = 0;
9927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
993dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FRMI) {
994dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.intensity_compensation) {
9957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Intensity compensation of reference */
996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) { // progressive picture
9977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->mode_config = 0x3;
998dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaScale1 = pic_params->luma_scale & 0x3F;
10007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaShift1 = pic_params->luma_shift & 0x3F;
1001dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale1 != 0 || ui8LumaShift1 != 0) {
10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
10047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
10057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
1006dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // field interlaced picture
10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    // top field
10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaScale1 = pic_params->luma_scale & 0x3F;
10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaShift1 = pic_params->luma_shift & 0x3F;
1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    // bottom field
10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaScale2 = ui8LumaScale1; /* TODO: How to keep track of top/bottom field intensity comp? */
10137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8LumaShift2 = ui8LumaShift1; /* TODO: How to keep track of top/bottom field intensity comp? */
1014dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* Check what fields undergo intensity compensation */
10167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->ui8IntCompField = 0;
1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale1 != 0 || ui8LumaShift1 != 0) {
10187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ctx->ui8IntCompField = 1;
10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ui8LumaScale2 != 0 || ui8LumaShift2 != 0) {
10217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ctx->ui8IntCompField |= 2;
10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    switch (ctx->ui8IntCompField) {
1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 0: /* none */
1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x0;
1027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 1: /* top */
1030dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x1;
1031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for top field
1033dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
1034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
1035dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 2: /* bottom */
1038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x2;
1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1040dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for bottom field
1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale2 = ui8LumaScale2;
1042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift2 = ui8LumaShift2;
1043dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
1044dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    case 3: /* both */
1046dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->mode_config = 0x3;
1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1048dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for top field
1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale1 = ui8LumaScale1;
1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift1 = ui8LumaShift1;
1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        // IC parameters for bottom field
1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaScale2 = ui8LumaScale2;
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        ctx->ui8CurrLumaShift2 = ui8LumaShift2;
1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
10567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
10597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ctx->mode_config = 0;
10607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
1061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // interlaced frame P picture
1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.intensity_compensation) { /* iINSO */
1063dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config = 0x3;   // intensity compensate whole frame
1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
1065dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config = 0;
10667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
10677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
10697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->mode_config = 0;
10707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
1073bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        10.3.8 Intensity Compensation:
1074bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        If intensity compensation is performed on a reference field, then after decoding the field,
1075bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        the post-compensated pixel values shall be retained and shall be used when decoding the next
1076bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field. If the next field indicates that the field that was intensity compensated by the
1077bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        previous field is to have intensity compensation performed again then the post-compensated
1078bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field shall be used. Therefore, when a reference field has intensity compensation performed
1079bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        twice, the result of the first intensity compensation operation shall be used as input
1080bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        for the second intensity compensation.
10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
1083bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Don't forget point 9.1.1.4 in VC1 Spec:
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1085bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        If the current frame, coded as two interlace field pictures, contains at least one P or B
1086bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        field, and if this P or B field uses one or both field in another frame as a reference, where
1087bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        the reference frame was also coded as a interlace field pictue, then the TFF of the current
1088bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        frame and reference frame shall be the same.
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
1090dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) {
1091dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.top_field_first) { // top field first
1092dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and bottom)
1093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    /* The second and bottom field picture of the current frame
1095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       intensity compensates the top field of the current frame. */
10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][0].ui8LumaScale1 = ui8LumaScale1;
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][0].ui8LumaShift1 = ui8LumaShift1;
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][0].ui8IC1 = 1;
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The second and bottom field picture of the current frame
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the bottom field of the previous frame. */
11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaScale2 = ui8LumaScale2;
11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaShift2 = ui8LumaShift2;
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8IC2 = 2;
11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // first field picture (and top)
1108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and top field picture of the current frame
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the top field of the previous frame. */
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaScale2 = ui8LumaScale1;
11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaShift2 = ui8LumaShift1;
11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8IC2 = 1;
11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and top field picture of the current frame
11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the bottom field of the previous frame. */
11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaScale1 = ui8LumaScale2;
11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaShift1 = ui8LumaShift2;
11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8IC1 = 2;
11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // bottom field first
1124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and top)
1125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The second and top field picture of the current frame
11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the bottom field of the current frame. */
11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][1].ui8LumaScale1 = ui8LumaScale2;
11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][1].ui8LumaShift1 = ui8LumaShift2;
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[1][1].ui8IC1 = 2;
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The second and top field picture of the current frame
11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the top field of the previous frame. */
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaScale2 = ui8LumaScale1;
11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaShift2 = ui8LumaShift1;
11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8IC2 = 1;
11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // first field picture (and bottom)
1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x1) {
11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and bottom field picture of the current frame
11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the top field of the previous frame. */
11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaScale1 = ui8LumaScale1;
11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8LumaShift1 = ui8LumaShift1;
11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][0].ui8IC1 = 1;
11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->ui8IntCompField & 0x2) {
11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and bottom field picture of the current frame
11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       intensity compensates the bottom field of the previous frame. */
11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaScale2 = ui8LumaScale2;
11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8LumaShift2 = ui8LumaShift2;
11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ctx->sICparams[0][1].ui8IC2 = 2;
11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
11547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
11567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /********************************* RANGE REDUCTION **********************************/
11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Determine the difference between the range reduction of current and reference picture */
1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->profile == WMF_PROFILE_MAIN) {
11627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Range Reduction is only enabled for Main Profile */
11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* The RANGEREDFRM values from the reference pictures are;
11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psVLDContext->bRef0RangeRed
11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psVLDContext->bRef1RangeRed */
11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (pic_params->picture_fields.bits.picture_type) {
1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_I:
1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_BI:
1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* no reference picture scaling */
1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_P: /* P picture */
1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                8.3.4.11 also need to scale the previously reconstructed anchor frame prior to using it for MC if:
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                - RANGEREDFRM == 1 and ref RANGEREDFRM flag is not signalled scale down previous reconstructed frame.
1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                - RANGEREDFRM == 0 and ref RANGEREDFRM flag is set scale up previous reconstructed frame.
1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             */
1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->pic_params->range_reduction_frame && !ctx->bRef0RangeRed) {
1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x1 << 2); // scale down previous reconstructed frame
1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!ctx->pic_params->range_reduction_frame && ctx->bRef0RangeRed) {
1182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x2 << 2); // scale up previous reconstructed frame
1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* neither or both are set */
1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x0 << 2); // no scaling of reference
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case WMF_PTYPE_B: /* B picture */
1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               8.4.4.14 RANGEREDFRM shall be the same as for the temporally subsequent anchor frame (display order)
1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               If this is set then the current decoded frame shall be scalled up similar to P frame.
1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               Scaling for the temporally (display order) preceeding frame will be applied as for P frames
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             */
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (ctx->bRef0RangeRed && !ctx->bRef1RangeRed) {
1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x1 << 2);
1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (!ctx->bRef0RangeRed && ctx->bRef1RangeRed) {
1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x2 << 2);
1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { /* neither or both are set */
1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ctx->mode_config |= (0x0 << 2); // no scaling of reference
1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->mode_config |= (0x0 << 2);
12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /********************************** Slice structure *********************************/
1212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VC1_FCM_FLDI == pic_params->picture_fields.bits.frame_coding_mode) {
12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((pic_params->picture_fields.bits.top_field_first && pic_params->picture_fields.bits.is_first_field) ||
1214bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (!pic_params->picture_fields.bits.top_field_first && !pic_params->picture_fields.bits.is_first_field)) {
12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // Top field
1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->slice_field_type = 0;
12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->bottom_field = 0;
1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            // Bottom field
1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->slice_field_type = 1;
12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->bottom_field = 1;
12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // progressive or interlaced frame
12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->slice_field_type = 2;
12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->bottom_field = 1;
12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************* FCM for the reference pictures ***************************/
1231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) ||
1232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ((pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) &&       /* The second B field picture in an             */
1233bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) &&    /* interlaced field coded frame shall   */
1234bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         !pic_params->picture_fields.bits.is_first_field)) {            /* reference the first field picture.   */
1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI && !pic_params->picture_fields.bits.is_first_field) {
1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* The current picture is the second field of the frame, then the previous field picture
12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang               is in the same frame. Therefore the FCM of the first field is the same as the FCM of the
1238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            current field and the first field will be reference 0. */
1239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref0Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
1240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (ctx->pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI && pic_params->picture_fields.bits.is_first_field) {
1241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* The current picture is the first field of the frame, then the previous field picture
1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               is in a different frame and will be reference 1. */
1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref1Pic = ctx->ui8FCM_Ref2Pic;
1244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { // progresive or interlaced frame picture
1245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->ui8FCM_Ref1Pic = ctx->ui8FCM_Ref2Pic;
1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
12477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
12497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************* TFF for the reference pictures ***************************/
1251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(pic_params->picture_fields.bits.picture_type) &&
1252bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ((ctx->pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) ||
1253bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang         pic_params->picture_fields.bits.is_first_field)) {
12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->bTFF_FwRefFrm = ctx->bTFF_BwRefFrm;
12557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
12577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
12597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
12607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_process_bitplane(context_VC1_p ctx, object_buffer_p obj_buffer)
12627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
12637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
12647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VABitPlaneBufferType);
12657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->pic_params);
1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((NULL == obj_buffer->psb_buffer) ||
1268bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == obj_buffer->size)) {
12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* We need to have data in the bitplane buffer */
12707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
12717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
12727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->bitplane_buffer = obj_buffer->psb_buffer;
12757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->has_bitplane = TRUE;
12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
12787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Adds a VASliceParameterBuffer to the list of slice params
12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
12827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_add_slice_param(context_VC1_p ctx, object_buffer_p obj_buffer)
12837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
12847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(obj_buffer->type == VASliceParameterBufferType);
1285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) {
1286e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        unsigned char *new_list;
12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->slice_param_list_size += 8;
12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_list = realloc(ctx->slice_param_list,
1289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           sizeof(object_buffer_p) * ctx->slice_param_list_size);
1290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == new_list) {
12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return VA_STATUS_ERROR_ALLOCATION_FAILED;
12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->slice_param_list = (object_buffer_p*) new_list;
12947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer;
12967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->slice_param_list_idx++;
12977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
12987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
12997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
13027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This function extracts the information about a given table from the index of VLC tables.
13037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_extract_table_info(context_VC1_p ctx, sTableData *psInfo, int idx)
13057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    IMG_UINT32 tmp;
1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (idx >= VLC_INDEX_TABLE_SIZE)
1309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        idx = VLC_INDEX_TABLE_SIZE - 1;
13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    tmp = ctx->vlc_packed_index_table[idx];
13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psInfo->aui16StartLocation      = (IMG_UINT16)(tmp & 0xffff);
13137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psInfo->aui16VLCTableLength     = (IMG_UINT16)((tmp >> 16) & 0x1ff);
13147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psInfo->aui16InitialWidth       = (IMG_UINT16)((tmp >> 25) & 0x7);
13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psInfo->aui16InitialOpcode      = (IMG_UINT16)((tmp >> 28) & 0x3);
13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This function selects the VLD tables from the picture layer parameters.
13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_write_VLC_tables(context_VC1_p ctx)
13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
13237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
1324bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT16          ui16Table = 0, ui16IntraTable = 0, ui16InterTable = 0, aui16Table[3];
1325bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32          i, ui32TableNum = 0;
1326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* select the required table from the n different types
13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            A - vc1DEC_I_Picture_CBPCY_VLC            (1)       �
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            B - vc1DEC_P_Picture_CBPCY_VLC_N          (4)       |
13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            C - vc1DEC_Interlaced_CBPCY_N             (8)       |
13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            D - vc1DEC_FourMV_Pattern_N               (4)       |
13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            E - vc1DEC_INTERLACE_2_MVP_Pattern_N      (4)       |
13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            F - vc1DEC_Mot_Vector_Diff_VLC_N          (4)       |   MB Layer
13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            G - vc1DEC_One_Field_Ref_Ilace_MV_N       (4)       |
13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            H - vc1DEC_Two_Field_Ref_Ilace_MV_N       (8)       |
1336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            I - vc1DEC_Mixed_MV_MB_N                  (8)       |
13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            J - vc1DEC_One_MV_MB_N                    (8)       |
13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            K - vc1DEC_INTERLACE_4MV_MB_N             (4)       |
13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            L - vc1DEC_INTERLACE_Non_4MV_MB_N         (4)       |
13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            M - vc1DEC_X_Rate_TTMB                    (3)       -
13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            N - vc1DEC_X_Rate_TTBLK                   (3)       �
1342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            O - vc1DEC_X_Rate_SUBBLKPAT               (3)       |
13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            P - vc1DEC_X_X_Inter_VLC                  (4)       |   Block Layer
13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Q - vc1DEC_X_X_Intra_VLC                  (4)       |
13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            R - vc1DEC_X_Mot_Luminance_DC_Diff_VLC    (2)       |
13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            S - vc1DEC_X_Mot_Chroma_DC_Diff_VLC       (2)       -
1347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            X - vc1DEC_Code_3x2_2x3_tiles             (1)   NOT USED    */
13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ***********************************************************************************
13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table A,B,C  VLC CBPCY Tables
13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1354bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   7.1.3.1 Coded Block Pattern (CBPCY) (Variable size)[I, P,B]
13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1356bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            CBPCY is a variable-sized syntax element that shall be present in all
1357bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            I and BI picture macroblocks, and may be present in P and B picture
1358bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            macroblocks. In P and B pictures, CBPCY shall be decoded using
1359bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            the VLC table specified by the CBPTAB syntax element as described in
1360bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            section 7.1.1.39. The CBP tables for P and B pictures are listed in
1361bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            section 11.6.
13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1364bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   9.1.3.2 Coded Block Pattern (CBPCY) (Variable size)[I, P,B]
13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1366bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Table 102: ICBPTAB code-table
13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            A  vc1DEC_I_Picture_CBPCY_VLC            (1)
1369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            B  vc1DEC_P_Picture_CBPCY_VLC_N          (4)
13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            C  vc1DEC_Interlaced_CBPCY_N             (8)
13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ***********************************************************************************/
13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((!pic_params->sequence_fields.bits.interlace) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P)) {
1375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = VC1_VLC_I_Picture_CBPCY_VLC;
1377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__bounds_check(pic_params->cbp_table, 4);
13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = CBPCYTableProg[pic_params->cbp_table];
13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else { /* Interlaced */
1382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
13837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = VC1_VLC_I_Picture_CBPCY_VLC;
1384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
13857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__bounds_check(pic_params->cbp_table, 8);
13867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = CBPCYTableInterlaced[pic_params->cbp_table];  /* LUT */
1387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************
13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table D   VLC 4MV Pattern
13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1397bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       Table 104: 4MVBP code-table
13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Tables 116-119
14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            D vc1DEC_FourMV_Pattern_N               (4)
14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************/
14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__bounds_check(pic_params->mv_fields.bits.four_mv_block_pattern_table, 4);
14047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui16Table = FourMVTable[pic_params->mv_fields.bits.four_mv_block_pattern_table];
14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************************************
14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table E  VLC 2MVBP Tables
14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Table 103: 2MVBP code-table
14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for Tables 120-123
1417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        E vc1DEC_INTERLACE_2_MVP_Pattern_N      (4)
14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ***********************************************************************************/
14207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__bounds_check(pic_params->mv_fields.bits.two_mv_block_pattern_table, 4);
14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui16Table = Interlace2MVTable[pic_params->mv_fields.bits.two_mv_block_pattern_table];
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************************************
14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table F,G,H  VLC MV Tables
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1430bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   MVDATA                                  Variable size   vlclbf  7.1.3.8
14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1432bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        7.1.3.8 Motion Vector Data (MVDATA)(Variable size)[P]
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MVDATA is a variable sized syntax element that may be present in P picture
1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        macroblocks. This syntax element decodes to the motion vector(s) for the
1436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        macroblock. The table used to decode this syntax element is specified by the
1437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MVTAB syntax element in the picture layer as specified in section 7.1.1.38.
14387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        F   vc1DEC_Mot_Vector_Diff_VLC_N          (4)
14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1441bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        [VC1]   9.1.1.34        INTERLACE Motion Vector Table (IMVTAB) (2 or 3 bits)
14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1443bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Table 100:      IMVTAB code-table for P INTERLACE field picture with NUMREF = 0,
1444bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                            and for P/B INTERLACE frame pictures
14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1446bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            IMVTAB      Motion Vector Table
1447bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            00          1-Reference Table 0
1448bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            01          1-Reference Table 1
1449bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            10          1-Reference Table 2
1450bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            11          1-Reference Table 3
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1452bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        Table 101:      IMVTAB code-table for P INTERLACE field pictures with NUMREF = 1,
1453bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                            and for B INTERLACE field pictures
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1455bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            IMVTAB      Motion Vector Table
1456bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            000         2-Reference Table 0
1457bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            001         2-Reference Table 1
1458bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            010         2-Reference Table 2
1459bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            011         2-Reference Table 3
1460bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            100         2-Reference Table 4
1461bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            101         2-Reference Table 5
1462bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            110         2-Reference Table 6
1463bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            111         2-Reference Table 7
14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        G   vc1DEC_One_Field_Ref_Ilace_MV_N       (4)
14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        H   vc1DEC_Two_Field_Ref_Ilace_MV_N       (8)
14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ***********************************************************************************/
1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((!pic_params->sequence_fields.bits.interlace) || (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P)) {
14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__bounds_check(pic_params->mv_fields.bits.mv_table, 4);
14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui16Table = ProgressiveMVTable[pic_params->mv_fields.bits.mv_table];
1472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (
14747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (
1475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type) &&
1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI)
14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            )
1478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ||
14797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (
1480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) &&
1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) &&
1482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                (pic_params->reference_fields.bits.num_reference_pictures == 0)
14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            )
1484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ) {
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* One field */
14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__bounds_check(pic_params->mv_fields.bits.mv_table, 4);
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = Interlaced1RefMVTable[pic_params->mv_fields.bits.mv_table];
1488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else { /*if (((FCM == VC1_FCM_FLDI) && (NUMREF == 0) && (PTYPE == WMF_PTYPE_P)) || ((PTYPE == WMF_PTYPE_B) && (FCM == VC1_FCM_FLDI))) */
14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* two field */
14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__bounds_check(pic_params->mv_fields.bits.mv_table, 8);
14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16Table = MVTable2RefIlace[pic_params->mv_fields.bits.mv_table];   /* LUT */
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************************************
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table I,J,K,L  VLC MBMODE Tables
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        I vc1DEC_Mixed_MV_MB_N                  (8)
1503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        J vc1DEC_One_MV_MB_N                    (8)
15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        K vc1DEC_INTERLACE_4MV_MB_N             (4)
1505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        L vc1DEC_INTERLACE_Non_4MV_MB_N         (4)
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ***********************************************************************************/
15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui16Table = 0;
1508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode > VC1_FCM_P)) {
1509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (PIC_TYPE_IS_INTER(pic_params->picture_fields.bits.picture_type)) {
1510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__bounds_check(pic_params->mb_mode_table, 8);
15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* 9.1.1.33 use MBMODETAB and MVMODE to select field interlaced tables */
15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ui16Table = MBMODETableFLDI[pic_params->mb_mode_table][(pic_params->mv_fields.bits.mv_mode == WMF_MVMODE_MIXED_MV) ? 1 : 0];
1514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FRMI) {
15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__bounds_check(pic_params->mb_mode_table, 4);
15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* 9.1.1.33 use MBMODETAB and MV4SWITCH to select frame interlaced tables */
15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ui16Table = MBMODETableFRMI[pic_params->mb_mode_table][(pic_params->mv_fields.bits.four_mv_switch) ? 0 : 1];
15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16Table);
1523dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ui32TableNum++;
15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************************************
15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table M,N,O  VLC PQUANT Tables
15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1529bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.2.10        MB-level Transform Type (TTMB)(Variable size)[P,B]
1530bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.3.15        Block-level Transform Type (TTBLK)(Variable size)[inter]
1531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1532bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [WMV9]      3.2.3.16        Transform sub-block pattern (SUBBLKPAT)(Variable size)[inter]
15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            M vc1DEC_X_Rate_TTMB                    (3)
15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            N vc1DEC_X_Rate_TTBLK                   (3)
1536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            O vc1DEC_X_Rate_SUBBLKPAT               (3)
15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        TTBLK and TTMB P and B Pictures only
15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ***********************************************************************************/
1541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[0] = 0;
1542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[1] = 0;
1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    aui16Table[2] = 0;
1544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale <= 4) {            /* high rate */
15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[2]   = VC1_VLC_High_Rate_SUBBLKPAT;
15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[1]   = VC1_VLC_High_Rate_TTBLK;
15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[0]   = VC1_VLC_High_Rate_TTMB;
1549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (pic_params->pic_quantizer_fields.bits.pic_quantizer_scale <= 12) {     /* med rate */
15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[2]   = VC1_VLC_Medium_Rate_SUBBLKPAT;
15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[1]   = VC1_VLC_Medium_Rate_TTBLK;
15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[0]   = VC1_VLC_Medium_Rate_TTMB;
1553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {                                                     /* low rate */
15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[2]   = VC1_VLC_Low_Rate_SUBBLKPAT;
15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[1]   = VC1_VLC_Low_Rate_TTBLK;
15567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        aui16Table[0]   = VC1_VLC_Low_Rate_TTMB;
15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
15587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = ui32TableNum; i < ui32TableNum + 3; i++) {
15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[i], aui16Table[i-ui32TableNum]);
15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ui32TableNum = ui32TableNum + 3;
15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*!
15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ***********************************************************************************************
1568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Inter Coded Blocks
1569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Table 54: Index/Coding Set Correspondence for PQINDEX <= 7
1571dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Y, Cb and Cr blocks
1572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1573bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table
1574bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           High Rate Inter
1575bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Inter
1576bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Inter
15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 55: Index/Coding Set Correspondence for PQINDEX > 7
1579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Y, Cb and Cr blocks
15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1581bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table
1582bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           Low Motion Inter
1583bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Inter
1584bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Inter
15857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ----------------------------------------------------------------------------------
15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Intra Blocks
1588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        8 AC Coeff Coding Sets:
15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            4 x INTRA, 4 x INTER
15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Y use Intra, CrCb use Inter
15937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 38: Coding Set Correspondence for PQINDEX <= 7
15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1596bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Y blocks                                            Cb and Cr blocks
1597bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table                                   Index   Table
1598bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           High Rate Intra                 0               High Rate Inter
1599bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Intra               1               High Motion Inter
1600bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Intra                  2               Mid Rate Inter
16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        Table 39: Coding Set Correspondence for PQINDEX > 7
16037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1604bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Y blocks                                            Cb and Cr blocks
1605bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            Index       Table                                   Index   Table
1606bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            0           Low Motion Intra                0               Low Motion Inter
1607bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            1           High Motion Intra               1               High Motion Inter
1608bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            2           Mid Rate Intra                  2               Mid Rate Inter
16097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        The value decoded from the DCTACFRM2 syntax element shall be used
1611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        as the coding set index for Y blocks and the value decoded from the
1612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DCTACFRM syntax element shall be used as the coding set
1613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        index for Cb and Cr blocks.
16147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            P vc1DEC_X_X_Inter_VLC
1616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            Q vc1DEC_X_X_Intra_VLC
16177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for I pictures  TRANSACFRM specifies the Inter Coding set
16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        TRANSACFRM2 specifies the Intra Coding set
16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        for P pictures  TRANSACFRM specifies Inter and Intra Coding set
16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ***************************************************************************************************/
16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        IMG_UINT32  ui32IntraCodingSetIndex = PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)
1627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                              ?  pic_params->transform_fields.bits.transform_ac_codingset_idx2
1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                              :  pic_params->transform_fields.bits.transform_ac_codingset_idx1;
16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        IMG_UINT32  ui32InterCodingSetIndex = pic_params->transform_fields.bits.transform_ac_codingset_idx1;
16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* For PQINDEX < 9 the uniform quantizer should be used, as indicated by PQUANTIZER == 1 */
1633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!ctx->pqindex_gt8) {
16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16IntraTable = IntraTablePQIndexLT9[ui32IntraCodingSetIndex];
16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16InterTable = InterTablePQIndexLT9[ui32InterCodingSetIndex];
1636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16IntraTable = IntraTablePQIndexGT8[ui32IntraCodingSetIndex];
16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui16InterTable = InterTablePQIndexGT8[ui32InterCodingSetIndex];
16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
1640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16IntraTable);
16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui32TableNum++;
16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16InterTable);
16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui32TableNum++;
16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*!
16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ************************************************************************************
16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    @ Table R & S  VLC TRANSDCTAB Tables
16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                R vc1DEC_X_Mot_Luminance_DC_Diff_VLC    (2)
1653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                S vc1DEC_X_Mot_Chroma_DC_Diff_VLC       (2)
1654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1655bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       8.1.1.2 Intra Transform DC Table
1656bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            TRANSDCTAB is a one-bit syntax element that shall specify which of two
1657bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            tables is used to decode the Transform DC coefficients in intra-coded blocks.
1658bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 0, then the low motion table of Section 11.7 shall be used.
1659bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 1, then the high motion table of Section 11.7 shall be used.
1660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1661bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    [VC1]       8.1.1.2 Intra Transform DC Table
1662bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            TRANSDCTAB is a one-bit syntax element that shall specify which of two
1663bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            tables is used to decode the Transform DC coefficients in intra-coded blocks.
1664bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 0, then the low motion table of Section 11.7 shall be used.
1665bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            If TRANSDCTAB = 1, then the high motion table of Section 11.7 shall be used.
16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ***********************************************************************************/
1668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->transform_fields.bits.intra_transform_dc_table == 0) {
16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* low motion */
1670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC */
16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui16IntraTable = VC1_VLC_Low_Mot_Luminance_DC_Diff_VLC;
16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC */
16757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui16InterTable = VC1_VLC_Low_Mot_Chroma_DC_Diff_VLC;
1676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else { /* TRANSDCTAB == 1 */
16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* high motion */
16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* VC1_VLC_High_Mot_Luminance_DC_Diff_VLC */
16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui16IntraTable = VC1_VLC_High_Mot_Luminance_DC_Diff_VLC;
1680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* VC1_VLC_High_Mot_Chroma_DC_Diff_VLC */
16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ui16InterTable = VC1_VLC_High_Mot_Chroma_DC_Diff_VLC;
1683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16IntraTable);
16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__VC1_extract_table_info(ctx, &ctx->sTableInfo[ui32TableNum], ui16InterTable);
16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32TableNum++;
1690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* at the end determine how many tables have been chosen
16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        this should be constant and equal 12 */
16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->ui32NumTables = ui32TableNum;
16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->ui32NumTables == 12);
16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_build_VLC_tables(context_VC1_p ctx)
16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
17002befccec034c13d34746a9e87149889d59ac767bFei Jiang    unsigned int i;
17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint16_t RAM_location = 0;
17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_value;
17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < ctx->ui32NumTables; i++) {
1705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (RAM_location & 0x03) {
17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Align */
17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            RAM_location += 4 - (RAM_location & 0x03);
17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->sTableInfo[i].aui16RAMLocation = RAM_location;
1710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* VLC Table */
17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Write a LLDMA Cmd to transfer VLD Table data */
17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_lldma_write_cmdbuf(cmdbuf, &ctx->vlc_packed_table,
1715dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      ctx->sTableInfo[i].aui16StartLocation * sizeof(IMG_UINT16), /* origin */
1716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      ctx->sTableInfo[i].aui16VLCTableLength * sizeof(IMG_UINT16), /* size */
1717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      RAM_location * sizeof(IMG_UINT32), /* destination */
1718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                      LLDMA_TYPE_VLC_TABLE);
1719c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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));
17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RAM_location += ctx->sTableInfo[i].aui16VLCTableLength;
17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write the vec registers with the index data for each of the tables */
1724680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0, VLC_TABLE_ADDR0, ctx->sTableInfo[0].aui16RAMLocation);
1728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0, VLC_TABLE_ADDR1, ctx->sTableInfo[1].aui16RAMLocation);
1729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0), reg_value);
17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1, VLC_TABLE_ADDR2, ctx->sTableInfo[2].aui16RAMLocation);
1733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1, VLC_TABLE_ADDR3, ctx->sTableInfo[3].aui16RAMLocation);
1734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1), reg_value);
1735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2, VLC_TABLE_ADDR4, ctx->sTableInfo[4].aui16RAMLocation);
1738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2, VLC_TABLE_ADDR5, ctx->sTableInfo[5].aui16RAMLocation);
1739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2), reg_value);
1740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3, VLC_TABLE_ADDR6, ctx->sTableInfo[6].aui16RAMLocation);
1743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3, VLC_TABLE_ADDR7, ctx->sTableInfo[7].aui16RAMLocation);
1744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3), reg_value);
17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4, VLC_TABLE_ADDR8, ctx->sTableInfo[8].aui16RAMLocation);
1748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4, VLC_TABLE_ADDR9, ctx->sTableInfo[9].aui16RAMLocation);
1749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4), reg_value);
17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5, VLC_TABLE_ADDR10, ctx->sTableInfo[10].aui16RAMLocation);
1753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5, VLC_TABLE_ADDR11, ctx->sTableInfo[11].aui16RAMLocation);
1754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5), reg_value);
17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH0, ctx->sTableInfo[0].aui16InitialWidth);
1758dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH1, ctx->sTableInfo[1].aui16InitialWidth);
1759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH2, ctx->sTableInfo[2].aui16InitialWidth);
1760dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH3, ctx->sTableInfo[3].aui16InitialWidth);
1761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH4, ctx->sTableInfo[4].aui16InitialWidth);
1762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH5, ctx->sTableInfo[5].aui16InitialWidth);
1763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH6, ctx->sTableInfo[6].aui16InitialWidth);
1764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH7, ctx->sTableInfo[7].aui16InitialWidth);
1765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH8, ctx->sTableInfo[8].aui16InitialWidth);
1766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0, VLC_TABLE_INITIAL_WIDTH9, ctx->sTableInfo[9].aui16InitialWidth);
1767dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0), reg_value);
17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1, VLC_TABLE_INITIAL_WIDTH10, ctx->sTableInfo[10].aui16InitialWidth);
1771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1, VLC_TABLE_INITIAL_WIDTH11, ctx->sTableInfo[11].aui16InitialWidth);
1772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1), reg_value);
1773dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
1775dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE0, ctx->sTableInfo[0].aui16InitialOpcode);
1776dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE1, ctx->sTableInfo[1].aui16InitialOpcode);
1777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE2, ctx->sTableInfo[2].aui16InitialOpcode);
1778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE3, ctx->sTableInfo[3].aui16InitialOpcode);
1779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE4, ctx->sTableInfo[4].aui16InitialOpcode);
1780dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE5, ctx->sTableInfo[5].aui16InitialOpcode);
1781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE6, ctx->sTableInfo[6].aui16InitialOpcode);
1782dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE7, ctx->sTableInfo[7].aui16InitialOpcode);
1783dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE8, ctx->sTableInfo[8].aui16InitialOpcode);
1784dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE9, ctx->sTableInfo[9].aui16InitialOpcode);
1785dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE10, ctx->sTableInfo[10].aui16InitialOpcode);
1786dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0, VLC_TABLE_INITIAL_OPCODE11, ctx->sTableInfo[11].aui16InitialOpcode);
1787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0), reg_value);
1788dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
17907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_write_kick(context_VC1_p ctx, VASliceParameterBufferVC1 *slice_param)
17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    (void) slice_param; /* Unused for now */
17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = CMD_COMPLETION;
18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Programme the Alt output if there is a rotation*/
1803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb__VC1_setup_alternative_frame(context_VC1_p ctx)
18044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
18054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t cmd;
18064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
18074d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng    psb_surface_p rotate_surface = ctx->obj_context->current_render_target->out_loop_surface;
18084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    object_context_p obj_context = ctx->obj_context;
18094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1810ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    if (GET_SURFACE_INFO_rotate(rotate_surface) != obj_context->msvdx_rotate)
1811c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Display rotate mode does not match surface rotate mode!\n");
1812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
18134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CRendecBlock    RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */
1815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
18164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs);
1818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset);
18194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
18214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Set the rotation registers */
1823dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION));
18244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
1825dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
1826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, rotate_surface->stride_mode);
1827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */
1828ca7d98aa1e54c9ee6ee79eb46ad25e0b897e7c51Austin Yuan    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(rotate_surface));
18294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, cmd);
18314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1832dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
18334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
18344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_send_rendec_params(context_VC1_p ctx, VASliceParameterBufferVC1 *slice_param)
18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_surface_p deblock_surface = ctx->decoded_surface->psb_surface;
18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd;
18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32    ui32MBParamMemOffset;
18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8     ui8PrevLumaScale = 0, ui8PrevLumaShift = 0;
18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8     ui8BackLumaScale = 0, ui8BackLumaShift = 0;
18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8     ui8PrevBotLumaShift = 0, ui8PrevBotLumaScale = 0;
18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT8     ui8PrevIC = 0, ui8BackIC = 0, ui8PrevBotIC = 0;
18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Align MB Parameter memory */
18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32MBParamMemOffset  = ((pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) && (!pic_params->picture_fields.bits.is_first_field)) ?
1851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            (ctx->size_mb * VC1_MB_PARAM_STRIDE) : 0;
18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32MBParamMemOffset += 0x00000fff;
18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32MBParamMemOffset &= 0xfffff000;
18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /****************************** INTENSITY COMPENSATION ******************************/
1856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI) {
1857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
1858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.top_field_first) { // top field first
1859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and bottom)
1860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][1].ui8IC1 == 2) {
18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        /* The first and top field picture of the current frame
18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           intensity compensates the bottom field of the previous frame. */
18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevIC = 2;
18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
1867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // first field picture (and top)
1868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][0].ui8IC1 == 1) {
18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        /* The second and bottom field picture of the previous frame
18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           intensity compensates the top field of the previous frame. */
18717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevIC = 1;
18747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
18757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // botom field first
1877dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (!pic_params->picture_fields.bits.is_first_field) { // this is the second field picture (and top)
1878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][0].ui8IC1 == 1) {
18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        /* The first and bottom field picture of the current frame
18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           intensity compensates the top field of the previous frame. */
18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
18837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevIC = 1;
18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    }
1885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else { // first field picture (and bottom)
1886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if (ctx->sICparams[0][1].ui8IC1 == 2) {
18877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        /* The second and top field picture of the previous frame
18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           intensity compensates the bottom field of the previous frame. */
18897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
18907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
18917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                        ui8PrevIC = 2;
1892dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    }
18937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
18947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
1895dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
18967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /*
18977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                First frame - second temporally closest reference frame to the B frame
18987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                Second frame - first temporally closest reference frame to the B frame
18997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            */
1900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pic_params->picture_fields.bits.top_field_first) { // top field first
1901dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC1 == 1) {
19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The second and bottom field of the first reference frame intensity
19037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the first and top field of the first reference frame. */
19047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
19057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
19067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevIC = 1;
19077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1908dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC2 == 1) {
19097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and top field of the second reference frame intensity
19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the first and top field of the first reference frame. */
19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackLumaScale = ctx->sICparams[0][0].ui8LumaScale2;
19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackLumaShift = ctx->sICparams[0][0].ui8LumaShift2;
19137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackIC = 1;
19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1915dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC2 == 2) {
1916dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    /* The first and top field of the second reference frame intensity
19177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the second and bottom field of the first reference frame. */
19187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotLumaScale = ctx->sICparams[0][1].ui8LumaScale2;
19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotLumaShift = ctx->sICparams[0][1].ui8LumaShift2;
19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotIC = 2;
19217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1922dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else { // botom field first
1923dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC1 == 2) {
19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The second and top field of the first reference frame intensity
19257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the first and bottom field of the first reference frame. */
19267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackLumaScale = ctx->sICparams[0][1].ui8LumaScale1;
19277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackLumaShift = ctx->sICparams[0][1].ui8LumaShift1;
19287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8BackIC = 2;
19297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1930dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][1].ui8IC2 == 2) {
19317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    /* The first and bottom field of the second reference frame intensity
19327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the first and bottom field of the first reference frame. */
19337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotLumaScale = ctx->sICparams[0][1].ui8LumaScale2;
19347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotLumaShift = ctx->sICparams[0][1].ui8LumaShift2;
19357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevBotIC = 2;
19367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
1937dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (ctx->sICparams[0][0].ui8IC1 == 1) {
1938bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                    /* The first and bottom field of the second reference frame intensity
19397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       compensates the second and top field of the first reference frame. */
19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevLumaScale = ctx->sICparams[0][0].ui8LumaScale1;
19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevLumaShift = ctx->sICparams[0][0].ui8LumaShift1;
19427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    ui8PrevIC = 1;
19437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
19447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
19457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
19467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
19477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /************************************************************************************/
19487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1949dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_block(cmdbuf);
19507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19510da1930627209986e8db220799a690f816494401Austin Yuan    if (CONTEXT_ROTATE(ctx->obj_context)) /* FIXME field coded should not issue */
19524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb__VC1_setup_alternative_frame(ctx);
19534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 1 - VC1SEQUENCE00 */
1955dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
19567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1957bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE00    Command: Display Picture Size (sequence) */
19587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
19597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Can "display size" and "coded size" be different? */
19607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_HEIGHT, (ctx->display_picture_height - 1)); /* display picture size - 1 */
1961dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_WIDTH, (ctx->display_picture_width - 1));
19627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1964bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE00    Command: Coded Picture Size  (sequence) */
19657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
19667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_HEIGHT, (ctx->coded_picture_height - 1)); /* coded picture size - 1 */
1967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE00, PICTURE_WIDTH, (ctx->coded_picture_width - 1));
19687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1970bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SEQUENCE01    Command: Operating Mode (sequence) */
19717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
19727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CHROMA_INTERLEAVED,   0); /* 0 = CbCr - MSVDX default */
19737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, ROW_STRIDE,           target_surface->stride_mode);
1974dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CODEC_MODE,           2); /* MODE_VC1 */
19757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CODEC_PROFILE,        ctx->profile);
19767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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
19777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, CHROMA_FORMAT,        1);
1978dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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 */
19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, VC1_OVERLAP,          pic_params->sequence_fields.bits.overlap);
19807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, PIC_CONDOVER,         ctx->condover);
19817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SEQUENCE01, PIC_QUANT,            pic_params->pic_quantizer_fields.bits.pic_quantizer_scale);
19827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->obj_context->operating_mode = cmd;
19837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
19847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1986dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
19877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                  */
1989dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
19907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Aux MSB buffer */
1992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->aux_msb_buffer, 0);
19937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1994dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
19957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 2 - VC1SLICE00 */
1997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, MC_CACHE_CONFIGURATION));
19987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1999bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE00           Command: Cache Configuration (picture?) */
20007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
20017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE00, CONFIG_REF_OFFSET,  72);
20027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE00, CONFIG_ROW_OFFSET,  4);
20037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
2004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2005bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE01           Command: VC1 Intensity Compensation Parameter (picture or slice) */
20067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSHIFT2,  ctx->ui8CurrLumaShift2); /* INTERLACE field P pictures */
20087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSCALE2,  ctx->ui8CurrLumaScale2); /* INTERLACE field P pictures */
20097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSHIFT1,  ctx->ui8CurrLumaShift1);
20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE01, VC1_LUMSCALE1,  ctx->ui8CurrLumaScale1);
20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 3 */
2016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1 Luma Range Mapping Base Address */
2019dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &deblock_surface->buf, deblock_surface->buf.buffer_ofs);
20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1 Chroma Range Mapping Base Address */
2022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &deblock_surface->buf, deblock_surface->chroma_offset + deblock_surface->buf.buffer_ofs);
20237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1SLICE03       Range Map Control (current picture) */
20257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPUV_FLAG,  pic_params->range_mapping_fields.bits.chroma_flag /*RANGE_MAPUV_FLAG*/);
20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPUV,       pic_params->range_mapping_fields.bits.chroma);
20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPY_FLAG,   pic_params->range_mapping_fields.bits.luma_flag /*RANGE_MAPY_FLAG*/);
20297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE03, RANGE_MAPY,        pic_params->range_mapping_fields.bits.luma);
20307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
20317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Store VC1SLICE03 bits in lower bits of Range Mapping Base Address */
20337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1 Luma Range Mapping Base Address */
20347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*ctx->p_range_mapping_base, cmd + deblock_surface->buf.buffer_ofs, &deblock_surface->buf);
20357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2036bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1 Intensity Compensation Backward/Previous     */
20377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
20387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            3.3.10 VC1 Intensity Compensation Backward/Previous:
20397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            The parameters applied in VC1 Intensity Compensation Parameters are the Intensity Compensation
20407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            applied to forward prediction. In the case of Interlaced P field pictures, the second field can
20417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            be Intensity Compensated relative to the first P field picture. If this is done, when decoding
20427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            B pictures the first field backward MV reference to P picture needs to be Intensity Compensated
20437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            with VC1_LUMSCALE_BACK and VC1_LUMSHIFT_BACK. (The command should contain the Intensity
20447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Compensation parameters that were used for opposite parity field when decoding 2nd P field picture).
2045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            The parameters will only be used if VC1_BACK_INT_COMP in Slice Params command indicates
20477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            Backward Intensity Compensation is used.
20487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
20497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
20507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSHIFT_PREV,  ui8PrevLumaShift);
20517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSCALE_PREV,  ui8PrevLumaScale);
20527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSHIFT_BACK,  ui8BackLumaShift);
20537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE04, VC1_LUMSCALE_BACK,  ui8BackLumaScale);
20547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
20557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
20577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1 Intensity Compensation Previous Bottom */
2058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ui8PrevBotIC) {
20597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
20607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            The VDMC dynamically applies intensity compensation when generating reference predicted data
20617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            for P/B fields/frames. In the case of Interlaced B field pictures, both the top field and
20627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            bottom field could be Intensity Compensated twice (if all previous P field pictures applied
20637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            separate top and bottom Intensity Compensation). If this is the case, the VC1 previous field
20647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            defined in 3.3.10 should apply to top field, whilst the parameters defined in this register
20657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            apply to the bottom field. The VC1_PREV_BOT_INT_COMP field of Slice Params command indicates
20667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if the fields in this register are used.
20677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        */
2068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmd = 0;
2069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_, VC1_LUMSHIFT_PREV_BOT, ui8PrevBotLumaShift);
2070dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_, VC1_LUMSCALE_PREV_BOT, ui8PrevBotLumaScale);
2071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pcmdBuffer[i++] = REGISTER_OFFSET(MSVDX_CMDS, VC1_INTENSITY_COMPENSATION_);
2072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        pcmdBuffer[i++] = cmd;
20737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
20747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
2075dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
20767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
20787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        Reference Picture Base Addresses
2079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        The reference picture pointers always include the current picture at first location (0) and
20817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        the oldest reference in the next location (1). For B pictures the subsequent reference
20827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        frame (display order) is 2.
20837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    */
2084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((pic_params->picture_fields.bits.picture_type != WMF_PTYPE_I) && (pic_params->picture_fields.bits.picture_type != WMF_PTYPE_BI)) {
20857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* CHUNK: 4 */
2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
2087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /********************** CURRENT PICTURE **********************/
2089dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
2090dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
20917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*************** FORWARD REFERENCE *****************/
2093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->forward_ref_surface) {
20947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /*
20957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                In VC1, if a P field picture references both top field and bottom field, but the two fields
2096dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                are stored in different frame stores, then the most recently decoded field will use reference
20977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                index 0, and the other field will use reference index 1.
2098dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
20997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                Progressive P pictures use always reference index 1.
21007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            */
2101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
2102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->\
2103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                            buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
2104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
21057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*************** BACKWARD REFERENCE *****************/
2107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->backward_ref_surface) {
2108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs);
2109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface\
2110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                            ->buf.buffer_ofs + ctx->backward_ref_surface->psb_surface->chroma_offset);
2111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
2112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_end_chunk(cmdbuf);
21137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
21147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 5 - VC1SLICE02 */
2116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS));
21177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2118bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* VC1SLICE02           Command: Slice Params (picture or slice) */
21197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
2120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, SLICE_PARAMS, VC1_PREV_BOT_INT_COMP,  ui8PrevBotIC);
21227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_PREV_INT_COMP,  ui8PrevIC);
21237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_BACK_INT_COMP,  ui8BackIC);
21247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, RND_CTRL_BIT,       pic_params->rounding_control);
21257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, MODE_CONFIG,        ctx->mode_config);
2126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
21277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_FASTUVMC,       pic_params->fast_uvmc_flag);
21287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, VC1_LOOPFILTER,     pic_params->entrypoint_fields.bits.loopfilter);
21297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, VC1_RENDEC_CMD, VC1SLICE02, SLICE_FIELD_TYPE,   ctx->slice_field_type);
2130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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 */
21317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
2134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *ctx->p_slice_params = cmd;
21367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* ------------------------------- Back-End Registers --------------------------------- */
21387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 6 (Back-end registers) */
2140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_SPS0));
21417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_SPS0 */
21437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
21447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_EXTENDED_DMV,   pic_params->mv_fields.bits.extended_dmv_flag);
21457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_EXTENDED_MV,    pic_params->mv_fields.bits.extended_mv_flag);
21467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_FASTUVMC,       pic_params->fast_uvmc_flag);
21477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_INTERLACE,      pic_params->sequence_fields.bits.interlace);
21487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS0, VC1_BE_PROFILE,      ctx->profile);
21497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_SPS1 */
2152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
21537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS1, VC1_BE_PIC_HEIGHT_IN_MBS_LESS1, ctx->picture_height_mb - 1);
21547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_SPS2 */
2157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
21587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_SPS2, VC1_BE_PIC_WIDTH_IN_MBS_LESS1, ctx->picture_width_mb - 1);
21597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
21627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 6b (Back-end registers) */
2164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_PPS2));
21657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_PPS2 */
2167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmd = 0;
21687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF2, ctx->ui8FCM_Ref2Pic);
21697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF1, ctx->ui8FCM_Ref1Pic);
21707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_FCM_REF0, ctx->ui8FCM_Ref0Pic);
21717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS2, VC1_BE_COLLOCATED_SKIPPED, 0); // @TODO: Really need this?
21727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_PPS0 */
21757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
2176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
21777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
21787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF_FWD,           ctx->bTFF_FwRefFrm);
21797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF_BWD,           ctx->bTFF_BwRefFrm);
21807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_TFF,               pic_params->picture_fields.bits.top_field_first);
21817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_SECOND_FIELD,      !pic_params->picture_fields.bits.is_first_field);
21827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_HALFQP,            pic_params->pic_quantizer_fields.bits.half_qp);
21837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_BFRACTION,         pic_params->b_picture_fraction);
21847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_FCM,               pic_params->picture_fields.bits.frame_coding_mode);
2185bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS0, VC1_BE_RNDCTRL,           pic_params->rounding_control);
21867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
2187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_PPS1 */
21897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
21907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_EXTEND_Y,       ctx->extend_y);
21917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_EXTEND_X,       ctx->extend_x);
2192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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 */));
21937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_PQUANT,         pic_params->pic_quantizer_fields.bits.pic_quantizer_scale);
21947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_MVMODE,         pic_params->mv_fields.bits.mv_mode);
21957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_MVMODE2,        pic_params->mv_fields.bits.mv_mode2);
21967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_PPS1, VC1_BE_PTYPE,          pic_params->picture_fields.bits.picture_type);
21977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
21987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD0 */
22007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
22017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD0, VC1_BE_BRPD,  ctx->i8BckwrdRefFrmDist);     /* 10.4.6.2 */
22027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD0, VC1_BE_FRPD,  ctx->i8FwrdRefFrmDist);
22037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD1 */
22067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
22077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD1, VC1_BE_SCALEFACTOR, ctx->ui32ScaleFactor);  /* figure 66 */
22087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD2 */
22117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
2212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD2, VC1_BE_PULLBACK_X, ctx->pull_back_x);
22137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD3 */
22167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
2217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD3, VC1_BE_PULLBACK_Y, ctx->pull_back_y);
22187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD4 */
22217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
22227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD4, VC1_BE_FIRST_MB_IN_SLICE_Y, slice_param->slice_vertical_position);
22237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CR_VEC_VC1_BE_MVD5 */
22267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmd = 0;
2227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_REFDIST,           pic_params->reference_fields.bits.reference_distance);
2228bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_NUMREF,            pic_params->reference_fields.bits.num_reference_pictures);
2229bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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);
2230bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_MVRANGE,           pic_params->mv_fields.bits.extended_mv_range);
2231bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_HALFPEL_FLAG,      ctx->half_pel);
2232bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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);
22337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_BOTTOM_FIELD_FLAG, ctx->bottom_field);
2234bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_ADVANCED_PROFILE, (ctx->profile == WMF_PROFILE_ADVANCED) ? 1 : 0);
2235bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(cmd, MSVDX_VEC_VC1, CR_VEC_VC1_BE_MVD5, VC1_BE_SCAN_INDEX,        ctx->scan_index);
22367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, cmd);
22377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
22397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
22407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: 6c (Back-end registers) */
2241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_PARAM_BASE_ADDR));
22427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2243c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1: picture_type = %d\n", pic_params->picture_fields.bits.picture_type);
22447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type) || (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P)) {
22467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p colocated_target_buffer = psb__VC1_lookup_colocated_buffer(ctx, target_surface);
22477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(colocated_target_buffer);
2248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (colocated_target_buffer) {
22497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_cmdbuf_rendec_write_address(cmdbuf, colocated_target_buffer, ui32MBParamMemOffset);
2250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
22517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This is an error */
22527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_cmdbuf_rendec_write(cmdbuf, 0);
22537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
22557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(ctx->forward_ref_surface);
22567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p colocated_forward_ref_buffer = ctx->forward_ref_surface ? psb__VC1_lookup_colocated_buffer(ctx, ctx->forward_ref_surface->psb_surface) : 0;
22577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(colocated_forward_ref_buffer);
2258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (colocated_forward_ref_buffer) {
22597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_cmdbuf_rendec_write_address(cmdbuf, colocated_forward_ref_buffer, ui32MBParamMemOffset);
2260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
22617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This is an error */
22627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_cmdbuf_rendec_write(cmdbuf, 0);
22637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
22647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
22667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!PIC_TYPE_IS_INTRA(pic_params->picture_fields.bits.picture_type)) {
22687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* CHUNK: 6d (Back-end registers) */
2269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, VC1_CR_VEC_VC1_BE_COLPARAM_BASE_ADDR));
22707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P) {
22727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* CR_VEC_VC1_BE_COLPARAM_BASE_ADDR */
22737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(ctx->forward_ref_surface);
22747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p colocated_forward_ref_buffer = ctx->forward_ref_surface ? psb__VC1_lookup_colocated_buffer(ctx, ctx->forward_ref_surface->psb_surface) : NULL;
22757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(colocated_forward_ref_buffer);
2276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (colocated_forward_ref_buffer) {
22777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_cmdbuf_rendec_write_address(cmdbuf, colocated_forward_ref_buffer, ui32MBParamMemOffset);
2278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
22797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* This is an error */
22807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_cmdbuf_rendec_write(cmdbuf, 0);
22817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
2282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else if (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_B) {
22837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* CR_VEC_VC1_BE_COLPARAM_BASE_ADDR */
22847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(ctx->backward_ref_surface);
2285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_p colocated_backward_ref_buffer;
2286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
2287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == ctx->backward_ref_surface) {
2288c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "%s L%d Invalid backward_ref_surface handle\n", __FUNCTION__, __LINE__);
2289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return;
2290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
2291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            colocated_backward_ref_buffer = ctx->backward_ref_surface->psb_surface ? psb__VC1_lookup_colocated_buffer(ctx, ctx->backward_ref_surface->psb_surface) : NULL;
22937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(colocated_backward_ref_buffer);
2294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (colocated_backward_ref_buffer) {
22957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_cmdbuf_rendec_write_address(cmdbuf, colocated_backward_ref_buffer, ui32MBParamMemOffset);
2296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
22977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* This is an error */
22987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_cmdbuf_rendec_write(cmdbuf, 0);
22997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
23007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
23017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_end_chunk(cmdbuf);
23037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
23047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_block(cmdbuf);
23067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_load_sequence_registers(context_VC1_p ctx)
23107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
23117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
23127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_value;
23137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2314680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
23157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* FE_CONTROL */
23177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
2318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL, ENTDEC_FE_PROFILE, ctx->profile);
2319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL, ENTDEC_FE_MODE, 2);  /* 2 - VC1 */
2320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL), reg_value);
23217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* FE_SPS0 */
23237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
2324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0, VC1_FE_SYNCMARKER, ctx->pic_params->sequence_fields.bits.syncmarker);
2325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
2326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0, VC1_FE_INTERLACE, ctx->pic_params->sequence_fields.bits.interlace);
2327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_SPS0), reg_value);
23287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
23307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_block(cmdbuf);
23327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* CHUNK: Entdec back-end profile and level */
2333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL));
23347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
2336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_PROFILE, ctx->profile);
2337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_MODE, 2);  /* 2 - VC1 */
23387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_rendec_write(cmdbuf, reg_value);
2340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_chunk(cmdbuf);
2341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end_block(cmdbuf);
23427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
23437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_load_picture_registers(context_VC1_p ctx, VASliceParameterBufferVC1 *slice_param)
23457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
23467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAPictureParameterBufferVC1 *pic_params = ctx->pic_params;
23477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
23487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_value;
23497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int bEnableMVDLite = FALSE;
2350680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
23517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Enable MVD lite for Progressive or FLDI P */
2353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (
23547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (
2355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_FLDI)) ||
2356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (!pic_params->sequence_fields.bits.interlace) ||
2357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            (pic_params->sequence_fields.bits.interlace && (pic_params->picture_fields.bits.frame_coding_mode == VC1_FCM_P))
23587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ) &&
2359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (pic_params->picture_fields.bits.picture_type == WMF_PTYPE_P)
2360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ) {
23617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        bEnableMVDLite = TRUE;
23627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
23637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* FE_PPS0 */
23657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
2366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
23677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
2368bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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);
23697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_PTYPE,                   pic_params->picture_fields.bits.picture_type);
23707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0, VC1_FE_FCM,                     pic_params->picture_fields.bits.frame_coding_mode);
2371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS0), reg_value);
23727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* FE_PPS1 */
23747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
23757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if VC1_INTERLEAVED_BITPLANE
23767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BP_FORMAT,     IMG_FALSE); // interleaved format
23777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
23787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BP_FORMAT,     IMG_TRUE); // non-interleaved format
23797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
2380bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BP_PRESENT,  ctx->bitplane_present);
23817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_RAWCODINGFLAG, (pic_params->raw_coding.value & 0x7F)); /* 7-bits */
23827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_MVMODE,      pic_params->mv_fields.bits.mv_mode);
23837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_MVMODE2,     pic_params->mv_fields.bits.mv_mode2);
23847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
23857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
23867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_BFRACTION,   pic_params->b_picture_fraction);
23877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_CONDOVER,    ctx->condover);
23887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_EXTEND_X,    ctx->extend_x);
23897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1, VC1_FE_EXTEND_Y,    ctx->extend_y);
2390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS1), reg_value);
23917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
23927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* FE_PPS2 */
23937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
2394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
23957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANT,            pic_params->pic_quantizer_fields.bits.dquant);
23967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
23977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_HALFQP,            pic_params->pic_quantizer_fields.bits.half_qp);
23987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Is this correct? */
23997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // Write to the VC1_FE_VOPDQUANT_PRESENT register according to PowerVR decoder's implementation.
2400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (((ctx->profile == WMF_PROFILE_ADVANCED) && (pic_params->pic_quantizer_fields.bits.dquant != 0))
2401bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun 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))) {
24027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_VOPDQUANT_PRESENT, 1);
2403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
24047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_VOPDQUANT_PRESENT, 0);
24057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
24067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANTFRM,         pic_params->pic_quantizer_fields.bits.dq_frame);
24077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
2408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_BOOL DQUANT_INFRAME = (pic_params->pic_quantizer_fields.bits.dquant == 2) ||
2409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  ((pic_params->pic_quantizer_fields.bits.dquant == 1) && pic_params->pic_quantizer_fields.bits.dq_frame) ||
2410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  ((pic_params->pic_quantizer_fields.bits.dquant == 3) && pic_params->pic_quantizer_fields.bits.dq_frame);
2411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQUANT_INFRAME, DQUANT_INFRAME);
24127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
24137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_DQPROFILE,         pic_params->pic_quantizer_fields.bits.dq_profile);
24157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
2416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2, VC1_FE_PQINDEX_GT8,       ctx->pqindex_gt8);
24177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
2419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_PPS2), reg_value);
24207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* MVD_LITE0 */
24227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
24237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_MVD_LITE_ENABLE,   bEnableMVDLite);
24247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_PULLBACK_X,        ctx->pull_back_x);
24257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0, VC1_FE_PULLBACK_Y,        ctx->pull_back_y);
2426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE0), reg_value);
24277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* MVD_LITE1 */
24297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reg_value = 0;
24307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_REFDIST,          pic_params->reference_fields.bits.reference_distance);
24327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    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);
24357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_HALFPEL_FLAG,     ctx->half_pel);
24367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //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);
24377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD(reg_value, MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1, VC1_FE_BOTTOM_FIELD_FLAG,      ctx->bottom_field);
2438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    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);
2439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_MVD_LITE1), reg_value);
24407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
24427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
24437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_setup_bitplane(context_VC1_p ctx)
24457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
24467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
24477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2448680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_cmdbuf_reg_start_block(cmdbuf, 0);
24497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Bitplanes Data Buffer Base Address */
2451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->bitplane_present) {
24527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(ctx->has_bitplane);
2453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR0),
2454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   ctx->bitplane_buffer, 0);
2455c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        //if (psb_video_trace_fp && (psb_video_trace_level & AUXBUF_TRACE))
2456c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            //psb__debug_schedule_hexdump("Bitplane buffer", ctx->bitplane_buffer, 0, (ctx->size_mb + 1) / 2);
2457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
2458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_VC1, CR_VEC_VC1_FE_BITPLANES_BASE_ADDR0), 0);
24597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
24607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
24627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
24637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__VC1_FE_state(context_VC1_p ctx)
24657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
24667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset;
24677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
24687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_surface_p deblock_surface = ctx->decoded_surface->psb_surface;
2469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
24707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* See RENDER_BUFFER_HEADER */
24717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = CMD_HEADER_VC1;
24727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->p_range_mapping_base = cmdbuf->cmd_idx++; /* Fill Luma Range Mapping Base later */
24747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* VC1 Chroma Range Mapping Base Address */
24767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, deblock_surface->buf.buffer_ofs + deblock_surface->chroma_offset, &deblock_surface->buf);
24777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->p_slice_params = cmdbuf->cmd_idx;
24797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = 0; /* ui32SliceParams */
24807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, &ctx->preload_buffer, 0,
2482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          sizeof(VC1PRELOAD), 0, LLDMA_TYPE_VC1_PRELOAD_SAVE);
24837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx, lldma_record_offset, &(cmdbuf->buf));
24847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx++;
24857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, &ctx->preload_buffer, 0,
2487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          sizeof(VC1PRELOAD), 0, LLDMA_TYPE_VC1_PRELOAD_RESTORE);
24887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx, lldma_record_offset, &(cmdbuf->buf));
24897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx++;
24907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
24917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_process_slice(context_VC1_p ctx,
2493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       VASliceParameterBufferVC1 *slice_param,
2494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       object_buffer_p obj_buffer)
24957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
24967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
24977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
24987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
24997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "VC1 process slice\n");
2501c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "    size = %08x offset = %08x\n", slice_param->slice_data_size, slice_param->slice_data_offset);
2502c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "    vertical pos = %d offset = %d\n", slice_param->slice_vertical_position, slice_param->macroblock_offset);
2503c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "    slice_data_flag = %d\n", slice_param->slice_data_flag);
25047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) ||
2506bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) {
2507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 == slice_param->slice_data_size) {
25087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
25097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
25107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return vaStatus;
25117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(!ctx->split_buffer_pending);
2513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
25147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Initialise the command buffer */
25157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* TODO: Reuse current command buffer until full */
25167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_context_get_next_cmdbuf(ctx->obj_context);
25177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_FE_state(ctx);
2519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* TODO: Optimize? */
25217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_write_VLC_tables(ctx);
2522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
25237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_build_VLC_tables(ctx);
25247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_lldma_write_bitstream(ctx->obj_context->cmdbuf,
25267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         obj_buffer->psb_buffer,
25277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset,
25287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         slice_param->slice_data_size,
25297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         slice_param->macroblock_offset,
25307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                         (ctx->profile == WMF_PROFILE_ADVANCED) ? CMD_ENABLE_RBDU_EXTRACTION : 0);
25317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) {
25337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->split_buffer_pending = TRUE;
25347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
2536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(ctx->split_buffer_pending);
25377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(0 == slice_param->slice_data_offset);
25387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Create LLDMA chain to continue buffer */
2539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_size) {
25407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_cmdbuf_lldma_write_bitstream_chained(ctx->obj_context->cmdbuf,
2541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    obj_buffer->psb_buffer,
2542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    slice_param->slice_data_size);
25437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
25447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
25467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) ||
2547bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) {
2548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) {
2549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ASSERT(ctx->split_buffer_pending);
25507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
25517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_load_sequence_registers(ctx);
25537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_load_picture_registers(ctx, slice_param);
2555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
25567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_setup_bitplane(ctx);
2557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
25587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_send_rendec_params(ctx, slice_param);
25597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__VC1_write_kick(ctx, slice_param);
25617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->split_buffer_pending = FALSE;
25637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->obj_context->video_op = psb_video_vld;
25647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->obj_context->first_mb = 0;
25657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->obj_context->flags = 0;
2566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->is_first_slice) {
2567bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ctx->obj_context->flags |= FW_VA_RENDER_IS_FIRST_SLICE;
25687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->bitplane_present) {
2570bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            ctx->obj_context->flags |= FW_VA_RENDER_VC1_BITPLANE_PRESENT;
25717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->obj_context->last_mb = ((ctx->picture_height_mb - 1) << 8) | (ctx->picture_width_mb - 1);
25737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2574c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_fp && (psb_video_trace_level & AUXBUF_TRACE)) {
2575c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__debug_schedule_hexdump("Preload buffer", &ctx->preload_buffer, 0, PRELOAD_BUFFER_SIZE);
2576c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__debug_schedule_hexdump("AUXMSB buffer", &ctx->aux_msb_buffer, 0, 0x8000 /* AUXMSB_BUFFER_SIZE */);
2577c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__debug_schedule_hexdump("VLC Table", &ctx->vlc_packed_table, 0, gui16vc1VlcTableSize * sizeof(IMG_UINT16));
2578c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
25797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_context_submit_cmdbuf(ctx->obj_context)) {
25817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
25827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
25837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->is_first_slice = FALSE; /* Reset */
25857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
25867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
25877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
25887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb__VC1_process_slice_data(context_VC1_p ctx, object_buffer_p obj_buffer)
25907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
25917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
25927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VASliceParameterBufferVC1 *slice_param;
25937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int buffer_idx = 0;
2594e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int element_idx = 0;
25957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
25977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
25987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->pic_params);
25997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->slice_param_list_idx);
2600dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ctx->pic_params) {
26027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Picture params missing */
26037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
26047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
26057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
26067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
26077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((NULL == obj_buffer->psb_buffer) ||
2608bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == obj_buffer->size)) {
26097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* We need to have data in the bitstream buffer */
26107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
26117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE;
26127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
26137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
26147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (buffer_idx < ctx->slice_param_list_idx) {
26167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx];
2617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (element_idx >= slice_buf->num_elements) {
26187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Move to next buffer */
26197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            element_idx = 0;
26207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            buffer_idx++;
26217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            continue;
26227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
26247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        slice_param = (VASliceParameterBufferVC1 *) slice_buf->buffer_data;
26257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        slice_param += element_idx;
26267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        element_idx++;
26277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb__VC1_process_slice(ctx, slice_param, obj_buffer);
2628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
26297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DEBUG_FAILURE;
26307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
26317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
26327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
26337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->slice_param_list_idx = 0;
2634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
26357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
26367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
26377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
26387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_VC1_BeginPicture(
2639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
26407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
26417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_VC1
2642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
26447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free(ctx->pic_params);
26457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->pic_params = NULL;
26467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
26477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->is_first_slice = TRUE;
2648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
26497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
26507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
26517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
26527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_VC1_RenderPicture(
2653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
2654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p *buffers,
2655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_buffers)
26567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
26577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
26587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_VC1
26597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
2660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
26627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        object_buffer_p obj_buffer = buffers[i];
2663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
2665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAPictureParameterBufferType:
2666c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1_RenderPicture got VAPictureParameterBuffer\n");
2667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__VC1_process_picture_param(ctx, obj_buffer);
2668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
2669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
2670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VABitPlaneBufferType:
2672c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1_RenderPicture got VABitPlaneBuffer\n");
2673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__VC1_process_bitplane(ctx, obj_buffer);
2674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
2675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
2676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VASliceParameterBufferType:
2678c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1_RenderPicture got VASliceParameterBufferType\n");
2679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__VC1_add_slice_param(ctx, obj_buffer);
2680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
2681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
2682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VASliceDataBufferType:
2684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProtectedSliceDataBufferType:
2685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2686c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_VC1_RenderPicture got %s\n", SLICEDATA_BUFFER_TYPE(obj_buffer->type));
2687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__VC1_process_slice_data(ctx, obj_buffer);
2688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
2689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
2690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
2692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_UNKNOWN;
2693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
26947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
2695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
26967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            break;
26977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
26987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
26997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
27017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
27027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic VAStatus psb_VC1_EndPicture(
2704dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
27057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
27067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    INIT_CONTEXT_VC1
27077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_context_flush_cmdbuf(ctx->obj_context)) {
27097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
27107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
27117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(ctx->pic_params);
2713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ctx->pic_params) {
27147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_UNKNOWN;
27157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
27167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /********* Keep some picture parameters of the previously decoded picture ***********/
2718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(ctx->pic_params->picture_fields.bits.picture_type)) { // I or P
2719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Assume that the picture that we just decoded (the picture previous to the one that
27207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang           is about to be decoded) is the backward reference picture for a B picture. */
27217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* TODO: Make this more robust */
27227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->ui8FCM_Ref2Pic = ctx->pic_params->picture_fields.bits.frame_coding_mode;
2723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
27247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* For interlaced field pictures only */
2725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((ctx->pic_params->picture_fields.bits.frame_coding_mode != VC1_FCM_FLDI) || !ctx->pic_params->picture_fields.bits.is_first_field) {
27267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ctx->bTFF_BwRefFrm = ctx->pic_params->picture_fields.bits.top_field_first;
27277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
27287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
27297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->bRef1RangeRed = ctx->bRef0RangeRed;
2731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (PIC_TYPE_IS_REF(ctx->pic_params->picture_fields.bits.picture_type)) {
27327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ctx->bRef0RangeRed = ctx->pic_params->range_reduction_frame;
27337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
27347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /***********************************************************************************/
27357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(ctx->pic_params);
27377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ctx->pic_params = NULL;
27387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
27407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
27417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
27427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct format_vtable_s psb_VC1_vtable = {
2743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
2744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_QueryConfigAttributes,
2745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
2746dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_ValidateConfig,
2747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
2748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_CreateContext,
2749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
2750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_DestroyContext,
2751dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
2752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_BeginPicture,
2753dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
2754dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_RenderPicture,
2755dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
2756dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_VC1_EndPicture
27577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
2758