1 /* 2 INTEL CONFIDENTIAL 3 Copyright 2009 Intel Corporation All Rights Reserved. 4 The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission. 5 6 No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing. 7 */ 8 9 #ifndef VBP_LOADER_H 10 #define VBP_LOADER_H 11 12 #include <va/va.h> 13 14 #ifndef TRUE 15 #define TRUE 1 16 #endif 17 18 #ifndef FALSE 19 #define FALSE 0 20 #endif 21 22 23 #ifndef uint8 24 typedef unsigned char uint8; 25 #endif 26 #ifndef uint16 27 typedef unsigned short uint16; 28 #endif 29 #ifndef uint32 30 typedef unsigned int uint32; 31 #endif 32 #ifndef bool 33 typedef int bool; 34 #endif 35 36 typedef void *Handle; 37 38 /* 39 * MPEG-4 Part 2 data structure 40 */ 41 42 typedef struct _vbp_codec_data_mp42 43 { 44 uint8 profile_and_level_indication; 45 } vbp_codec_data_mp42; 46 47 typedef struct _vbp_slice_data_mp42 48 { 49 uint8* buffer_addr; 50 uint32 slice_offset; 51 uint32 slice_size; 52 VASliceParameterBufferMPEG4 slice_param; 53 } vbp_slice_data_mp42; 54 55 typedef struct _vbp_picture_data_mp42 56 { 57 uint8 vop_coded; 58 VAPictureParameterBufferMPEG4 picture_param; 59 VAIQMatrixBufferMPEG4 iq_matrix_buffer; 60 61 uint32 number_slices; 62 vbp_slice_data_mp42 *slice_data; 63 64 } vbp_picture_data_mp42; 65 66 typedef struct _vbp_data_mp42 67 { 68 vbp_codec_data_mp42 codec_data; 69 70 uint32 number_pictures; 71 vbp_picture_data_mp42 *picture_data; 72 73 } vbp_data_mp42; 74 75 /* 76 * H.264 data structure 77 */ 78 79 typedef struct _vbp_codec_data_h264 80 { 81 uint8 pic_parameter_set_id; 82 uint8 seq_parameter_set_id; 83 84 uint8 profile_idc; 85 uint8 level_idc; 86 uint8 constraint_set1_flag; 87 88 uint8 num_ref_frames; 89 uint8 gaps_in_frame_num_value_allowed_flag; 90 91 uint8 frame_mbs_only_flag; 92 uint8 mb_adaptive_frame_field_flag; 93 94 int frame_width; 95 int frame_height; 96 97 uint8 frame_cropping_flag; 98 int frame_crop_rect_left_offset; 99 int frame_crop_rect_right_offset; 100 int frame_crop_rect_top_offset; 101 int frame_crop_rect_bottom_offset; 102 103 uint8 vui_parameters_present_flag; 104 /* aspect ratio */ 105 uint8 aspect_ratio_info_present_flag; 106 uint8 aspect_ratio_idc; 107 uint16 sar_width; 108 uint16 sar_height; 109 110 /* video fromat */ 111 uint8 video_signal_type_present_flag; 112 uint8 video_format; 113 114 } vbp_codec_data_h264; 115 116 typedef struct _vbp_slice_data_h264 117 { 118 uint8* buffer_addr; 119 120 uint32 slice_offset; /* slice data offset */ 121 122 uint32 slice_size; /* slice data size */ 123 124 VASliceParameterBufferH264 slc_parms; 125 126 } vbp_slice_data_h264; 127 128 129 typedef struct _vbp_picture_data_h264 130 { 131 VAPictureParameterBufferH264* pic_parms; 132 133 uint32 num_slices; 134 135 vbp_slice_data_h264* slc_data; 136 137 } vbp_picture_data_h264; 138 139 140 typedef struct _vbp_data_h264 141 { 142 /* rolling counter of buffers sent by vbp_parse */ 143 uint32 buf_number; 144 145 uint32 num_pictures; 146 147 vbp_picture_data_h264* pic_data; 148 149 /** 150 * do we need to send matrix to VA for each picture? If not, we need 151 * a flag indicating whether it is updated. 152 */ 153 VAIQMatrixBufferH264* IQ_matrix_buf; 154 155 vbp_codec_data_h264* codec_data; 156 157 } vbp_data_h264; 158 159 /* 160 * vc1 data structure 161 */ 162 typedef struct _vbp_codec_data_vc1 163 { 164 /* Sequence layer. */ 165 uint8 PROFILE; 166 uint8 LEVEL; 167 uint8 POSTPROCFLAG; 168 uint8 PULLDOWN; 169 uint8 INTERLACE; 170 uint8 TFCNTRFLAG; 171 uint8 FINTERPFLAG; 172 uint8 PSF; 173 174 /* Entry point layer. */ 175 uint8 BROKEN_LINK; 176 uint8 CLOSED_ENTRY; 177 uint8 PANSCAN_FLAG; 178 uint8 REFDIST_FLAG; 179 uint8 LOOPFILTER; 180 uint8 FASTUVMC; 181 uint8 EXTENDED_MV; 182 uint8 DQUANT; 183 uint8 VSTRANSFORM; 184 uint8 OVERLAP; 185 uint8 QUANTIZER; 186 uint16 CODED_WIDTH; 187 uint16 CODED_HEIGHT; 188 uint8 EXTENDED_DMV; 189 uint8 RANGE_MAPY_FLAG; 190 uint8 RANGE_MAPY; 191 uint8 RANGE_MAPUV_FLAG; 192 uint8 RANGE_MAPUV; 193 194 /* Others. */ 195 uint8 RANGERED; 196 uint8 MAXBFRAMES; 197 uint8 MULTIRES; 198 uint8 SYNCMARKER; 199 uint8 RNDCTRL; 200 uint8 REFDIST; 201 uint16 widthMB; 202 uint16 heightMB; 203 204 uint8 INTCOMPFIELD; 205 uint8 LUMSCALE2; 206 uint8 LUMSHIFT2; 207 } vbp_codec_data_vc1; 208 209 typedef struct _vbp_slice_data_vc1 210 { 211 uint8 *buffer_addr; 212 uint32 slice_offset; 213 uint32 slice_size; 214 VASliceParameterBufferVC1 slc_parms; /* pointer to slice parms */ 215 } vbp_slice_data_vc1; 216 217 218 typedef struct _vbp_picture_data_vc1 219 { 220 uint32 picture_is_skipped; /* VC1_PTYPE_SKIPPED is PTYPE is skipped. */ 221 VAPictureParameterBufferVC1 *pic_parms; /* current parsed picture header */ 222 uint32 size_bitplanes; /* based on number of MBs */ 223 uint8 *packed_bitplanes; /* contains up to three bitplanes packed for libVA */ 224 uint32 num_slices; /* number of slices. always at least one */ 225 vbp_slice_data_vc1 *slc_data; /* pointer to array of slice data */ 226 } vbp_picture_data_vc1; 227 228 typedef struct _vbp_data_vc1 229 { 230 uint32 buf_number; /* rolling counter of buffers sent by vbp_parse */ 231 vbp_codec_data_vc1 *se_data; /* parsed SH/EPs */ 232 233 uint32 num_pictures; 234 235 vbp_picture_data_vc1* pic_data; 236 } vbp_data_vc1; 237 238 enum _picture_type 239 { 240 VC1_PTYPE_I, 241 VC1_PTYPE_P, 242 VC1_PTYPE_B, 243 VC1_PTYPE_BI, 244 VC1_PTYPE_SKIPPED 245 }; 246 247 enum _vbp_parser_error 248 { 249 VBP_OK, 250 VBP_TYPE, 251 VBP_LOAD, 252 VBP_UNLOAD, 253 VBP_INIT, 254 VBP_DATA, 255 VBP_DONE, 256 VBP_GLIB, 257 VBP_MEM, 258 VBP_PARM, 259 VBP_CXT, 260 VBP_IMPL 261 }; 262 263 enum _vbp_parser_type 264 { 265 VBP_VC1, 266 VBP_MPEG2, 267 VBP_MPEG4, 268 VBP_H264 269 }; 270 271 /* 272 * open video bitstream parser to parse a specific media type. 273 * @param parser_type: one of the types defined in #vbp_parser_type 274 * @param hcontext: pointer to hold returned VBP context handle. 275 * @return VBP_OK on success, anything else on failure. 276 * 277 */ 278 uint32 vbp_open(uint32 parser_type, Handle *hcontext); 279 280 /* 281 * close video bitstream parser. 282 * @param hcontext: VBP context handle. 283 * @returns VBP_OK on success, anything else on failure. 284 * 285 */ 286 uint32 vbp_close(Handle hcontext); 287 288 /* 289 * parse bitstream. 290 * @param hcontext: handle to VBP context. 291 * @param data: pointer to bitstream buffer. 292 * @param size: size of bitstream buffer. 293 * @param init_flag: 1 if buffer contains bitstream configuration data, 0 otherwise. 294 * @return VBP_OK on success, anything else on failure. 295 * 296 */ 297 uint32 vbp_parse(Handle hcontext, uint8 *data, uint32 size, uint8 init_data_flag); 298 299 /* 300 * query parsing result. 301 * @param hcontext: handle to VBP context. 302 * @param data: pointer to hold a data blob that contains parsing result. 303 * Structure of data blob is determined by the media type. 304 * @return VBP_OK on success, anything else on failure. 305 * 306 */ 307 uint32 vbp_query(Handle hcontext, void **data); 308 309 310 /* 311 * flush any un-parsed bitstream. 312 * @param hcontext: handle to VBP context. 313 * @returns VBP_OK on success, anything else on failure. 314 * 315 */ 316 uint32 vbp_flush(Handle hcontent); 317 318 #endif /* VBP_LOADER_H */ 319