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