Coverage Report

Created: 2025-12-14 06:42

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