/src/libavc/decoder/ih264d_mb_utils.c
Line | Count | Source |
1 | | /****************************************************************************** |
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 "ih264_defs.h" |
36 | | #include "ih264d_bitstrm.h" |
37 | | #include "ih264d_defs.h" |
38 | | #include "ih264d_debug.h" |
39 | | #include "ih264d_structs.h" |
40 | | #include "ih264d_defs.h" |
41 | | #include "ih264d_mb_utils.h" |
42 | | #include "ih264d_parse_slice.h" |
43 | | #include "ih264d_error_handler.h" |
44 | | #include "ih264d_parse_mb_header.h" |
45 | | #include "ih264d_cabac.h" |
46 | | #include "ih264d_defs.h" |
47 | | #include "ih264d_tables.h" |
48 | | |
49 | | /*****************************************************************************/ |
50 | | /* */ |
51 | | /* Function Name : get_mb_info_cavlc */ |
52 | | /* */ |
53 | | /* Description : This function sets the following information of cur MB */ |
54 | | /* (a) mb_x and mb_y */ |
55 | | /* (b) Neighbour availablity */ |
56 | | /* (c) Macroblock location in the frame buffer */ |
57 | | /* (e) For mbaff predicts field/frame u4_flag for topMb */ |
58 | | /* and sets the field/frame for botMb. This is */ |
59 | | /* written in ps_dec->u1_cur_mb_fld_dec_flag */ |
60 | | /* */ |
61 | | /* Inputs : pointer to decstruct */ |
62 | | /* pointer to current mb info */ |
63 | | /* currentMbaddress */ |
64 | | /* */ |
65 | | /* Processing : leftMb and TopMb params are used by DecMbskip and */ |
66 | | /* DecCtxMbfield modules so that these modules do not */ |
67 | | /* check for neigbour availability and then find the */ |
68 | | /* neigbours for context increments */ |
69 | | /* */ |
70 | | /* Returns : OK */ |
71 | | /* */ |
72 | | /* Issues : <List any issues or problems with this function> */ |
73 | | /* */ |
74 | | /* Revision History: */ |
75 | | /* */ |
76 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
77 | | /* 13 07 2002 Jay Draft */ |
78 | | /* */ |
79 | | /*****************************************************************************/ |
80 | | |
81 | | UWORD32 ih264d_get_mb_info_cavlc_nonmbaff(dec_struct_t *ps_dec, |
82 | | const UWORD16 u2_cur_mb_address, |
83 | | dec_mb_info_t * ps_cur_mb_info, |
84 | | UWORD32 u4_mbskip_run) |
85 | 21.1M | { |
86 | 21.1M | WORD32 mb_x; |
87 | 21.1M | WORD32 mb_y; |
88 | 21.1M | UWORD8 u1_mb_ngbr_avail = 0; |
89 | 21.1M | UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs; |
90 | 21.1M | WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx; |
91 | 21.1M | UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE; |
92 | 21.1M | UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE; |
93 | 21.1M | UNUSED(u4_mbskip_run); |
94 | | /*--------------------------------------------------------------------*/ |
95 | | /* Calculate values of mb_x and mb_y */ |
96 | | /*--------------------------------------------------------------------*/ |
97 | 21.1M | mb_x = (WORD16)ps_dec->u2_mbx; |
98 | 21.1M | mb_y = (WORD16)ps_dec->u2_mby; |
99 | | |
100 | 21.1M | ps_dec->u4_cur_mb_addr = u2_cur_mb_address; |
101 | | |
102 | 21.1M | mb_x++; |
103 | | |
104 | 21.1M | if(mb_x == u2_frm_width_in_mb) |
105 | 365k | { |
106 | 365k | mb_x = 0; |
107 | 365k | mb_y++; |
108 | 365k | } |
109 | 21.1M | if(mb_y > ps_dec->i2_prev_slice_mby) |
110 | 20.6M | { |
111 | | /* if not in the immemdiate row of prev slice end then top |
112 | | will be available */ |
113 | 20.6M | if(mb_y > (ps_dec->i2_prev_slice_mby + 1)) |
114 | 20.1M | i2_prev_slice_mbx = -1; |
115 | | |
116 | 20.6M | if(mb_x > i2_prev_slice_mbx) |
117 | 20.4M | { |
118 | 20.4M | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
119 | 20.4M | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
120 | 20.4M | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
121 | 20.4M | } |
122 | | |
123 | 20.6M | if((mb_x > (i2_prev_slice_mbx - 1)) |
124 | 20.5M | && (mb_x != (u2_frm_width_in_mb - 1))) |
125 | 20.1M | { |
126 | 20.1M | u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK; |
127 | 20.1M | u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE; |
128 | 20.1M | } |
129 | | |
130 | 20.6M | if(mb_x > (i2_prev_slice_mbx + 1)) |
131 | 20.1M | { |
132 | 20.1M | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
133 | 20.1M | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
134 | 20.1M | } |
135 | | |
136 | | /* Next row Left will be available*/ |
137 | 20.6M | i2_prev_slice_mbx = -1; |
138 | 20.6M | } |
139 | | |
140 | | /* Same row */ |
141 | 21.1M | if(mb_x > (i2_prev_slice_mbx + 1)) |
142 | 20.7M | { |
143 | 20.7M | u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK; |
144 | 20.7M | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
145 | 20.7M | } |
146 | | |
147 | 21.1M | { |
148 | 21.1M | mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row; |
149 | 21.1M | mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row; |
150 | | |
151 | | /* copy the parameters of topleft Mb */ |
152 | 21.1M | ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype; |
153 | | /* Neighbour pointer assignments*/ |
154 | 21.1M | ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x; |
155 | 21.1M | ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1; |
156 | 21.1M | ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x; |
157 | 21.1M | ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1; |
158 | | |
159 | | /* Update the parameters of topleftmb*/ |
160 | 21.1M | ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type; |
161 | 21.1M | } |
162 | | |
163 | 21.1M | ps_dec->u2_mby = mb_y; |
164 | 21.1M | ps_dec->u2_mbx = mb_x; |
165 | 21.1M | ps_cur_mb_info->u2_mbx = mb_x; |
166 | 21.1M | ps_cur_mb_info->u2_mby = mb_y; |
167 | 21.1M | ps_cur_mb_info->u1_topmb = 1; |
168 | 21.1M | ps_dec->i4_submb_ofst += SUB_BLK_SIZE; |
169 | 21.1M | ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
170 | 21.1M | ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
171 | 21.1M | ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag; |
172 | 21.1M | ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag; |
173 | 21.1M | ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask; |
174 | 21.1M | ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask; |
175 | 21.1M | return (OK); |
176 | | |
177 | 21.1M | } |
178 | | |
179 | | /*****************************************************************************/ |
180 | | /* */ |
181 | | /* Function Name : get_mb_info_cavlc */ |
182 | | /* */ |
183 | | /* Description : This function sets the following information of cur MB */ |
184 | | /* (a) mb_x and mb_y */ |
185 | | /* (b) Neighbour availablity */ |
186 | | /* (c) Macroblock location in the frame buffer */ |
187 | | /* (e) For mbaff predicts field/frame u4_flag for topMb */ |
188 | | /* and sets the field/frame for botMb. This is */ |
189 | | /* written in ps_dec->u1_cur_mb_fld_dec_flag */ |
190 | | /* */ |
191 | | /* Inputs : pointer to decstruct */ |
192 | | /* pointer to current mb info */ |
193 | | /* currentMbaddress */ |
194 | | /* */ |
195 | | /* Processing : leftMb and TopMb params are used by DecMbskip and */ |
196 | | /* DecCtxMbfield modules so that these modules do not */ |
197 | | /* check for neigbour availability and then find the */ |
198 | | /* neigbours for context increments */ |
199 | | /* */ |
200 | | /* Returns : OK */ |
201 | | /* */ |
202 | | /* Issues : <List any issues or problems with this function> */ |
203 | | /* */ |
204 | | /* Revision History: */ |
205 | | /* */ |
206 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
207 | | /* 13 07 2002 Jay Draft */ |
208 | | /* */ |
209 | | /*****************************************************************************/ |
210 | | |
211 | | UWORD32 ih264d_get_mb_info_cavlc_mbaff(dec_struct_t *ps_dec, |
212 | | const UWORD16 u2_cur_mb_address, |
213 | | dec_mb_info_t * ps_cur_mb_info, |
214 | | UWORD32 u4_mbskip_run) |
215 | 1.89M | { |
216 | 1.89M | UWORD16 u2_mb_x; |
217 | 1.89M | UWORD16 u2_mb_y; |
218 | 1.89M | UWORD8 u1_mb_ngbr_avail = 0; |
219 | 1.89M | UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs; |
220 | | |
221 | 1.89M | UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01); |
222 | 1.89M | WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx; |
223 | 1.89M | UWORD8 u1_cur_mb_field = 0; |
224 | 1.89M | UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE; |
225 | 1.89M | UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE; |
226 | | |
227 | | /*--------------------------------------------------------------------*/ |
228 | | /* Calculate values of mb_x and mb_y */ |
229 | | /*--------------------------------------------------------------------*/ |
230 | 1.89M | u2_mb_x = ps_dec->u2_mbx; |
231 | 1.89M | u2_mb_y = ps_dec->u2_mby; |
232 | | |
233 | 1.89M | ps_dec->u4_cur_mb_addr = u2_cur_mb_address; |
234 | | |
235 | | |
236 | 1.89M | if(u1_top_mb) |
237 | 947k | { |
238 | 947k | u2_mb_x++; |
239 | 947k | if(u2_mb_x == u2_frm_width_in_mb) |
240 | 39.9k | { |
241 | 39.9k | u2_mb_x = 0; |
242 | 39.9k | u2_mb_y += 2; |
243 | 39.9k | } |
244 | 947k | if(u2_mb_y > ps_dec->i2_prev_slice_mby) |
245 | 888k | { |
246 | | /* if not in the immemdiate row of prev slice end then top |
247 | | will be available */ |
248 | 888k | if(u2_mb_y > (ps_dec->i2_prev_slice_mby + 2)) |
249 | 834k | i2_prev_slice_mbx = -1; |
250 | 888k | if(u2_mb_x > i2_prev_slice_mbx) |
251 | 875k | { |
252 | 875k | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
253 | 875k | u1_cur_mb_field = ps_dec->ps_top_mb_row[u2_mb_x << 1].u1_mb_fld; |
254 | 875k | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
255 | 875k | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
256 | 875k | } |
257 | 888k | if((u2_mb_x > (i2_prev_slice_mbx - 1)) |
258 | 877k | && (u2_mb_x != (u2_frm_width_in_mb - 1))) |
259 | 837k | { |
260 | 837k | u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK; |
261 | 837k | u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE; |
262 | 837k | } |
263 | | |
264 | 888k | if(u2_mb_x > (i2_prev_slice_mbx + 1)) |
265 | 836k | { |
266 | 836k | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
267 | 836k | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
268 | 836k | } |
269 | | |
270 | 888k | i2_prev_slice_mbx = -1; |
271 | 888k | } |
272 | | /* Same row */ |
273 | 947k | if(u2_mb_x > (i2_prev_slice_mbx + 1)) |
274 | 904k | { |
275 | 904k | u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK; |
276 | 904k | u1_cur_mb_field = |
277 | 904k | ps_dec->ps_cur_mb_row[(u2_mb_x << 1) - 1].u1_mb_fld; |
278 | 904k | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
279 | 904k | } |
280 | | /* Read u1_cur_mb_field from the bitstream if u4_mbskip_run <= 1*/ |
281 | 947k | if(u4_mbskip_run <= 1) |
282 | 7.16k | u1_cur_mb_field = (UWORD8)ih264d_get_bit_h264(ps_dec->ps_bitstrm); |
283 | | |
284 | 947k | ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field; |
285 | 947k | ps_dec->u2_top_left_mask = u2_top_left_mask; |
286 | 947k | ps_dec->u2_top_right_mask = u2_top_right_mask; |
287 | 947k | } |
288 | 947k | else |
289 | 947k | { |
290 | 947k | u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity; |
291 | 947k | u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag; |
292 | 947k | u2_top_left_mask = ps_dec->u2_top_left_mask; |
293 | 947k | u2_top_right_mask = ps_dec->u2_top_right_mask; |
294 | | |
295 | 947k | if(!u1_cur_mb_field) |
296 | 937k | { |
297 | | /* Top is available */ |
298 | 937k | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
299 | 937k | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
300 | 937k | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
301 | | /* Top Right not available */ |
302 | 937k | u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD; |
303 | 937k | u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE); |
304 | | |
305 | 937k | if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK) |
306 | 896k | { |
307 | 896k | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
308 | 896k | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
309 | 896k | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
310 | 896k | } |
311 | 937k | } |
312 | 947k | } |
313 | | |
314 | 1.89M | ps_dec->u2_mby = u2_mb_y; |
315 | 1.89M | ps_dec->u2_mbx = u2_mb_x; |
316 | 1.89M | ps_cur_mb_info->u2_mbx = u2_mb_x; |
317 | 1.89M | ps_cur_mb_info->u2_mby = u2_mb_y; |
318 | 1.89M | ps_cur_mb_info->u1_topmb = u1_top_mb; |
319 | 1.89M | ps_dec->i4_submb_ofst += SUB_BLK_SIZE; |
320 | 1.89M | ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
321 | 1.89M | ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
322 | 1.89M | ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field; |
323 | 1.89M | ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask; |
324 | 1.89M | ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask; |
325 | 1.89M | ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field); |
326 | 1.89M | return (OK); |
327 | 1.89M | } |
328 | | |
329 | | /*****************************************************************************/ |
330 | | /* */ |
331 | | /* Function Name : get_mb_info_cabac */ |
332 | | /* */ |
333 | | /* Description : This function sets the following information of cur MB */ |
334 | | /* (a) mb_x and mb_y */ |
335 | | /* (b) Neighbour availablity */ |
336 | | /* (c) Macroblock location in the frame buffer */ |
337 | | /* (e) leftMb parama and TopMb params of curMB */ |
338 | | /* (f) For Mbaff case leftMb params and TopMb params of */ |
339 | | /* bottomMb are also set if curMB is top */ |
340 | | /* (g) For mbaff predicts field/frame u4_flag for topMb */ |
341 | | /* and sets the field/frame for botMb. This is */ |
342 | | /* written in ps_dec->u1_cur_mb_fld_dec_flag */ |
343 | | /* */ |
344 | | /* Inputs : pointer to decstruct */ |
345 | | /* pointer to current mb info */ |
346 | | /* currentMbaddress */ |
347 | | /* */ |
348 | | /* Processing : leftMb and TopMb params are used by DecMbskip and */ |
349 | | /* DecCtxMbfield modules so that these modules do not */ |
350 | | /* check for neigbour availability and then find the */ |
351 | | /* neigbours for context increments */ |
352 | | /* */ |
353 | | /* Returns : OK */ |
354 | | /* */ |
355 | | /* Issues : <List any issues or problems with this function> */ |
356 | | /* */ |
357 | | /* Revision History: */ |
358 | | /* */ |
359 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
360 | | /* 13 07 2002 Jay Draft */ |
361 | | /* */ |
362 | | /*****************************************************************************/ |
363 | | UWORD32 ih264d_get_mb_info_cabac_nonmbaff(dec_struct_t *ps_dec, |
364 | | const UWORD16 u2_cur_mb_address, |
365 | | dec_mb_info_t * ps_cur_mb_info, |
366 | | UWORD32 u4_mbskip) |
367 | 2.40M | { |
368 | 2.40M | WORD32 mb_x; |
369 | 2.40M | WORD32 mb_y; |
370 | 2.40M | UWORD32 u1_mb_ngbr_avail = 0; |
371 | 2.40M | UWORD32 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs; |
372 | 2.40M | UWORD32 u1_top_mb = 1; |
373 | 2.40M | WORD32 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx; |
374 | 2.40M | UWORD32 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE; |
375 | 2.40M | UWORD32 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE; |
376 | 2.40M | ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map; |
377 | | |
378 | | /*--------------------------------------------------------------------*/ |
379 | | /* Calculate values of mb_x and mb_y */ |
380 | | /*--------------------------------------------------------------------*/ |
381 | 2.40M | mb_x = (WORD16)ps_dec->u2_mbx; |
382 | 2.40M | mb_y = (WORD16)ps_dec->u2_mby; |
383 | | |
384 | 2.40M | ps_dec->u4_cur_mb_addr = u2_cur_mb_address; |
385 | | |
386 | 2.40M | mb_x++; |
387 | 2.40M | if((UWORD32)mb_x == u2_frm_width_in_mb) |
388 | 63.6k | { |
389 | 63.6k | mb_x = 0; |
390 | 63.6k | mb_y++; |
391 | 63.6k | } |
392 | | /*********************************************************************/ |
393 | | /* Cabac Context Initialisations */ |
394 | | /*********************************************************************/ |
395 | 2.40M | ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + mb_x; |
396 | 2.40M | ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1; |
397 | 2.40M | ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1; |
398 | | |
399 | | /********************************************************************/ |
400 | | /* neighbour availablility */ |
401 | | /********************************************************************/ |
402 | 2.40M | if(mb_y > ps_dec->i2_prev_slice_mby) |
403 | 2.04M | { |
404 | | /* if not in the immemdiate row of prev slice end then top |
405 | | will be available */ |
406 | 2.04M | if(mb_y > (ps_dec->i2_prev_slice_mby + 1)) |
407 | 1.92M | i2_prev_slice_mbx = -1; |
408 | | |
409 | 2.04M | if(mb_x > i2_prev_slice_mbx) |
410 | 2.02M | { |
411 | 2.02M | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
412 | 2.02M | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
413 | 2.02M | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
414 | 2.02M | ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info; |
415 | 2.02M | } |
416 | 2.04M | if((mb_x > (i2_prev_slice_mbx - 1)) |
417 | 2.03M | && ((UWORD32)mb_x != (u2_frm_width_in_mb - 1))) |
418 | 1.96M | { |
419 | 1.96M | u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK; |
420 | 1.96M | u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE; |
421 | 1.96M | } |
422 | | |
423 | 2.04M | if(mb_x > (i2_prev_slice_mbx + 1)) |
424 | 1.96M | { |
425 | 1.96M | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
426 | 1.96M | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
427 | 1.96M | } |
428 | | /* Next row */ |
429 | 2.04M | i2_prev_slice_mbx = -1; |
430 | 2.04M | } |
431 | | /* Same row */ |
432 | 2.40M | if(mb_x > (i2_prev_slice_mbx + 1)) |
433 | 2.33M | { |
434 | 2.33M | u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK; |
435 | 2.33M | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
436 | 2.33M | ps_dec->p_left_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info - 1; |
437 | 2.33M | } |
438 | 2.40M | { |
439 | 2.40M | mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row; |
440 | 2.40M | mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row; |
441 | | /* copy the parameters of topleft Mb */ |
442 | 2.40M | ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype; |
443 | | /* Neighbour pointer assignments*/ |
444 | 2.40M | ps_cur_mb_info->ps_curmb = ps_cur_mb_row + mb_x; |
445 | 2.40M | ps_cur_mb_info->ps_left_mb = ps_cur_mb_row + mb_x - 1; |
446 | 2.40M | ps_cur_mb_info->ps_top_mb = ps_top_mb_row + mb_x; |
447 | 2.40M | ps_cur_mb_info->ps_top_right_mb = ps_top_mb_row + mb_x + 1; |
448 | | |
449 | | /* Update the parameters of topleftmb*/ |
450 | 2.40M | ps_dec->u1_topleft_mbtype = ps_cur_mb_info->ps_top_mb->u1_mb_type; |
451 | 2.40M | } |
452 | | |
453 | 2.40M | ps_dec->u2_mby = mb_y; |
454 | 2.40M | ps_dec->u2_mbx = mb_x; |
455 | 2.40M | ps_cur_mb_info->u2_mbx = mb_x; |
456 | 2.40M | ps_cur_mb_info->u2_mby = mb_y; |
457 | 2.40M | ps_cur_mb_info->u1_topmb = u1_top_mb; |
458 | 2.40M | ps_dec->i4_submb_ofst += SUB_BLK_SIZE; |
459 | 2.40M | ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
460 | 2.40M | ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
461 | 2.40M | ps_cur_mb_info->ps_curmb->u1_mb_fld = ps_dec->u1_cur_mb_fld_dec_flag; |
462 | 2.40M | ps_cur_mb_info->u1_mb_field_decodingflag = ps_dec->u1_cur_mb_fld_dec_flag; |
463 | 2.40M | ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask; |
464 | 2.40M | ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask; |
465 | | |
466 | | /*********************************************************************/ |
467 | | /* Assign the neigbours */ |
468 | | /*********************************************************************/ |
469 | 2.40M | if(u4_mbskip) |
470 | 773k | { |
471 | 773k | UWORD32 u4_ctx_inc = |
472 | 773k | 2 |
473 | 773k | - ((!!(ps_dec->p_top_ctxt_mb_info->u1_mb_type |
474 | 773k | & CAB_SKIP_MASK)) |
475 | 773k | + (!!(ps_dec->p_left_ctxt_mb_info->u1_mb_type |
476 | 773k | & CAB_SKIP_MASK))); |
477 | | |
478 | 773k | u4_mbskip = ih264d_decode_bin(u4_ctx_inc, ps_dec->p_mb_skip_flag_t, |
479 | 773k | ps_dec->ps_bitstrm, &ps_dec->s_cab_dec_env); |
480 | | |
481 | 773k | if(!u4_mbskip) |
482 | 198k | { |
483 | 198k | if(!(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK)) |
484 | 15.1k | { |
485 | 15.1k | UWORD32 *pu4_buf; |
486 | 15.1k | UWORD8 *pu1_buf; |
487 | | |
488 | 15.1k | pu1_buf = ps_dec->pu1_left_nnz_y; |
489 | 15.1k | pu4_buf = (UWORD32 *)pu1_buf; |
490 | 15.1k | *pu4_buf = 0; |
491 | 15.1k | pu1_buf = ps_dec->pu1_left_nnz_uv; |
492 | 15.1k | pu4_buf = (UWORD32 *)pu1_buf; |
493 | 15.1k | *pu4_buf = 0; |
494 | | |
495 | | |
496 | 15.1k | *(ps_dec->pu1_left_yuv_dc_csbp) = 0; |
497 | 15.1k | MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); |
498 | 15.1k | *(UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc = 0; |
499 | 15.1k | } |
500 | 198k | if(!(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK)) |
501 | 86.8k | { |
502 | 86.8k | MEMSET_16BYTES(ps_dec->ps_curr_ctxt_mb_info->u1_mv, 0); |
503 | 86.8k | memset(ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx, 0, 4); |
504 | 86.8k | } |
505 | 198k | } |
506 | 773k | } |
507 | 2.40M | return (u4_mbskip); |
508 | 2.40M | } |
509 | | |
510 | | /*****************************************************************************/ |
511 | | /* */ |
512 | | /* Function Name : get_mb_info_cabac */ |
513 | | /* */ |
514 | | /* Description : This function sets the following information of cur MB */ |
515 | | /* (a) mb_x and mb_y */ |
516 | | /* (b) Neighbour availablity */ |
517 | | /* (c) Macroblock location in the frame buffer */ |
518 | | /* (e) leftMb parama and TopMb params of curMB */ |
519 | | /* (f) For Mbaff case leftMb params and TopMb params of */ |
520 | | /* bottomMb are also set if curMB is top */ |
521 | | /* (g) For mbaff predicts field/frame u4_flag for topMb */ |
522 | | /* and sets the field/frame for botMb. This is */ |
523 | | /* written in ps_dec->u1_cur_mb_fld_dec_flag */ |
524 | | /* */ |
525 | | /* Inputs : pointer to decstruct */ |
526 | | /* pointer to current mb info */ |
527 | | /* currentMbaddress */ |
528 | | /* */ |
529 | | /* Processing : leftMb and TopMb params are used by DecMbskip and */ |
530 | | /* DecCtxMbfield modules so that these modules do not */ |
531 | | /* check for neigbour availability and then find the */ |
532 | | /* neigbours for context increments */ |
533 | | /* */ |
534 | | /* Returns : OK */ |
535 | | /* */ |
536 | | /* Issues : <List any issues or problems with this function> */ |
537 | | /* */ |
538 | | /* Revision History: */ |
539 | | /* */ |
540 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
541 | | /* 13 07 2002 Jay Draft */ |
542 | | /* */ |
543 | | /*****************************************************************************/ |
544 | | |
545 | | UWORD32 ih264d_get_mb_info_cabac_mbaff(dec_struct_t *ps_dec, |
546 | | const UWORD16 u2_cur_mb_address, |
547 | | dec_mb_info_t * ps_cur_mb_info, |
548 | | UWORD32 u4_mbskip) |
549 | 130k | { |
550 | 130k | WORD32 mb_x; |
551 | 130k | WORD32 mb_y; |
552 | 130k | UWORD8 u1_mb_ngbr_avail = 0; |
553 | 130k | UWORD16 u2_frm_width_in_mb = ps_dec->u2_frm_wd_in_mbs; |
554 | 130k | ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map; |
555 | 130k | ctxt_inc_mb_info_t *ps_curr_ctxt, *ps_top_ctxt, *ps_left_ctxt; |
556 | 130k | mb_neigbour_params_t *ps_cur_mb_row = ps_dec->ps_cur_mb_row; |
557 | 130k | mb_neigbour_params_t *ps_top_mb_row = ps_dec->ps_top_mb_row; |
558 | 130k | UWORD32 u4_left_mb_pair_fld = 0; |
559 | 130k | UWORD32 u4_top_mb_pair_fld = 0; |
560 | 130k | UWORD8 u1_cur_mb_field = 0; |
561 | 130k | UWORD8 u1_top_mb = 1 - (u2_cur_mb_address & 0x01); |
562 | 130k | WORD16 i2_prev_slice_mbx = ps_dec->i2_prev_slice_mbx; |
563 | 130k | UWORD16 u2_top_right_mask = TOP_RIGHT_DEFAULT_AVAILABLE; |
564 | 130k | UWORD16 u2_top_left_mask = TOP_LEFT_DEFAULT_AVAILABLE; |
565 | | |
566 | | /*--------------------------------------------------------------------*/ |
567 | | /* Calculate values of mb_x and mb_y */ |
568 | | /*--------------------------------------------------------------------*/ |
569 | 130k | mb_x = (WORD16)ps_dec->u2_mbx; |
570 | 130k | mb_y = (WORD16)ps_dec->u2_mby; |
571 | | |
572 | 130k | ps_dec->u4_cur_mb_addr = u2_cur_mb_address; |
573 | | |
574 | 130k | ps_top_ctxt = ps_left_ctxt = p_ctx_inc_mb_map - 1; |
575 | | |
576 | 130k | if(u1_top_mb) |
577 | 65.3k | { |
578 | 65.3k | ctxt_inc_mb_info_t *ps_left_mb_of_bot = ps_left_ctxt; |
579 | 65.3k | ctxt_inc_mb_info_t *ps_top_mb_of_bot = ps_top_ctxt; |
580 | | |
581 | 65.3k | mb_x++; |
582 | | |
583 | 65.3k | if(mb_x == u2_frm_width_in_mb) |
584 | 2.93k | { |
585 | 2.93k | mb_x = 0; |
586 | 2.93k | mb_y += 2; |
587 | 2.93k | } |
588 | | |
589 | 65.3k | ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1); |
590 | 65.3k | if(mb_y > ps_dec->i2_prev_slice_mby) |
591 | 53.4k | { |
592 | 53.4k | UWORD8 u1_cur_mb_fld_flag_known = 0; |
593 | | /* Next row */ |
594 | 53.4k | if(mb_x > 0) |
595 | 50.5k | { |
596 | | /***********************************************************************/ |
597 | | /* Left Mb is avialable */ |
598 | | /***********************************************************************/ |
599 | 50.5k | u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK; |
600 | 50.5k | ps_left_ctxt = ps_curr_ctxt - 2; |
601 | 50.5k | ps_left_mb_of_bot = ps_curr_ctxt - 1; |
602 | 50.5k | u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x |
603 | 50.5k | << 1) - 1].u1_mb_fld; |
604 | 50.5k | u1_cur_mb_fld_flag_known = 1; |
605 | 50.5k | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
606 | 50.5k | } |
607 | | /* if not in the immemdiate row of prev slice end then top |
608 | | will be available */ |
609 | 53.4k | if(mb_y > (ps_dec->i2_prev_slice_mby + 2)) |
610 | 48.2k | i2_prev_slice_mbx = -1; |
611 | 53.4k | if(mb_x > i2_prev_slice_mbx) |
612 | 53.3k | { |
613 | | /*********************************************************************/ |
614 | | /* Top Mb is avialable */ |
615 | | /*********************************************************************/ |
616 | 53.3k | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
617 | 53.3k | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
618 | 53.3k | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
619 | | |
620 | | /* point to MbAddrB + 1 */ |
621 | 53.3k | ps_top_ctxt = ps_curr_ctxt + 1; |
622 | 53.3k | u4_top_mb_pair_fld = ps_top_mb_row[(mb_x << 1)].u1_mb_fld; |
623 | | |
624 | 53.3k | u1_cur_mb_field = |
625 | 53.3k | u1_cur_mb_fld_flag_known ? |
626 | 50.4k | u1_cur_mb_field : |
627 | 53.3k | u4_top_mb_pair_fld; |
628 | 53.3k | ps_top_mb_of_bot = u1_cur_mb_field ? ps_top_ctxt : ps_curr_ctxt; |
629 | | |
630 | | /* MbAddrB */ |
631 | 53.3k | ps_top_ctxt -= (u1_cur_mb_field && u4_top_mb_pair_fld); |
632 | 53.3k | } |
633 | | |
634 | 53.4k | if((mb_x > (i2_prev_slice_mbx - 1)) |
635 | 53.4k | && (mb_x != (u2_frm_width_in_mb - 1))) |
636 | 50.7k | { |
637 | 50.7k | u1_mb_ngbr_avail |= TOP_RIGHT_MB_AVAILABLE_MASK; |
638 | 50.7k | u2_top_right_mask |= TOP_RIGHT_TOPR_AVAILABLE; |
639 | 50.7k | } |
640 | | |
641 | 53.4k | if(mb_x > (i2_prev_slice_mbx + 1)) |
642 | 50.4k | { |
643 | 50.4k | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
644 | 50.4k | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
645 | 50.4k | } |
646 | 53.4k | } |
647 | 11.8k | else |
648 | 11.8k | { |
649 | | /* Same row */ |
650 | 11.8k | if(mb_x > (i2_prev_slice_mbx + 1)) |
651 | 10.8k | { |
652 | | /***************************************************************/ |
653 | | /* Left Mb is avialable */ |
654 | | /***************************************************************/ |
655 | 10.8k | u1_mb_ngbr_avail |= LEFT_MB_AVAILABLE_MASK; |
656 | | |
657 | 10.8k | u1_cur_mb_field = u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x |
658 | 10.8k | << 1) - 1].u1_mb_fld; |
659 | 10.8k | ps_left_ctxt = ps_curr_ctxt - 2; |
660 | 10.8k | ps_left_mb_of_bot = ps_curr_ctxt - 1; |
661 | 10.8k | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
662 | 10.8k | } |
663 | 11.8k | } |
664 | | /*********************************************************/ |
665 | | /* Check whether the call is from I slice or Inter slice */ |
666 | | /*********************************************************/ |
667 | 65.3k | if(u4_mbskip) |
668 | 60.2k | { |
669 | 60.2k | UWORD32 u4_ctx_inc = 2 |
670 | 60.2k | - ((!!(ps_top_ctxt->u1_mb_type & CAB_SKIP_MASK)) |
671 | 60.2k | + (!!(ps_left_ctxt->u1_mb_type |
672 | 60.2k | & CAB_SKIP_MASK))); |
673 | 60.2k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
674 | 60.2k | decoding_envirnoment_t *ps_cab_dec_env = &ps_dec->s_cab_dec_env; |
675 | 60.2k | bin_ctxt_model_t *p_mb_skip_flag_t = ps_dec->p_mb_skip_flag_t; |
676 | | |
677 | 60.2k | ps_dec->u4_next_mb_skip = 0; |
678 | 60.2k | u4_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t, |
679 | 60.2k | ps_bitstrm, ps_cab_dec_env); |
680 | | |
681 | 60.2k | if(u4_mbskip) |
682 | 19.7k | { |
683 | 19.7k | UWORD32 u4_next_mbskip; |
684 | 19.7k | ps_curr_ctxt->u1_mb_type = CAB_SKIP; |
685 | | |
686 | 19.7k | u4_ctx_inc = |
687 | 19.7k | 2 |
688 | 19.7k | - ((!!(ps_top_mb_of_bot->u1_mb_type |
689 | 19.7k | & CAB_SKIP_MASK)) |
690 | 19.7k | + (!!(ps_left_mb_of_bot->u1_mb_type |
691 | 19.7k | & CAB_SKIP_MASK))); |
692 | | |
693 | | /* Decode the skip u4_flag of bottom Mb */ |
694 | 19.7k | u4_next_mbskip = ih264d_decode_bin(u4_ctx_inc, p_mb_skip_flag_t, |
695 | 19.7k | ps_bitstrm, |
696 | 19.7k | ps_cab_dec_env); |
697 | | |
698 | 19.7k | ps_dec->u4_next_mb_skip = u4_next_mbskip; |
699 | | |
700 | 19.7k | if(!u4_next_mbskip) |
701 | 6.23k | { |
702 | 6.23k | u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld; |
703 | | |
704 | 6.23k | u1_cur_mb_field = ih264d_decode_bin( |
705 | 6.23k | u4_ctx_inc, ps_dec->p_mb_field_dec_flag_t, |
706 | 6.23k | ps_bitstrm, ps_cab_dec_env); |
707 | 6.23k | } |
708 | 19.7k | } |
709 | 60.2k | } |
710 | | |
711 | 65.3k | if(!u4_mbskip) |
712 | 45.5k | { |
713 | 45.5k | UWORD32 u4_ctx_inc = u4_top_mb_pair_fld + u4_left_mb_pair_fld; |
714 | 45.5k | u1_cur_mb_field = ih264d_decode_bin(u4_ctx_inc, |
715 | 45.5k | ps_dec->p_mb_field_dec_flag_t, |
716 | 45.5k | ps_dec->ps_bitstrm, |
717 | 45.5k | &ps_dec->s_cab_dec_env); |
718 | 45.5k | } |
719 | | |
720 | 65.3k | ps_dec->u1_cur_mb_fld_dec_flag = u1_cur_mb_field; |
721 | 65.3k | ps_dec->u2_top_left_mask = u2_top_left_mask; |
722 | 65.3k | ps_dec->u2_top_right_mask = u2_top_right_mask; |
723 | 65.3k | ps_dec->u2_mby = mb_y; |
724 | 65.3k | ps_dec->u2_mbx = mb_x; |
725 | 65.3k | } |
726 | 64.9k | else |
727 | 64.9k | { |
728 | 64.9k | u1_cur_mb_field = ps_dec->u1_cur_mb_fld_dec_flag; |
729 | 64.9k | u1_mb_ngbr_avail = ps_dec->u1_mb_ngbr_availablity; |
730 | 64.9k | u2_top_left_mask = ps_dec->u2_top_left_mask; |
731 | 64.9k | u2_top_right_mask = ps_dec->u2_top_right_mask; |
732 | 64.9k | ps_curr_ctxt = p_ctx_inc_mb_map + (mb_x << 1) + 1; |
733 | | |
734 | 64.9k | if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK) |
735 | 61.1k | { |
736 | 61.1k | u4_left_mb_pair_fld = ps_cur_mb_row[(mb_x << 1) - 1].u1_mb_fld; |
737 | | |
738 | | /* point to A if top else A+1 */ |
739 | 61.1k | ps_left_ctxt = ps_curr_ctxt - 2 |
740 | 61.1k | - (u4_left_mb_pair_fld != u1_cur_mb_field); |
741 | 61.1k | } |
742 | | |
743 | 64.9k | if(u1_cur_mb_field) |
744 | 25.5k | { |
745 | 25.5k | if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK) |
746 | 23.8k | { |
747 | | /* point to MbAddrB + 1 */ |
748 | 23.8k | ps_top_ctxt = ps_curr_ctxt; |
749 | 23.8k | } |
750 | 25.5k | } |
751 | 39.3k | else |
752 | 39.3k | { |
753 | | /* Top is available */ |
754 | 39.3k | u1_mb_ngbr_avail |= TOP_MB_AVAILABLE_MASK; |
755 | 39.3k | u2_top_right_mask |= TOP_RIGHT_TOP_AVAILABLE; |
756 | 39.3k | u2_top_left_mask |= TOP_LEFT_TOP_AVAILABLE; |
757 | | /* Top Right not available */ |
758 | 39.3k | u1_mb_ngbr_avail &= TOP_RT_SUBBLOCK_MASK_MOD; |
759 | 39.3k | u2_top_right_mask &= (~TOP_RIGHT_TOPR_AVAILABLE); |
760 | | |
761 | 39.3k | if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK) |
762 | 36.1k | { |
763 | 36.1k | u1_mb_ngbr_avail |= TOP_LEFT_MB_AVAILABLE_MASK; |
764 | 36.1k | u2_top_left_mask |= TOP_LEFT_LEFT_AVAILABLE; |
765 | 36.1k | u2_top_left_mask |= TOP_LEFT_TOPL_AVAILABLE; |
766 | 36.1k | } |
767 | | |
768 | | /* CurMbAddr - 1 */ |
769 | 39.3k | ps_top_ctxt = ps_curr_ctxt - 1; |
770 | 39.3k | } |
771 | | |
772 | 64.9k | if(u4_mbskip) |
773 | 59.9k | { |
774 | 59.9k | if(ps_curr_ctxt[-1].u1_mb_type & CAB_SKIP_MASK) |
775 | 19.7k | { |
776 | | /* If previous mb is skipped, return value of next mb skip */ |
777 | 19.7k | u4_mbskip = ps_dec->u4_next_mb_skip; |
778 | | |
779 | 19.7k | } |
780 | 40.2k | else |
781 | 40.2k | { |
782 | | /* If previous mb is not skipped then call DecMbSkip */ |
783 | 40.2k | UWORD32 u4_ctx_inc = |
784 | 40.2k | 2 |
785 | 40.2k | - ((!!(ps_top_ctxt->u1_mb_type |
786 | 40.2k | & CAB_SKIP_MASK)) |
787 | 40.2k | + (!!(ps_left_ctxt->u1_mb_type |
788 | 40.2k | & CAB_SKIP_MASK))); |
789 | | |
790 | 40.2k | u4_mbskip = ih264d_decode_bin(u4_ctx_inc, |
791 | 40.2k | ps_dec->p_mb_skip_flag_t, |
792 | 40.2k | ps_dec->ps_bitstrm, |
793 | 40.2k | &ps_dec->s_cab_dec_env); |
794 | 40.2k | } |
795 | 59.9k | } |
796 | 64.9k | } |
797 | | |
798 | 130k | ps_cur_mb_info->u2_mbx = mb_x; |
799 | 130k | ps_cur_mb_info->u2_mby = mb_y; |
800 | 130k | ps_cur_mb_info->u1_topmb = u1_top_mb; |
801 | 130k | ps_dec->i4_submb_ofst += SUB_BLK_SIZE; |
802 | 130k | ps_dec->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
803 | 130k | ps_cur_mb_info->u1_mb_ngbr_availablity = u1_mb_ngbr_avail; |
804 | 130k | ps_cur_mb_info->u1_mb_field_decodingflag = u1_cur_mb_field; |
805 | 130k | ps_cur_mb_info->u2_top_left_avail_mask = u2_top_left_mask; |
806 | 130k | ps_cur_mb_info->u2_top_right_avail_mask = u2_top_right_mask; |
807 | | |
808 | 130k | ih264d_get_mbaff_neighbours(ps_dec, ps_cur_mb_info, u1_cur_mb_field); |
809 | 130k | { |
810 | 130k | ih264d_get_cabac_context_mbaff(ps_dec, ps_cur_mb_info, u4_mbskip); |
811 | 130k | } |
812 | | |
813 | 130k | { |
814 | 130k | bin_ctxt_model_t *p_cabac_ctxt_table_t = ps_dec->p_cabac_ctxt_table_t; |
815 | | |
816 | 130k | if(u1_cur_mb_field) |
817 | 51.3k | { |
818 | 51.3k | p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FLD; |
819 | 51.3k | } |
820 | 78.9k | else |
821 | 78.9k | { |
822 | 78.9k | p_cabac_ctxt_table_t += SIGNIFICANT_COEFF_FLAG_FRAME; |
823 | 78.9k | } |
824 | 130k | { |
825 | 130k | bin_ctxt_model_t * * p_significant_coeff_flag_t = |
826 | 130k | ps_dec->p_significant_coeff_flag_t; |
827 | 130k | p_significant_coeff_flag_t[0] = p_cabac_ctxt_table_t |
828 | 130k | + SIG_COEFF_CTXT_CAT_0_OFFSET; |
829 | 130k | p_significant_coeff_flag_t[1] = p_cabac_ctxt_table_t |
830 | 130k | + SIG_COEFF_CTXT_CAT_1_OFFSET; |
831 | 130k | p_significant_coeff_flag_t[2] = p_cabac_ctxt_table_t |
832 | 130k | + SIG_COEFF_CTXT_CAT_2_OFFSET; |
833 | 130k | p_significant_coeff_flag_t[3] = p_cabac_ctxt_table_t |
834 | 130k | + SIG_COEFF_CTXT_CAT_3_OFFSET; |
835 | 130k | p_significant_coeff_flag_t[4] = p_cabac_ctxt_table_t |
836 | 130k | + SIG_COEFF_CTXT_CAT_4_OFFSET; |
837 | 130k | p_significant_coeff_flag_t[5] = p_cabac_ctxt_table_t |
838 | 130k | + SIG_COEFF_CTXT_CAT_5_OFFSET; |
839 | | |
840 | 130k | } |
841 | 130k | } |
842 | 130k | return (u4_mbskip); |
843 | 130k | } |
844 | | |
845 | | /*****************************************************************************/ |
846 | | /* */ |
847 | | /* Function Name : ih264d_get_cabac_context_mbaff */ |
848 | | /* */ |
849 | | /* Description : Gets the current macroblock Cabac Context and sets the */ |
850 | | /* top and left cabac context ptrs in CtxIncMbMap */ |
851 | | /* 1. For Coss field left neigbours it alters coded block */ |
852 | | /* u4_flag , motion vectors, reference indices, cbp of */ |
853 | | /* the left neigbours which increases the code i4_size */ |
854 | | /* 2. For Coss field top neigbours it alters motion */ |
855 | | /* vectors reference indices of the top neigbours */ |
856 | | /* which further increases the code i4_size */ |
857 | | /* */ |
858 | | /* Inputs : 1. dec_struct_t */ |
859 | | /* 2. CurMbAddr used for Mbaff (only to see if curMB */ |
860 | | /* is top or bottom) */ |
861 | | /* 3. uc_curMbFldDecFlag only for Mbaff */ |
862 | | /* */ |
863 | | /* Returns : 0 */ |
864 | | /* */ |
865 | | /* Issues : code i4_size can be reduced if ui_CodedBlockFlag storage */ |
866 | | /* structure in context is changed. This change however */ |
867 | | /* would break the parseResidual4x4Cabac asm routine. */ |
868 | | /* */ |
869 | | /* Revision History: */ |
870 | | /* */ |
871 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
872 | | /* 18 06 2005 Jay */ |
873 | | /* */ |
874 | | /*****************************************************************************/ |
875 | | UWORD32 ih264d_get_cabac_context_mbaff(dec_struct_t * ps_dec, |
876 | | dec_mb_info_t *ps_cur_mb_info, |
877 | | UWORD32 u4_mbskip) |
878 | 130k | { |
879 | 130k | const UWORD8 u1_mb_ngbr_availablity = ps_dec->u1_mb_ngbr_availablity; |
880 | 130k | ctxt_inc_mb_info_t * const p_ctx_inc_mb_map = ps_dec->p_ctxt_inc_mb_map; |
881 | | |
882 | 130k | UWORD8 (*pu1_left_mv_ctxt_inc_2d)[4] = &ps_dec->pu1_left_mv_ctxt_inc[0]; |
883 | 130k | WORD8 (*pi1_left_ref_idx_ctxt_inc) = ps_dec->pi1_left_ref_idx_ctxt_inc; |
884 | 130k | const UWORD8 u1_cur_mb_fld_flag = ps_cur_mb_info->u1_mb_field_decodingflag; |
885 | 130k | const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb; |
886 | 130k | const UWORD8 uc_botMb = 1 - ps_cur_mb_info->u1_topmb; |
887 | | |
888 | 130k | ctxt_inc_mb_info_t * ps_leftMB; |
889 | | |
890 | 130k | ps_dec->ps_curr_ctxt_mb_info = p_ctx_inc_mb_map + (ps_dec->u2_mbx << 1); |
891 | 130k | ps_dec->p_top_ctxt_mb_info = ps_dec->ps_curr_ctxt_mb_info; |
892 | | |
893 | 130k | if(u1_topmb) |
894 | 65.3k | { |
895 | 65.3k | pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[0]; |
896 | 65.3k | pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0]; |
897 | 65.3k | ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_topmb; |
898 | 65.3k | } |
899 | 64.9k | else |
900 | 64.9k | { |
901 | | /* uc_botMb */ |
902 | 64.9k | pu1_left_mv_ctxt_inc_2d = ps_dec->u1_left_mv_ctxt_inc_arr[1]; |
903 | 64.9k | pi1_left_ref_idx_ctxt_inc = &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0]; |
904 | 64.9k | ps_dec->pu1_left_yuv_dc_csbp = &ps_dec->u1_yuv_dc_csbp_bot_mb; |
905 | 64.9k | ps_dec->ps_curr_ctxt_mb_info += 1; |
906 | 64.9k | } |
907 | | |
908 | 130k | ps_dec->pu1_left_mv_ctxt_inc = pu1_left_mv_ctxt_inc_2d; |
909 | 130k | ps_dec->pi1_left_ref_idx_ctxt_inc = pi1_left_ref_idx_ctxt_inc; |
910 | | |
911 | 130k | if(u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK) |
912 | 122k | { |
913 | 122k | const UWORD8 u1_left_mb_fld_flag = ps_cur_mb_info->ps_left_mb->u1_mb_fld; |
914 | | |
915 | 122k | ps_leftMB = ps_dec->ps_curr_ctxt_mb_info - 2; |
916 | 122k | if(u1_left_mb_fld_flag != u1_cur_mb_fld_flag) |
917 | 27.4k | { |
918 | 27.4k | ctxt_inc_mb_info_t *ps_tempLeft; |
919 | 27.4k | UWORD8 u1_cbp_t, u1_cbp_b; |
920 | 27.4k | UWORD8 u1_cr_cpb; |
921 | | |
922 | 27.4k | ps_leftMB -= uc_botMb; |
923 | 27.4k | ps_tempLeft = ps_dec->ps_left_mb_ctxt_info; |
924 | 27.4k | ps_tempLeft->u1_mb_type = ps_leftMB->u1_mb_type; |
925 | 27.4k | ps_tempLeft->u1_intra_chroma_pred_mode = |
926 | 27.4k | ps_leftMB->u1_intra_chroma_pred_mode; |
927 | | |
928 | 27.4k | ps_tempLeft->u1_transform8x8_ctxt = ps_leftMB->u1_transform8x8_ctxt; |
929 | | |
930 | 27.4k | u1_cr_cpb = ps_leftMB->u1_cbp; |
931 | | /*****************************************************************/ |
932 | | /* reform RefIdx, CBP, MV and CBF ctxInc taking care of A and A+1*/ |
933 | | /*****************************************************************/ |
934 | 27.4k | if(u1_cur_mb_fld_flag) |
935 | 14.7k | { |
936 | | /* current MB is a FLD and left a FRM */ |
937 | 14.7k | UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_top)[4] = |
938 | 14.7k | ps_dec->u1_left_mv_ctxt_inc_arr[0]; |
939 | 14.7k | UWORD8 (* const pu1_left_mv_ctxt_inc_2d_arr_bot)[4] = |
940 | 14.7k | ps_dec->u1_left_mv_ctxt_inc_arr[1]; |
941 | 14.7k | WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_top) = |
942 | 14.7k | &ps_dec->i1_left_ref_idx_ctx_inc_arr[0][0]; |
943 | 14.7k | WORD8 (* const i1_left_ref_idx_ctxt_inc_arr_bot) = |
944 | 14.7k | &ps_dec->i1_left_ref_idx_ctx_inc_arr[1][0]; |
945 | | |
946 | 14.7k | u1_cbp_t = ps_leftMB->u1_cbp; |
947 | 14.7k | u1_cbp_b = (ps_leftMB + 1)->u1_cbp; |
948 | 14.7k | ps_tempLeft->u1_cbp = (u1_cbp_t & 0x02) |
949 | 14.7k | | ((u1_cbp_b & 0x02) << 2); |
950 | | |
951 | | // set motionvectors as |
952 | | // 0T = 0T 0B = 0T |
953 | | // 1T = 2T 1B = 2T |
954 | | // 2T = 0B 2B = 0B |
955 | | // 3T = 2B 3B = 2B |
956 | 14.7k | if(u1_topmb) |
957 | 7.40k | { |
958 | | /********************************************/ |
959 | | /* Bottoms DC CBF = Top DC CBF */ |
960 | | /********************************************/ |
961 | 7.40k | ps_dec->u1_yuv_dc_csbp_bot_mb = |
962 | 7.40k | ps_dec->u1_yuv_dc_csbp_topmb; |
963 | | |
964 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] = |
965 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[2]; |
966 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] = |
967 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[2]; |
968 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] = |
969 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_bot[0]; |
970 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0] = |
971 | 7.40k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d_arr_top[0]; |
972 | | |
973 | 7.40k | i1_left_ref_idx_ctxt_inc_arr_top[1] = |
974 | 7.40k | i1_left_ref_idx_ctxt_inc_arr_bot[0]; |
975 | 7.40k | i1_left_ref_idx_ctxt_inc_arr_top[3] = |
976 | 7.40k | i1_left_ref_idx_ctxt_inc_arr_bot[2]; |
977 | | |
978 | 7.40k | *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_bot) = |
979 | 7.40k | *(UWORD32 *)(i1_left_ref_idx_ctxt_inc_arr_top); |
980 | | |
981 | 7.40k | memcpy(pu1_left_mv_ctxt_inc_2d_arr_bot, |
982 | 7.40k | pu1_left_mv_ctxt_inc_2d_arr_top, 16); |
983 | 7.40k | } |
984 | | |
985 | 14.7k | { |
986 | 14.7k | UWORD8 i; |
987 | 73.9k | for(i = 0; i < 4; i++) |
988 | 59.1k | { |
989 | 59.1k | pu1_left_mv_ctxt_inc_2d[i][1] >>= 1; |
990 | 59.1k | pu1_left_mv_ctxt_inc_2d[i][3] >>= 1; |
991 | 59.1k | } |
992 | 14.7k | } |
993 | 14.7k | } |
994 | 12.6k | else |
995 | 12.6k | { |
996 | | /* current MB is a FRM and left FLD */ |
997 | 12.6k | if(u1_topmb) |
998 | 6.32k | { |
999 | 6.32k | u1_cbp_t = ps_leftMB->u1_cbp; |
1000 | 6.32k | u1_cbp_t = (u1_cbp_t & 0x02); |
1001 | 6.32k | ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t << 2)); |
1002 | | |
1003 | | /********************************************/ |
1004 | | /* Bottoms DC CBF = Top DC CBF */ |
1005 | | /********************************************/ |
1006 | 6.32k | ps_dec->u1_yuv_dc_csbp_bot_mb = |
1007 | 6.32k | ps_dec->u1_yuv_dc_csbp_topmb; |
1008 | | |
1009 | | // set motionvectors as |
1010 | | // 3B = 2B = 3T |
1011 | | // 1B = 0B = 2T |
1012 | | // 3T = 2T = 1T |
1013 | | // 1T = 0T = 0T |
1014 | | |
1015 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[7] = |
1016 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3]; |
1017 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[6] = |
1018 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3]; |
1019 | | |
1020 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[5] = |
1021 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2]; |
1022 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[4] = |
1023 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2]; |
1024 | | |
1025 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[3] = |
1026 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1]; |
1027 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[2] = |
1028 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1]; |
1029 | | |
1030 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[1] = |
1031 | 6.32k | *(UWORD32 *)pu1_left_mv_ctxt_inc_2d[0]; |
1032 | | |
1033 | 6.32k | pi1_left_ref_idx_ctxt_inc[7] = (pi1_left_ref_idx_ctxt_inc[3] |
1034 | 6.32k | - 1); |
1035 | 6.32k | pi1_left_ref_idx_ctxt_inc[6] = (pi1_left_ref_idx_ctxt_inc[3] |
1036 | 6.32k | - 1); |
1037 | | |
1038 | 6.32k | pi1_left_ref_idx_ctxt_inc[5] = (pi1_left_ref_idx_ctxt_inc[1] |
1039 | 6.32k | - 1); |
1040 | 6.32k | pi1_left_ref_idx_ctxt_inc[4] = (pi1_left_ref_idx_ctxt_inc[1] |
1041 | 6.32k | - 1); |
1042 | | |
1043 | 6.32k | pi1_left_ref_idx_ctxt_inc[3] = (pi1_left_ref_idx_ctxt_inc[2] |
1044 | 6.32k | - 1); |
1045 | 6.32k | pi1_left_ref_idx_ctxt_inc[2] = (pi1_left_ref_idx_ctxt_inc[2] |
1046 | 6.32k | - 1); |
1047 | | |
1048 | 6.32k | pi1_left_ref_idx_ctxt_inc[1] = (pi1_left_ref_idx_ctxt_inc[0] |
1049 | 6.32k | - 1); |
1050 | 6.32k | pi1_left_ref_idx_ctxt_inc[0] = (pi1_left_ref_idx_ctxt_inc[0] |
1051 | 6.32k | - 1); |
1052 | 6.32k | } |
1053 | 6.31k | else |
1054 | 6.31k | { |
1055 | 6.31k | u1_cbp_t = ps_leftMB->u1_cbp; |
1056 | 6.31k | u1_cbp_t = (u1_cbp_t & 0x08); |
1057 | 6.31k | ps_tempLeft->u1_cbp = (u1_cbp_t | (u1_cbp_t >> 2)); |
1058 | 6.31k | } |
1059 | | |
1060 | 12.6k | { |
1061 | 12.6k | UWORD8 i; |
1062 | 63.1k | for(i = 0; i < 4; i++) |
1063 | 50.5k | { |
1064 | 50.5k | pu1_left_mv_ctxt_inc_2d[i][1] <<= 1; |
1065 | 50.5k | pu1_left_mv_ctxt_inc_2d[i][3] <<= 1; |
1066 | 50.5k | } |
1067 | 12.6k | } |
1068 | | |
1069 | 12.6k | } |
1070 | | |
1071 | 27.4k | ps_tempLeft->u1_cbp = ps_tempLeft->u1_cbp + ((u1_cr_cpb >> 4) << 4); |
1072 | 27.4k | ps_leftMB = ps_tempLeft; |
1073 | 27.4k | } |
1074 | | |
1075 | 122k | ps_dec->p_left_ctxt_mb_info = ps_leftMB; |
1076 | 122k | } |
1077 | 7.72k | else |
1078 | 7.72k | { |
1079 | 7.72k | ps_dec->p_left_ctxt_mb_info = p_ctx_inc_mb_map - 1; |
1080 | 7.72k | if(!u4_mbskip) |
1081 | 3.33k | { |
1082 | 3.33k | *(ps_dec->pu1_left_yuv_dc_csbp) = 0; |
1083 | | |
1084 | 3.33k | MEMSET_16BYTES(&pu1_left_mv_ctxt_inc_2d[0][0], 0); |
1085 | 3.33k | *(UWORD32 *)pi1_left_ref_idx_ctxt_inc = 0; |
1086 | 3.33k | } |
1087 | 7.72k | } |
1088 | | |
1089 | | /*************************************************************************/ |
1090 | | /* Now get the top context mb info */ |
1091 | | /*************************************************************************/ |
1092 | 130k | { |
1093 | 130k | UWORD8 (*u1_top_mv_ctxt_inc_arr_2d)[4] = |
1094 | 130k | ps_dec->ps_curr_ctxt_mb_info->u1_mv; |
1095 | 130k | WORD8 (*pi1_top_ref_idx_ctxt_inc) = |
1096 | 130k | ps_dec->ps_curr_ctxt_mb_info->i1_ref_idx; |
1097 | 130k | UWORD8 uc_topMbFldDecFlag = ps_cur_mb_info->ps_top_mb->u1_mb_fld; |
1098 | | |
1099 | 130k | if(u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK) |
1100 | 116k | { |
1101 | 116k | if(ps_cur_mb_info->i1_offset) |
1102 | 62.4k | ps_dec->p_top_ctxt_mb_info += 1; |
1103 | | |
1104 | 116k | if(!u4_mbskip) |
1105 | 81.2k | { |
1106 | 81.2k | memcpy(u1_top_mv_ctxt_inc_arr_2d, |
1107 | 81.2k | &ps_dec->p_top_ctxt_mb_info->u1_mv, 16); |
1108 | 81.2k | memcpy(pi1_top_ref_idx_ctxt_inc, |
1109 | 81.2k | &ps_dec->p_top_ctxt_mb_info->i1_ref_idx, 4); |
1110 | 81.2k | if(uc_topMbFldDecFlag ^ u1_cur_mb_fld_flag) |
1111 | 18.0k | { |
1112 | 18.0k | UWORD8 i; |
1113 | 18.0k | if(u1_cur_mb_fld_flag) |
1114 | 12.8k | { |
1115 | 64.2k | for(i = 0; i < 4; i++) |
1116 | 51.4k | { |
1117 | 51.4k | u1_top_mv_ctxt_inc_arr_2d[i][1] >>= 1; |
1118 | 51.4k | u1_top_mv_ctxt_inc_arr_2d[i][3] >>= 1; |
1119 | 51.4k | } |
1120 | 12.8k | } |
1121 | 5.19k | else |
1122 | 5.19k | { |
1123 | 25.9k | for(i = 0; i < 4; i++) |
1124 | 20.7k | { |
1125 | 20.7k | u1_top_mv_ctxt_inc_arr_2d[i][1] <<= 1; |
1126 | 20.7k | u1_top_mv_ctxt_inc_arr_2d[i][3] <<= 1; |
1127 | 20.7k | pi1_top_ref_idx_ctxt_inc[i] -= 1; |
1128 | 20.7k | } |
1129 | 5.19k | } |
1130 | 18.0k | } |
1131 | 81.2k | } |
1132 | 116k | } |
1133 | 13.6k | else |
1134 | 13.6k | { |
1135 | 13.6k | ps_dec->p_top_ctxt_mb_info = p_ctx_inc_mb_map - 1; |
1136 | 13.6k | if(!u4_mbskip) |
1137 | 8.99k | { |
1138 | | |
1139 | 8.99k | MEMSET_16BYTES(&u1_top_mv_ctxt_inc_arr_2d[0][0], 0); |
1140 | 8.99k | memset(pi1_top_ref_idx_ctxt_inc, 0, 4); |
1141 | 8.99k | } |
1142 | 13.6k | } |
1143 | 130k | } |
1144 | | |
1145 | 130k | return OK; |
1146 | 130k | } |
1147 | | |
1148 | | /*****************************************************************************/ |
1149 | | /* */ |
1150 | | /* Function Name : ih264d_update_mbaff_left_nnz */ |
1151 | | /* */ |
1152 | | /* Description : This function updates the left luma and chroma nnz for */ |
1153 | | /* mbaff cases. */ |
1154 | | /* */ |
1155 | | /* Inputs : <What inputs does the function take?> */ |
1156 | | /* Globals : <Does it use any global variables?> */ |
1157 | | /* Processing : <Describe how the function operates - include algorithm */ |
1158 | | /* description> */ |
1159 | | /* Outputs : <What does the function produce?> */ |
1160 | | /* Returns : <What does the function return?> */ |
1161 | | /* */ |
1162 | | /* Issues : <List any issues or problems with this function> */ |
1163 | | /* */ |
1164 | | /* Revision History: */ |
1165 | | /* */ |
1166 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1167 | | /* 13 07 2002 Ittiam Draft */ |
1168 | | /* */ |
1169 | | /*****************************************************************************/ |
1170 | | void ih264d_update_mbaff_left_nnz(dec_struct_t * ps_dec, |
1171 | | dec_mb_info_t * ps_cur_mb_info) |
1172 | 2.02M | { |
1173 | 2.02M | UWORD32 *pu4_buf; |
1174 | 2.02M | UWORD8 *pu1_buf; |
1175 | 2.02M | if(ps_cur_mb_info->u1_topmb) |
1176 | 1.01M | { |
1177 | 1.01M | pu1_buf = ps_dec->pu1_left_nnz_y; |
1178 | 1.01M | pu4_buf = (UWORD32 *)pu1_buf; |
1179 | 1.01M | ps_dec->u4_n_left_temp_y = *pu4_buf; |
1180 | | |
1181 | 1.01M | pu1_buf = ps_dec->pu1_left_nnz_uv; |
1182 | 1.01M | pu4_buf = (UWORD32 *)pu1_buf; |
1183 | 1.01M | ps_dec->u4_n_left_temp_uv = *pu4_buf; |
1184 | 1.01M | } |
1185 | 1.01M | else |
1186 | 1.01M | { |
1187 | | |
1188 | 1.01M | ps_dec->u4_n_leftY[0] = ps_dec->u4_n_left_temp_y; |
1189 | 1.01M | pu1_buf = ps_dec->pu1_left_nnz_y; |
1190 | 1.01M | pu4_buf = (UWORD32 *)pu1_buf; |
1191 | 1.01M | ps_dec->u4_n_leftY[1] = *pu4_buf; |
1192 | 1.01M | ps_dec->u4_n_left_cr[0] = ps_dec->u4_n_left_temp_uv; |
1193 | 1.01M | pu1_buf = ps_dec->pu1_left_nnz_uv; |
1194 | 1.01M | pu4_buf = (UWORD32 *)pu1_buf; |
1195 | 1.01M | ps_dec->u4_n_left_cr[1] = *pu4_buf; |
1196 | | |
1197 | 1.01M | } |
1198 | 2.02M | } |
1199 | | |
1200 | | /*! |
1201 | | ************************************************************************** |
1202 | | * \if Function name : ih264d_get_mbaff_neighbours \endif |
1203 | | * |
1204 | | * \brief |
1205 | | * Gets the neighbors for the current MB if it is of type MB-AFF |
1206 | | * frame. |
1207 | | * |
1208 | | * \return |
1209 | | * None |
1210 | | * |
1211 | | ************************************************************************** |
1212 | | */ |
1213 | | void ih264d_get_mbaff_neighbours(dec_struct_t * ps_dec, |
1214 | | dec_mb_info_t * ps_cur_mb_info, |
1215 | | UWORD8 uc_curMbFldDecFlag) |
1216 | 2.02M | { |
1217 | | |
1218 | 2.02M | mb_neigbour_params_t *ps_left_mb; |
1219 | 2.02M | mb_neigbour_params_t *ps_top_mb; |
1220 | 2.02M | mb_neigbour_params_t *ps_top_right_mb = NULL; |
1221 | 2.02M | mb_neigbour_params_t *ps_curmb; |
1222 | 2.02M | const UWORD8 u1_topmb = ps_cur_mb_info->u1_topmb; |
1223 | 2.02M | const UWORD8 uc_botMb = 1 - u1_topmb; |
1224 | 2.02M | const UWORD32 u4_mb_x = ps_cur_mb_info->u2_mbx; |
1225 | | |
1226 | | /* Current MbParams location in top row buffer */ |
1227 | 2.02M | ps_curmb = ps_dec->ps_cur_mb_row + (u4_mb_x << 1) + uc_botMb; |
1228 | 2.02M | ps_left_mb = ps_curmb - 2; |
1229 | | /* point to A if top else A+1 */ |
1230 | 2.02M | if(uc_botMb && (ps_left_mb->u1_mb_fld != uc_curMbFldDecFlag)) |
1231 | 17.8k | { |
1232 | | /* move from A + 1 to A */ |
1233 | 17.8k | ps_left_mb--; |
1234 | 17.8k | } |
1235 | 2.02M | ps_cur_mb_info->i1_offset = 0; |
1236 | 2.02M | if((uc_curMbFldDecFlag == 0) && uc_botMb) |
1237 | 976k | { |
1238 | 976k | mb_neigbour_params_t *ps_topleft_mb; |
1239 | | /* CurMbAddr - 1 */ |
1240 | 976k | ps_top_mb = ps_curmb - 1; |
1241 | | |
1242 | | /* Mark Top right Not available */ |
1243 | | /* point to A */ |
1244 | 976k | ps_topleft_mb = ps_curmb - 3; |
1245 | | |
1246 | 976k | if(ps_topleft_mb->u1_mb_fld) |
1247 | 8.51k | { |
1248 | | /* point to A + 1 */ |
1249 | 8.51k | ps_topleft_mb++; |
1250 | 8.51k | } |
1251 | 976k | ps_cur_mb_info->u1_topleft_mb_fld = ps_topleft_mb->u1_mb_fld; |
1252 | 976k | ps_cur_mb_info->u1_topleft_mbtype = ps_topleft_mb->u1_mb_type; |
1253 | 976k | } |
1254 | 1.04M | else |
1255 | 1.04M | { |
1256 | | /* Top = B + 1 */ |
1257 | 1.04M | ps_top_mb = ps_dec->ps_top_mb_row + (u4_mb_x << 1) + 1; |
1258 | 1.04M | ps_top_right_mb = ps_top_mb + 2; |
1259 | 1.04M | ps_cur_mb_info->i1_offset = 4; |
1260 | | /* TopRight = C + 1 */ |
1261 | | |
1262 | | /* TopLeft = D+1 */ |
1263 | 1.04M | ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld_bot; |
1264 | 1.04M | ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype_bot; |
1265 | | |
1266 | 1.04M | if(uc_curMbFldDecFlag && u1_topmb) |
1267 | 35.5k | { |
1268 | 35.5k | if(ps_top_mb->u1_mb_fld) |
1269 | 21.4k | { |
1270 | | /* MbAddrB */ |
1271 | 21.4k | ps_top_mb--; |
1272 | 21.4k | ps_cur_mb_info->i1_offset = 0; |
1273 | 21.4k | } |
1274 | | /* If topright is field then point to C */ |
1275 | 35.5k | ps_top_right_mb -= ps_top_right_mb->u1_mb_fld ? 1 : 0; |
1276 | 35.5k | if(ps_cur_mb_info->u1_topleft_mb_fld) |
1277 | 20.3k | { |
1278 | | /* TopLeft = D */ |
1279 | 20.3k | ps_cur_mb_info->u1_topleft_mb_fld = ps_dec->u1_topleft_mb_fld; |
1280 | 20.3k | ps_cur_mb_info->u1_topleft_mbtype = ps_dec->u1_topleft_mbtype; |
1281 | 20.3k | } |
1282 | 35.5k | } |
1283 | 1.04M | } |
1284 | 2.02M | if(u1_topmb) |
1285 | 1.01M | { |
1286 | | /* Update the parameters of topleftmb*/ |
1287 | 1.01M | ps_dec->u1_topleft_mb_fld = ps_top_mb->u1_mb_fld; |
1288 | 1.01M | ps_dec->u1_topleft_mbtype = ps_top_mb->u1_mb_type; |
1289 | | /* Set invscan and dequantMatrixScan*/ |
1290 | 1.01M | if(uc_curMbFldDecFlag) |
1291 | 35.5k | { |
1292 | 35.5k | ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld; |
1293 | 35.5k | } |
1294 | 977k | else |
1295 | 977k | { |
1296 | 977k | ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan; |
1297 | 977k | } |
1298 | 1.01M | ps_dec->pu2_quant_scale_y = |
1299 | 1.01M | gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6]; |
1300 | 1.01M | ps_dec->pu2_quant_scale_u = |
1301 | 1.01M | gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6]; |
1302 | 1.01M | ps_dec->pu2_quant_scale_v = |
1303 | 1.01M | gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6]; |
1304 | | |
1305 | 1.01M | } |
1306 | 1.01M | else |
1307 | 1.01M | { |
1308 | | /* Update the parameters of topleftmb*/ |
1309 | 1.01M | mb_neigbour_params_t *ps_top_mb_temp = ps_dec->ps_top_mb_row |
1310 | 1.01M | + (u4_mb_x << 1) + 1; |
1311 | 1.01M | ps_dec->u1_topleft_mb_fld_bot = ps_top_mb_temp->u1_mb_fld; |
1312 | 1.01M | ps_dec->u1_topleft_mbtype_bot = ps_top_mb_temp->u1_mb_type; |
1313 | 1.01M | } |
1314 | | |
1315 | 2.02M | ps_cur_mb_info->ps_left_mb = ps_left_mb; |
1316 | 2.02M | ps_cur_mb_info->ps_top_mb = ps_top_mb; |
1317 | 2.02M | ps_cur_mb_info->ps_top_right_mb = ps_top_right_mb; |
1318 | 2.02M | ps_cur_mb_info->ps_curmb = ps_curmb; |
1319 | 2.02M | ps_curmb->u1_mb_fld = uc_curMbFldDecFlag; |
1320 | | |
1321 | 2.02M | { |
1322 | | /* Form Left NNZ */ |
1323 | 2.02M | UWORD8 u1_is_left_mb_fld = ps_left_mb->u1_mb_fld; |
1324 | 2.02M | UWORD8 *pu1_left_mb_pair_nnz_y = (UWORD8 *)&ps_dec->u4_n_leftY[0]; |
1325 | 2.02M | UWORD8 *pu1_left_mb_pair_nnz_uv = (UWORD8 *)&ps_dec->u4_n_left_cr[0]; |
1326 | 2.02M | UWORD8 *pu1_left_nnz_y = ps_dec->pu1_left_nnz_y; |
1327 | 2.02M | UWORD8 *pu1_left_nnz_uv = ps_dec->pu1_left_nnz_uv; |
1328 | | |
1329 | 2.02M | if(uc_curMbFldDecFlag == u1_is_left_mb_fld) |
1330 | 1.98M | { |
1331 | 1.98M | *(UWORD32 *)pu1_left_nnz_y = *(UWORD32 *)(pu1_left_mb_pair_nnz_y |
1332 | 1.98M | + (uc_botMb << 2)); |
1333 | 1.98M | *(UWORD32 *)pu1_left_nnz_uv = *(UWORD32 *)(pu1_left_mb_pair_nnz_uv |
1334 | 1.98M | + (uc_botMb << 2)); |
1335 | 1.98M | } |
1336 | 36.0k | else if((uc_curMbFldDecFlag == 0) && u1_topmb && u1_is_left_mb_fld) |
1337 | 8.53k | { |
1338 | | /* 0 0 1 1 of u4_n_leftY[0], 0 0 2 2 of u4_n_left_cr[0] */ |
1339 | 8.53k | pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[0]; |
1340 | 8.53k | pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[1]; |
1341 | 8.53k | pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] = |
1342 | 8.53k | pu1_left_mb_pair_nnz_uv[0]; |
1343 | 8.53k | pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] = |
1344 | 8.53k | pu1_left_mb_pair_nnz_uv[2]; |
1345 | 8.53k | } |
1346 | 27.4k | else if((uc_curMbFldDecFlag == 0) && uc_botMb && u1_is_left_mb_fld) |
1347 | 8.51k | { |
1348 | | /* 2 2 3 3 of u4_n_leftY[0] , 1 1 3 3 of u4_n_left_cr[0] */ |
1349 | 8.51k | pu1_left_nnz_y[0] = pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2]; |
1350 | 8.51k | pu1_left_nnz_y[2] = pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[3]; |
1351 | 8.51k | pu1_left_nnz_uv[0] = pu1_left_nnz_uv[1] = |
1352 | 8.51k | pu1_left_mb_pair_nnz_uv[1]; |
1353 | 8.51k | pu1_left_nnz_uv[2] = pu1_left_nnz_uv[3] = |
1354 | 8.51k | pu1_left_mb_pair_nnz_uv[3]; |
1355 | 8.51k | } |
1356 | 18.9k | else |
1357 | 18.9k | { |
1358 | | /* 0 2 0 2 of u4_n_leftY[0], u4_n_leftY[1] */ |
1359 | 18.9k | pu1_left_nnz_y[0] = pu1_left_mb_pair_nnz_y[0]; |
1360 | 18.9k | pu1_left_nnz_y[1] = pu1_left_mb_pair_nnz_y[2]; |
1361 | 18.9k | pu1_left_nnz_y[2] = pu1_left_mb_pair_nnz_y[4 + 0]; |
1362 | 18.9k | pu1_left_nnz_y[3] = pu1_left_mb_pair_nnz_y[4 + 2]; |
1363 | | |
1364 | | /* 0 of u4_n_left_cr[0] and 0 u4_n_left_cr[1] |
1365 | | 2 of u4_n_left_cr[0] and 2 u4_n_left_cr[1] */ |
1366 | 18.9k | pu1_left_nnz_uv[0] = pu1_left_mb_pair_nnz_uv[0]; |
1367 | 18.9k | pu1_left_nnz_uv[1] = pu1_left_mb_pair_nnz_uv[4 + 0]; |
1368 | 18.9k | pu1_left_nnz_uv[2] = pu1_left_mb_pair_nnz_uv[2]; |
1369 | 18.9k | pu1_left_nnz_uv[3] = pu1_left_mb_pair_nnz_uv[4 + 2]; |
1370 | 18.9k | } |
1371 | 2.02M | } |
1372 | 2.02M | } |
1373 | | |
1374 | | /* |
1375 | | ************************************************************************** |
1376 | | * \if Function name : ih264d_transfer_mb_group_data \endif |
1377 | | * |
1378 | | * \brief |
1379 | | * Transfer the Following things |
1380 | | * N-Mb DeblkParams Data ( To Ext DeblkParams Buffer ) |
1381 | | * N-Mb Recon Data ( To Ext Frame Buffer ) |
1382 | | * N-Mb Intrapredline Data ( Updated Internally) |
1383 | | * N-Mb MV Data ( To Ext MV Buffer ) |
1384 | | * N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers) |
1385 | | * |
1386 | | * \return |
1387 | | * None |
1388 | | * |
1389 | | ************************************************************************** |
1390 | | */ |
1391 | | void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec, |
1392 | | const UWORD32 u4_num_mbs, |
1393 | | const UWORD32 u4_end_of_row, /* Cur n-Mb End of Row Flag */ |
1394 | | const UWORD32 u4_end_of_row_next /* Next n-Mb End of Row Flag */ |
1395 | | ) |
1396 | 2.82M | { |
1397 | 2.82M | dec_mb_info_t *ps_cur_mb_info = ps_dec->ps_nmb_info; |
1398 | 2.82M | tfr_ctxt_t *ps_trns_addr = &ps_dec->s_tran_addrecon; |
1399 | 2.82M | UWORD16 u2_mb_y; |
1400 | 2.82M | UWORD32 y_offset; |
1401 | 2.82M | UWORD32 u4_frame_stride; |
1402 | 2.82M | mb_neigbour_params_t *ps_temp; |
1403 | 2.82M | const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
1404 | 2.82M | UNUSED(u4_end_of_row_next); |
1405 | | |
1406 | 2.82M | ps_trns_addr->pu1_dest_y += ps_trns_addr->u4_inc_y[u4_end_of_row]; |
1407 | 2.82M | ps_trns_addr->pu1_dest_u += ps_trns_addr->u4_inc_uv[u4_end_of_row]; |
1408 | 2.82M | ps_trns_addr->pu1_dest_v += ps_trns_addr->u4_inc_uv[u4_end_of_row]; |
1409 | | |
1410 | | /* Swap top and current pointers */ |
1411 | 2.82M | if(u4_end_of_row) |
1412 | 2.76M | { |
1413 | | |
1414 | 2.76M | if(ps_dec->u1_separate_parse) |
1415 | 1.41M | { |
1416 | 1.41M | u2_mb_y = ps_dec->i2_dec_thread_mb_y; |
1417 | 1.41M | } |
1418 | 1.35M | else |
1419 | 1.35M | { |
1420 | 1.35M | ps_temp = ps_dec->ps_cur_mb_row; |
1421 | 1.35M | ps_dec->ps_cur_mb_row = ps_dec->ps_top_mb_row; |
1422 | 1.35M | ps_dec->ps_top_mb_row = ps_temp; |
1423 | | |
1424 | 1.35M | u2_mb_y = ps_dec->u2_mby + (1 + u1_mbaff); |
1425 | 1.35M | } |
1426 | | |
1427 | 2.76M | u4_frame_stride = ps_dec->u2_frm_wd_y |
1428 | 2.76M | << ps_dec->ps_cur_slice->u1_field_pic_flag; |
1429 | 2.76M | y_offset = (u2_mb_y * u4_frame_stride) << 4; |
1430 | 2.76M | ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + y_offset; |
1431 | | |
1432 | 2.76M | u4_frame_stride = ps_dec->u2_frm_wd_uv |
1433 | 2.76M | << ps_dec->ps_cur_slice->u1_field_pic_flag; |
1434 | 2.76M | y_offset = (u2_mb_y * u4_frame_stride) << 3; |
1435 | 2.76M | ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + y_offset; |
1436 | 2.76M | ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + y_offset; |
1437 | | |
1438 | 2.76M | ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y; |
1439 | 2.76M | ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u; |
1440 | 2.76M | ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v; |
1441 | 2.76M | } |
1442 | | |
1443 | | /* |
1444 | | * The Slice boundary is also a valid condition to transfer. So recalculate |
1445 | | * the Left increment, in case the number of MBs is lesser than the |
1446 | | * N MB value. u4_num_mbs will be equal to N of N MB if the entire N Mb is |
1447 | | * decoded. |
1448 | | */ |
1449 | 2.82M | ps_dec->s_tran_addrecon.u2_mv_left_inc = ((WORD16)(u4_num_mbs >> u1_mbaff) - 1) |
1450 | 2.82M | << (4 + u1_mbaff); |
1451 | 2.82M | ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (WORD16)(u4_num_mbs << 2) - 1 |
1452 | 2.82M | - (u1_mbaff << 2); |
1453 | | |
1454 | 2.82M | if(ps_dec->u1_separate_parse == 0) |
1455 | 1.38M | { |
1456 | | /* reassign left MV and cur MV pointers */ |
1457 | 1.38M | ps_dec->ps_mv_left = ps_dec->ps_mv_cur |
1458 | 1.38M | + ps_dec->s_tran_addrecon.u2_mv_left_inc; |
1459 | | |
1460 | 1.38M | ps_dec->ps_mv_cur += (u4_num_mbs << 4); |
1461 | 1.38M | } |
1462 | | |
1463 | | /* Increment deblock parameters pointer in external memory */ |
1464 | | |
1465 | 2.82M | if(ps_dec->u1_separate_parse == 0) |
1466 | 1.38M | { |
1467 | 1.38M | ps_dec->ps_deblk_mbn += u4_num_mbs; |
1468 | 1.38M | } |
1469 | | |
1470 | 2.82M | } |
1471 | | |
1472 | | /* |
1473 | | ************************************************************************** |
1474 | | * \if Function name : ih264d_populate_mb_info_map \endif |
1475 | | * |
1476 | | * \brief |
1477 | | * Populate mb info values for mbtype and qp map at 8x8 level for each MB |
1478 | | * |
1479 | | * \return |
1480 | | * void |
1481 | | * |
1482 | | ************************************************************************** |
1483 | | */ |
1484 | | void ih264d_populate_mb_info_map(dec_struct_t *ps_dec, dec_mb_info_t *ps_cur_mb_info, |
1485 | | UWORD16 u2_blk_x, UWORD16 u2_blk_y, UWORD8 u1_qp_val) |
1486 | 0 | { |
1487 | 0 | UWORD16 stride = ps_dec->u2_frm_wd_in_mbs << 1; |
1488 | 0 | UWORD8 *pu1_qp_map = ps_dec->as_buf_id_info_map[ps_dec->u1_pic_buf_id].pu1_qp_map; |
1489 | 0 | UWORD8 *pu1_mb_type_map = ps_dec->as_buf_id_info_map[ps_dec->u1_pic_buf_id].pu1_mb_type_map; |
1490 | |
|
1491 | 0 | UWORD8 cur_mb_type = ps_cur_mb_info->u1_mb_type; |
1492 | 0 | UWORD8 mb_is_inter = |
1493 | 0 | (cur_mb_type == P_MB || cur_mb_type == B_MB || cur_mb_type == SP_MB); |
1494 | 0 | UWORD8 mb_type = mb_is_inter ? BLOCK_TYPE_INTER_MB : BLOCK_TYPE_INTRA_MB; |
1495 | 0 | if(cur_mb_type == MB_SKIP) mb_type = BLOCK_TYPE_SKIP_MB; |
1496 | | |
1497 | | // populate qp_map, mb_type_map for mbx, mby |
1498 | | // since we store values at 8x8 level, duplicate values for blocks while storing in map |
1499 | 0 | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1500 | 0 | { |
1501 | 0 | UWORD8 bot_mb = ps_cur_mb_info->u1_topmb ? 0 : 1; |
1502 | 0 | if(ps_cur_mb_info->u1_mb_field_decodingflag) |
1503 | 0 | { |
1504 | 0 | pu1_qp_map[u2_blk_x + stride * ( u2_blk_y + bot_mb)] = |
1505 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * ( u2_blk_y + bot_mb)] = |
1506 | 0 | pu1_qp_map[u2_blk_x + stride * ((u2_blk_y + 2) + bot_mb)] = |
1507 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * ((u2_blk_y + 2) + bot_mb)] = |
1508 | 0 | u1_qp_val; |
1509 | |
|
1510 | 0 | pu1_mb_type_map[u2_blk_x + stride * ( u2_blk_y + bot_mb)] = |
1511 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * ( u2_blk_y + bot_mb)] = |
1512 | 0 | pu1_mb_type_map[u2_blk_x + stride * ((u2_blk_y + 2) + bot_mb)] = |
1513 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * ((u2_blk_y + 2) + bot_mb)] = |
1514 | 0 | mb_type; |
1515 | 0 | } |
1516 | 0 | else |
1517 | 0 | { |
1518 | 0 | pu1_qp_map[u2_blk_x + stride * ( u2_blk_y + (2 * bot_mb))] = |
1519 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * ( u2_blk_y + (2 * bot_mb))] = |
1520 | 0 | pu1_qp_map[u2_blk_x + stride * ((u2_blk_y + 1) + (2 * bot_mb))] = |
1521 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * ((u2_blk_y + 1) + (2 * bot_mb))] = |
1522 | 0 | u1_qp_val; |
1523 | |
|
1524 | 0 | pu1_mb_type_map[u2_blk_x + stride * ( u2_blk_y + (2 * bot_mb))] = |
1525 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * ( u2_blk_y + (2 * bot_mb))] = |
1526 | 0 | pu1_mb_type_map[u2_blk_x + stride * ((u2_blk_y + 1) + (2 * bot_mb))] = |
1527 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * ((u2_blk_y + 1) + (2 * bot_mb))] = |
1528 | 0 | mb_type; |
1529 | 0 | } |
1530 | 0 | } |
1531 | 0 | else |
1532 | 0 | { |
1533 | 0 | if(ps_dec->ps_cur_slice->u1_field_pic_flag) |
1534 | 0 | { |
1535 | 0 | UWORD8 bot_mb = ps_dec->ps_cur_slice->u1_bottom_field_flag; |
1536 | 0 | pu1_qp_map[u2_blk_x + stride * (2 * u2_blk_y + bot_mb)] = |
1537 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * (2 * u2_blk_y + bot_mb)] = |
1538 | 0 | pu1_qp_map[u2_blk_x + stride * (2 * (u2_blk_y + 1) + bot_mb)] = |
1539 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * (2 * (u2_blk_y + 1) + bot_mb)] = |
1540 | 0 | u1_qp_val; |
1541 | |
|
1542 | 0 | pu1_mb_type_map[u2_blk_x + stride * (2 * u2_blk_y + bot_mb)] = |
1543 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * (2 * u2_blk_y + bot_mb)] = |
1544 | 0 | pu1_mb_type_map[u2_blk_x + stride * (2 * (u2_blk_y + 1) + bot_mb)] = |
1545 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * (2 * (u2_blk_y + 1) + bot_mb)] = |
1546 | 0 | mb_type; |
1547 | 0 | } |
1548 | 0 | else |
1549 | 0 | { |
1550 | 0 | pu1_qp_map[u2_blk_x + stride * u2_blk_y ] = |
1551 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * u2_blk_y ] = |
1552 | 0 | pu1_qp_map[u2_blk_x + stride * (u2_blk_y + 1)] = |
1553 | 0 | pu1_qp_map[u2_blk_x + 1 + stride * (u2_blk_y + 1)] = |
1554 | 0 | u1_qp_val; |
1555 | |
|
1556 | 0 | pu1_mb_type_map[u2_blk_x + stride * u2_blk_y ] = |
1557 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * u2_blk_y ] = |
1558 | 0 | pu1_mb_type_map[u2_blk_x + stride * (u2_blk_y + 1)] = |
1559 | 0 | pu1_mb_type_map[u2_blk_x + 1 + stride * (u2_blk_y + 1)] = |
1560 | 0 | mb_type; |
1561 | 0 | } |
1562 | 0 | } |
1563 | 0 | } |