blob: ded2756dd2570692cc854e22c346ebfa2de08235 [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20/*!
21 **************************************************************************
22 * \file ih264d_mb_utils.c
23 *
24 * \brief
25 * Contains utitlity functions needed for Macroblock decoding
26 *
27 * \date
28 * 18/12/2002
29 *
30 * \author AI
31 **************************************************************************
32 */
33#include <string.h>
34#include <stdlib.h>
35#include "ih264d_bitstrm.h"
36#include "ih264d_defs.h"
37#include "ih264d_debug.h"
38#include "ih264d_structs.h"
39#include "ih264d_defs.h"
40#include "ih264d_mb_utils.h"
41#include "ih264d_parse_slice.h"
42#include "ih264d_error_handler.h"
43#include "ih264d_parse_mb_header.h"
44#include "ih264d_cabac.h"
45#include "ih264d_defs.h"
46#include "ih264d_tables.h"
47
48/*****************************************************************************/
49/* */
50/* Function Name : get_mb_info_cavlc */
51/* */
52/* Description : This function sets the following information of cur MB */
53/* (a) mb_x and mb_y */
54/* (b) Neighbour availablity */
55/* (c) Macroblock location in the frame buffer */
56/* (e) For mbaff predicts field/frame u4_flag for topMb */
57/* and sets the field/frame for botMb. This is */
58/* written in ps_dec->u1_cur_mb_fld_dec_flag */
59/* */
60/* Inputs : pointer to decstruct */
61/* pointer to current mb info */
62/* currentMbaddress */
63/* */
64/* Processing : leftMb and TopMb params are used by DecMbskip and */
65/* DecCtxMbfield modules so that these modules do not */
66/* check for neigbour availability and then find the */
67/* neigbours for context increments */
68/* */
69/* Returns : OK */
70/* */
71/* Issues : <List any issues or problems with this function> */
72/* */
73/* Revision History: */
74/* */
75/* DD MM YYYY Author(s) Changes (Describe the changes made) */
76/* 13 07 2002 Jay Draft */
77/* */
78/*****************************************************************************/
79
80UWORD32 ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t *ps_dec,
81 const UWORD16 u2_cur_mb_address,
82 dec_mb_info_t * ps_cur_mb_info,
83 UWORD32 u4_mbskip_run)
84{
Hamsalekha Scaab4fe2015-05-07 16:38:07 +053085 WORD32 mb_x;
86 WORD32 mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +053087 UWORD8 u1_mb_ngbr_avail = 0;
88 UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
89 WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
90 UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
91 UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
92 UNUSED(u4_mbskip_run);
93 /*--------------------------------------------------------------------*/
94 /* Calculate values of mb_x and mb_y */
95 /*--------------------------------------------------------------------*/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +053096 mb_x = (WORD16)ps_dec->u2_mbx;
97 mb_y = (WORD16)ps_dec->u2_mby;
Hamsalekha S8d3d3032015-03-13 21:24:58 +053098
Hamsalekha Scaab4fe2015-05-07 16:38:07 +053099 ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530100
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530101 mb_x++;
102
103 if(mb_x == u2_frm_width_in_mb)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530104 {
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530105 mb_x = 0;
106 mb_y++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530107 }
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530108 if(mb_y > ps_dec->i2_prev_slice_mby)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530109 {
110 /* if not in the immemdiate row of prev slice end then top
111 will be available */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530112 if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530113 i2_prev_slice_mbx = -1;
114
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530115 if(mb_x > i2_prev_slice_mbx)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530116 {
117 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
118 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
119 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
120 }
121
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530122 if((mb_x > (i2_prev_slice_mbx - 1))
123 && (mb_x != (u2_frm_width_in_mb - 1)))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530124 {
125 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
126 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
127 }
128
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530129 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530130 {
131 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
132 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
133 }
134
135 /* Next row Left will be available*/
136 i2_prev_slice_mbx = -1;
137 }
138
139 /* Same row */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530140 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530141 {
142 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
143 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
144 }
145
146 {
147 mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
148 mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
149
150 /* copy the parameters of topleft Mb */
151 ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
152 /* Neighbour pointer assignments*/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530153 ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
154 ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
155 ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
156 ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530157
158 /* Update the parameters of topleftmb*/
159 ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
160 }
161
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530162 ps_dec->u2_mby = mb_y;
163 ps_dec->u2_mbx = mb_x;
164 ps_cur_mb_info->u2_mbx = mb_x;
165 ps_cur_mb_info->u2_mby = mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530166 ps_cur_mb_info->u1_topmb = 1;
167 ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
168 ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
169 ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
170 ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
171 ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
172 ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
173 ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
174 return (OK);
175
176}
177
178/*****************************************************************************/
179/* */
180/* Function Name : get_mb_info_cavlc */
181/* */
182/* Description : This function sets the following information of cur MB */
183/* (a) mb_x and mb_y */
184/* (b) Neighbour availablity */
185/* (c) Macroblock location in the frame buffer */
186/* (e) For mbaff predicts field/frame u4_flag for topMb */
187/* and sets the field/frame for botMb. This is */
188/* written in ps_dec->u1_cur_mb_fld_dec_flag */
189/* */
190/* Inputs : pointer to decstruct */
191/* pointer to current mb info */
192/* currentMbaddress */
193/* */
194/* Processing : leftMb and TopMb params are used by DecMbskip and */
195/* DecCtxMbfield modules so that these modules do not */
196/* check for neigbour availability and then find the */
197/* neigbours for context increments */
198/* */
199/* Returns : OK */
200/* */
201/* Issues : <List any issues or problems with this function> */
202/* */
203/* Revision History: */
204/* */
205/* DD MM YYYY Author(s) Changes (Describe the changes made) */
206/* 13 07 2002 Jay Draft */
207/* */
208/*****************************************************************************/
209
210UWORD32 ih264d_get_mb_info_cavlc_mbaff(dec_struct_t *ps_dec,
211 const UWORD16 u2_cur_mb_address,
212 dec_mb_info_t * ps_cur_mb_info,
213 UWORD32 u4_mbskip_run)
214{
215 UWORD16 u2_mb_x;
216 UWORD16 u2_mb_y;
217 UWORD8 u1_mb_ngbr_avail = 0;
218 UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
219
220 UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
221 WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
222 UWORD8 u1_cur_mb_field = 0;
223 UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
224 UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
225
226 /*--------------------------------------------------------------------*/
227 /* Calculate values of mb_x and mb_y */
228 /*--------------------------------------------------------------------*/
229 u2_mb_x = ps_dec->u2_mbx;
230 u2_mb_y = ps_dec->u2_mby;
231
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530232 ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530233
234
235 if(u1_top_mb)
236 {
237 u2_mb_x++;
238 if(u2_mb_x == u2_frm_width_in_mb)
239 {
240 u2_mb_x = 0;
241 u2_mb_y += 2;
242 }
243 if(u2_mb_y > ps_dec->i2_prev_slice_mby)
244 {
245 /* if not in the immemdiate row of prev slice end then top
246 will be available */
247 if(u2_mb_y > (ps_dec->i2_prev_slice_mby + 2))
248 i2_prev_slice_mbx = -1;
249 if(u2_mb_x > i2_prev_slice_mbx)
250 {
251 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
252 u1_cur_mb_field = ps_dec->ps_top_mb_row[u2_mb_x << 1].u1_mb_fld;
253 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
254 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
255 }
256 if((u2_mb_x > (i2_prev_slice_mbx - 1))
257 && (u2_mb_x != (u2_frm_width_in_mb - 1)))
258 {
259 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
260 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
261 }
262
263 if(u2_mb_x > (i2_prev_slice_mbx + 1))
264 {
265 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
266 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
267 }
268
269 i2_prev_slice_mbx = -1;
270 }
271 /* Same row */
272 if(u2_mb_x > (i2_prev_slice_mbx + 1))
273 {
274 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
275 u1_cur_mb_field =
276 ps_dec->ps_cur_mb_row[(u2_mb_x << 1) - 1].u1_mb_fld;
277 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
278 }
279 /* Read u1_cur_mb_field from the bitstream if u4_mbskip_run <= 1*/
280 if(u4_mbskip_run <= 1)
281 u1_cur_mb_field = (UWORD8)ih264d_get_bit_h264(ps_dec->ps_bitstrm);
282
283 ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
284 ps_dec->u2_top_left_mask = u2_top_left_mask;
285 ps_dec->u2_top_right_mask = u2_top_right_mask;
286 }
287 else
288 {
289 u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
290 u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
291 u2_top_left_mask = ps_dec->u2_top_left_mask;
292 u2_top_right_mask = ps_dec->u2_top_right_mask;
293
294 if(!u1_cur_mb_field)
295 {
296 /* Top is available */
297 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
298 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
299 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
300 /* Top Right not available */
301 u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
302 u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);
303
304 if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
305 {
306 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
307 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
308 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
309 }
310 }
311 }
312
313 ps_dec->u2_mby = u2_mb_y;
314 ps_dec->u2_mbx = u2_mb_x;
315 ps_cur_mb_info->u2_mbx = u2_mb_x;
316 ps_cur_mb_info->u2_mby = u2_mb_y;
317 ps_cur_mb_info->u1_topmb = u1_top_mb;
318 ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
319 ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
320 ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
321 ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
322 ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
323 ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
324 ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
325 return (OK);
326}
327
328/*****************************************************************************/
329/* */
330/* Function Name : get_mb_info_cabac */
331/* */
332/* Description : This function sets the following information of cur MB */
333/* (a) mb_x and mb_y */
334/* (b) Neighbour availablity */
335/* (c) Macroblock location in the frame buffer */
336/* (e) leftMb parama and TopMb params of curMB */
337/* (f) For Mbaff case leftMb params and TopMb params of */
338/* bottomMb are also set if curMB is top */
339/* (g) For mbaff predicts field/frame u4_flag for topMb */
340/* and sets the field/frame for botMb. This is */
341/* written in ps_dec->u1_cur_mb_fld_dec_flag */
342/* */
343/* Inputs : pointer to decstruct */
344/* pointer to current mb info */
345/* currentMbaddress */
346/* */
347/* Processing : leftMb and TopMb params are used by DecMbskip and */
348/* DecCtxMbfield modules so that these modules do not */
349/* check for neigbour availability and then find the */
350/* neigbours for context increments */
351/* */
352/* Returns : OK */
353/* */
354/* Issues : <List any issues or problems with this function> */
355/* */
356/* Revision History: */
357/* */
358/* DD MM YYYY Author(s) Changes (Describe the changes made) */
359/* 13 07 2002 Jay Draft */
360/* */
361/*****************************************************************************/
362UWORD32 ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t *ps_dec,
363 const UWORD16 u2_cur_mb_address,
364 dec_mb_info_t * ps_cur_mb_info,
365 UWORD32 u4_mbskip)
366{
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530367 WORD32 mb_x;
368 WORD32 mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530369 UWORD32 u1_mb_ngbr_avail = 0;
370 UWORD32 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
371 UWORD32 u1_top_mb = 1;
372 WORD32 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
373 UWORD32 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
374 UWORD32 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
375 ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
376
377 /*--------------------------------------------------------------------*/
378 /* Calculate values of mb_x and mb_y */
379 /*--------------------------------------------------------------------*/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530380 mb_x = (WORD16)ps_dec->u2_mbx;
381 mb_y = (WORD16)ps_dec->u2_mby;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530382
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530383 ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530384
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530385 mb_x++;
386 if((UWORD32)mb_x == u2_frm_width_in_mb)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530387 {
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530388 mb_x = 0;
389 mb_y++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530390 }
391 /*********************************************************************/
392 /* Cabac Context Initialisations */
393 /*********************************************************************/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530394 ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + mb_x;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530395 ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
396 ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;
397
398 /********************************************************************/
399 /* neighbour availablility */
400 /********************************************************************/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530401 if(mb_y > ps_dec->i2_prev_slice_mby)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530402 {
403 /* if not in the immemdiate row of prev slice end then top
404 will be available */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530405 if(mb_y > (ps_dec->i2_prev_slice_mby + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530406 i2_prev_slice_mbx = -1;
407
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530408 if(mb_x > i2_prev_slice_mbx)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530409 {
410 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
411 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
412 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
413 ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;
414 }
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530415 if((mb_x > (i2_prev_slice_mbx - 1))
416 && ((UWORD32)mb_x != (u2_frm_width_in_mb - 1)))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530417 {
418 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
419 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
420 }
421
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530422 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530423 {
424 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
425 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
426 }
427 /* Next row */
428 i2_prev_slice_mbx = -1;
429 }
430 /* Same row */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530431 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530432 {
433 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
434 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
435 ps_dec->p_left_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info - 1;
436 }
437 {
438 mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
439 mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
440 /* copy the parameters of topleft Mb */
441 ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
442 /* Neighbour pointer assignments*/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530443 ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x;
444 ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1;
445 ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x;
446 ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530447
448 /* Update the parameters of topleftmb*/
449 ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type;
450 }
451
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530452 ps_dec->u2_mby = mb_y;
453 ps_dec->u2_mbx = mb_x;
454 ps_cur_mb_info->u2_mbx = mb_x;
455 ps_cur_mb_info->u2_mby = mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530456 ps_cur_mb_info->u1_topmb = u1_top_mb;
457 ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
458 ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
459 ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
460 ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag;
461 ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag;
462 ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
463 ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
464
465 /*********************************************************************/
466 /* Assign the neigbours */
467 /*********************************************************************/
468 if(u4_mbskip)
469 {
470 UWORD32 u4_ctx_inc =
471 2
472 - ((!!(ps_dec->p_top_ctxt_mb_info->u1_mb_type
473 & CAB_SKIP_MASK))
474 + (!!(ps_dec->p_left_ctxt_mb_info->u1_mb_type
475 & CAB_SKIP_MASK)));
476
477 u4_mbskip = ih264d_decode_bin(u4_ctx_inc, ps_dec->p_mb_skip_flag_t,
478 ps_dec->ps_bitstrm, &ps_dec->s_cab_dec_env);
479
480 if(!u4_mbskip)
481 {
482 if(!(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK))
483 {
484 UWORD32 *pu4_buf;
485 UWORD8 *pu1_buf;
486
487 pu1_buf = ps_dec->pu1_left_nnz_y;
488 pu4_buf = (UWORD32 *)pu1_buf;
489 *pu4_buf = 0;
490 pu1_buf = ps_dec->pu1_left_nnz_uv;
491 pu4_buf = (UWORD32 *)pu1_buf;
492 *pu4_buf = 0;
493
494
495 *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
496 MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0);
497 *(UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc = 0;
498 }
499 if(!(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK))
500 {
501 MEMSET_16BYTES(ps_dec->ps_curr_ctxt_mb_info->u1_mv, 0);
502 memset(ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx, 0, 4);
503 }
504 }
505 }
506 return (u4_mbskip);
507}
508
509/*****************************************************************************/
510/* */
511/* Function Name : get_mb_info_cabac */
512/* */
513/* Description : This function sets the following information of cur MB */
514/* (a) mb_x and mb_y */
515/* (b) Neighbour availablity */
516/* (c) Macroblock location in the frame buffer */
517/* (e) leftMb parama and TopMb params of curMB */
518/* (f) For Mbaff case leftMb params and TopMb params of */
519/* bottomMb are also set if curMB is top */
520/* (g) For mbaff predicts field/frame u4_flag for topMb */
521/* and sets the field/frame for botMb. This is */
522/* written in ps_dec->u1_cur_mb_fld_dec_flag */
523/* */
524/* Inputs : pointer to decstruct */
525/* pointer to current mb info */
526/* currentMbaddress */
527/* */
528/* Processing : leftMb and TopMb params are used by DecMbskip and */
529/* DecCtxMbfield modules so that these modules do not */
530/* check for neigbour availability and then find the */
531/* neigbours for context increments */
532/* */
533/* Returns : OK */
534/* */
535/* Issues : <List any issues or problems with this function> */
536/* */
537/* Revision History: */
538/* */
539/* DD MM YYYY Author(s) Changes (Describe the changes made) */
540/* 13 07 2002 Jay Draft */
541/* */
542/*****************************************************************************/
543
544UWORD32 ih264d_get_mb_info_cabac_mbaff(dec_struct_t *ps_dec,
545 const UWORD16 u2_cur_mb_address,
546 dec_mb_info_t * ps_cur_mb_info,
547 UWORD32 u4_mbskip)
548{
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530549 WORD32 mb_x;
550 WORD32 mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530551 UWORD8 u1_mb_ngbr_avail = 0;
552 UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs;
553 ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
554 ctxt_inc_mb_info_t *ps_curr_ctxt, *ps_top_ctxt, *ps_left_ctxt;
555 mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row;
556 mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row;
557 UWORD32 u4_left_mb_pair_fld = 0;
558 UWORD32 u4_top_mb_pair_fld = 0;
559 UWORD8 u1_cur_mb_field = 0;
560 UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01);
561 WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx;
562 UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE;
563 UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE;
564
565 /*--------------------------------------------------------------------*/
566 /* Calculate values of mb_x and mb_y */
567 /*--------------------------------------------------------------------*/
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530568 mb_x = (WORD16)ps_dec->u2_mbx;
569 mb_y = (WORD16)ps_dec->u2_mby;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530570
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530571 ps_dec->u2_cur_mb_addr = u2_cur_mb_address;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530572
573 ps_top_ctxt = ps_left_ctxt = p_ctx_inc_mb_map - 1;
574
575 if(u1_top_mb)
576 {
577 ctxt_inc_mb_info_t *ps_left_mb_of_bot = ps_left_ctxt;
578 ctxt_inc_mb_info_t *ps_top_mb_of_bot = ps_top_ctxt;
579
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530580 mb_x++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530581
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530582 if(mb_x == u2_frm_width_in_mb)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530583 {
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530584 mb_x = 0;
585 mb_y += 2;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530586 }
587
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530588 ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1);
589 if(mb_y > ps_dec->i2_prev_slice_mby)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530590 {
591 UWORD8 u1_cur_mb_fld_flag_known = 0;
592 /* Next row */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530593 if(mb_x > 0)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530594 {
595 /***********************************************************************/
596 /* Left Mb is avialable */
597 /***********************************************************************/
598 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
599 ps_left_ctxt = ps_curr_ctxt - 2;
600 ps_left_mb_of_bot = ps_curr_ctxt - 1;
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530601 u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530602 << 1) - 1].u1_mb_fld;
603 u1_cur_mb_fld_flag_known = 1;
604 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
605 }
606 /* if not in the immemdiate row of prev slice end then top
607 will be available */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530608 if(mb_y > (ps_dec->i2_prev_slice_mby + 2))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530609 i2_prev_slice_mbx = -1;
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530610 if(mb_x > i2_prev_slice_mbx)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530611 {
612 /*********************************************************************/
613 /* Top Mb is avialable */
614 /*********************************************************************/
615 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
616 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
617 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
618
619 /* point to MbAddrB + 1 */
620 ps_top_ctxt = ps_curr_ctxt + 1;
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530621 u4_top_mb_pair_fld = ps_top_mb_row[(mb_x << 1)].u1_mb_fld;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530622
623 u1_cur_mb_field =
624 u1_cur_mb_fld_flag_known ?
625 u1_cur_mb_field :
626 u4_top_mb_pair_fld;
627 ps_top_mb_of_bot = u1_cur_mb_field ? ps_top_ctxt : ps_curr_ctxt;
628
629 /* MbAddrB */
630 ps_top_ctxt -= (u1_cur_mb_field && u4_top_mb_pair_fld);
631 }
632
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530633 if((mb_x > (i2_prev_slice_mbx - 1))
634 && (mb_x != (u2_frm_width_in_mb - 1)))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530635 {
636 u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK;
637 u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE;
638 }
639
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530640 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530641 {
642 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
643 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
644 }
645 }
646 else
647 {
648 /* Same row */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530649 if(mb_x > (i2_prev_slice_mbx + 1))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530650 {
651 /***************************************************************/
652 /* Left Mb is avialable */
653 /***************************************************************/
654 u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK;
655
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530656 u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530657 << 1) - 1].u1_mb_fld;
658 ps_left_ctxt = ps_curr_ctxt - 2;
659 ps_left_mb_of_bot = ps_curr_ctxt - 1;
660 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
661 }
662 }
663 /*********************************************************/
664 /* Check whether the call is from I slice or Inter slice */
665 /*********************************************************/
666 if(u4_mbskip)
667 {
668 UWORD32 u4_ctx_inc = 2
669 - ((!!(ps_top_ctxt->u1_mb_type & CAB_SKIP_MASK))
670 + (!!(ps_left_ctxt->u1_mb_type
671 & CAB_SKIP_MASK)));
672 dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm;
673 decoding_envirnoment_t *ps_cab_dec_env = &ps_dec->s_cab_dec_env;
674 bin_ctxt_model_t *p_mb_skip_flag_t = ps_dec->p_mb_skip_flag_t;
675
676 ps_dec->u4_next_mb_skip = 0;
677 u4_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
678 ps_bitstrm, ps_cab_dec_env);
679
680 if(u4_mbskip)
681 {
682 UWORD32 u4_next_mbskip;
683 ps_curr_ctxt->u1_mb_type = CAB_SKIP;
684
685 u4_ctx_inc =
686 2
687 - ((!!(ps_top_mb_of_bot->u1_mb_type
688 & CAB_SKIP_MASK))
689 + (!!(ps_left_mb_of_bot->u1_mb_type
690 & CAB_SKIP_MASK)));
691
692 /* Decode the skip u4_flag of bottom Mb */
693 u4_next_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t,
694 ps_bitstrm,
695 ps_cab_dec_env);
696
697 ps_dec->u4_next_mb_skip = u4_next_mbskip;
698
699 if(!u4_next_mbskip)
700 {
701 u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;
702
703 u1_cur_mb_field = ih264d_decode_bin(
704 u4_ctx_inc, ps_dec->p_mb_field_dec_flag_t,
705 ps_bitstrm, ps_cab_dec_env);
706 }
707 }
708 }
709
710 if(!u4_mbskip)
711 {
712 UWORD32 u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld;
713 u1_cur_mb_field = ih264d_decode_bin(u4_ctx_inc,
714 ps_dec->p_mb_field_dec_flag_t,
715 ps_dec->ps_bitstrm,
716 &ps_dec->s_cab_dec_env);
717 }
718
719 ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field;
720 ps_dec->u2_top_left_mask = u2_top_left_mask;
721 ps_dec->u2_top_right_mask = u2_top_right_mask;
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530722 ps_dec->u2_mby = mb_y;
723 ps_dec->u2_mbx = mb_x;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530724 }
725 else
726 {
727 u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag;
728 u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity;
729 u2_top_left_mask = ps_dec->u2_top_left_mask;
730 u2_top_right_mask = ps_dec->u2_top_right_mask;
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530731 ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1) + 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530732
733 if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
734 {
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530735 u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x << 1) - 1].u1_mb_fld;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530736
737 /* point to A if top else A+1 */
738 ps_left_ctxt = ps_curr_ctxt - 2
739 - (u4_left_mb_pair_fld != u1_cur_mb_field);
740 }
741
742 if(u1_cur_mb_field)
743 {
744 if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)
745 {
746 /* point to MbAddrB + 1 */
747 ps_top_ctxt = ps_curr_ctxt;
748 }
749 }
750 else
751 {
752 /* Top is available */
753 u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK;
754 u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE;
755 u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE;
756 /* Top Right not available */
757 u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD;
758 u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE);
759
760 if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)
761 {
762 u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK;
763 u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE;
764 u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE;
765 }
766
767 /* CurMbAddr - 1 */
768 ps_top_ctxt = ps_curr_ctxt - 1;
769 }
770
771 if(u4_mbskip)
772 {
773 if(ps_curr_ctxt[-1].u1_mb_type & CAB_SKIP_MASK)
774 {
775 /* If previous mb is skipped, return value of next mb skip */
776 u4_mbskip = ps_dec->u4_next_mb_skip;
777
778 }
779 else
780 {
781 /* If previous mb is not skipped then call DecMbSkip */
782 UWORD32 u4_ctx_inc =
783 2
784 - ((!!(ps_top_ctxt->u1_mb_type
785 & CAB_SKIP_MASK))
786 + (!!(ps_left_ctxt->u1_mb_type
787 & CAB_SKIP_MASK)));
788
789 u4_mbskip = ih264d_decode_bin(u4_ctx_inc,
790 ps_dec->p_mb_skip_flag_t,
791 ps_dec->ps_bitstrm,
792 &ps_dec->s_cab_dec_env);
793 }
794 }
795 }
796
Hamsalekha Scaab4fe2015-05-07 16:38:07 +0530797 ps_cur_mb_info->u2_mbx = mb_x;
798 ps_cur_mb_info->u2_mby = mb_y;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530799 ps_cur_mb_info->u1_topmb = u1_top_mb;
800 ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
801 ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
802 ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail;
803 ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field;
804 ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask;
805 ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask;
806
807 ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field);
808 {
809 ih264d_get_cabac_context_mbaff(ps_dec, ps_cur_mb_info, u4_mbskip);
810 }
811
812 {
813 bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t;
814
815 if(u1_cur_mb_field)
816 {
817 p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FLD;
818 }
819 else
820 {
821 p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FRAME;
822 }
823 {
824 bin_ctxt_model_t * * p_significant_coeff_flag_t =
825 ps_dec->p_significant_coeff_flag_t;
826 p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t
827 + SIG_COEFF_CTXT_CAT_0_OFFSET;
828 p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t
829 + SIG_COEFF_CTXT_CAT_1_OFFSET;
830 p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t
831 + SIG_COEFF_CTXT_CAT_2_OFFSET;
832 p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t
833 + SIG_COEFF_CTXT_CAT_3_OFFSET;
834 p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t
835 + SIG_COEFF_CTXT_CAT_4_OFFSET;
836 p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t
837 + SIG_COEFF_CTXT_CAT_5_OFFSET;
838
839 }
840 }
841 return (u4_mbskip);
842}
843
844/*****************************************************************************/
845/* */
846/* Function Name : ih264d_get_cabac_context_mbaff */
847/* */
848/* Description : Gets the current macroblock Cabac Context and sets the */
849/* top and left cabac context ptrs in CtxIncMbMap */
850/* 1. For Coss field left neigbours it alters coded block */
851/* u4_flag , motion vectors, reference indices, cbp of */
852/* the left neigbours which increases the code i4_size */
853/* 2. For Coss field top neigbours it alters motion */
854/* vectors reference indices of the top neigbours */
855/* which further increases the code i4_size */
856/* */
857/* Inputs : 1. dec_struct_t */
858/* 2. CurMbAddr used for Mbaff (only to see if curMB */
859/* is top or bottom) */
860/* 3. uc_curMbFldDecFlag only for Mbaff */
861/* */
862/* Returns : 0 */
863/* */
864/* Issues : code i4_size can be reduced if ui_CodedBlockFlag storage */
865/* structure in context is changed. This change however */
866/* would break the parseResidual4x4Cabac asm routine. */
867/* */
868/* Revision History: */
869/* */
870/* DD MM YYYY Author(s) Changes (Describe the changes made) */
871/* 18 06 2005 Jay */
872/* */
873/*****************************************************************************/
874UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec,
875 dec_mb_info_t *ps_cur_mb_info,
876 UWORD32 u4_mbskip)
877{
878 const UWORD8 u1_mb_ngbr_availablity = ps_dec->u1_mb_ngbr_availablity;
879 ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map;
880
881 UWORD8 (*pu1_left_mv_ctxt_inc_2d)[4] = &ps_dec->pu1_left_mv_ctxt_inc[0];
882 WORD8 (*pi1_left_ref_idx_ctxt_inc) = ps_dec->pi1_left_ref_idx_ctxt_inc;
883 const UWORD8 u1_cur_mb_fld_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
884 const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
885 const UWORD8 uc_botMb = 1 - ps_cur_mb_info->u1_topmb;
886
887 ctxt_inc_mb_info_t * ps_leftMB;
888
889 ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + (ps_dec->u2_mbx << 1);
890 ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info;
891
892 if(u1_topmb)
893 {
894 pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[0];
895 pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
896 ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb;
897 }
898 else
899 {
900 /* uc_botMb */
901 pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[1];
902 pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];
903 ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_bot_mb;
904 ps_dec->ps_curr_ctxt_mb_info += 1;
905 }
906
907 ps_dec->pu1_left_mv_ctxt_inc = pu1_left_mv_ctxt_inc_2d;
908 ps_dec->pi1_left_ref_idx_ctxt_inc = pi1_left_ref_idx_ctxt_inc;
909
910 if(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK)
911 {
912 const UWORD8 u1_left_mb_fld_flag = ps_cur_mb_info->ps_left_mb->u1_mb_fld;
913
914 ps_leftMB = ps_dec->ps_curr_ctxt_mb_info - 2;
915 if(u1_left_mb_fld_flag != u1_cur_mb_fld_flag)
916 {
917 ctxt_inc_mb_info_t *ps_tempLeft;
918 UWORD8 u1_cbp_t, u1_cbp_b;
919 UWORD8 u1_cr_cpb;
920
921 ps_leftMB -= uc_botMb;
922 ps_tempLeft = ps_dec->ps_left_mb_ctxt_info;
923 ps_tempLeft->u1_mb_type = ps_leftMB->u1_mb_type;
924 ps_tempLeft->u1_intra_chroma_pred_mode =
925 ps_leftMB->u1_intra_chroma_pred_mode;
926
927 ps_tempLeft->u1_transform8x8_ctxt = ps_leftMB->u1_transform8x8_ctxt;
928
929 u1_cr_cpb = ps_leftMB->u1_cbp;
930 /*****************************************************************/
931 /* reform RefIdx, CBP, MV and CBF ctxInc taking care of A and A+1*/
932 /*****************************************************************/
933 if(u1_cur_mb_fld_flag)
934 {
935 /* current MB is a FLD and left a FRM */
936 UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_top)[4] =
937 ps_dec->u1_left_mv_ctxt_inc_arr[0];
938 UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_bot)[4] =
939 ps_dec->u1_left_mv_ctxt_inc_arr[1];
940 WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_top) =
941 &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0];
942 WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_bot) =
943 &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0];
944
945 u1_cbp_t = ps_leftMB->u1_cbp;
946 u1_cbp_b = (ps_leftMB + 1)->u1_cbp;
947 ps_tempLeft->u1_cbp = (u1_cbp_t & 0x02)
948 | ((u1_cbp_b & 0x02) << 2);
949
950 // set motionvectors as
951 // 0T = 0T 0B = 0T
952 // 1T = 2T 1B = 2T
953 // 2T = 0B 2B = 0B
954 // 3T = 2B 3B = 2B
955 if(u1_topmb)
956 {
957 /********************************************/
958 /* Bottoms DC CBF = Top DC CBF */
959 /********************************************/
960 ps_dec->u1_yuv_dc_csbp_bot_mb =
961 ps_dec->u1_yuv_dc_csbp_topmb;
962
963 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
964 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[2];
965 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
966 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[2];
967 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
968 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[0];
969 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0] =
970 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[0];
971
972 i1_left_ref_idx_ctxt_inc_arr_top[1] =
973 i1_left_ref_idx_ctxt_inc_arr_bot[0];
974 i1_left_ref_idx_ctxt_inc_arr_top[3] =
975 i1_left_ref_idx_ctxt_inc_arr_bot[2];
976
977 *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_bot) =
978 *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_top);
979
980 memcpy(pu1_left_mv_ctxt_inc_2d_arr_bot,
981 pu1_left_mv_ctxt_inc_2d_arr_top, 16);
982 }
983
984 {
985 UWORD8 i;
986 for(i = 0; i < 4; i++)
987 {
988 pu1_left_mv_ctxt_inc_2d[i][1] >>= 1;
989 pu1_left_mv_ctxt_inc_2d[i][3] >>= 1;
990 }
991 }
992 }
993 else
994 {
995 /* current MB is a FRM and left FLD */
996 if(u1_topmb)
997 {
998 u1_cbp_t = ps_leftMB->u1_cbp;
999 u1_cbp_t = (u1_cbp_t & 0x02);
1000 ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t << 2));
1001
1002 /********************************************/
1003 /* Bottoms DC CBF = Top DC CBF */
1004 /********************************************/
1005 ps_dec->u1_yuv_dc_csbp_bot_mb =
1006 ps_dec->u1_yuv_dc_csbp_topmb;
1007
1008 // set motionvectors as
1009 // 3B = 2B = 3T
1010 // 1B = 0B = 2T
1011 // 3T = 2T = 1T
1012 // 1T = 0T = 0T
1013
1014 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[7] =
1015 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];
1016 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[6] =
1017 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3];
1018
1019 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[5] =
1020 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];
1021 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[4] =
1022 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2];
1023
1024 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] =
1025 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];
1026 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] =
1027 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1];
1028
1029 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] =
1030 *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0];
1031
1032 pi1_left_ref_idx_ctxt_inc[7] = (pi1_left_ref_idx_ctxt_inc[3]
1033 - 1);
1034 pi1_left_ref_idx_ctxt_inc[6] = (pi1_left_ref_idx_ctxt_inc[3]
1035 - 1);
1036
1037 pi1_left_ref_idx_ctxt_inc[5] = (pi1_left_ref_idx_ctxt_inc[1]
1038 - 1);
1039 pi1_left_ref_idx_ctxt_inc[4] = (pi1_left_ref_idx_ctxt_inc[1]
1040 - 1);
1041
1042 pi1_left_ref_idx_ctxt_inc[3] = (pi1_left_ref_idx_ctxt_inc[2]
1043 - 1);
1044 pi1_left_ref_idx_ctxt_inc[2] = (pi1_left_ref_idx_ctxt_inc[2]
1045 - 1);
1046
1047 pi1_left_ref_idx_ctxt_inc[1] = (pi1_left_ref_idx_ctxt_inc[0]
1048 - 1);
1049 pi1_left_ref_idx_ctxt_inc[0] = (pi1_left_ref_idx_ctxt_inc[0]
1050 - 1);
1051 }
1052 else
1053 {
1054 u1_cbp_t = ps_leftMB->u1_cbp;
1055 u1_cbp_t = (u1_cbp_t & 0x08);
1056 ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t >> 2));
1057 }
1058
1059 {
1060 UWORD8 i;
1061 for(i = 0; i < 4; i++)
1062 {
1063 pu1_left_mv_ctxt_inc_2d[i][1] <<= 1;
1064 pu1_left_mv_ctxt_inc_2d[i][3] <<= 1;
1065 }
1066 }
1067
1068 }
1069
1070 ps_tempLeft->u1_cbp = ps_tempLeft->u1_cbp + ((u1_cr_cpb >> 4) << 4);
1071 ps_leftMB = ps_tempLeft;
1072 }
1073
1074 ps_dec->p_left_ctxt_mb_info = ps_leftMB;
1075 }
1076 else
1077 {
1078 ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1;
1079 if(!u4_mbskip)
1080 {
1081 *(ps_dec->pu1_left_yuv_dc_csbp) = 0;
1082
1083 MEMSET_16BYTES(&pu1_left_mv_ctxt_inc_2d[0][0], 0);
1084 *(UWORD32 *)pi1_left_ref_idx_ctxt_inc = 0;
1085 }
1086 }
1087
1088 /*************************************************************************/
1089 /* Now get the top context mb info */
1090 /*************************************************************************/
1091 {
1092 UWORD8 (*u1_top_mv_ctxt_inc_arr_2d)[4] =
1093 ps_dec->ps_curr_ctxt_mb_info->u1_mv;
1094 WORD8 (*pi1_top_ref_idx_ctxt_inc) =
1095 ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx;
1096 UWORD8 uc_topMbFldDecFlag = ps_cur_mb_info->ps_top_mb->u1_mb_fld;
1097
1098 if(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK)
1099 {
1100 if(ps_cur_mb_info->i1_offset)
1101 ps_dec->p_top_ctxt_mb_info += 1;
1102
1103 if(!u4_mbskip)
1104 {
1105 memcpy(u1_top_mv_ctxt_inc_arr_2d,
1106 &ps_dec->p_top_ctxt_mb_info->u1_mv, 16);
1107 memcpy(pi1_top_ref_idx_ctxt_inc,
1108 &ps_dec->p_top_ctxt_mb_info->i1_ref_idx, 4);
1109 if(uc_topMbFldDecFlag ^ u1_cur_mb_fld_flag)
1110 {
1111 UWORD8 i;
1112 if(u1_cur_mb_fld_flag)
1113 {
1114 for(i = 0; i < 4; i++)
1115 {
1116 u1_top_mv_ctxt_inc_arr_2d[i][1] >>= 1;
1117 u1_top_mv_ctxt_inc_arr_2d[i][3] >>= 1;
1118 }
1119 }
1120 else
1121 {
1122 for(i = 0; i < 4; i++)
1123 {
1124 u1_top_mv_ctxt_inc_arr_2d[i][1] <<= 1;
1125 u1_top_mv_ctxt_inc_arr_2d[i][3] <<= 1;
1126 pi1_top_ref_idx_ctxt_inc[i] -= 1;
1127 }
1128 }
1129 }
1130 }
1131 }
1132 else
1133 {
1134 ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1;
1135 if(!u4_mbskip)
1136 {
1137
1138 MEMSET_16BYTES(&u1_top_mv_ctxt_inc_arr_2d[0][0], 0);
1139 memset(pi1_top_ref_idx_ctxt_inc, 0, 4);
1140 }
1141 }
1142 }
1143
1144 return OK;
1145}
1146
1147/*****************************************************************************/
1148/* */
1149/* Function Name : ih264d_update_mbaff_left_nnz */
1150/* */
1151/* Description : This function updates the left luma and chroma nnz for */
1152/* mbaff cases. */
1153/* */
1154/* Inputs : <What inputs does the function take?> */
1155/* Globals : <Does it use any global variables?> */
1156/* Processing : <Describe how the function operates - include algorithm */
1157/* description> */
1158/* Outputs : <What does the function produce?> */
1159/* Returns : <What does the function return?> */
1160/* */
1161/* Issues : <List any issues or problems with this function> */
1162/* */
1163/* Revision History: */
1164/* */
1165/* DD MM YYYY Author(s) Changes (Describe the changes made) */
1166/* 13 07 2002 Ittiam Draft */
1167/* */
1168/*****************************************************************************/
1169void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec,
1170 dec_mb_info_t * ps_cur_mb_info)
1171{
1172 UWORD32 *pu4_buf;
1173 UWORD8 *pu1_buf;
1174 if(ps_cur_mb_info->u1_topmb)
1175 {
1176 pu1_buf = ps_dec->pu1_left_nnz_y;
1177 pu4_buf = (UWORD32 *)pu1_buf;
1178 ps_dec->u4_n_left_temp_y = *pu4_buf;
1179
1180 pu1_buf = ps_dec->pu1_left_nnz_uv;
1181 pu4_buf = (UWORD32 *)pu1_buf;
1182 ps_dec->u4_n_left_temp_uv = *pu4_buf;
1183 }
1184 else
1185 {
1186
1187 ps_dec->u4_n_leftY[0] = ps_dec->u4_n_left_temp_y;
1188 pu1_buf = ps_dec->pu1_left_nnz_y;
1189 pu4_buf = (UWORD32 *)pu1_buf;
1190 ps_dec->u4_n_leftY[1] = *pu4_buf;
1191 ps_dec->u4_n_left_cr[0] = ps_dec->u4_n_left_temp_uv;
1192 pu1_buf = ps_dec->pu1_left_nnz_uv;
1193 pu4_buf = (UWORD32 *)pu1_buf;
1194 ps_dec->u4_n_left_cr[1] = *pu4_buf;
1195
1196 }
1197}
1198
1199/*!
1200 **************************************************************************
1201 * \if Function name : ih264d_get_mbaff_neighbours \endif
1202 *
1203 * \brief
1204 * Gets the neighbors for the current MB if it is of type MB-AFF
1205 * frame.
1206 *
1207 * \return
1208 * None
1209 *
1210 **************************************************************************
1211 */
1212void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec,
1213 dec_mb_info_t * ps_cur_mb_info,
1214 UWORD8 uc_curMbFldDecFlag)
1215{
1216
1217 mb_neigbour_params_t *ps_left_mb;
1218 mb_neigbour_params_t *ps_top_mb;
1219 mb_neigbour_params_t *ps_top_right_mb = NULL;
1220 mb_neigbour_params_t *ps_curmb;
1221 const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb;
1222 const UWORD8 uc_botMb = 1 - u1_topmb;
1223 const UWORD32 u4_mb_x = ps_cur_mb_info->u2_mbx;
1224
1225 /* Current MbParams location in top row buffer */
1226 ps_curmb = ps_dec->ps_cur_mb_row + (u4_mb_x << 1) + uc_botMb;
1227 ps_left_mb = ps_curmb - 2;
1228 /* point to A if top else A+1 */
1229 if(uc_botMb && (ps_left_mb->u1_mb_fld != uc_curMbFldDecFlag))
1230 {
1231 /* move from A + 1 to A */
1232 ps_left_mb--;
1233 }
1234 ps_cur_mb_info->i1_offset = 0;
1235 if((uc_curMbFldDecFlag == 0) && uc_botMb)
1236 {
1237 mb_neigbour_params_t *ps_topleft_mb;
1238 /* CurMbAddr - 1 */
1239 ps_top_mb = ps_curmb - 1;
1240
1241 /* Mark Top right Not available */
1242 /* point to A */
1243 ps_topleft_mb = ps_curmb - 3;
1244
1245 if(ps_topleft_mb->u1_mb_fld)
1246 {
1247 /* point to A + 1 */
1248 ps_topleft_mb++;
1249 }
1250 ps_cur_mb_info->u1_topleft_mb_fld = ps_topleft_mb->u1_mb_fld;
1251 ps_cur_mb_info->u1_topleft_mbtype = ps_topleft_mb->u1_mb_type;
1252 }
1253 else
1254 {
1255 /* Top = B + 1 */
1256 ps_top_mb = ps_dec->ps_top_mb_row + (u4_mb_x << 1) + 1;
1257 ps_top_right_mb = ps_top_mb + 2;
1258 ps_cur_mb_info->i1_offset = 4;
1259 /* TopRight = C + 1 */
1260
1261 /* TopLeft = D+1 */
1262 ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld_bot;
1263 ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype_bot;
1264
1265 if(uc_curMbFldDecFlag && u1_topmb)
1266 {
1267 if(ps_top_mb->u1_mb_fld)
1268 {
1269 /* MbAddrB */
1270 ps_top_mb--;
1271 ps_cur_mb_info->i1_offset = 0;
1272 }
1273 /* If topright is field then point to C */
1274 ps_top_right_mb -= ps_top_right_mb->u1_mb_fld ? 1 : 0;
1275 if(ps_cur_mb_info->u1_topleft_mb_fld)
1276 {
1277 /* TopLeft = D */
1278 ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld;
1279 ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype;
1280 }
1281 }
1282 }
1283 if(u1_topmb)
1284 {
1285 /* Update the parameters of topleftmb*/
1286 ps_dec->u1_topleft_mb_fld = ps_top_mb->u1_mb_fld;
1287 ps_dec->u1_topleft_mbtype = ps_top_mb->u1_mb_type;
1288 /* Set invscan and dequantMatrixScan*/
1289 if(uc_curMbFldDecFlag)
1290 {
1291 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1292 }
1293 else
1294 {
1295 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1296 }
1297 ps_dec->pu2_quant_scale_y =
1298 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6];
1299 ps_dec->pu2_quant_scale_u =
1300 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6];
1301 ps_dec->pu2_quant_scale_v =
1302 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6];
1303
1304 }
1305 else
1306 {
1307 /* Update the parameters of topleftmb*/
1308 mb_neigbour_params_t *ps_top_mb_temp = ps_dec->ps_top_mb_row
1309 + (u4_mb_x << 1) + 1;
1310 ps_dec->u1_topleft_mb_fld_bot = ps_top_mb_temp->u1_mb_fld;
1311 ps_dec->u1_topleft_mbtype_bot = ps_top_mb_temp->u1_mb_type;
1312 }
1313
1314 ps_cur_mb_info->ps_left_mb = ps_left_mb;
1315 ps_cur_mb_info->ps_top_mb = ps_top_mb;
1316 ps_cur_mb_info->ps_top_right_mb = ps_top_right_mb;
1317 ps_cur_mb_info->ps_curmb = ps_curmb;
1318 ps_curmb->u1_mb_fld = uc_curMbFldDecFlag;
1319
1320 {
1321 /* Form Left NNZ */
1322 UWORD8 u1_is_left_mb_fld = ps_left_mb->u1_mb_fld;
1323 UWORD8 *pu1_left_mb_pair_nnz_y = (UWORD8 *)&ps_dec->u4_n_leftY[0];
1324 UWORD8 *pu1_left_mb_pair_nnz_uv = (UWORD8 *)&ps_dec->u4_n_left_cr[0];
1325 UWORD8 *pu1_left_nnz_y = ps_dec->pu1_left_nnz_y;
1326 UWORD8 *pu1_left_nnz_uv = ps_dec->pu1_left_nnz_uv;
1327
1328 if(uc_curMbFldDecFlag == u1_is_left_mb_fld)
1329 {
1330 *(UWORD32 *)pu1_left_nnz_y = *(UWORD32 *)(pu1_left_mb_pair_nnz_y
1331 + (uc_botMb << 2));
1332 *(UWORD32 *)pu1_left_nnz_uv = *(UWORD32 *)(pu1_left_mb_pair_nnz_uv
1333 + (uc_botMb << 2));
1334 }
1335 else if((uc_curMbFldDecFlag == 0) && u1_topmb && u1_is_left_mb_fld)
1336 {
1337 /* 0 0 1 1 of u4_n_leftY[0], 0 0 2 2 of u4_n_left_cr[0] */
1338 pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[0];
1339 pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[1];
1340 pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
1341 pu1_left_mb_pair_nnz_uv[0];
1342 pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
1343 pu1_left_mb_pair_nnz_uv[2];
1344 }
1345 else if((uc_curMbFldDecFlag == 0) && uc_botMb && u1_is_left_mb_fld)
1346 {
1347 /* 2 2 3 3 of u4_n_leftY[0] , 1 1 3 3 of u4_n_left_cr[0] */
1348 pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
1349 pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[3];
1350 pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] =
1351 pu1_left_mb_pair_nnz_uv[1];
1352 pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] =
1353 pu1_left_mb_pair_nnz_uv[3];
1354 }
1355 else
1356 {
1357 /* 0 2 0 2 of u4_n_leftY[0], u4_n_leftY[1] */
1358 pu1_left_nnz_y[0] = pu1_left_mb_pair_nnz_y[0];
1359 pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2];
1360 pu1_left_nnz_y[2] = pu1_left_mb_pair_nnz_y[4 + 0];
1361 pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[4 + 2];
1362
1363 /* 0 of u4_n_left_cr[0] and 0 u4_n_left_cr[1]
1364 2 of u4_n_left_cr[0] and 2 u4_n_left_cr[1] */
1365 pu1_left_nnz_uv[0] = pu1_left_mb_pair_nnz_uv[0];
1366 pu1_left_nnz_uv[1] = pu1_left_mb_pair_nnz_uv[4 + 0];
1367 pu1_left_nnz_uv[2] = pu1_left_mb_pair_nnz_uv[2];
1368 pu1_left_nnz_uv[3] = pu1_left_mb_pair_nnz_uv[4 + 2];
1369 }
1370 }
1371}
1372
1373/*
1374 **************************************************************************
1375 * \if Function name : ih264d_transfer_mb_group_data \endif
1376 *
1377 * \brief
1378 * Transfer the Following things
1379 * N-Mb DeblkParams Data ( To Ext DeblkParams Buffer )
1380 * N-Mb Recon Data ( To Ext Frame Buffer )
1381 * N-Mb Intrapredline Data ( Updated Internally)
1382 * N-Mb MV Data ( To Ext MV Buffer )
1383 * N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)
1384 *
1385 * \return
1386 * None
1387 *
1388 **************************************************************************
1389 */
1390void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301391 const UWORD8 u1_num_mbs,
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301392 const UWORD8 u1_end_of_row, /* Cur n-Mb End of Row Flag */
1393 const UWORD8 u1_end_of_row_next /* Next n-Mb End of Row Flag */
1394 )
1395{
1396 dec_mb_info_t *ps_cur_mb_info = ps_dec->ps_nmb_info;
1397 tfr_ctxt_t *ps_trns_addr = &ps_dec->s_tran_addrecon;
1398 UWORD16 u2_mb_y;
1399 UWORD32 y_offset;
1400 UWORD32 u4_frame_stride;
1401 mb_neigbour_params_t *ps_temp;
1402 const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1403 UNUSED(u1_end_of_row_next);
1404
1405 ps_trns_addr->pu1_dest_y += ps_trns_addr->u4_inc_y[u1_end_of_row];
1406 ps_trns_addr->pu1_dest_u += ps_trns_addr->u4_inc_uv[u1_end_of_row];
1407 ps_trns_addr->pu1_dest_v += ps_trns_addr->u4_inc_uv[u1_end_of_row];
1408
1409 /* Swap top and current pointers */
1410 if(u1_end_of_row)
1411 {
1412
1413 if(ps_dec->u1_separate_parse)
1414 {
1415 u2_mb_y = ps_dec->i2_dec_thread_mb_y;
1416 }
1417 else
1418 {
1419 ps_temp = ps_dec->ps_cur_mb_row;
1420 ps_dec->ps_cur_mb_row = ps_dec->ps_top_mb_row;
1421 ps_dec->ps_top_mb_row = ps_temp;
1422
1423 u2_mb_y = ps_dec->u2_mby + (1 + u1_mbaff);
1424 }
1425
1426 u4_frame_stride = ps_dec->u2_frm_wd_y
1427 << ps_dec->ps_cur_slice->u1_field_pic_flag;
1428 y_offset = (u2_mb_y * u4_frame_stride) << 4;
1429 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + y_offset;
1430
1431 u4_frame_stride = ps_dec->u2_frm_wd_uv
1432 << ps_dec->ps_cur_slice->u1_field_pic_flag;
1433 y_offset = (u2_mb_y * u4_frame_stride) << 3;
1434 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + y_offset;
1435 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + y_offset;
1436
1437 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1438 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1439 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1440 }
1441
1442 /*
1443 * The Slice boundary is also a valid condition to transfer. So recalculate
1444 * the Left increment, in case the number of MBs is lesser than the
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301445 * N MB value. u1_num_mbs will be equal to N of N MB if the entire N Mb is
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301446 * decoded.
1447 */
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301448 ps_dec->s_tran_addrecon.u2_mv_left_inc = ((u1_num_mbs >> u1_mbaff) - 1)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301449 << (4 + u1_mbaff);
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301450 ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (u1_num_mbs << 2) - 1
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301451 - (u1_mbaff << 2);
1452
1453 if(ps_dec->u1_separate_parse == 0)
1454 {
1455 /* reassign left MV and cur MV pointers */
1456 ps_dec->ps_mv_left = ps_dec->ps_mv_cur
1457 + ps_dec->s_tran_addrecon.u2_mv_left_inc;
1458
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301459 ps_dec->ps_mv_cur += (u1_num_mbs << 4);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301460 }
1461
1462 /* Increment deblock parameters pointer in external memory */
1463
Harish Mahendrakar34b3e472015-08-04 09:55:15 +05301464 if(ps_dec->u1_separate_parse == 0)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301465 {
Hamsalekha Scaab4fe2015-05-07 16:38:07 +05301466 ps_dec->ps_deblk_mbn += u1_num_mbs;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301467 }
1468
1469}
1470