Coverage Report

Created: 2025-07-12 06:37

/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
}