/src/libavc/decoder/svc/isvcd_process_ebslice.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2022 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 |
23 | | * isvcd_process_bslice.c |
24 | | * |
25 | | * @brief |
26 | | * Contains routines that decode B slice type |
27 | | * |
28 | | * @author |
29 | | * Kishore |
30 | | * |
31 | | * @remarks |
32 | | * None |
33 | | * |
34 | | ******************************************************************************* |
35 | | */ |
36 | | |
37 | | #include <string.h> |
38 | | #include "ih264_typedefs.h" |
39 | | #include "ih264_macros.h" |
40 | | #include "ih264_platform_macros.h" |
41 | | #include "isvcd_structs.h" |
42 | | #include "ih264d_bitstrm.h" |
43 | | #include "ih264d_parse_cavlc.h" |
44 | | #include "ih264d_mb_utils.h" |
45 | | #include "ih264d_mvpred.h" |
46 | | #include "ih264d_inter_pred.h" |
47 | | #include "ih264d_process_pslice.h" |
48 | | #include "ih264d_error_handler.h" |
49 | | #include "ih264d_tables.h" |
50 | | #include "ih264d_parse_slice.h" |
51 | | #include "ih264d_process_pslice.h" |
52 | | #include "ih264d_process_bslice.h" |
53 | | #include "ih264d_tables.h" |
54 | | #include "ih264d_parse_islice.h" |
55 | | #include "ih264d_mvpred.h" |
56 | | |
57 | | /*! |
58 | | ************************************************************************** |
59 | | * \if Function name : isvcd_one_to_one \endif |
60 | | * |
61 | | * \brief |
62 | | * Initializes forward and backward refernce lists for B slice decoding. |
63 | | * |
64 | | * |
65 | | * \return |
66 | | * 0 on Success and Error code otherwise |
67 | | ************************************************************************** |
68 | | */ |
69 | | void isvcd_one_to_one(svc_dec_lyr_struct_t *ps_svc_lyr_dec, struct pic_buffer_t *ps_col_pic, |
70 | | directmv_t *ps_direct, UWORD8 u1_wd_x, WORD32 u2_sub_mb_ofst, |
71 | | dec_mb_info_t *ps_cur_mb_info) |
72 | 87.9k | { |
73 | 87.9k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
74 | 87.9k | UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num; |
75 | 87.9k | UWORD8 u1_init_colzero_flag; |
76 | 87.9k | UNUSED(ps_cur_mb_info); |
77 | 87.9k | pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst; |
78 | 87.9k | u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num]; |
79 | 87.9k | u1_init_colzero_flag = u1_col_mb_pred_mode & 1; |
80 | 87.9k | u1_col_mb_pred_mode >>= 6; |
81 | 87.9k | ps_direct->u1_vert_mv_scale = ONE_TO_ONE; |
82 | 87.9k | ps_direct->u1_col_zeroflag_change = (ps_svc_lyr_dec->u1_base_res_flag) ? 0 : 1; |
83 | | |
84 | 87.9k | if(u1_wd_x == MB_SIZE) |
85 | 83.0k | { |
86 | 83.0k | ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode); |
87 | 83.0k | if(u1_col_mb_pred_mode == PRED_16x16) |
88 | 76.3k | { |
89 | 76.3k | ps_direct->i1_num_partitions = 1; |
90 | 76.3k | ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; |
91 | 76.3k | ps_direct->i1_submb_num[0] = 0; |
92 | 76.3k | ps_direct->i1_partitionsize[0] = PRED_16x16; |
93 | | |
94 | 76.3k | return; |
95 | 76.3k | } |
96 | 6.66k | else if(u1_col_mb_pred_mode < PRED_8x8) |
97 | 3.18k | { |
98 | 3.18k | ps_direct->i1_num_partitions = 2; |
99 | 3.18k | ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst; |
100 | 3.18k | ps_direct->i1_submb_num[0] = 0; |
101 | 3.18k | ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode; |
102 | 3.18k | u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2; |
103 | 3.18k | ps_direct->i1_submb_num[1] = u1_sub_mb_num; |
104 | 3.18k | ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + ps_direct->i1_submb_num[1]; |
105 | 3.18k | ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode; |
106 | 3.18k | if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag) |
107 | 1.37k | ps_direct->u1_col_zeroflag_change = 1; |
108 | 3.18k | return; |
109 | 3.18k | } |
110 | 3.47k | else |
111 | 3.47k | { |
112 | 3.47k | u1_num_blks = 4; |
113 | 3.47k | } |
114 | 83.0k | } |
115 | 4.89k | else |
116 | 4.89k | { |
117 | 4.89k | u1_num_blks = 1; |
118 | 4.89k | } |
119 | | |
120 | 8.36k | { |
121 | 8.36k | const UWORD8 *pu1_top_lt_mb_part_idx; |
122 | 8.36k | UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0; |
123 | 8.36k | UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num; |
124 | 8.36k | const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part; |
125 | 8.36k | UWORD8 i1_num_partitions = 0, partition_size; |
126 | 8.36k | WORD32 mv_index; |
127 | 8.36k | const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct; |
128 | | |
129 | 8.36k | u1_sub_mb_num = ps_dec->u1_sub_mb_num; |
130 | 8.36k | uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag; |
131 | 8.36k | pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod + (PRED_8x8 << 1) + 1; |
132 | | |
133 | 27.1k | for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++) |
134 | 18.8k | { |
135 | 18.8k | partition_size = PRED_8x8; |
136 | 18.8k | pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct; |
137 | 18.8k | if(uc_direct8x8inf == 1) |
138 | 2.81k | { |
139 | 2.81k | u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1); |
140 | 2.81k | mv_index = u2_sub_mb_ofst + u1_submb_col; |
141 | 2.81k | u1_num_sub_blks = 1; |
142 | 2.81k | } |
143 | 15.9k | else |
144 | 15.9k | { |
145 | | /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */ |
146 | 15.9k | pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num; |
147 | 15.9k | u1_col_sub_mb_pred_mode = *pu1_col_zero_flag; |
148 | 15.9k | u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4; |
149 | 15.9k | partition_size = (UWORD8) ((u1_col_sub_mb_pred_mode) | (PRED_8x8 << 2)); |
150 | 15.9k | mv_index = u2_sub_mb_ofst + u1_sub_mb_num; |
151 | 15.9k | pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1); |
152 | 15.9k | u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode]; |
153 | 15.9k | } |
154 | | |
155 | 41.0k | for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks; u1_sub_blk++, pu1_top_lt_sub_mb_idx++) |
156 | 22.2k | { |
157 | 22.2k | u1_sub_mb_num += *pu1_top_lt_sub_mb_idx; |
158 | 22.2k | mv_index += *pu1_top_lt_sub_mb_idx; |
159 | 22.2k | ps_direct->i4_mv_indices[i1_num_partitions] = mv_index; |
160 | 22.2k | ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num; |
161 | 22.2k | ps_direct->i1_partitionsize[i1_num_partitions] = partition_size; |
162 | 22.2k | i1_num_partitions++; |
163 | 22.2k | if(!uc_direct8x8inf) u1_submb_col = u1_sub_mb_num; |
164 | 22.2k | if((pu1_col_zero_flag_start[u1_submb_col] & 1) != u1_init_colzero_flag) |
165 | 3.16k | ps_direct->u1_col_zeroflag_change = 1; |
166 | 22.2k | } |
167 | 18.8k | u1_sub_mb_num = *pu1_top_lt_mb_part_idx++; |
168 | 18.8k | } |
169 | 8.36k | ps_direct->i1_num_partitions = i1_num_partitions; |
170 | 8.36k | } |
171 | 8.36k | } |
172 | | |
173 | | /*! |
174 | | ************************************************************************** |
175 | | * \if Function name : isvcd_decode_spatial_direct \endif |
176 | | * |
177 | | * \brief |
178 | | * Decodes spatial direct mode. |
179 | | * |
180 | | * \return |
181 | | * None. |
182 | | * Vijay |
183 | | ************************************************************************** |
184 | | */ |
185 | | WORD32 isvcd_decode_spatial_direct(dec_struct_t *ps_dec, UWORD8 u1_wd_x, |
186 | | dec_mb_info_t *ps_cur_mb_info, UWORD8 u1_mb_num) |
187 | 87.9k | { |
188 | 87.9k | svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec; |
189 | 87.9k | mv_pred_t s_mv_pred = {0}; |
190 | 87.9k | mv_pred_t *ps_mv; |
191 | 87.9k | UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0; |
192 | 87.9k | UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
193 | 87.9k | mv_pred_t *ps_mv_ntop_start; |
194 | 87.9k | mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4); |
195 | 87.9k | UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth; |
196 | 87.9k | UWORD8 i; |
197 | 87.9k | WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1; |
198 | 87.9k | struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL, |
199 | 87.9k | *ps_pic_buff1 = NULL; |
200 | | |
201 | 87.9k | UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b; |
202 | 87.9k | WORD16 i2_spat_pred_mv[4] = {0}; |
203 | 87.9k | WORD16 *pi2_final_mv0, *pi2_final_mv1; |
204 | 87.9k | UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0; |
205 | 87.9k | UWORD32 *pui32_weight_ofsts = NULL; |
206 | 87.9k | directmv_t s_mvdirect = {0}; |
207 | 87.9k | UWORD8 u1_colz; |
208 | 87.9k | UWORD8 u1_final_ref_idx = 0; |
209 | 87.9k | const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth; |
210 | 87.9k | const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw; |
211 | | |
212 | 87.9k | mv_pred_t s_temp_mv_pred = {0}; |
213 | 87.9k | ps_mv_ntop_start = |
214 | 87.9k | ps_dec->ps_mv_cur + (u1_mb_num << 4) - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12; |
215 | | |
216 | 87.9k | u1_direct_zero_pred_flag = |
217 | 87.9k | ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, (ps_mv_nmb_start + ps_dec->u1_sub_mb_num), |
218 | 87.9k | ps_mv_ntop_start + (ps_dec->u1_sub_mb_num & 0x03), &s_mv_pred, |
219 | 87.9k | ps_dec->u1_sub_mb_num, (u1_wd_x >> 2), 0, 1, B_DIRECT_SPATIAL); |
220 | | |
221 | 87.9k | i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0]; |
222 | 87.9k | i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1]; |
223 | 87.9k | i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2]; |
224 | 87.9k | i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3]; |
225 | | |
226 | 87.9k | i1_ref_frame0 = s_mv_pred.i1_ref_frame[0]; |
227 | 87.9k | i1_ref_frame1 = s_mv_pred.i1_ref_frame[1]; |
228 | | |
229 | 87.9k | i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0; |
230 | 87.9k | i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1; |
231 | | |
232 | 87.9k | i1_pred = 0; |
233 | | |
234 | 87.9k | { |
235 | 87.9k | WORD8 u1_ref_idx, u1_ref_idx1; |
236 | 87.9k | UWORD32 uc_Idx, uc_Idx1; |
237 | 87.9k | UWORD8 u1_scale_ref = |
238 | 87.9k | (ps_dec->ps_cur_slice->u1_mbaff_frame_flag && ps_cur_mb_info->u1_mb_field_decodingflag); |
239 | 87.9k | u1_final_ref_idx = i1_ref_frame0; |
240 | 87.9k | if(i1_ref_frame0 >= 0) |
241 | 84.4k | { |
242 | | /* convert RefIdx if it is MbAff */ |
243 | 84.4k | u1_ref_idx = i1_ref_frame0; |
244 | 84.4k | u1_ref_idx1 = i1_ref_frame0; |
245 | 84.4k | if(u1_scale_ref) |
246 | 0 | { |
247 | 0 | u1_ref_idx1 = u1_ref_idx >> 1; |
248 | 0 | if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb)) |
249 | 0 | u1_ref_idx1 += MAX_REF_BUFS; |
250 | 0 | } |
251 | | /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */ |
252 | 84.4k | ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1]; |
253 | 84.4k | ps_ref_frame = ps_pic_buff0; |
254 | 84.4k | i1_pred = PRED_L0; |
255 | 84.4k | } |
256 | | |
257 | 87.9k | if(i1_ref_frame1 >= 0) |
258 | 77.0k | { |
259 | | /* convert RefIdx if it is MbAff */ |
260 | 77.0k | u1_ref_idx = i1_ref_frame1; |
261 | 77.0k | u1_ref_idx1 = i1_ref_frame1; |
262 | 77.0k | if(u1_scale_ref) |
263 | 0 | { |
264 | 0 | u1_ref_idx1 = u1_ref_idx >> 1; |
265 | 0 | if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb)) |
266 | 0 | u1_ref_idx1 += MAX_REF_BUFS; |
267 | 0 | } |
268 | 77.0k | ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1]; |
269 | 77.0k | i1_pred = i1_pred | PRED_L1; |
270 | 77.0k | } |
271 | 87.9k | if(i1_ref_frame0 < 0) |
272 | 3.44k | { |
273 | 3.44k | ps_ref_frame = ps_pic_buff1; |
274 | 3.44k | u1_final_ref_idx = i1_ref_frame1; |
275 | 3.44k | } |
276 | | |
277 | 87.9k | u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0); |
278 | 87.9k | u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0); |
279 | | |
280 | 87.9k | if(ps_dec->ps_cur_pps->u1_wted_bipred_idc) |
281 | 67.4k | { |
282 | 67.4k | uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0) * |
283 | 67.4k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; |
284 | 67.4k | if(u1_scale_ref) uc_Idx >>= 1; |
285 | 67.4k | uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1; |
286 | 67.4k | uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1; |
287 | 67.4k | pui32_weight_ofsts = (UWORD32 *) &ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)]; |
288 | | |
289 | 67.4k | if(i1_ref_frame0 < 0) pui32_weight_ofsts += 1; |
290 | | |
291 | 67.4k | if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2)) |
292 | 0 | { |
293 | 0 | WORD16 i2_ref_idx; |
294 | 0 | i2_ref_idx = MAX(i1_ref_frame0, 0); |
295 | 0 | i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] << 1); |
296 | 0 | i2_ref_idx += MAX(i1_ref_frame1, 0); |
297 | 0 | if(!ps_cur_mb_info->u1_topmb) |
298 | 0 | i2_ref_idx += (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] << 1) * |
299 | 0 | (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] << 1); |
300 | 0 | pui32_weight_ofsts = (UWORD32 *) &ps_dec->pu4_mbaff_wt_mat[2 * X3(i2_ref_idx)]; |
301 | 0 | } |
302 | 67.4k | } |
303 | 87.9k | } |
304 | | |
305 | 87.9k | s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0; |
306 | 87.9k | s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1; |
307 | 87.9k | s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id; |
308 | 87.9k | s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type; |
309 | | |
310 | | /**********************************************************************/ |
311 | | /* Call the function which gets the number of partitions and */ |
312 | | /* partition info of colocated Mb */ |
313 | | /**********************************************************************/ |
314 | | |
315 | 87.9k | isvcd_one_to_one(ps_svc_lyr_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x, |
316 | 87.9k | ps_dec->i4_submb_ofst, ps_cur_mb_info); |
317 | | |
318 | 87.9k | ps_col_pic = ps_dec->ps_col_pic; |
319 | 87.9k | if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag) |
320 | 4.56k | { |
321 | 4.56k | WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1; |
322 | | /* Most probable case */ |
323 | 4.56k | u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]); |
324 | 4.56k | u1_col_zero_flag = u1_col_zero_flag & 0x01; |
325 | | |
326 | 4.56k | if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1))) |
327 | 4.56k | { |
328 | 4.56k | i2_mv_x = 0; |
329 | 4.56k | i2_mv_y = 0; |
330 | 4.56k | } |
331 | 0 | else |
332 | 0 | { |
333 | 0 | i2_mv_x = i2_spat_pred_mv[0]; |
334 | 0 | i2_mv_y = i2_spat_pred_mv[1]; |
335 | 0 | } |
336 | | |
337 | 4.56k | if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1))) |
338 | 4.56k | { |
339 | 4.56k | i2_mvX1 = 0; |
340 | 4.56k | i2_mvY1 = 0; |
341 | 4.56k | } |
342 | 0 | else |
343 | 0 | { |
344 | 0 | i2_mvX1 = i2_spat_pred_mv[2]; |
345 | 0 | i2_mvY1 = i2_spat_pred_mv[3]; |
346 | 0 | } |
347 | | |
348 | 4.56k | u1_sub_mb_num = ps_dec->u1_sub_mb_num; |
349 | 4.56k | u1_mb_partw = (u1_wd_x >> 2); |
350 | | |
351 | 4.56k | if(i1_ref_frame0 >= 0) |
352 | 4.56k | { |
353 | 4.56k | { |
354 | 4.56k | pred_info_pkd_t *ps_pred_pkd; |
355 | 4.56k | WORD16 i2_mv[2]; |
356 | 4.56k | WORD8 i1_ref_idx = 0; |
357 | | |
358 | 4.56k | i2_mv[0] = i2_mv_x; |
359 | 4.56k | i2_mv[1] = i2_mv_y; |
360 | | |
361 | 4.56k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
362 | 4.56k | ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u1_sub_mb_num, i1_pred, |
363 | 4.56k | ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, |
364 | 4.56k | pui32_weight_ofsts, ps_pic_buff0->u1_pic_type); |
365 | 4.56k | ps_dec->u4_pred_info_pkd_idx++; |
366 | 4.56k | ps_cur_mb_info->u1_num_pred_parts++; |
367 | 4.56k | } |
368 | 4.56k | } |
369 | | |
370 | 4.56k | if(i1_ref_frame1 >= 0) |
371 | 4.56k | { |
372 | 4.56k | { |
373 | 4.56k | pred_info_pkd_t *ps_pred_pkd; |
374 | 4.56k | WORD16 i2_mv[2]; |
375 | 4.56k | WORD8 i1_ref_idx = 0; |
376 | | |
377 | 4.56k | i2_mv[0] = i2_mvX1; |
378 | 4.56k | i2_mv[1] = i2_mvY1; |
379 | | |
380 | 4.56k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
381 | 4.56k | ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u1_sub_mb_num, i1_pred, |
382 | 4.56k | ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, |
383 | 4.56k | pui32_weight_ofsts, ps_pic_buff1->u1_pic_type); |
384 | 4.56k | ps_dec->u4_pred_info_pkd_idx++; |
385 | 4.56k | ps_cur_mb_info->u1_num_pred_parts++; |
386 | 4.56k | } |
387 | 4.56k | } |
388 | | |
389 | | /* Replication optimisation */ |
390 | 4.56k | s_temp_mv_pred.i2_mv[0] = i2_mv_x; |
391 | 4.56k | s_temp_mv_pred.i2_mv[1] = i2_mv_y; |
392 | 4.56k | s_temp_mv_pred.i2_mv[2] = i2_mvX1; |
393 | 4.56k | s_temp_mv_pred.i2_mv[3] = i2_mvY1; |
394 | | |
395 | | /* Calculating colocated zero information */ |
396 | 4.56k | { |
397 | | /*************************************/ |
398 | | /* If(bit2 and bit3 set) */ |
399 | | /* then */ |
400 | | /* (bit0 and bit1) => submmbmode */ |
401 | | /* (bit2 and bit3) => mbmode */ |
402 | | /* else */ |
403 | | /* (bit0 and bit1) => mbmode */ |
404 | | /*************************************/ |
405 | | /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ? |
406 | | (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) << |
407 | | 2);*/ |
408 | 4.56k | UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0; |
409 | | |
410 | 4.56k | if(i1_ref_frame0 < 0) |
411 | 0 | { |
412 | 0 | i2_mv_x = i2_mvX1; |
413 | 0 | i2_mv_y = i2_mvY1; |
414 | 0 | } |
415 | | |
416 | | /* Change from left shift 4 to 6 - Varun */ |
417 | 4.56k | u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) | |
418 | 4.56k | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1)); |
419 | 4.56k | u1_colz |= (u1_packed_mb_sub_mb_mode << 6); |
420 | 4.56k | } |
421 | 4.56k | ps_mv = ps_mv_nmb_start + u1_sub_mb_num; |
422 | 4.56k | if(ps_mv) |
423 | 4.56k | { |
424 | 4.56k | ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, u1_mb_partw, |
425 | 4.56k | u1_mb_partw); |
426 | 4.56k | } |
427 | 0 | else |
428 | 0 | { |
429 | 0 | return NOT_OK; |
430 | 0 | } |
431 | | |
432 | 4.56k | if(u1_wd_x == MB_SIZE) ps_dec->u1_currB_type = 0; |
433 | | |
434 | 4.56k | return OK; |
435 | 4.56k | } |
436 | | |
437 | | /***************************************************************************/ |
438 | | /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */ |
439 | | /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and */ |
440 | | /* spatially predicted motion vector and do the multiplexing after */ |
441 | | /* motion compensation */ |
442 | | /***************************************************************************/ |
443 | | |
444 | 83.3k | if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2)) |
445 | 3.40k | { |
446 | 3.40k | ps_cur_mb_info->u1_Mux = 1; |
447 | 3.40k | if(i1_ref_frame0 >= 0) |
448 | 3.16k | { |
449 | 3.16k | { |
450 | 3.16k | pred_info_pkd_t *ps_pred_pkd; |
451 | 3.16k | WORD8 i1_ref_idx = 0; |
452 | | |
453 | 3.16k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
454 | 3.16k | ih264d_fill_pred_info(&(i2_spat_pred_mv[0]), 4, 4, 0, i1_pred, ps_pred_pkd, |
455 | 3.16k | ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts, |
456 | 3.16k | ps_pic_buff0->u1_pic_type); |
457 | 3.16k | ps_dec->u4_pred_info_pkd_idx++; |
458 | 3.16k | ps_cur_mb_info->u1_num_pred_parts++; |
459 | 3.16k | } |
460 | | |
461 | | /****** (0,0) Motion vectors DMA *****/ |
462 | 3.16k | { |
463 | 3.16k | pred_info_pkd_t *ps_pred_pkd; |
464 | 3.16k | WORD16 i2_mv[2]; |
465 | 3.16k | WORD8 i1_ref_idx = 0; |
466 | | |
467 | 3.16k | i2_mv[0] = 0; |
468 | 3.16k | i2_mv[1] = 0; |
469 | | |
470 | 3.16k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
471 | 3.16k | ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd, |
472 | 3.16k | ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts, |
473 | 3.16k | ps_pic_buff0->u1_pic_type); |
474 | 3.16k | ps_dec->u4_pred_info_pkd_idx++; |
475 | 3.16k | ps_cur_mb_info->u1_num_pred_parts++; |
476 | 3.16k | } |
477 | 3.16k | } |
478 | 3.40k | if(i1_ref_frame1 >= 0) |
479 | 2.94k | { |
480 | 2.94k | { |
481 | 2.94k | pred_info_pkd_t *ps_pred_pkd; |
482 | 2.94k | WORD8 i1_ref_idx = 0; |
483 | | |
484 | 2.94k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
485 | 2.94k | ih264d_fill_pred_info(&(i2_spat_pred_mv[2]), 4, 4, 0, i1_pred, ps_pred_pkd, |
486 | 2.94k | ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts, |
487 | 2.94k | ps_pic_buff1->u1_pic_type); |
488 | 2.94k | ps_dec->u4_pred_info_pkd_idx++; |
489 | 2.94k | ps_cur_mb_info->u1_num_pred_parts++; |
490 | 2.94k | } |
491 | | |
492 | | /****** (0,0) Motion vectors DMA *****/ |
493 | 2.94k | { |
494 | 2.94k | pred_info_pkd_t *ps_pred_pkd; |
495 | 2.94k | WORD16 i2_mv[2]; |
496 | 2.94k | WORD8 i1_ref_idx = 0; |
497 | | |
498 | 2.94k | i2_mv[0] = 0; |
499 | 2.94k | i2_mv[1] = 0; |
500 | | |
501 | 2.94k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
502 | 2.94k | ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd, |
503 | 2.94k | ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts, |
504 | 2.94k | ps_pic_buff1->u1_pic_type); |
505 | 2.94k | ps_dec->u4_pred_info_pkd_idx++; |
506 | 2.94k | ps_cur_mb_info->u1_num_pred_parts++; |
507 | 2.94k | } |
508 | 2.94k | } |
509 | 3.40k | } |
510 | | |
511 | 183k | for(i = 0; i < s_mvdirect.i1_num_partitions; i++) |
512 | 100k | { |
513 | 100k | partition_size = s_mvdirect.i1_partitionsize[i]; |
514 | 100k | u1_sub_mb_num = s_mvdirect.i1_submb_num[i]; |
515 | | |
516 | 100k | sub_partition = partition_size >> 2; |
517 | 100k | partition_size &= 0x3; |
518 | 100k | u1_mb_partw = pu1_mb_partw[partition_size]; |
519 | 100k | u1_mb_parth = pu1_mb_parth[partition_size]; |
520 | 100k | if(sub_partition != 0) |
521 | 18.8k | { |
522 | 18.8k | u1_mb_partw >>= 1; |
523 | 18.8k | u1_mb_parth >>= 1; |
524 | 18.8k | } |
525 | | |
526 | 100k | u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[i]); |
527 | 100k | u1_col_zero_flag = u1_col_zero_flag & 0x01; |
528 | | |
529 | | /*if(u1_col != u1_col_zero_flag) |
530 | | u1_init = 1;*/ |
531 | | |
532 | 100k | pi2_final_mv0 = &i2_spat_pred_mv[0]; |
533 | 100k | pi2_final_mv1 = &i2_spat_pred_mv[2]; |
534 | | |
535 | 100k | if(ps_cur_mb_info->u1_Mux != 1) |
536 | 83.1k | { |
537 | 83.1k | if(i1_ref_frame0 >= 0) |
538 | 79.8k | { |
539 | 79.8k | { |
540 | 79.8k | pred_info_pkd_t *ps_pred_pkd; |
541 | 79.8k | WORD8 i1_ref_idx = 0; |
542 | | |
543 | 79.8k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
544 | 79.8k | ih264d_fill_pred_info(pi2_final_mv0, u1_mb_partw, u1_mb_parth, u1_sub_mb_num, |
545 | 79.8k | i1_pred, ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id, |
546 | 79.8k | i1_ref_idx, pui32_weight_ofsts, |
547 | 79.8k | ps_pic_buff0->u1_pic_type); |
548 | 79.8k | ps_dec->u4_pred_info_pkd_idx++; |
549 | 79.8k | ps_cur_mb_info->u1_num_pred_parts++; |
550 | 79.8k | } |
551 | 79.8k | } |
552 | | |
553 | 83.1k | if(i1_ref_frame1 >= 0) |
554 | 71.4k | { |
555 | 71.4k | pred_info_pkd_t *ps_pred_pkd; |
556 | 71.4k | WORD8 i1_ref_idx = 0; |
557 | | |
558 | 71.4k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
559 | 71.4k | ih264d_fill_pred_info(pi2_final_mv1, u1_mb_partw, u1_mb_parth, u1_sub_mb_num, |
560 | 71.4k | i1_pred, ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, |
561 | 71.4k | pui32_weight_ofsts, ps_pic_buff1->u1_pic_type); |
562 | 71.4k | ps_dec->u4_pred_info_pkd_idx++; |
563 | 71.4k | ps_cur_mb_info->u1_num_pred_parts++; |
564 | 71.4k | } |
565 | 83.1k | } |
566 | | |
567 | | /* Replication optimisation */ |
568 | 100k | s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0]; |
569 | 100k | s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1]; |
570 | 100k | s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0]; |
571 | 100k | s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1]; |
572 | | |
573 | | /* Calculating colocated zero information */ |
574 | 100k | { |
575 | 100k | WORD16 i2_mv_x = 0, i2_mv_y = 0; |
576 | | /*************************************/ |
577 | | /* If(bit2 and bit3 set) */ |
578 | | /* then */ |
579 | | /* (bit0 and bit1) => submmbmode */ |
580 | | /* (bit2 and bit3) => mbmode */ |
581 | | /* else */ |
582 | | /* (bit0 and bit1) => mbmode */ |
583 | | /*************************************/ |
584 | 100k | UWORD8 u1_packed_mb_sub_mb_mode = sub_partition |
585 | 100k | ? (s_mvdirect.i1_partitionsize[i]) |
586 | 100k | : ((s_mvdirect.i1_partitionsize[i]) << 2); |
587 | | |
588 | 100k | if(i1_ref_frame0 >= 0) |
589 | 95.4k | { |
590 | 95.4k | i2_mv_x = pi2_final_mv0[0]; |
591 | 95.4k | i2_mv_y = pi2_final_mv0[1]; |
592 | 95.4k | } |
593 | 4.56k | else |
594 | 4.56k | { |
595 | 4.56k | i2_mv_x = pi2_final_mv1[0]; |
596 | 4.56k | i2_mv_y = pi2_final_mv1[1]; |
597 | 4.56k | } |
598 | | |
599 | 100k | u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) | |
600 | 100k | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1)); |
601 | 100k | u1_colz |= (u1_packed_mb_sub_mb_mode << 4); |
602 | 100k | } |
603 | 100k | ps_mv = ps_mv_nmb_start + u1_sub_mb_num; |
604 | 100k | if(ps_mv) |
605 | 100k | { |
606 | 100k | ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz, u1_mb_parth, |
607 | 100k | u1_mb_partw); |
608 | 100k | } |
609 | 0 | else |
610 | 0 | { |
611 | 0 | return NOT_OK; |
612 | 0 | } |
613 | 100k | } |
614 | 83.3k | i = 0; |
615 | 83.3k | if(i1_ref_frame0 >= 0) ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd; |
616 | 83.3k | if(i1_ref_frame1 >= 0) ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd; |
617 | | |
618 | 83.3k | return OK; |
619 | 83.3k | } |