pnw_MPEG2.c revision bde3ed7517cc876cb2a6e174ea2a96a75938e787
1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL
32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved.
42befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2005-2007 Imagination Technologies Limited. All Rights Reserved.
5437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
62befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to
72befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers
82befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its
92befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and
102befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its
112befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade
122befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used,
132befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted,
142befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written
15dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * permission.
16dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
172befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual
182befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery
192befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or
202befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be
212befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing.
22437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
23437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
24bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang/*
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Waldo Bastian <waldo.bastian@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Zeng Li <zeng.li@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
31437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_MPEG2.h"
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h"
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_surface.h"
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_cmdbuf.h"
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/reg_io2.h"
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/msvdx_offsets.h"
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/msvdx_cmds_io2.h"
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/msvdx_vec_reg_io2.h"
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/msvdx_vec_mpeg2_reg_io2.h"
41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "hwdefs/dxva_fw_ctrl.h"
42437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h>
44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdint.h>
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define GET_SURFACE_INFO_is_defined(psb_surface) ((int) (psb_surface->extra_info[0]))
48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SET_SURFACE_INFO_is_defined(psb_surface, val) psb_surface->extra_info[0] = (uint32_t) val;
49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define GET_SURFACE_INFO_picture_structure(psb_surface) (psb_surface->extra_info[1])
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SET_SURFACE_INFO_picture_structure(psb_surface, val) psb_surface->extra_info[1] = val;
51437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define GET_SURFACE_INFO_picture_coding_type(psb_surface) ((int) (psb_surface->extra_info[2]))
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SET_SURFACE_INFO_picture_coding_type(psb_surface, val) psb_surface->extra_info[2] = (uint32_t) val;
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SLICEDATA_BUFFER_TYPE(type) ((type==VASliceDataBufferType)?"VASliceDataBufferType":"VAProtectedSliceDataBufferType")
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Frame types - format dependant!
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define PICTURE_CODING_I    0x01
61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define PICTURE_CODING_P    0x02
62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define PICTURE_CODING_B    0x03
63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun/* A special syntax is defined for D-pictures (picture_coding_type = 4). D-pictures are like I-pictures with only Intra-DC coefficients,
64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang   no End of Block, and a special end_of_macroblock code '1'. PICTURE_CODING_D is not allowed in MPEG2 */
65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define PICTURE_CODING_D    0x04
66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/************************************************************************************/
68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*                Variable length codes in 'packed' format                            */
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/************************************************************************************/
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Format is: opcode, width, symbol. All VLC tables are concatenated. Index            */
72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* infomation is stored in gui16mpeg2VlcIndexData[]                                    */
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#define VLC_PACK(a,b,c)         ( ( (a) << 12 ) | ( (b) << 9  ) | (c) )
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunconst static IMG_UINT16 gaui16mpeg2VlcTableDataPacked[] = {
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(6 , 0 , 0) ,
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 6) ,
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 4) ,
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 5) ,
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 4 , 6) ,
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 5 , 7) ,
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 1 , 3) ,
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 0) ,
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 3) ,
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 8) ,
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 9) ,
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 5) ,
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 0) ,
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 2) ,
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 3) ,
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 4) ,
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 4 , 5) ,
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 5 , 6) ,
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 2 , 1) ,
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 7) ,
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 8) ,
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 9) ,
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 5) ,
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 16) ,
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 87) ,
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 3 , 90) ,
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 98) ,
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 253) ,
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 366) ,
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 380) ,
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 381) ,
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 508) ,
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 508) ,
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 508) ,
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 508) ,
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 509) ,
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 509) ,
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 509) ,
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 509) ,
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 4 , 8) ,
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 63) ,
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 255) ,
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 255) ,
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 365) ,
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 470) ,
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 251) ,
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 471) ,
122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 4 , 0) ,
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 31) ,
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 40) ,
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 41) ,
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 224) ,
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 228) ,
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 232) ,
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 236) ,
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 437) ,
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 39) ,
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 40) ,
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 41) ,
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 241) ,
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 41) ,
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 454) ,
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 456) ,
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 244) ,
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 439) ,
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 348) ,
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 245) ,
142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 363) ,
143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 325) ,
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 458) ,
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 459) ,
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 246) ,
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 460) ,
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 461) ,
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 186) ,
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 356) ,
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 247) ,
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 333) ,
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 462) ,
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 173) ,
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 1 , 3) ,
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 1 , 5) ,
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 449) ,
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 432) ,
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 431) ,
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 332) ,
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 434) ,
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 436) ,
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 448) ,
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 215) ,
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 219) ,
166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 180) ,
167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 178) ,
168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 177) ,
169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 223) ,
170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 340) ,
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 355) ,
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 362) ,
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 184) ,
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 185) ,
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 240) ,
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 243) ,
177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 453) ,
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 463) ,
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 341) ,
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 248) ,
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 364) ,
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 187) ,
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 464) ,
184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 465) ,
185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 349) ,
186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 326) ,
187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 334) ,
188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 189) ,
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 342) ,
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 252) ,
191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 4) ,
192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 467) ,
193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 249) ,
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 466) ,
195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 357) ,
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 188) ,
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 250) ,
198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 469) ,
199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 350) ,
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 358) ,
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 16) ,
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 87) ,
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 3 , 90) ,
204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 98) ,
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 253) ,
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 366) ,
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 380) ,
208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 381) ,
209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 254) ,
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 254) ,
211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 254) ,
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 254) ,
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 4 , 8) ,
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 63) ,
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 255) ,
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 1 , 255) ,
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 365) ,
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 470) ,
223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 251) ,
224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 471) ,
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 4 , 0) ,
226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 31) ,
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 40) ,
228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 41) ,
229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 224) ,
230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 228) ,
231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 232) ,
232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 236) ,
233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 437) ,
234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 39) ,
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 40) ,
236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 41) ,
237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 241) ,
238dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 41) ,
239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 454) ,
240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 456) ,
241dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 244) ,
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 439) ,
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 348) ,
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 245) ,
245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 363) ,
246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 325) ,
247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 458) ,
248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 459) ,
249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 246) ,
250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 460) ,
251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 461) ,
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 186) ,
253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 356) ,
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 247) ,
255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 333) ,
256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 462) ,
257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 173) ,
258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 1 , 3) ,
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 1 , 5) ,
260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 449) ,
261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 432) ,
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 431) ,
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 332) ,
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 434) ,
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 436) ,
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 448) ,
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 215) ,
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 219) ,
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 180) ,
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 178) ,
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 177) ,
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 223) ,
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 340) ,
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 355) ,
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 362) ,
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 184) ,
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 185) ,
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 240) ,
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 243) ,
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 453) ,
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 463) ,
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 341) ,
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 248) ,
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 364) ,
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 187) ,
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 464) ,
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 465) ,
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 349) ,
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 326) ,
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 334) ,
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 189) ,
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 342) ,
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 252) ,
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 4) ,
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 467) ,
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 249) ,
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 466) ,
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 357) ,
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 188) ,
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 250) ,
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 469) ,
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 350) ,
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 358) ,
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 32) ,
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 87) ,
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 248) ,
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 89) ,
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 2 , 90) ,
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 366) ,
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 189) ,
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 358) ,
312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 380) ,
313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 380) ,
314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 381) ,
315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 381) ,
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 254) ,
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 254) ,
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 4 , 504) ,
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 4 , 505) ,
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 508) ,
324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 509) ,
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 506) ,
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 506) ,
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 507) ,
331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 3 , 507) ,
332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 251) ,
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 250) ,
334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 71) ,
335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 74) ,
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 255) ,
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 3) ,
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 2 , 8) ,
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 3 , 17) ,
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 341) ,
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 465) ,
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 2) ,
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 464) ,
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 363) ,
345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 463) ,
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 438) ,
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 348) ,
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 324) ,
349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 458) ,
350dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 459) ,
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 461) ,
352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 356) ,
353dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 1) ,
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 333) ,
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 462) ,
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 3 , 0) ,
357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 15) ,
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 24) ,
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 25) ,
360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 224) ,
361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 228) ,
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 232) ,
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 236) ,
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 437) ,
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 23) ,
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 24) ,
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 185) ,
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 3 , 0) ,
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 452) ,
370dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 454) ,
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 456) ,
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 173) ,
373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 1 , 3) ,
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 1 , 5) ,
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 449) ,
376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 432) ,
377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 431) ,
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 332) ,
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 434) ,
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 436) ,
381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 448) ,
382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 215) ,
383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 219) ,
384dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 180) ,
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 178) ,
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 177) ,
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 223) ,
388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 340) ,
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 355) ,
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 362) ,
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 184) ,
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 326) ,
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 471) ,
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 334) ,
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 365) ,
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 350) ,
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 342) ,
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 1 , 4) ,
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 466) ,
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 357) ,
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 187) ,
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 244) ,
403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 468) ,
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 186) ,
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 470) ,
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 188) ,
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 469) ,
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 247) ,
409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 492) ,
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 493) ,
411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 243) ,
412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 242) ,
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 364) ,
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 349) ,
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 241) ,
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 240) ,
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 30) ,
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 14) ,
419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 13) ,
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 12) ,
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 3) ,
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 4) ,
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 1 , 7) ,
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 9) ,
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 11) ,
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 8) ,
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 6) ,
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 5) ,
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 3) ,
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 1 , 0) ,
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 3) ,
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 1 , 0) ,
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 1 , 5) ,
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 2 , 0) ,
435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 2 , 0) ,
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 2 , 0) ,
437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 2 , 226) ,
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 1) ,
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 0) ,
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 31) ,
441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(4 , 0 , 62) ,
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 30) ,
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 29) ,
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 28) ,
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(0 , 0 , 3) ,
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(2 , 2 , 4) ,
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(1 , 1 , 7) ,
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 25) ,
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 27) ,
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 24) ,
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 22) ,
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 0 , 21) ,
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 1 , 19) ,
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 1 , 0) ,
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(3 , 1 , 0) ,
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VLC_PACK(5 , 2 , 15)
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define MAX_QUANT_TABLES    (2) /* only 2 tables for 4:2:0 decode */
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
461bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangstatic int scan0[64] = { // spec, fig 7-2
462bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /*u 0  .....                   7*/
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    0,  1,  5,  6,  14, 15, 27, 28,  /* v = 0 */
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    2,  4,  7,  13, 16, 26, 29, 42,
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    3,  8,  12, 17, 25, 30, 41, 43,
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    9,  11, 18, 24, 31, 40, 44, 53,
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    10, 19, 23, 32, 39, 45, 52, 54,
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    20, 22, 33, 38, 46, 51, 55, 60,
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    21, 34, 37, 47, 50, 56, 59, 61,
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    35, 36, 48, 49, 57, 58, 62, 63  /* v = 7 */
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    NONINTRA_LUMA_Q = 0,
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INTRA_LUMA_Q = 1
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} QUANT_IDX;
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct context_MPEG2_s {
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context; /* back reference */
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Picture parameters */
482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAPictureParameterBufferMPEG2 *pic_params;
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p forward_ref_surface;
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_surface_p backward_ref_surface;
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t coded_picture_width;    /* in pixels */
487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t coded_picture_height;    /* in pixels */
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t picture_width_mb;        /* in macroblocks */
490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t picture_height_mb;        /* in macroblocks */
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t size_mb;                /* in macroblocks */
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t coded_picture_size;    /* MSVDX format */
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t display_picture_size;    /* MSVDX format */
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_PPS0;
497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_PPS1;
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_PPS2;
499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_SPS0;
500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_SPS1;
501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t FE_PPS0;
502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t FE_PPS1;
503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* IQ Matrix */
505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t qmatrix_data[MAX_QUANT_TABLES][16];
506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int got_iq_matrix;
507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
508dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Split buffers */
509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int split_buffer_pending;
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* List of VASliceParameterBuffers */
512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_buffer_p *slice_param_list;
513437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int slice_param_list_size;
514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int slice_param_list_idx;
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
516437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* VLC packed data */
517437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct psb_buffer_s vlc_packed_table;
518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Misc */
520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int previous_slice_vertical_position;
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
5224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t *p_range_mapping_base0;
5234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t *p_range_mapping_base1;
524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t *p_slice_params; /* pointer to ui32SliceParams in CMD_HEADER */
5254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t *slice_first_pic_last;
526437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
527437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
528437b3eda28a4bf098efa80598cab67f190275266Fei Jiangtypedef struct context_MPEG2_s *context_MPEG2_p;
529437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_CONTEXT_MPEG2    context_MPEG2_p ctx = (context_MPEG2_p) obj_context->format_data;
531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
532437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define SURFACE(id)    ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
533437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
535437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG2_QueryConfigAttributes(
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAProfile profile,
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAEntrypoint entrypoint,
538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VAConfigAttrib *attrib_list,
539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_attribs)
540437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* No MPEG2 specific attributes */
542437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
543437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
544437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG2_ValidateConfig(
545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
546437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
547437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
548437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Check all attributes */
549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < obj_config->attrib_count; i++) {
550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_config->attrib_list[i].type) {
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAConfigAttribRTFormat:
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Ignore */
553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
560437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
561437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
563437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
565437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
566437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
569437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
570437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
571dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
572437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_config) {
574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
576437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* MSVDX decode capability for MPEG2:
580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     *     MP@HL
581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     *
582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * Refer to Table 8-11 (Upper bounds for luminance sample rate) of ISO/IEC 13818-2: 1995(E),
583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     * and the "MSVDX MPEG2 decode capability" table of "Poulsbo Media Software Overview"
584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     */
585437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (obj_config->profile) {
587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileMPEG2Simple:
588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 352)
589bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 288)) {
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
593437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case VAProfileMPEG2Main:
595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((obj_context->picture_width <= 0) || (obj_context->picture_width > 1920)
596bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (obj_context->picture_height <= 0) || (obj_context->picture_height > 1088)) {
597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
609437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG2_DestroyContext(object_context_p obj_context);
610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
611437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG2_CreateContext(
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_config_p obj_config)
614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
616437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_MPEG2_p ctx;
617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Validate flag */
618437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Validate picture dimensions */
619437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb__MPEG2_check_legal_picture(obj_context, obj_config);
620dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
621437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
622437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
623437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->num_render_targets < 1) {
626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
627437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
628437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
629437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
6302befccec034c13d34746a9e87149889d59ac767bFei Jiang    ctx = (context_MPEG2_p) calloc(1, sizeof(struct context_MPEG2_s));
631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx) {
632437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
633437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
634437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
635437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
6362befccec034c13d34746a9e87149889d59ac767bFei Jiang
637437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_context->format_data = (void*) ctx;
638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->obj_context = obj_context;
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->pic_params = NULL;
640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->got_iq_matrix = FALSE;
641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->previous_slice_vertical_position = ~1;
642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->split_buffer_pending = FALSE;
644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->slice_param_list_size = 8;
646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size);
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->slice_param_list_idx = 0;
648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == ctx->slice_param_list) {
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
653437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(obj_context->driver_data,
656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     sizeof(gaui16mpeg2VlcTableDataPacked),
657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_bt_cpu_vpu,
658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     &ctx->vlc_packed_table);
659437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
660437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus == VA_STATUS_SUCCESS) {
662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        void *vlc_packed_data_address;
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 ==  psb_buffer_map(&ctx->vlc_packed_table, &vlc_packed_data_address)) {
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(vlc_packed_data_address, gaui16mpeg2VlcTableDataPacked, sizeof(gaui16mpeg2VlcTableDataPacked));
665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_unmap(&ctx->vlc_packed_table);
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
667437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
668437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
669437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
670437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (vaStatus != VA_STATUS_SUCCESS) {
673437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        pnw_MPEG2_DestroyContext(obj_context);
674437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
675437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
676437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
677437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
678437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
679437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void pnw_MPEG2_DestroyContext(
680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
681437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
682437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG2
683437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&ctx->vlc_packed_table);
685437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
687437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(ctx->pic_params);
688437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->pic_params = NULL;
689437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->slice_param_list) {
692437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(ctx->slice_param_list);
693437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->slice_param_list = NULL;
694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
695437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
696437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(obj_context->format_data);
697437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_context->format_data = NULL;
698437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
699437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
700437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_process_picture_param(context_MPEG2_p ctx, object_buffer_p obj_buffer)
701437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
702437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAPictureParameterBufferType);
703437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->num_elements == 1);
704437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->size == sizeof(VAPictureParameterBufferMPEG2));
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
706437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((obj_buffer->num_elements != 1) ||
707bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAPictureParameterBufferMPEG2))) {
708437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
709437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
710437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
711437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Transfer ownership of VAPictureParameterBufferMPEG2 data */
712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
713437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(ctx->pic_params);
714437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
715437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->pic_params = (VAPictureParameterBufferMPEG2 *) obj_buffer->buffer_data;
716437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->buffer_data = NULL;
717437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_buffer->size = 0;
718437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
719437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Lookup surfaces for backward/forward references */
720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (ctx->pic_params->picture_coding_type) {
721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_I:
722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->forward_ref_surface = NULL;
723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->backward_ref_surface = NULL;
724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_P:
727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->backward_ref_surface = NULL;
729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == ctx->forward_ref_surface) {
730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_INVALID_SURFACE;
731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_B:
735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ctx->backward_ref_surface = SURFACE(ctx->pic_params->backward_reference_picture);
737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if ((NULL == ctx->forward_ref_surface) ||
738bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (NULL == ctx->backward_ref_surface)) {
739dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            return VA_STATUS_ERROR_INVALID_SURFACE;
740dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
741dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
742dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
745437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
746437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
747437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->picture_width_mb = (ctx->pic_params->horizontal_size + 15) / 16;
748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->va_flags & VA_PROGRESSIVE) {
749437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->picture_height_mb = (ctx->pic_params->vertical_size + 15) / 16;
750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
751437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->picture_height_mb = (ctx->pic_params->vertical_size + 31) / 32;
752437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->picture_height_mb *= 2;
753437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
754437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->coded_picture_width = ctx->picture_width_mb * 16;
755437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->coded_picture_height = ctx->picture_height_mb * 16;
756437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
757437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->size_mb = ctx->picture_width_mb * ctx->picture_height_mb;
758437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
759dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Display picture size                                                            */
760437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->display_picture_size = 0;
761dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
762dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * coded_picture_width/height is aligned to the size of a macroblock..
763dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * Both coded_picture_height or vertical_size can be used for DISPLAY_SIZE and both give correct results,
764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * however Vista driver / test app uses the aligned value that's in coded_picture_height so we do too.
765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * See e.g. low4.m2v for an example clip where vertical_size will differ from coded_picture_height
766dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     */
767437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0
768dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->display_picture_size, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, ctx->pic_params->vertical_size - 1);
769dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->display_picture_size, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, ctx->pic_params->horizontal_size - 1);
770437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else
771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->display_picture_size, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->display_picture_size, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, ctx->coded_picture_width - 1);
773437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
774437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
775437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Coded picture size                                                            */
776437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->coded_picture_size = 0;
777dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->coded_picture_size, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
778dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->coded_picture_size, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, ctx->coded_picture_width - 1);
779dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
780437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->BE_SPS0 = 0;
781dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_SPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_SPS0, BE_HORIZONTAL_SIZE_MINUS1, ctx->picture_width_mb - 1);
782437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
783437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->BE_SPS1 = 0;
784dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_SPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_SPS1, BE_VERTICAL_SIZE_MINUS1, ctx->picture_height_mb);
785437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
786437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->FE_PPS0 = 0;
787dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_ALTERNATE_SCAN,                 !!(ctx->pic_params->picture_coding_extension.bits.alternate_scan));
788dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_Q_SCALE_TYPE,                 !!(ctx->pic_params->picture_coding_extension.bits.q_scale_type));
789dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_INTRA_DC_PRECISION,                ctx->pic_params->picture_coding_extension.bits.intra_dc_precision);
790dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_TOP_FIELD_FIRST,             !!(ctx->pic_params->picture_coding_extension.bits.top_field_first));
791dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_CONCEALMENT_MOTION_VECTORS,  !!(ctx->pic_params->picture_coding_extension.bits.concealment_motion_vectors));
792dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_FRAME_PRED_FRAME_DCT,         !!(ctx->pic_params->picture_coding_extension.bits.frame_pred_frame_dct));
793dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_PICTURE_STRUCTURE,                ctx->pic_params->picture_coding_extension.bits.picture_structure);
794dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0, FE_INTRA_VLC_FORMAT,             !!(ctx->pic_params->picture_coding_extension.bits.intra_vlc_format));
795437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
796437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->FE_PPS1 = 0;
797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1, FE_PICTURE_CODING_TYPE, ctx->pic_params->picture_coding_type);
798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1, FE_F_CODE00, (ctx->pic_params->f_code >> 12) & 0x0F);
799dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1, FE_F_CODE01, (ctx->pic_params->f_code >>  8) & 0x0F);
800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1, FE_F_CODE10, (ctx->pic_params->f_code >>  4) & 0x0F);
801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->FE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1, FE_F_CODE11, (ctx->pic_params->f_code >>  0) & 0x0F);
802437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
803437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* VEC Control register: Back-End MPEG2 PPS0                                    */
804437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->BE_PPS0 = 0;
805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS0, BE_FRAME_PRED_FRAME_DCT,    !!(ctx->pic_params->picture_coding_extension.bits.frame_pred_frame_dct));
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS0, BE_INTRA_DC_PRECISION,           ctx->pic_params->picture_coding_extension.bits.intra_dc_precision);
807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS0, BE_Q_SCALE_TYPE,            !!(ctx->pic_params->picture_coding_extension.bits.q_scale_type));
808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS0, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS0, BE_ALTERNATE_SCAN,            !!(ctx->pic_params->picture_coding_extension.bits.alternate_scan));
809437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
810437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->BE_PPS1 = 0;
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS1, BE_F_CODE00, (ctx->pic_params->f_code >> 12) & 0x0F);
812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS1, BE_F_CODE01, (ctx->pic_params->f_code >>  8) & 0x0F);
813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS1, BE_F_CODE10, (ctx->pic_params->f_code >>  4) & 0x0F);
814dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS1, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS1, BE_F_CODE11, (ctx->pic_params->f_code >>  0) & 0x0F);
815437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
816437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* VEC Control register: Back-End MPEG2 PPS2                                    */
817437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->BE_PPS2 = 0;
818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS2, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS2, BE_PICTURE_CODING_TYPE,           ctx->pic_params->picture_coding_type);
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS2, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS2, BE_TOP_FIELD_FIRST,            !!(ctx->pic_params->picture_coding_extension.bits.top_field_first));
820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS2, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS2, BE_CONCEALMENT_MOTION_VECTORS, !!(ctx->pic_params->picture_coding_extension.bits.concealment_motion_vectors));
821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->BE_PPS2, MSVDX_VEC_MPEG2, CR_VEC_MPEG2_BE_PPS2, BE_PICTURE_STRUCTURE,               ctx->pic_params->picture_coding_extension.bits.picture_structure);
822437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
823437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->obj_context->operating_mode = 0;
824dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, CHROMA_INTERLEAVED, 0);
825dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, ctx->obj_context->current_render_target->psb_surface->stride_mode);
826dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1);                                 /* MPEG2 profile            */
827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3);                                 /* MPEG2 mode                */
828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1);                                 /* VDMC only                */
829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(ctx->obj_context->operating_mode, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1);
830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
831437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
832437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
833437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
834437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_convert_iq_matrix(uint32_t *dest32, unsigned char *src)
835437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
836437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
837437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int *idx = scan0;
838437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint8_t *dest8 = (uint8_t*) dest32;
839dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
840dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < 64; i++) {
841437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *dest8++ = src[*idx++];
842437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
843437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
844437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
845437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_process_iq_matrix(context_MPEG2_p ctx, object_buffer_p obj_buffer)
846437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
847437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAIQMatrixBufferMPEG2 *iq_matrix = (VAIQMatrixBufferMPEG2 *) obj_buffer->buffer_data;
848437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VAIQMatrixBufferType);
849437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->num_elements == 1);
850437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->size == sizeof(VAIQMatrixBufferMPEG2));
851437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
852437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((obj_buffer->num_elements != 1) ||
853bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (obj_buffer->size != sizeof(VAIQMatrixBufferMPEG2))) {
854437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
855437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
856437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
857437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Only update the qmatrix data if the load flag is set */
858dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (iq_matrix->load_non_intra_quantiser_matrix) {
859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__MPEG2_convert_iq_matrix(ctx->qmatrix_data[NONINTRA_LUMA_Q], iq_matrix->non_intra_quantiser_matrix);
860437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (iq_matrix->load_intra_quantiser_matrix) {
862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__MPEG2_convert_iq_matrix(ctx->qmatrix_data[INTRA_LUMA_Q], iq_matrix->intra_quantiser_matrix);
863437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
864437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* We ignore the Chroma tables because those are not supported with VA_RT_FORMAT_YUV420 */
865437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->got_iq_matrix = TRUE;
866437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
867437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
868437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
869437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
870437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
871437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Adds a VASliceParameterBuffer to the list of slice params
872437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
873437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_add_slice_param(context_MPEG2_p ctx, object_buffer_p obj_buffer)
874437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
875437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(obj_buffer->type == VASliceParameterBufferType);
876dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) {
877437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        void *new_list;
878437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->slice_param_list_size += 8;
879437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        new_list = realloc(ctx->slice_param_list,
880dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           sizeof(object_buffer_p) * ctx->slice_param_list_size);
881dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (NULL == new_list) {
882437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return VA_STATUS_ERROR_ALLOCATION_FAILED;
883437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
884437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->slice_param_list = (object_buffer_p*) new_list;
885437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
886437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer;
887437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->slice_param_list_idx++;
888437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
889437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
890437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
891437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Precalculated values */
892437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define ADDR0       (0x00006000)
893437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define ADDR1       (0x0003f017)
894437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define ADDR2       (0x000ab0e5)
895437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define ADDR3       (0x0000016e)
896437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define WIDTH0      (0x0016c6ed)
897437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define OPCODE0     (0x00002805)
898437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
899437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_write_VLC_tables(context_MPEG2_p ctx)
900437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
901437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
902437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
903dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_skip_start_block(cmdbuf, SKIP_ON_CONTEXT_SWITCH);
9044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* VLC Table */
9054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* Write a LLDMA Cmd to transfer VLD Table data */
906dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_lldma_write_cmdbuf(cmdbuf, &ctx->vlc_packed_table, 0,
907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  sizeof(gaui16mpeg2VlcTableDataPacked),
908dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  0, LLDMA_TYPE_VLC_TABLE);
9094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
910437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Write the vec registers with the index data for each of the tables and then write    */
911437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* the actual table data.                                                                */
912dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
913dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0),            ADDR0);
914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1),            ADDR1);
915dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2),            ADDR2);
916dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3),            ADDR3);
917dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0),    WIDTH0);
918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0), OPCODE0);
919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
920dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_skip_end_block(cmdbuf);
9224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
9234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Programme the Alt output if there is a rotation*/
925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb__MPEG2_setup_alternative_frame(context_MPEG2_p ctx, IMG_BOOL write_reg)
9264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
9274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t cmd;
9284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
9294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p rotate_surface = ctx->obj_context->current_render_target->psb_surface_rotate;
9304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    object_context_p obj_context = ctx->obj_context;
9314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
932dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (rotate_surface->extra_info[5] != obj_context->rotate)
9334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        psb__error_message("Display rotate mode does not match surface rotate mode!\n");
9344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* CRendecBlock    RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */
937dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
9384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
939dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs);
940dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset);
9414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC(*ctx->p_range_mapping_base0, rotate_surface->buf.buffer_ofs, &rotate_surface->buf);
9434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC(*ctx->p_range_mapping_base1, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset, &rotate_surface->buf);
9444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
945dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
9464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
947dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (write_reg) {
9484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Set the rotation registers */
949dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION));
9504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        cmd = 0;
951dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
952dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, rotate_surface->stride_mode);
953dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always has Rec */
954dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, rotate_surface->extra_info[5]);
9554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, cmd);
9574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
958dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_end(cmdbuf);
9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
960437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
961437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
962437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_set_operating_mode(context_MPEG2_p ctx)
963437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
964437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
965437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
966437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->rotate != VA_ROTATION_NONE)
968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__MPEG2_setup_alternative_frame(ctx, ctx->pic_params->picture_coding_extension.bits.progressive_frame);
9694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->display_picture_size);
972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->coded_picture_size);
973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->obj_context->operating_mode);
974437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
975437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
976dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
977437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
978437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
979dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
980437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
981dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
982437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
983437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
984437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_set_reference_pictures(context_MPEG2_p ctx)
985437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
989dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
990437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* In MPEG2, the registers at N=0 are always used to store the base address of the luma and chroma buffers
992dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        of the most recently decoded reference picture. The registers at N=1 are used to store the base address
993dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        of the luma and chroma buffers of the older reference picture, if more than one reference picture is used.
994437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        This means that when decoding a P picture the forward reference picture�s address is at index 0.
995437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        When decoding a B-picture the backward reference picture�s address is at index 0 and the address of the
996437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        forward reference picture � which was decoded earlier than the backward reference � is at index 1.
997437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    */
998437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
999dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (ctx->pic_params->picture_coding_type) {
1000dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_I:
1001dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("    I-Frame\n");
1002dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* No reference pictures */
1003dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, 0);
1004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, 0);
1005dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, 0);
1006dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, 0);
1007dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
1008dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_P:
1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("    P-Frame\n");
1011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->pic_params->picture_coding_extension.bits.is_first_field) {
1012dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* forward reference picture */
1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1014dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
1015dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf,  ctx->forward_ref_surface->psb_surface\
1018dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                            ->buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
1019dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* No backward reference picture */
1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write(cmdbuf, 0);
1022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write(cmdbuf, 0);
1023dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
1024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* backward reference picture */
1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
1027dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1028dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
1030dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1031dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* forward reference picture */
1032dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1033dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
1034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1035dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
1037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1040dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case PICTURE_CODING_B:
1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("    B-Frame\n");
1042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* backward reference picture */
1043dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1044dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs);
1045dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1046dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs + ctx->backward_ref_surface->psb_surface->chroma_offset);
1048dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* forward reference picture */
1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
1052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES                                    */
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
1056437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1057437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
1059437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1060437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1061437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_set_picture_header(context_MPEG2_p ctx, VASliceParameterBufferMPEG2 *slice_param)
1062437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1063437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1064437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
1065437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t FE_slice;
1066437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t BE_slice;
1067437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1070437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* VEC Control register: Front-End MPEG2 PPS0 */
1071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS0) , ctx->FE_PPS0);
1072437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1073437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* VEC Control register: Front-End MPEG2 PPS1 */
1074dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_PPS1) , ctx->FE_PPS1);
1075437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1076437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Slice level */
1077437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    FE_slice = 0;
1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(FE_slice,
1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_VEC_MPEG2,
1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      CR_VEC_MPEG2_FE_SLICE,
1081dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      FE_FIRST_IN_ROW,
1082dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      (ctx->previous_slice_vertical_position != slice_param->slice_vertical_position));
1083437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(FE_slice,
1085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_VEC_MPEG2,
1086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      CR_VEC_MPEG2_FE_SLICE,
1087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      FE_SLICE_VERTICAL_POSITION_MINUS1,
1088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      slice_param->slice_vertical_position);
1089437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1090dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(FE_slice,
1091dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_VEC_MPEG2,
1092dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      CR_VEC_MPEG2_FE_SLICE,
1093dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      FE_QUANTISER_SCALE_CODE,
1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      slice_param->quantiser_scale_code);
1095437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1096dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG2, CR_VEC_MPEG2_FE_SLICE) , FE_slice);
1097437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1098dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
1099437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* BE Section */
1102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG2_CR_VEC_MPEG2_BE_SPS0));
1103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS0);
1105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS1);
1106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_PPS0);   /* VEC Control register: Back-End MPEG2 PPS0 */
1107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_PPS1);   /* VEC Control register: Back-End MPEG2 PPS1 */
1108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_PPS2);   /* VEC Control register: Back-End MPEG2 PPS2 */
1109437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    BE_slice = 0;
1111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ctx->pic_params->picture_coding_extension.bits.is_first_field) {
1112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /*
1113437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            BE_IP_PAIR_FLAG is 1 if the current picture_data is a P-coded field which is the 2nd field of a frame,
1114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                        and which uses the first field of the frame (which was I-coded) as a reference. 0 otherwise.
1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            BE_IP_PAIR_FLAG will only be 1 if BE_SECOND_FIELD_FLAG is 1, and the condition
1116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                of "this is a P-field which uses the accompanying I-field as a reference" is met.
1117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        */
1118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->pic_params->picture_coding_type == PICTURE_CODING_P) {
1119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (GET_SURFACE_INFO_picture_coding_type(target_surface) == PICTURE_CODING_I)            {
1120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                REGIO_WRITE_FIELD_LITE(BE_slice,
1121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       MSVDX_VEC_MPEG2,
1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       CR_VEC_MPEG2_BE_SLICE,
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       BE_IP_PAIR_FLAG, 1);
1124437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            }
1125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1127437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        REGIO_WRITE_FIELD_LITE(BE_slice,
1128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               MSVDX_VEC_MPEG2,
1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               CR_VEC_MPEG2_BE_SLICE,
1130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               BE_SECOND_FIELD_FLAG,     1);
1131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        // BE_IP_PAIR_FLAG = 0;
1134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        // BE_SECOND_FIELD_FLAG = 0;
1135437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /*  Update with current settings first field */
1137437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        SET_SURFACE_INFO_is_defined(target_surface, TRUE);
1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SET_SURFACE_INFO_picture_structure(target_surface, ctx->pic_params->picture_coding_extension.bits.picture_structure);
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        SET_SURFACE_INFO_picture_coding_type(target_surface, ctx->pic_params->picture_coding_type);
1140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(BE_slice,
1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           MSVDX_VEC_MPEG2,
1144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           CR_VEC_MPEG2_BE_SLICE,
1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           BE_FIRST_IN_ROW,
1146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           (ctx->previous_slice_vertical_position != slice_param->slice_vertical_position));
1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(BE_slice,
1149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           MSVDX_VEC_MPEG2,
1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           CR_VEC_MPEG2_BE_SLICE,
1151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           BE_SLICE_VERTICAL_POSITION_MINUS1,
1152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           slice_param->slice_vertical_position);
1153437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(BE_slice,
1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           MSVDX_VEC_MPEG2,
1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           CR_VEC_MPEG2_BE_SLICE,
1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           BE_QUANTISER_SCALE_CODE,
1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           slice_param->quantiser_scale_code);
1159437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("BE_slice = %08x first_field = %d\n", BE_slice, ctx->pic_params->picture_coding_extension.bits.is_first_field);
1161437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, BE_slice);
1163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
1165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->previous_slice_vertical_position = slice_param->slice_vertical_position;
1167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1169437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_set_slice_params(context_MPEG2_p ctx)
1170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t cmd_data;
1174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS));
1176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmd_data = 0;    /* Build slice parameters */
1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd_data,
1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_CMDS,
1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      SLICE_PARAMS,
1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      SLICE_FIELD_TYPE,
1182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      ctx->pic_params->picture_coding_extension.bits.picture_structure - 1);
1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd_data,
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_CMDS,
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      SLICE_PARAMS,
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      SLICE_CODE_TYPE,
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      PICTURE_CODING_D == ctx->pic_params->picture_coding_type ? 0 : ctx->pic_params->picture_coding_type - 1);
1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, cmd_data);
1191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *ctx->p_slice_params = cmd_data;
1193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
1195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1197437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_write_qmatrices(context_MPEG2_p ctx)
1198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
1201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Since we only decode 4:2:0 We only need to the Intra tables.
1203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    Chroma quant tables are only used in Mpeg 4:2:2 and 4:4:4.
1204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    The hardware wants non-intra followed by intra */
1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, REG_MSVDX_VEC_IQRAM_OFFSET);
1206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* todo : optimisation here is to only load the need table */
1208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*  NONINTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + 0 */
1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < 16; i++) {
1211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[NONINTRA_LUMA_Q][i]);
1212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang// psb__information_message("NONINTRA_LUMA_Q[i] = %08x\n", ctx->qmatrix_data[NONINTRA_LUMA_Q][i]);
1213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*  INTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + (16*4) */
1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < 16; i++) {
1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[INTRA_LUMA_Q][i]);
1217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang// psb__information_message("INTRA_LUMA_Q[i] = %08x\n", ctx->qmatrix_data[INTRA_LUMA_Q][i]);
1218437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
1221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1223437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_set_ent_dec(context_MPEG2_p ctx)
1224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1225437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1226437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1227437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t cmd_data;
1228437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
1230437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmd_data = 0;     /* Entdec Front-End controls    */
1232437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    REGIO_WRITE_FIELD_LITE(cmd_data, MSVDX_VEC,  CR_VEC_ENTDEC_FE_CONTROL,  ENTDEC_FE_PROFILE, 1); /* MPEG2 Main Profile */
1233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    REGIO_WRITE_FIELD_LITE(cmd_data, MSVDX_VEC,  CR_VEC_ENTDEC_FE_CONTROL,  ENTDEC_FE_MODE,       3); /* Set MPEG2 mode */
1234437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL), cmd_data);
1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
1238437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL));
1240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmd_data = 0;     /* Entdec Back-End controls    */
1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd_data,
1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_VEC,
1244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      CR_VEC_ENTDEC_BE_CONTROL,
1245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      ENTDEC_BE_PROFILE,
1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      1);                                /* MPEG2 Main Profile        */
1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd_data,
1249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      MSVDX_VEC,
1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      CR_VEC_ENTDEC_BE_CONTROL,
1251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      ENTDEC_BE_MODE,
1252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                      3);                                /* Set MPEG2 mode            */
1253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_write(cmdbuf, cmd_data);
1255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_rendec_end(cmdbuf);
1257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_write_kick(context_MPEG2_p ctx, VASliceParameterBufferMPEG2 *slice_param)
1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    (void) slice_param; /* Unused for now */
1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *cmdbuf->cmd_idx++ = CMD_COMPLETION;
1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1268437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic void psb__MPEG2_FE_state(context_MPEG2_p ctx)
1269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* See RENDER_BUFFER_HEADER */
12734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = CMD_HEADER_VC1;
12744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->p_range_mapping_base0 = cmdbuf->cmd_idx++;
12764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->p_range_mapping_base1 = cmdbuf->cmd_idx++;
12774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->p_range_mapping_base0 = 0;
12794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->p_range_mapping_base1 = 0;
12804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->p_slice_params = cmdbuf->cmd_idx;
1282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *cmdbuf->cmd_idx++ = 0; /* ui32SliceParams */
1283437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = 0; /* skip two lldma addr field */
1285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++  = 0;
12874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->slice_first_pic_last = cmdbuf->cmd_idx++;
1288437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1290437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_process_slice(context_MPEG2_p ctx,
1291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        VASliceParameterBufferMPEG2 *slice_param,
1292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        object_buffer_p obj_buffer)
1293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
1297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("MPEG2 process slice\n");
1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("    size = %08x offset = %08x\n", slice_param->slice_data_size, slice_param->slice_data_offset);
1300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("    vertical pos = %d\n", slice_param->slice_vertical_position);
1301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("    slice_data_flag = %d\n", slice_param->slice_data_flag);
1302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("    coded size = %dx%d\n", ctx->picture_width_mb, ctx->picture_height_mb);
1303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) ||
1305bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) {
1306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (0 == slice_param->slice_data_size) {
1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
1309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
1310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(!ctx->split_buffer_pending);
1313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* Initialise the command buffer */
1315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_context_get_next_cmdbuf(ctx->obj_context);
1316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_FE_state(ctx);
1318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_write_VLC_tables(ctx);
1319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_cmdbuf_lldma_write_bitstream(ctx->obj_context->cmdbuf,
1321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                         obj_buffer->psb_buffer,
1322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                         obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset,
1323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                         slice_param->slice_data_size,
1324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                         slice_param->macroblock_offset,
1325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                                         0);
1326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) {
1328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ctx->split_buffer_pending = TRUE;
1329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(ctx->split_buffer_pending);
1332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ASSERT(0 == slice_param->slice_data_offset);
1333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* Create LLDMA chain to continue buffer */
1334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_size) {
1335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_cmdbuf_lldma_write_bitstream_chained(ctx->obj_context->cmdbuf,
1336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    obj_buffer->psb_buffer,
1337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    slice_param->slice_data_size);
1338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) ||
1342bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) {
1343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) {
1344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ASSERT(ctx->split_buffer_pending);
1345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_set_operating_mode(ctx);
1348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_set_reference_pictures(ctx);
1350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1351437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_set_picture_header(ctx, slice_param);
1352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_set_slice_params(ctx);
1354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_write_qmatrices(ctx);
1356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_set_ent_dec(ctx);
1358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1359437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__MPEG2_write_kick(ctx, slice_param);
1360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->split_buffer_pending = FALSE;
1362437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->obj_context->video_op = psb_video_vld;
1363bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        ctx->obj_context->flags = FW_VA_RENDER_IS_VLD_NOT_MC;
1364437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->obj_context->first_mb = 0;
13654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ctx->pic_params->picture_coding_extension.bits.progressive_frame)
1367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->obj_context->last_mb = ((ctx->picture_height_mb - 1) << 8) | (ctx->picture_width_mb - 1);
13684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
1369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ctx->obj_context->last_mb = ((ctx->picture_height_mb / 2 - 1) << 8) | (ctx->picture_width_mb - 1);
13704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
13714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        *ctx->slice_first_pic_last = (ctx->obj_context->first_mb << 16) | (ctx->obj_context->last_mb);
13724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (psb_context_submit_cmdbuf(ctx->obj_context)) {
1374437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_UNKNOWN;
1375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
1378437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1380437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus psb__MPEG2_process_slice_data(context_MPEG2_p ctx, object_buffer_p obj_buffer)
1381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VASliceParameterBufferMPEG2 *slice_param;
1384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int buffer_idx = 0;
1385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int element_idx = 0;
1386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
1388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(ctx->got_iq_matrix);
1390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(ctx->pic_params);
1391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(ctx->slice_param_list_idx);
1392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ctx->got_iq_matrix || !ctx->pic_params) {
1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* IQ matrix or Picture params missing */
1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if ((NULL == obj_buffer->psb_buffer) ||
1398bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == obj_buffer->size)) {
1399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* We need to have data in the bitstream buffer */
1400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return VA_STATUS_ERROR_UNKNOWN;
1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1403dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (buffer_idx < ctx->slice_param_list_idx) {
1404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx];
1405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (element_idx >= slice_buf->num_elements) {
1406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* Move to next buffer */
1407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            element_idx = 0;
1408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            buffer_idx++;
1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            continue;
1410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1411dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        slice_param = (VASliceParameterBufferMPEG2 *) slice_buf->buffer_data;
1413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        slice_param += element_idx;
1414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        element_idx++;
1415437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = psb__MPEG2_process_slice(ctx, slice_param, obj_buffer);
1416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
1417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
1419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->slice_param_list_idx = 0;
1422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
1424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__MEPG2_send_highlevel_cmd(context_MPEG2_p ctx)
14274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
14284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t cmd;
14294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
14304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
14314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p rotate_surface = ctx->obj_context->current_render_target->psb_surface_rotate;
14324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
1434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE), ctx->display_picture_size);
1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, CODED_PICTURE_SIZE), ctx->coded_picture_size);
14364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
14384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1);
14394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); // 0 = VDMC and VDEB active.  1 = VDEB pass-thru.
14404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 3);        // MPEG2
14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, 1); // MAIN
1442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, target_surface->stride_mode);
1443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, OPERATING_MODE), cmd);
14444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES),
14464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                             &target_surface->buf, target_surface->buf.buffer_ofs);
14474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES),
1449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
14504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES) + (0 * 8),
14524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                             &target_surface->buf, target_surface->buf.buffer_ofs);
14534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES) + 4 + (0 * 8),
1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
14564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES) + (1 * 8),
14584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                             &target_surface->buf, target_surface->buf.buffer_ofs);
14594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES) + 4 + (1 * 8),
1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
14624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
14644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE,   2); /* FRAME PICTURE -- ui8SliceFldType */
14654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    REGIO_WRITE_FIELD(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE,    1); /* P PICTURE -- (ui8PicType == WMF_PTYPE_BI) ? WMF_PTYPE_I : (ui8PicType & 0x3) */
1466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS), cmd);
14674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->p_slice_params = cmd;
1468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
14694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
1472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS),
14734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                             &rotate_surface->buf, rotate_surface->buf.buffer_ofs);
14744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set_RELOC(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, VC1_CHROMA_RANGE_MAPPING_BASE_ADDRESS),
1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             &rotate_surface->buf, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset);
1477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
14784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC(*ctx->p_range_mapping_base0, rotate_surface->buf.buffer_ofs, &rotate_surface->buf);
14804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC(*ctx->p_range_mapping_base1, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset, &rotate_surface->buf);
14814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
14824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuostatic void psb__MEPG2_send_blit_cmd(context_MPEG2_p ctx)
14844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
14854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t cmd;
14864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
14874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_surface_p rotate_surface = ctx->obj_context->current_render_target->psb_surface_rotate;
14884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_start_block(cmdbuf);
14904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmd = 0;
1491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
1492dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, rotate_surface->stride_mode);
1493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0);
1494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, rotate_surface->extra_info[5]);
1495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION), cmd);
1496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_reg_end_block(cmdbuf);
14974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = 0x40000000; /* CMD_BLIT_CMD */
14994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = ctx->picture_width_mb;
15004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = ctx->picture_height_mb; /* FIXME */
15014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = CMD_COMPLETION;
15024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
15034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb__MPEG2_insert_blit_cmd_to_rotate(context_MPEG2_p ctx)
15054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
15064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
15074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    /* See RENDER_BUFFER_HEADER */
15094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = CMD_HEADER_VC1;
15104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->p_range_mapping_base0 = cmdbuf->cmd_idx++;
15124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->p_range_mapping_base1 = cmdbuf->cmd_idx++;
15134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->p_range_mapping_base0 = 0;
15154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->p_range_mapping_base1 = 0;
15164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->p_slice_params = cmdbuf->cmd_idx;
15184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = 0; /* ui32SliceParams */
15194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = 0; /* skip two lldma addr field */
15214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->cmd_idx++ = 0;
15224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->slice_first_pic_last = cmdbuf->cmd_idx++;
15244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *ctx->slice_first_pic_last = 0;
15254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__MEPG2_send_highlevel_cmd(ctx);
15274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb__MEPG2_send_blit_cmd(ctx);
15284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
15294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ctx->obj_context->video_op = psb_video_mc;
1530bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    ctx->obj_context->flags = FW_VA_RENDER_IS_LAST_SLICE;
15314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_context_submit_cmdbuf(ctx->obj_context)) {
1533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(0);
15344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
15354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
15364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1537437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG2_BeginPicture(
1538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
1539437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1540437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG2
1541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1542437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("pnw_MPEG2_BeginPicture\n");
1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
1544437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(ctx->pic_params);
1545437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->pic_params = NULL;
1546437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1547437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->previous_slice_vertical_position = ~1;
1548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1549437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return VA_STATUS_SUCCESS;
1550437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1551437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1552437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG2_RenderPicture(
1553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
1554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p *buffers,
1555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int num_buffers)
1556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
1558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG2
1559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1560dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < num_buffers; i++) {
1562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_buffer_p obj_buffer = buffers[i];
1563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (obj_buffer->type) {
1565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAPictureParameterBufferType:
1566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("pnw_MPEG2_RenderPicture got VAPictureParameterBuffer\n");
1567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__MPEG2_process_picture_param(ctx, obj_buffer);
1568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1570dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1571dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAIQMatrixBufferType:
1572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("pnw_MPEG2_RenderPicture got VAIQMatrixBufferType\n");
1573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__MPEG2_process_iq_matrix(ctx, obj_buffer);
1574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VASliceParameterBufferType:
1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("pnw_MPEG2_RenderPicture got VASliceParameterBufferType\n");
1579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__MPEG2_add_slice_param(ctx, obj_buffer);
1580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VASliceDataBufferType:
1584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProtectedSliceDataBufferType:
1585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("pnw_MPEG2_RenderPicture got %s\n", SLICEDATA_BUFFER_TYPE(obj_buffer->type));
1587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = psb__MPEG2_process_slice_data(ctx, obj_buffer);
1588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
1590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
1592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            vaStatus = VA_STATUS_ERROR_UNKNOWN;
1593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DEBUG_FAILURE;
1594437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (vaStatus != VA_STATUS_SUCCESS) {
1596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
1597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
1601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1603437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic VAStatus pnw_MPEG2_EndPicture(
1604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context)
1605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_CONTEXT_MPEG2
1608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1609437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("pnw_MPEG2_EndPicture\n");
1610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->obj_context->rotate != VA_ROTATION_NONE) {
1612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!(ctx->pic_params->picture_coding_extension.bits.progressive_frame) &&
1613bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            !(ctx->pic_params->picture_coding_extension.bits.is_first_field))
16144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            psb__MPEG2_insert_blit_cmd_to_rotate(ctx);
16154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
16164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_context_flush_cmdbuf(ctx->obj_context)) {
1618437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_UNKNOWN;
1619437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1620437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ctx->pic_params) {
1622437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(ctx->pic_params);
1623437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ctx->pic_params = NULL;
1624437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1625437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
1627437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1628437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1629437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstruct format_vtable_s pnw_MPEG2_vtable = {
1630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunqueryConfigAttributes:
1631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_QueryConfigAttributes,
1632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvalidateConfig:
1633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_ValidateConfig,
1634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuncreateContext:
1635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_CreateContext,
1636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkundestroyContext:
1637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_DestroyContext,
1638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunbeginPicture:
1639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_BeginPicture,
1640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunrenderPicture:
1641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_RenderPicture,
1642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunendPicture:
1643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_MPEG2_EndPicture
1644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang};
1645