Home | History | Annotate | Download | only in parser
      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 Intels 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 
     10 #include <glib.h>
     11 #include <dlfcn.h>
     12 
     13 #include <string.h>
     14 #include "vbp_loader.h"
     15 #include "vbp_utils.h"
     16 #include "vbp_mp42_parser.h"
     17 #include "../codecs/mp4/parser/viddec_mp4_parse.h"
     18 
     19 #define MIX_VBP_COMP 		"mixvbp"
     20 
     21 /*
     22  * Some divX avi files contains 2 frames in one gstbuffer.
     23  */
     24 #define MAX_NUM_PICTURES_MP42 8
     25 
     26 uint32 vbp_get_sc_pos_mp42(uint8 *buf, uint32 length,
     27 		uint32* sc_phase, uint32 *sc_end_pos, uint8 *is_normal_sc);
     28 
     29 void vbp_on_vop_mp42(vbp_context *pcontext, int list_index);
     30 void vbp_on_vop_svh_mp42(vbp_context *pcontext, int list_index);
     31 void vbp_dump_query_data(vbp_context *pcontext, int list_index);
     32 
     33 uint32 vbp_process_slices_mp42(vbp_context *pcontext, int list_index);
     34 uint32 vbp_process_slices_svh_mp42(vbp_context *pcontext, int list_index);
     35 
     36 /* This is coppied from DHG mp42 parser */
     37 static inline mp4_Status_t
     38 vbp_sprite_trajectory_mp42(void *parent, mp4_VideoObjectLayer_t *vidObjLay,
     39 		mp4_VideoObjectPlane_t *vidObjPlane);
     40 
     41 /* This is coppied from DHG mp42 parser */
     42 static inline int32_t vbp_sprite_dmv_length_mp42(void * parent,
     43 		int32_t *dmv_length);
     44 
     45 /**
     46  *
     47  */
     48 uint32 vbp_init_parser_entries_mp42( vbp_context *pcontext)
     49 {
     50 	if (NULL == pcontext->parser_ops)
     51 	{
     52 		/* absolutely impossible, just sanity check */
     53 		return VBP_PARM;
     54 	}
     55 	pcontext->parser_ops->init = dlsym(pcontext->fd_parser, "viddec_mp4_init");
     56 	if (pcontext->parser_ops->init == NULL)
     57 	{
     58 		ETRACE ("Failed to set entry point." );
     59 		return VBP_LOAD;
     60 	}
     61 
     62 	pcontext->parser_ops->parse_sc = dlsym(pcontext->fd_parser, "viddec_parse_sc_mp4");
     63 	if (pcontext->parser_ops->parse_sc == NULL)
     64 	{
     65 		ETRACE ("Failed to set entry point." );
     66 		return VBP_LOAD;
     67 	}
     68 
     69 	pcontext->parser_ops->parse_syntax = dlsym(pcontext->fd_parser, "viddec_mp4_parse");
     70 	if (pcontext->parser_ops->parse_syntax == NULL)
     71 	{
     72 		ETRACE ("Failed to set entry point." );
     73 		return VBP_LOAD;
     74 	}
     75 
     76 	pcontext->parser_ops->get_cxt_size = dlsym(pcontext->fd_parser, "viddec_mp4_get_context_size");
     77 	if (pcontext->parser_ops->get_cxt_size == NULL)
     78 	{
     79 		ETRACE ("Failed to set entry point." );
     80 		return VBP_LOAD;
     81 	}
     82 
     83 	pcontext->parser_ops->is_wkld_done = dlsym(pcontext->fd_parser, "viddec_mp4_wkld_done");
     84 	if (pcontext->parser_ops->is_wkld_done == NULL)
     85 	{
     86 		ETRACE ("Failed to set entry point." );
     87 		return VBP_LOAD;
     88 	}
     89 
     90 	return VBP_OK;
     91 }
     92 
     93 
     94 /*
     95  * For the codec_data passed by gstreamer
     96  */
     97 uint32 vbp_parse_init_data_mp42(vbp_context *pcontext)
     98 {
     99 	VTRACE ("begin\n");
    100 	vbp_parse_start_code_mp42(pcontext);
    101 	VTRACE ("end\n");
    102 
    103 	return VBP_OK;
    104 }
    105 
    106 uint32 vbp_process_parsing_result_mp42(vbp_context *pcontext, int list_index)
    107 {
    108 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    109 	viddec_mp4_parser_t *parser =
    110 			(viddec_mp4_parser_t *) &(pcontext->parser_cxt->codec_data[0]);
    111 
    112 	uint8 is_svh = 0;
    113 	uint32 current_sc = parser->current_sc;
    114 	is_svh = parser->cur_sc_prefix ? false : true;
    115 
    116 	VTRACE ("begin\n");
    117 
    118 	VTRACE ("current_sc = 0x%x  profile_and_level_indication = 0x%x\n",
    119 			parser->current_sc, parser->info.profile_and_level_indication);
    120 
    121 	if (!is_svh)
    122 	{
    123 		/* remove prefix from current_sc */
    124 		current_sc &= 0x0FF;
    125 		switch (current_sc)
    126 		{
    127 		case MP4_SC_VISUAL_OBJECT_SEQUENCE:
    128 			VTRACE ("MP4_SC_VISUAL_OBJECT_SEQUENCE\n");
    129 
    130 			query_data->codec_data.profile_and_level_indication
    131 					= parser->info.profile_and_level_indication;
    132 
    133 			break;
    134 		case MP4_SC_VIDEO_OBJECT_PLANE:
    135 			VTRACE ("MP4_SC_VIDEO_OBJECT_PLANE\n");
    136 			vbp_on_vop_mp42(pcontext, list_index);
    137 			break;
    138 		default: {
    139 			if ((current_sc >= MP4_SC_VIDEO_OBJECT_LAYER_MIN) && (current_sc
    140 					<= MP4_SC_VIDEO_OBJECT_LAYER_MAX)) {
    141 				query_data->codec_data.profile_and_level_indication
    142 						= parser->info.profile_and_level_indication;
    143 			} else if (current_sc <= MP4_SC_VIDEO_OBJECT_MAX) {
    144 				if (parser->sc_seen == MP4_SC_SEEN_SVH) {
    145 					VTRACE ("parser->sc_seen == MP4_SC_SEEN_SVH\n");
    146 					vbp_on_vop_svh_mp42(pcontext, list_index);
    147 				}
    148 			}
    149 		}
    150 			break;
    151 		}
    152 
    153 	} else {
    154 		if (parser->sc_seen == MP4_SC_SEEN_SVH) {
    155 			VTRACE ("parser->sc_seen == MP4_SC_SEEN_SVH\n");
    156 			vbp_on_vop_svh_mp42(pcontext, list_index);
    157 		}
    158 	}
    159 
    160 	VTRACE ("End\n");
    161 
    162 	return VBP_OK;
    163 }
    164 
    165 /*
    166  * This function fills viddec_pm_cxt_t by start codes
    167  * I may change the codes to make it more efficient later
    168  */
    169 
    170 uint32 vbp_parse_start_code_mp42(vbp_context *pcontext)
    171 {
    172 	viddec_pm_cxt_t *cxt = pcontext->parser_cxt;
    173 	/*viddec_parser_ops_t *func = pcontext->parser_ops; */
    174 	uint8 *buf = NULL;
    175 	uint32 size = 0;
    176 	uint32 sc_phase = 0;
    177 	uint32 sc_end_pos = -1;
    178 
    179 	uint32 bytes_parsed = 0;
    180 
    181 	viddec_mp4_parser_t *pinfo = NULL;
    182 
    183 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    184 	/* reset query data for the new sample buffer */
    185 	query_data->number_pictures = 0;
    186 
    187 	/* emulation prevention byte is always present */
    188 	cxt->getbits.is_emul_reqd = 1;
    189 
    190 	cxt->list.num_items = 0;
    191 	cxt->list.data[0].stpos = 0;
    192 	cxt->list.data[0].edpos = cxt->parse_cubby.size;
    193 
    194 	buf = cxt->parse_cubby.buf;
    195 	size = cxt->parse_cubby.size;
    196 
    197 	pinfo = (viddec_mp4_parser_t *) &(cxt->codec_data[0]);
    198 
    199 	uint8 is_normal_sc = 0;
    200 
    201 	uint32 found_sc = 0;
    202 
    203 	VTRACE ("begin cxt->parse_cubby.size= %d\n", size);
    204 
    205 	while (1) {
    206 
    207 		sc_phase = 0;
    208 
    209 		found_sc = vbp_get_sc_pos_mp42(buf + bytes_parsed, size
    210 				- bytes_parsed, &sc_phase, &sc_end_pos, &is_normal_sc);
    211 
    212 		if (found_sc) {
    213 
    214 			VTRACE ("sc_end_pos = %d\n", sc_end_pos);
    215 
    216 			cxt->list.data[cxt->list.num_items].stpos = bytes_parsed
    217 					+ sc_end_pos - 3;
    218 			if (cxt->list.num_items != 0) {
    219 				cxt->list.data[cxt->list.num_items - 1].edpos = bytes_parsed
    220 						+ sc_end_pos - 3;
    221 			}
    222 			bytes_parsed += sc_end_pos;
    223 
    224 			cxt->list.num_items++;
    225 			pinfo->cur_sc_prefix = is_normal_sc;
    226 
    227 		} else {
    228 
    229 			if (cxt->list.num_items != 0) {
    230 				cxt->list.data[cxt->list.num_items - 1].edpos
    231 						= cxt->parse_cubby.size;
    232 				break;
    233 			} else {
    234 
    235 				VTRACE ("I didn't find any sc in cubby buffer! The size of cubby is %d\n",
    236 						size);
    237 
    238 				cxt->list.num_items = 1;
    239 				cxt->list.data[0].stpos = 0;
    240 				cxt->list.data[0].edpos = cxt->parse_cubby.size;
    241 				break;
    242 			}
    243 		}
    244 	}
    245 
    246 	return VBP_OK;
    247 }
    248 
    249 uint32 vbp_populate_query_data_mp42(vbp_context *pcontext)
    250 {
    251 #if 0
    252 	vbp_dump_query_data(pcontext);
    253 #endif
    254 	return VBP_OK;
    255 }
    256 
    257 void vbp_fill_codec_data(vbp_context *pcontext, int list_index)
    258 {
    259 
    260 	/* fill vbp_codec_data_mp42 data */
    261 	viddec_mp4_parser_t *parser =
    262 			(viddec_mp4_parser_t *) &(pcontext->parser_cxt->codec_data[0]);
    263 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    264 	query_data->codec_data.profile_and_level_indication
    265 			= parser->info.profile_and_level_indication;
    266 }
    267 
    268 void vbp_fill_slice_data(vbp_context *pcontext, int list_index)
    269 {
    270 
    271 	viddec_mp4_parser_t *parser =
    272 			(viddec_mp4_parser_t *) &(pcontext->parser_cxt->codec_data[0]);
    273 
    274 	if (!parser->info.VisualObject.VideoObject.short_video_header) {
    275 		vbp_process_slices_mp42(pcontext, list_index);
    276 	} else {
    277 		vbp_process_slices_svh_mp42(pcontext, list_index);
    278 	}
    279 }
    280 
    281 void vbp_fill_picture_param(vbp_context *pcontext, int list_index)
    282 {
    283 
    284 	viddec_mp4_parser_t *parser =
    285 			(viddec_mp4_parser_t *) &(pcontext->parser_cxt->codec_data[0]);
    286 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    287 
    288 	vbp_picture_data_mp42 *picture_data = NULL;
    289 	VAPictureParameterBufferMPEG4 *picture_param = NULL;
    290 
    291 	picture_data = &(query_data->picture_data[query_data->number_pictures]);
    292 
    293 	picture_param = &(picture_data->picture_param);
    294 
    295 	uint8 idx = 0;
    296 
    297 	picture_data->vop_coded
    298 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.vop_coded;
    299 	VTRACE ("vop_coded = %d\n", picture_data->vop_coded);
    300 
    301 	/*
    302 	 * fill picture_param
    303 	 */
    304 
    305 	/* NOTE: for short video header, the parser saves vop_width and vop_height
    306 	 * to VOL->video_object_layer_width and VOL->video_object_layer_height
    307 	 */
    308 	picture_param->vop_width
    309 			= parser->info.VisualObject.VideoObject.video_object_layer_width;
    310 	picture_param->vop_height
    311 			= parser->info.VisualObject.VideoObject.video_object_layer_height;
    312 
    313 	picture_param->forward_reference_picture = VA_INVALID_SURFACE;
    314 	picture_param->backward_reference_picture = VA_INVALID_SURFACE;
    315 
    316 	/*
    317 	 * VAPictureParameterBufferMPEG4::vol_fields
    318 	 */
    319 	picture_param->vol_fields.bits.short_video_header
    320 			= parser->info.VisualObject.VideoObject.short_video_header;
    321 	picture_param->vol_fields.bits.chroma_format
    322 			= parser->info.VisualObject.VideoObject.VOLControlParameters.chroma_format;
    323 
    324 	/* TODO: find out why testsuite always set this value to be 0 */
    325 	//	picture_param->vol_fields.bits.chroma_format = 0;
    326 
    327 	picture_param->vol_fields.bits.interlaced
    328 			= parser->info.VisualObject.VideoObject.interlaced;
    329 	picture_param->vol_fields.bits.obmc_disable
    330 			= parser->info.VisualObject.VideoObject.obmc_disable;
    331 	picture_param->vol_fields.bits.sprite_enable
    332 			= parser->info.VisualObject.VideoObject.sprite_enable;
    333 	picture_param->vol_fields.bits.sprite_warping_accuracy
    334 			= parser->info.VisualObject.VideoObject.sprite_info.sprite_warping_accuracy;
    335 	picture_param->vol_fields.bits.quant_type
    336 			= parser->info.VisualObject.VideoObject.quant_type;
    337 	picture_param->vol_fields.bits.quarter_sample
    338 			= parser->info.VisualObject.VideoObject.quarter_sample;
    339 	picture_param->vol_fields.bits.data_partitioned
    340 			= parser->info.VisualObject.VideoObject.data_partitioned;
    341 	picture_param->vol_fields.bits.reversible_vlc
    342 			= parser->info.VisualObject.VideoObject.reversible_vlc;
    343 	picture_param->vol_fields.bits.resync_marker_disable
    344 			= parser->info.VisualObject.VideoObject.resync_marker_disable;
    345 
    346 	picture_param->no_of_sprite_warping_points
    347 			= parser->info.VisualObject.VideoObject.sprite_info.no_of_sprite_warping_points;
    348 
    349 	for (idx = 0; idx < 3; idx++) {
    350 		picture_param->sprite_trajectory_du[idx]
    351 				= parser->info.VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_du[idx];
    352 		picture_param->sprite_trajectory_dv[idx]
    353 				= parser->info.VisualObject.VideoObject.VideoObjectPlane.warping_mv_code_dv[idx];
    354 	}
    355 
    356 	picture_param->quant_precision
    357 			= parser->info.VisualObject.VideoObject.quant_precision;
    358 
    359 	/*
    360 	 *  VAPictureParameterBufferMPEG4::vop_fields
    361 	 */
    362 
    363 	if (!parser->info.VisualObject.VideoObject.short_video_header) {
    364 		picture_param->vop_fields.bits.vop_coding_type
    365 				= parser->info.VisualObject.VideoObject.VideoObjectPlane.vop_coding_type;
    366 	} else {
    367 		picture_param->vop_fields.bits.vop_coding_type
    368 				= parser->info.VisualObject.VideoObject.VideoObjectPlaneH263.picture_coding_type;
    369 	}
    370 
    371 	/* TODO:
    372 	 * fill picture_param->vop_fields.bits.backward_reference_vop_coding_type
    373 	 * This shall be done in mixvideoformat_mp42. See M42 spec 7.6.7
    374 	 */
    375 
    376 	if (picture_param->vop_fields.bits.vop_coding_type != MP4_VOP_TYPE_B) {
    377 		picture_param->vop_fields.bits.backward_reference_vop_coding_type
    378 				= picture_param->vop_fields.bits.vop_coding_type;
    379 	}
    380 
    381 	picture_param->vop_fields.bits.vop_rounding_type
    382 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.vop_rounding_type;
    383 	picture_param->vop_fields.bits.intra_dc_vlc_thr
    384 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.intra_dc_vlc_thr;
    385 	picture_param->vop_fields.bits.top_field_first
    386 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.top_field_first;
    387 	picture_param->vop_fields.bits.alternate_vertical_scan_flag
    388 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.alternate_vertical_scan_flag;
    389 
    390 	picture_param->vop_fcode_forward
    391 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.vop_fcode_forward;
    392 	picture_param->vop_fcode_backward
    393 			= parser->info.VisualObject.VideoObject.VideoObjectPlane.vop_fcode_backward;
    394 	picture_param->vop_time_increment_resolution
    395 			= parser->info.VisualObject.VideoObject.vop_time_increment_resolution;
    396 
    397 	/* short header related */
    398 	picture_param->num_gobs_in_vop
    399 			= parser->info.VisualObject.VideoObject.VideoObjectPlaneH263.num_gobs_in_vop;
    400 	picture_param->num_macroblocks_in_gob
    401 			= parser->info.VisualObject.VideoObject.VideoObjectPlaneH263.num_macroblocks_in_gob;
    402 
    403 	/* for direct mode prediction */
    404 	picture_param->TRB = parser->info.VisualObject.VideoObject.TRB;
    405 	picture_param->TRD = parser->info.VisualObject.VideoObject.TRD;
    406 
    407 #if 0
    408 	printf(
    409 			"parser->info.VisualObject.VideoObject.reduced_resolution_vop_enable = %d\n",
    410 			parser->info.VisualObject.VideoObject.reduced_resolution_vop_enable);
    411 
    412 	printf("parser->info.VisualObject.VideoObject.data_partitioned = %d\n",
    413 			parser->info.VisualObject.VideoObject.data_partitioned);
    414 
    415 	printf(
    416 			"####parser->info.VisualObject.VideoObject.resync_marker_disable = %d####\n",
    417 			parser->info.VisualObject.VideoObject.resync_marker_disable);
    418 #endif
    419 }
    420 
    421 void vbp_fill_iq_matrix_buffer(vbp_context *pcontext, int list_index)
    422 {
    423 
    424 	viddec_mp4_parser_t *parser =
    425 			(viddec_mp4_parser_t *) &(pcontext->parser_cxt->codec_data[0]);
    426 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    427 
    428 	mp4_VOLQuant_mat_t *quant_mat_info =
    429 			&(parser->info.VisualObject.VideoObject.quant_mat_info);
    430 
    431 	vbp_picture_data_mp42 *picture_data = NULL;
    432 	VAIQMatrixBufferMPEG4 *iq_matrix = NULL;
    433 
    434 	picture_data = &(query_data->picture_data[query_data->number_pictures]);
    435 	iq_matrix = &(picture_data->iq_matrix_buffer);
    436 
    437 	iq_matrix->load_intra_quant_mat = quant_mat_info->load_intra_quant_mat;
    438 	iq_matrix->load_non_intra_quant_mat
    439 			= quant_mat_info->load_nonintra_quant_mat;
    440 	memcpy(iq_matrix->intra_quant_mat, quant_mat_info->intra_quant_mat, 64);
    441 	memcpy(iq_matrix->non_intra_quant_mat, quant_mat_info->nonintra_quant_mat,
    442 			64);
    443 }
    444 
    445 void vbp_on_vop_mp42(vbp_context *pcontext, int list_index)
    446 {
    447 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    448 
    449 	vbp_fill_codec_data(pcontext, list_index);
    450 
    451 	vbp_fill_picture_param(pcontext, list_index);
    452 	vbp_fill_iq_matrix_buffer(pcontext, list_index);
    453 	vbp_fill_slice_data(pcontext, list_index);
    454 
    455 	query_data->number_pictures++;
    456 }
    457 
    458 void vbp_on_vop_svh_mp42(vbp_context *pcontext, int list_index)
    459 {
    460 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    461 
    462 	vbp_fill_codec_data(pcontext, list_index);
    463 
    464 	vbp_fill_picture_param(pcontext, list_index);
    465 	vbp_fill_iq_matrix_buffer(pcontext, list_index);
    466 	vbp_fill_slice_data(pcontext, list_index);
    467 
    468 	query_data->number_pictures++;
    469 }
    470 
    471 uint32 vbp_get_sc_pos_mp42(
    472 	uint8 *buf,
    473 	uint32 length,
    474 	uint32* sc_phase,
    475 	uint32 *sc_end_pos,
    476 	uint8 *is_normal_sc)
    477 {
    478 	uint8 *ptr = buf;
    479 	uint32 size;
    480 	uint32 data_left = 0, phase = 0, ret = 0;
    481 	size = 0;
    482 
    483 	data_left = length;
    484 	phase = *sc_phase;
    485 	*sc_end_pos = -1;
    486 
    487 	/* parse until there is more data and start code not found */
    488 	while ((data_left > 0) && (phase < 3)) {
    489 		/* Check if we are byte aligned & phase=0, if thats the case we can check
    490 		 work at a time instead of byte*/
    491 		if (((((uint32) ptr) & 0x3) == 0) && (phase == 0)) {
    492 			while (data_left > 3) {
    493 				uint32 data;
    494 				char mask1 = 0, mask2 = 0;
    495 
    496 				data = *((uint32 *) ptr);
    497 #ifndef MFDBIGENDIAN
    498 				data = SWAP_WORD(data);
    499 #endif
    500 				mask1 = (FIRST_STARTCODE_BYTE != (data & SC_BYTE_MASK0));
    501 				mask2 = (FIRST_STARTCODE_BYTE != (data & SC_BYTE_MASK1));
    502 				/* If second byte and fourth byte are not zero's then we cannot have a start code here as we need
    503 				 two consecutive zero bytes for a start code pattern */
    504 				if (mask1 && mask2) {/* Success so skip 4 bytes and start over */
    505 					ptr += 4;
    506 					size += 4;
    507 					data_left -= 4;
    508 					continue;
    509 				} else {
    510 					break;
    511 				}
    512 			}
    513 		}
    514 
    515 		/* At this point either data is not on a word boundary or phase > 0 or On a word boundary but we detected
    516 		 two zero bytes in the word so we look one byte at a time*/
    517 		if (data_left > 0) {
    518 			if (*ptr == FIRST_STARTCODE_BYTE) {/* Phase can be 3 only if third start code byte is found */
    519 				phase++;
    520 				ptr++;
    521 				size++;
    522 				data_left--;
    523 				if (phase > 2) {
    524 					phase = 2;
    525 
    526 					if ((((uint32) ptr) & 0x3) == 0) {
    527 						while (data_left > 3) {
    528 							if (*((uint32 *) ptr) != 0) {
    529 								break;
    530 							}
    531 							ptr += 4;
    532 							size += 4;
    533 							data_left -= 4;
    534 						}
    535 					}
    536 				}
    537 			} else {
    538 				uint8 normal_sc = 0, short_sc = 0;
    539 				if (phase == 2) {
    540 					normal_sc = (*ptr == THIRD_STARTCODE_BYTE);
    541 					short_sc = (SHORT_THIRD_STARTCODE_BYTE == (*ptr & 0xFC));
    542 
    543 					VTRACE ("short_sc = %d\n", short_sc);
    544 
    545 					*is_normal_sc = normal_sc;
    546 				}
    547 
    548 				if (!(normal_sc | short_sc)) {
    549 					phase = 0;
    550 				} else {/* Match for start code so update context with byte position */
    551 					*sc_end_pos = size;
    552 					phase = 3;
    553 
    554 					if (normal_sc) {
    555 					} else {
    556 						/* For short start code since start code is in one nibble just return at this point */
    557 						phase += 1;
    558 						ret = 1;
    559 						break;
    560 					}
    561 				}
    562 				ptr++;
    563 				size++;
    564 				data_left--;
    565 			}
    566 		}
    567 	}
    568 	if ((data_left > 0) && (phase == 3)) {
    569 		(*sc_end_pos)++;
    570 		phase++;
    571 		ret = 1;
    572 	}
    573 	*sc_phase = phase;
    574 	/* Return SC found only if phase is 4, else always success */
    575 	return ret;
    576 }
    577 
    578 uint32 vbp_macroblock_number_length_mp42(uint32 numOfMbs)
    579 {
    580 	uint32 length = 0;
    581 	numOfMbs--;
    582 	do {
    583 		numOfMbs >>= 1;
    584 		length++;
    585 	} while (numOfMbs);
    586 	return length;
    587 }
    588 
    589 mp4_Status_t vbp_video_packet_header_mp42(
    590 	void *parent,
    591 	viddec_mp4_parser_t *parser_cxt,
    592 	uint16_t *quant_scale,
    593 	uint32 *macroblock_number)
    594 {
    595 
    596 	mp4_Status_t ret = MP4_STATUS_OK;
    597 	mp4_Info_t *pInfo = &(parser_cxt->info);
    598 	mp4_VideoObjectLayer_t *vidObjLay = &(pInfo->VisualObject.VideoObject);
    599 	mp4_VideoObjectPlane_t *vidObjPlane =
    600 			&(pInfo->VisualObject.VideoObject.VideoObjectPlane);
    601 
    602 	uint32 code = 0;
    603 	int32_t getbits = 0;
    604 
    605 	uint16_t _quant_scale = 0;
    606 	uint32 _macroblock_number = 0;
    607 	uint32 header_extension_codes = 0;
    608 	uint8 vop_coding_type = vidObjPlane->vop_coding_type;
    609 
    610 	do {
    611 		if (vidObjLay->video_object_layer_shape != MP4_SHAPE_TYPE_RECTANGULAR) {
    612 			ret = MP4_STATUS_NOTSUPPORT;
    613 			break;
    614 		}
    615 
    616 		/* get macroblock_number */
    617 		{
    618 			uint16_t mbs_x = (vidObjLay->video_object_layer_width + 15) >> 4;
    619 			uint16_t mbs_y = (vidObjLay->video_object_layer_height + 15) >> 4;
    620 			uint32 length = vbp_macroblock_number_length_mp42(mbs_x
    621 					* mbs_y);
    622 
    623 			getbits = viddec_pm_get_bits(parent, &code, length);
    624 			BREAK_GETBITS_FAIL(getbits, ret);
    625 
    626 			length = code;
    627 		}
    628 
    629 		/* quant_scale */
    630 		if (vidObjLay->video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY) {
    631 			getbits = viddec_pm_get_bits(parent, &code,
    632 					vidObjLay->quant_precision);
    633 			BREAK_GETBITS_FAIL(getbits, ret);
    634 			_quant_scale = code;
    635 		}
    636 
    637 		/* header_extension_codes */
    638 		if (vidObjLay->video_object_layer_shape == MP4_SHAPE_TYPE_RECTANGULAR) {
    639 			getbits = viddec_pm_get_bits(parent, &code, 1);
    640 			BREAK_GETBITS_FAIL(getbits, ret);
    641 			header_extension_codes = code;
    642 		}
    643 
    644 		if (header_extension_codes) {
    645 			do {
    646 				getbits = viddec_pm_get_bits(parent, &code, 1);
    647 				BREAK_GETBITS_FAIL(getbits, ret);
    648 			} while (code);
    649 
    650 			/* marker_bit */
    651 			getbits = viddec_pm_get_bits(parent, &code, 1);
    652 			BREAK_GETBITS_FAIL(getbits, ret);
    653 
    654 			/* vop_time_increment */
    655 			{
    656 				uint32 numbits = 0;
    657 				numbits = vidObjLay->vop_time_increment_resolution_bits;
    658 				if (numbits == 0) {
    659 					numbits = 1;
    660 				}
    661 				getbits = viddec_pm_get_bits(parent, &code, numbits);
    662 				BREAK_GETBITS_FAIL(getbits, ret);
    663 			}
    664 			/* marker_bit */
    665 			getbits = viddec_pm_get_bits(parent, &code, 1);
    666 			BREAK_GETBITS_FAIL(getbits, ret);
    667 
    668 			/* vop_coding_type */
    669 			getbits = viddec_pm_get_bits(parent, &code, 2);
    670 			BREAK_GETBITS_FAIL(getbits, ret);
    671 
    672 			vop_coding_type = code & 0x3;
    673 
    674 		/* Fixed Klocwork issue: Code is unreachable.
    675 		 * Comment the following codes because we have
    676 		 * already checked video_object_layer_shape
    677 		 */
    678 		 /* if (vidObjLay->video_object_layer_shape
    679 					!= MP4_SHAPE_TYPE_RECTANGULAR) {
    680 				ret = MP4_STATUS_NOTSUPPORT;
    681 				break;
    682 			}
    683 		 */
    684 			if (vidObjLay->video_object_layer_shape
    685 					!= MP4_SHAPE_TYPE_BINARYONLY) {
    686 				/* intra_dc_vlc_thr */
    687 				getbits = viddec_pm_get_bits(parent, &code, 3);
    688 				BREAK_GETBITS_FAIL(getbits, ret);
    689 				if ((vidObjLay->sprite_enable == MP4_SPRITE_GMC)
    690 						&& (vop_coding_type == MP4_VOP_TYPE_S)
    691 						&& (vidObjLay->sprite_info.no_of_sprite_warping_points
    692 								> 0)) {
    693 					if (vbp_sprite_trajectory_mp42(parent, vidObjLay,
    694 							vidObjPlane) != MP4_STATUS_OK) {
    695 						break;
    696 					}
    697 				}
    698 
    699 				if (vidObjLay->reduced_resolution_vop_enable
    700 						&& (vidObjLay->video_object_layer_shape
    701 								== MP4_SHAPE_TYPE_RECTANGULAR)
    702 						&& ((vop_coding_type == MP4_VOP_TYPE_I)
    703 								|| (vop_coding_type == MP4_VOP_TYPE_P))) {
    704 					/* vop_reduced_resolution */
    705 					getbits = viddec_pm_get_bits(parent, &code, 1);
    706 					BREAK_GETBITS_FAIL(getbits, ret);
    707 				}
    708 
    709 				if (vop_coding_type == MP4_VOP_TYPE_I) {
    710 					/* vop_fcode_forward */
    711 					getbits = viddec_pm_get_bits(parent, &code, 3);
    712 					BREAK_GETBITS_FAIL(getbits, ret);
    713 				}
    714 
    715 				if (vop_coding_type == MP4_VOP_TYPE_B) {
    716 					/* vop_fcode_backward */
    717 					getbits = viddec_pm_get_bits(parent, &code, 3);
    718 					BREAK_GETBITS_FAIL(getbits, ret);
    719 				}
    720 			}
    721 		}
    722 
    723 		if (vidObjLay->newpred_enable) {
    724 			/* New pred mode not supported in HW, but, does libva support this? */
    725 			ret = MP4_STATUS_NOTSUPPORT;
    726 			break;
    727 		}
    728 
    729 		*quant_scale = _quant_scale;
    730 		*macroblock_number = _macroblock_number;
    731 	} while (0);
    732 	return ret;
    733 }
    734 
    735 uint32 vbp_resync_marker_Length_mp42(viddec_mp4_parser_t *parser_cxt)
    736 {
    737 
    738 	mp4_Info_t *pInfo = &(parser_cxt->info);
    739 	mp4_VideoObjectPlane_t *vidObjPlane =
    740 			&(pInfo->VisualObject.VideoObject.VideoObjectPlane);
    741 
    742 	uint32 resync_marker_length = 0;
    743 	if (vidObjPlane->vop_coding_type == MP4_VOP_TYPE_I) {
    744 		resync_marker_length = 17;
    745 	} else if (vidObjPlane->vop_coding_type == MP4_VOP_TYPE_B) {
    746 		uint8 fcode_max = vidObjPlane->vop_fcode_forward;
    747 		if (fcode_max < vidObjPlane->vop_fcode_backward) {
    748 			fcode_max = vidObjPlane->vop_fcode_backward;
    749 		}
    750 		resync_marker_length = 16 + fcode_max;
    751 	} else {
    752 		resync_marker_length = 16 + vidObjPlane->vop_fcode_forward;
    753 	}
    754 	return resync_marker_length;
    755 }
    756 
    757 uint32 vbp_process_slices_svh_mp42(vbp_context *pcontext, int list_index)
    758 {
    759 	uint32 ret = MP4_STATUS_OK;
    760 
    761 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    762 	viddec_pm_cxt_t *parent = pcontext->parser_cxt;
    763 	viddec_mp4_parser_t *parser_cxt =
    764 			(viddec_mp4_parser_t *) &(parent->codec_data[0]);
    765 
    766 	VTRACE ("begin\n");
    767 
    768 	vbp_picture_data_mp42 *picture_data =
    769 			&(query_data->picture_data[query_data->number_pictures]);
    770 	vbp_slice_data_mp42 *slice_data = &(picture_data->slice_data[0]);
    771 	VASliceParameterBufferMPEG4* slice_param = &(slice_data->slice_param);
    772 
    773 	picture_data->number_slices = 1;
    774 
    775 	uint8 is_emul = 0;
    776 	uint32 bit_offset = 0;
    777 	uint32 byte_offset = 0;
    778 
    779 	/* The offsets are relative to parent->parse_cubby.buf */
    780 	viddec_pm_get_au_pos(parent, &bit_offset, &byte_offset, &is_emul);
    781 
    782 	slice_data->buffer_addr = parent->parse_cubby.buf;
    783 
    784 	slice_data->slice_offset = byte_offset
    785 			+ parent->list.data[list_index].stpos;
    786 	slice_data->slice_size = parent->list.data[list_index].edpos
    787 			- parent->list.data[list_index].stpos - byte_offset;
    788 
    789 	slice_param->slice_data_size = slice_data->slice_size;
    790 	slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
    791 	slice_param->slice_data_offset = 0;
    792 	slice_param->macroblock_offset = bit_offset;
    793 	slice_param->macroblock_number = 0;
    794 	slice_param->quant_scale
    795 			= parser_cxt->info.VisualObject.VideoObject.VideoObjectPlaneH263.vop_quant;
    796 
    797 	VTRACE ("end\n");
    798 
    799 	return ret;
    800 }
    801 
    802 mp4_Status_t vbp_process_slices_mp42(vbp_context *pcontext, int list_index)
    803 {
    804 
    805 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
    806 	viddec_pm_cxt_t *parent = pcontext->parser_cxt;
    807 	viddec_mp4_parser_t *parser_cxt =
    808 			(viddec_mp4_parser_t *) &(parent->codec_data[0]);
    809 
    810 	vbp_picture_data_mp42 *picture_data = NULL;
    811 	vbp_slice_data_mp42 *slice_data = NULL;
    812 	VASliceParameterBufferMPEG4* slice_param = NULL;
    813 
    814 	uint32 ret = MP4_STATUS_OK;
    815 
    816 	uint8 is_emul = 0;
    817 	uint32 bit_offset = 0;
    818 	uint32 byte_offset = 0;
    819 
    820 	uint32 code = 0;
    821 	int32_t getbits = 0;
    822 	uint32 resync_marker_length = 0;
    823 
    824 	uint32 slice_index = 0;
    825 
    826 #ifdef VBP_TRACE
    827 	uint32 list_size_at_index = parent->list.data[list_index].edpos
    828 	- parent->list.data[list_index].stpos;
    829 #endif
    830 
    831 	VTRACE ("list_index = %d list_size_at_index = %d\n", list_index,
    832 			list_size_at_index);
    833 
    834 	VTRACE ("list_index = %d edpos = %d stpos = %d\n", list_index,
    835 			parent->list.data[list_index].edpos,
    836 			parent->list.data[list_index].stpos);
    837 
    838 	/* The offsets are relative to parent->parse_cubby.buf */
    839 	viddec_pm_get_au_pos(parent, &bit_offset, &byte_offset, &is_emul);
    840 
    841 #if 0
    842 	if (is_emul) {
    843 		g_print("*** emul != 0\n");
    844 		/*byte_offset += 1;*/
    845 	}
    846 #endif
    847 
    848 	picture_data = &(query_data->picture_data[query_data->number_pictures]);
    849 	slice_data = &(picture_data->slice_data[slice_index]);
    850 	slice_param = &(slice_data->slice_param);
    851 
    852 	slice_data->buffer_addr = parent->parse_cubby.buf;
    853 
    854 	slice_data->slice_offset = byte_offset
    855 			+ parent->list.data[list_index].stpos;
    856 	slice_data->slice_size = parent->list.data[list_index].edpos
    857 			- parent->list.data[list_index].stpos - byte_offset;
    858 
    859 	slice_param->slice_data_size = slice_data->slice_size;
    860 	slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
    861 	slice_param->slice_data_offset = 0;
    862 	slice_param->macroblock_offset = bit_offset;
    863 	slice_param->macroblock_number = 0;
    864 	slice_param->quant_scale
    865 			= parser_cxt->info.VisualObject.VideoObject.VideoObjectPlane.vop_quant;
    866 
    867 	slice_index++;
    868 	picture_data->number_slices = slice_index;
    869 
    870 	/*
    871 	 * scan for resync_marker
    872 	 */
    873 
    874 	if (!parser_cxt->info.VisualObject.VideoObject.resync_marker_disable) {
    875 
    876 		viddec_pm_get_au_pos(parent, &bit_offset, &byte_offset, &is_emul);
    877 		if (bit_offset) {
    878 			getbits = viddec_pm_get_bits(parent, &code, 8 - bit_offset);
    879 			if (getbits == -1) {
    880 				ret = MP4_STATUS_PARSE_ERROR;
    881 				return ret;
    882 			}
    883 		}
    884 
    885 		/*
    886 		 * get resync_marker_length
    887 		 */
    888 		resync_marker_length = vbp_resync_marker_Length_mp42(parser_cxt);
    889 
    890 		while (1) {
    891 
    892 			uint16_t quant_scale = 0;
    893 			uint32 macroblock_number = 0;
    894 
    895 			getbits = viddec_pm_peek_bits(parent, &code, resync_marker_length);
    896 			BREAK_GETBITS_FAIL(getbits, ret);
    897 
    898 			if (code != 1) {
    899 				getbits = viddec_pm_get_bits(parent, &code, 8);
    900 				BREAK_GETBITS_FAIL(getbits, ret);
    901 				continue;
    902 			}
    903 
    904 			/*
    905 			 * We found resync_marker
    906 			 */
    907 
    908 			viddec_pm_get_au_pos(parent, &bit_offset, &byte_offset, &is_emul);
    909 
    910 			slice_data->slice_size -= (parent->list.data[list_index].edpos
    911 					- parent->list.data[list_index].stpos - byte_offset);
    912 			slice_param->slice_data_size = slice_data->slice_size;
    913 
    914 			slice_data = &(picture_data->slice_data[slice_index]);
    915 			slice_param = &(slice_data->slice_param);
    916 
    917 			/*
    918 			 * parse video_packet_header
    919 			 */
    920 			getbits = viddec_pm_get_bits(parent, &code, resync_marker_length);
    921 			BREAK_GETBITS_FAIL(getbits, ret);
    922 
    923 			vbp_video_packet_header_mp42(parent, parser_cxt,
    924 					&quant_scale, &macroblock_number);
    925 
    926 			viddec_pm_get_au_pos(parent, &bit_offset, &byte_offset, &is_emul);
    927 
    928 			slice_data->buffer_addr = parent->parse_cubby.buf;
    929 
    930 			slice_data->slice_offset = byte_offset
    931 					+ parent->list.data[list_index].stpos;
    932 			slice_data->slice_size = parent->list.data[list_index].edpos
    933 					- parent->list.data[list_index].stpos - byte_offset;
    934 
    935 			slice_param->slice_data_size = slice_data->slice_size;
    936 			slice_param->slice_data_flag = VA_SLICE_DATA_FLAG_ALL;
    937 			slice_param->slice_data_offset = 0;
    938 			slice_param->macroblock_offset = bit_offset;
    939 			slice_param->macroblock_number = macroblock_number;
    940 			slice_param->quant_scale = quant_scale;
    941 
    942 			slice_index++;
    943 
    944 			if (slice_index >= MAX_NUM_SLICES) {
    945 				ret = MP4_STATUS_PARSE_ERROR;
    946 				break;
    947 			}
    948 
    949 			picture_data->number_slices = slice_index;
    950 		}
    951 	}
    952 	return ret;
    953 }
    954 
    955 /* This is coppied from DHG MP42 parser */
    956 static inline int32_t vbp_sprite_dmv_length_mp42(
    957 	void * parent,
    958 	int32_t *dmv_length)
    959 {
    960 	uint32 code, skip;
    961 	int32_t getbits = 0;
    962 	mp4_Status_t ret = MP4_STATUS_PARSE_ERROR;
    963 	*dmv_length = 0;
    964 	skip = 3;
    965 	do {
    966 		getbits = viddec_pm_peek_bits(parent, &code, skip);
    967 		BREAK_GETBITS_FAIL(getbits, ret);
    968 
    969 		if (code == 7) {
    970 			viddec_pm_skip_bits(parent, skip);
    971 			getbits = viddec_pm_peek_bits(parent, &code, 9);
    972 			BREAK_GETBITS_FAIL(getbits, ret);
    973 
    974 			skip = 1;
    975 			while ((code & 256) != 0) {/* count number of 1 bits */
    976 				code <<= 1;
    977 				skip++;
    978 			}
    979 			*dmv_length = 5 + skip;
    980 		} else {
    981 			skip = (code <= 1) ? 2 : 3;
    982 			*dmv_length = code - 1;
    983 		}
    984 		viddec_pm_skip_bits(parent, skip);
    985 		ret = MP4_STATUS_OK;
    986 
    987 	} while (0);
    988 	return ret;
    989 }
    990 
    991 /* This is coppied from DHG MP42 parser */
    992 static inline mp4_Status_t vbp_sprite_trajectory_mp42(
    993 	void *parent,
    994 	mp4_VideoObjectLayer_t *vidObjLay,
    995 	mp4_VideoObjectPlane_t *vidObjPlane)
    996 {
    997 	uint32 code, i;
    998 	int32_t dmv_length = 0, dmv_code = 0, getbits = 0;
    999 	mp4_Status_t ret = MP4_STATUS_OK;
   1000 	for (i = 0; i
   1001 			< (uint32) vidObjLay->sprite_info.no_of_sprite_warping_points; i++) {
   1002 		ret = vbp_sprite_dmv_length_mp42(parent, &dmv_length);
   1003 		if (ret != MP4_STATUS_OK) {
   1004 			break;
   1005 		}
   1006 		if (dmv_length <= 0) {
   1007 			dmv_code = 0;
   1008 		} else {
   1009 			getbits = viddec_pm_get_bits(parent, &code, (uint32) dmv_length);
   1010 			BREAK_GETBITS_FAIL(getbits, ret);
   1011 			dmv_code = (int32_t) code;
   1012 			if ((dmv_code & (1 << (dmv_length - 1))) == 0) {
   1013 				dmv_code -= (1 << dmv_length) - 1;
   1014 			}
   1015 		}
   1016 		getbits = viddec_pm_get_bits(parent, &code, 1);
   1017 		BREAK_GETBITS_FAIL(getbits, ret);
   1018 		if (code != 1) {
   1019 			ret = MP4_STATUS_PARSE_ERROR;
   1020 			break;
   1021 		}
   1022 		vidObjPlane->warping_mv_code_du[i] = dmv_code;
   1023 		/* TODO: create another inline function to avoid code duplication */
   1024 		ret = vbp_sprite_dmv_length_mp42(parent, &dmv_length);
   1025 		if (ret != MP4_STATUS_OK) {
   1026 			break;
   1027 		}
   1028 		if (dmv_length <= 0) {
   1029 			dmv_code = 0;
   1030 		} else {
   1031 			getbits = viddec_pm_get_bits(parent, &code, (uint32) dmv_length);
   1032 			BREAK_GETBITS_FAIL(getbits, ret);
   1033 			dmv_code = (int32_t) code;
   1034 			if ((dmv_code & (1 << (dmv_length - 1))) == 0) {
   1035 				dmv_code -= (1 << dmv_length) - 1;
   1036 			}
   1037 		}
   1038 		getbits = viddec_pm_get_bits(parent, &code, 1);
   1039 		BREAK_GETBITS_FAIL(getbits, ret);
   1040 		if (code != 1) {
   1041 			ret = MP4_STATUS_PARSE_ERROR;
   1042 			break;
   1043 		}
   1044 		vidObjPlane->warping_mv_code_dv[i] = dmv_code;
   1045 
   1046 	}
   1047 	return ret;
   1048 }
   1049 
   1050 /*
   1051  * free memory of vbp_data_mp42 structure and its members
   1052  */
   1053 uint32 vbp_free_query_data_mp42(vbp_context *pcontext)
   1054 {
   1055 
   1056 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
   1057 	gint idx = 0;
   1058 
   1059 	if (query_data) {
   1060 		if (query_data->picture_data) {
   1061 			for (idx = 0; idx < MAX_NUM_PICTURES_MP42; idx++) {
   1062 				g_free(query_data->picture_data[idx].slice_data);
   1063 			}
   1064 			g_free(query_data->picture_data);
   1065 		}
   1066 
   1067 		g_free(query_data);
   1068 	}
   1069 
   1070 	pcontext->query_data = NULL;
   1071 	return VBP_OK;
   1072 }
   1073 
   1074 /*
   1075  * Allocate memory for vbp_data_mp42 structure and all its members.
   1076  */
   1077 uint32 vbp_allocate_query_data_mp42(vbp_context *pcontext)
   1078 {
   1079 
   1080 	gint idx = 0;
   1081 	vbp_data_mp42 *query_data;
   1082 	pcontext->query_data = NULL;
   1083 
   1084 	query_data = g_try_new0(vbp_data_mp42, 1);
   1085 	if (query_data == NULL) {
   1086 		goto cleanup;
   1087 	}
   1088 
   1089 	query_data->picture_data = g_try_new0(vbp_picture_data_mp42,
   1090 			MAX_NUM_PICTURES_MP42);
   1091 	if (NULL == query_data->picture_data) {
   1092 		goto cleanup;
   1093 	}
   1094 
   1095 	for (idx = 0; idx < MAX_NUM_PICTURES_MP42; idx++) {
   1096 		query_data->picture_data[idx].number_slices = 0;
   1097 		query_data->picture_data[idx].slice_data = g_try_new0(
   1098 				vbp_slice_data_mp42, MAX_NUM_SLICES);
   1099 
   1100 		if (query_data->picture_data[idx].slice_data == NULL) {
   1101 			goto cleanup;
   1102 		}
   1103 	}
   1104 
   1105 	pcontext->query_data = (void *) query_data;
   1106 	return VBP_OK;
   1107 
   1108 	cleanup:
   1109 
   1110 	if (query_data) {
   1111 		if (query_data->picture_data) {
   1112 			for (idx = 0; idx < MAX_NUM_PICTURES_MP42; idx++) {
   1113 				g_free(query_data->picture_data[idx].slice_data);
   1114 			}
   1115 			g_free(query_data->picture_data);
   1116 		}
   1117 
   1118 		g_free(query_data);
   1119 	}
   1120 
   1121 	return VBP_MEM;
   1122 }
   1123 
   1124 void vbp_dump_query_data(vbp_context *pcontext, int list_index)
   1125 {
   1126 	vbp_data_mp42 *query_data = (vbp_data_mp42 *) pcontext->query_data;
   1127 
   1128 	vbp_picture_data_mp42 *picture_data = NULL;
   1129 	VAPictureParameterBufferMPEG4 *picture_param = NULL;
   1130 	vbp_slice_data_mp42 *slice_data = NULL;
   1131 
   1132 	uint32 idx = 0, jdx = 0;
   1133 
   1134 	for (idx = 0; idx < query_data->number_pictures; idx++) {
   1135 
   1136 		picture_data = &(query_data->picture_data[idx]);
   1137 		picture_param = &(picture_data->picture_param);
   1138 		slice_data = &(picture_data->slice_data[0]);
   1139 
   1140 		g_print("======================= dump_begin ======================\n\n");
   1141 		g_print("======================= codec_data ======================\n");
   1142 
   1143 		/* codec_data */
   1144 		g_print("codec_data.profile_and_level_indication = 0x%x\n",
   1145 				query_data->codec_data.profile_and_level_indication);
   1146 
   1147 		g_print("==================== picture_param =======================\n");
   1148 
   1149 		/* picture_param */
   1150 		g_print("picture_param->vop_width = %d\n", picture_param->vop_width);
   1151 		g_print("picture_param->vop_height = %d\n", picture_param->vop_height);
   1152 
   1153 		g_print("picture_param->vol_fields.bits.short_video_header = %d\n",
   1154 				picture_param->vol_fields.bits.short_video_header);
   1155 		g_print("picture_param->vol_fields.bits.chroma_format = %d\n",
   1156 				picture_param->vol_fields.bits.chroma_format);
   1157 		g_print("picture_param->vol_fields.bits.interlaced = %d\n",
   1158 				picture_param->vol_fields.bits.interlaced);
   1159 		g_print("picture_param->vol_fields.bits.obmc_disable = %d\n",
   1160 				picture_param->vol_fields.bits.obmc_disable);
   1161 		g_print("picture_param->vol_fields.bits.sprite_enable = %d\n",
   1162 				picture_param->vol_fields.bits.sprite_enable);
   1163 		g_print(
   1164 				"picture_param->vol_fields.bits.sprite_warping_accuracy = %d\n",
   1165 				picture_param->vol_fields.bits.sprite_warping_accuracy);
   1166 		g_print("picture_param->vol_fields.bits.quant_type = %d\n",
   1167 				picture_param->vol_fields.bits.quant_type);
   1168 		g_print("picture_param->vol_fields.bits.quarter_sample = %d\n",
   1169 				picture_param->vol_fields.bits.quarter_sample);
   1170 		g_print("picture_param->vol_fields.bits.data_partitioned = %d\n",
   1171 				picture_param->vol_fields.bits.data_partitioned);
   1172 		g_print("picture_param->vol_fields.bits.reversible_vlc = %d\n",
   1173 				picture_param->vol_fields.bits.reversible_vlc);
   1174 
   1175 		g_print("picture_param->no_of_sprite_warping_points = %d\n",
   1176 				picture_param->no_of_sprite_warping_points);
   1177 		g_print("picture_param->quant_precision = %d\n",
   1178 				picture_param->quant_precision);
   1179 		g_print("picture_param->sprite_trajectory_du = %d, %d, %d\n",
   1180 				picture_param->sprite_trajectory_du[0],
   1181 				picture_param->sprite_trajectory_du[1],
   1182 				picture_param->sprite_trajectory_du[2]);
   1183 		g_print("picture_param->sprite_trajectory_dv = %d, %d, %d\n",
   1184 				picture_param->sprite_trajectory_dv[0],
   1185 				picture_param->sprite_trajectory_dv[1],
   1186 				picture_param->sprite_trajectory_dv[2]);
   1187 
   1188 		g_print("picture_param->vop_fields.bits.vop_coding_type = %d\n",
   1189 				picture_param->vop_fields.bits.vop_coding_type);
   1190 		g_print(
   1191 				"picture_param->vop_fields.bits.backward_reference_vop_coding_type = %d\n",
   1192 				picture_param->vop_fields.bits.backward_reference_vop_coding_type);
   1193 		g_print("picture_param->vop_fields.bits.vop_rounding_type = %d\n",
   1194 				picture_param->vop_fields.bits.vop_rounding_type);
   1195 		g_print("picture_param->vop_fields.bits.intra_dc_vlc_thr = %d\n",
   1196 				picture_param->vop_fields.bits.intra_dc_vlc_thr);
   1197 		g_print("picture_param->vop_fields.bits.top_field_first = %d\n",
   1198 				picture_param->vop_fields.bits.top_field_first);
   1199 		g_print(
   1200 				"picture_param->vop_fields.bits.alternate_vertical_scan_flag = %d\n",
   1201 				picture_param->vop_fields.bits.alternate_vertical_scan_flag);
   1202 
   1203 		g_print("picture_param->vop_fcode_forward = %d\n",
   1204 				picture_param->vop_fcode_forward);
   1205 		g_print("picture_param->vop_fcode_backward = %d\n",
   1206 				picture_param->vop_fcode_backward);
   1207 		g_print("picture_param->num_gobs_in_vop = %d\n",
   1208 				picture_param->num_gobs_in_vop);
   1209 		g_print("picture_param->num_macroblocks_in_gob = %d\n",
   1210 				picture_param->num_macroblocks_in_gob);
   1211 		g_print("picture_param->TRB = %d\n", picture_param->TRB);
   1212 		g_print("picture_param->TRD = %d\n", picture_param->TRD);
   1213 
   1214 		g_print("==================== slice_data ==========================\n");
   1215 
   1216 		g_print("slice_data.buffer_addr = 0x%x\n",
   1217 				(unsigned int) slice_data->buffer_addr);
   1218 		g_print("slice_data.slice_offset = 0x%x\n", slice_data->slice_offset);
   1219 		g_print("slice_data.slice_size = 0x%x\n", slice_data->slice_size);
   1220 
   1221 		g_print("slice_data.slice_param.macroblock_number = %d\n",
   1222 				slice_data->slice_param.macroblock_number);
   1223 		g_print("slice_data.slice_param.macroblock_offset = 0x%x\n",
   1224 				slice_data->slice_param.macroblock_offset);
   1225 		g_print("slice_data.slice_param.quant_scale = %d\n",
   1226 				slice_data->slice_param.quant_scale);
   1227 		g_print("slice_data.slice_param.slice_data_flag = %d\n",
   1228 				slice_data->slice_param.slice_data_flag);
   1229 		g_print("slice_data.slice_param.slice_data_offset = %d\n",
   1230 				slice_data->slice_param.slice_data_offset);
   1231 		g_print("slice_data.slice_param.slice_data_size = %d\n",
   1232 				slice_data->slice_param.slice_data_size);
   1233 
   1234 		g_print("================= iq_matrix_buffer ======================\n");
   1235 		g_print("iq_matrix_buffer.load_intra_quant_mat = %d\n",
   1236 				picture_data->iq_matrix_buffer.load_intra_quant_mat);
   1237 		g_print("iq_matrix_buffer.load_non_intra_quant_mat = %d\n",
   1238 				picture_data->iq_matrix_buffer.load_non_intra_quant_mat);
   1239 
   1240 		g_print("------- iq_matrix_buffer.intra_quant_mat ----------\n");
   1241 		for (jdx = 0; jdx < 64; jdx++) {
   1242 
   1243 			g_print("%02x ",
   1244 					picture_data->iq_matrix_buffer.intra_quant_mat[jdx]);
   1245 
   1246 			if ((jdx + 1) % 8 == 0) {
   1247 				g_print("\n");
   1248 			}
   1249 		}
   1250 
   1251 		g_print("----- iq_matrix_buffer.non_intra_quant_mat --------\n");
   1252 		for (jdx = 0; jdx < 64; jdx++) {
   1253 
   1254 			g_print("%02x ",
   1255 					picture_data->iq_matrix_buffer.non_intra_quant_mat[jdx]);
   1256 
   1257 			if ((jdx + 1) % 8 == 0) {
   1258 				g_print("\n");
   1259 			}
   1260 		}
   1261 
   1262 		g_print("-------- slice buffer begin ------------\n");
   1263 
   1264 		for (jdx = 0; jdx < 64; jdx++) {
   1265 			g_print("%02x ", *(slice_data->buffer_addr
   1266 					+ slice_data->slice_offset + jdx));
   1267 			if ((jdx + 1) % 8 == 0) {
   1268 				g_print("\n");
   1269 			}
   1270 		}
   1271 		g_print("-------- slice buffer begin ------------\n");
   1272 
   1273 		g_print("\n\n============== dump_end ==========================\n\n");
   1274 
   1275 	}
   1276 }
   1277 
   1278