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