Coverage Report

Created: 2026-03-07 07:01

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
74.7k
{
73
74.7k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
74
74.7k
    UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num;
75
74.7k
    UWORD8 u1_init_colzero_flag;
76
74.7k
    UNUSED(ps_cur_mb_info);
77
74.7k
    pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
78
74.7k
    u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num];
79
74.7k
    u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
80
74.7k
    u1_col_mb_pred_mode >>= 6;
81
74.7k
    ps_direct->u1_vert_mv_scale = ONE_TO_ONE;
82
74.7k
    ps_direct->u1_col_zeroflag_change = (ps_svc_lyr_dec->u1_base_res_flag) ? 0 : 1;
83
84
74.7k
    if(u1_wd_x == MB_SIZE)
85
69.4k
    {
86
69.4k
        ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
87
69.4k
        if(u1_col_mb_pred_mode == PRED_16x16)
88
65.5k
        {
89
65.5k
            ps_direct->i1_num_partitions = 1;
90
65.5k
            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
91
65.5k
            ps_direct->i1_submb_num[0] = 0;
92
65.5k
            ps_direct->i1_partitionsize[0] = PRED_16x16;
93
94
65.5k
            return;
95
65.5k
        }
96
3.91k
        else if(u1_col_mb_pred_mode < PRED_8x8)
97
1.61k
        {
98
1.61k
            ps_direct->i1_num_partitions = 2;
99
1.61k
            ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
100
1.61k
            ps_direct->i1_submb_num[0] = 0;
101
1.61k
            ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode;
102
1.61k
            u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2;
103
1.61k
            ps_direct->i1_submb_num[1] = u1_sub_mb_num;
104
1.61k
            ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + ps_direct->i1_submb_num[1];
105
1.61k
            ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode;
106
1.61k
            if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag)
107
474
                ps_direct->u1_col_zeroflag_change = 1;
108
1.61k
            return;
109
1.61k
        }
110
2.29k
        else
111
2.29k
        {
112
2.29k
            u1_num_blks = 4;
113
2.29k
        }
114
69.4k
    }
115
5.30k
    else
116
5.30k
    {
117
5.30k
        u1_num_blks = 1;
118
5.30k
    }
119
120
7.60k
    {
121
7.60k
        const UWORD8 *pu1_top_lt_mb_part_idx;
122
7.60k
        UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0;
123
7.60k
        UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num;
124
7.60k
        const UWORD8 *pu1_num_sub_mb_part = (const UWORD8 *) gau1_ih264d_num_submb_part;
125
7.60k
        UWORD8 i1_num_partitions = 0, partition_size;
126
7.60k
        WORD32 mv_index;
127
7.60k
        const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
128
129
7.60k
        u1_sub_mb_num = ps_dec->u1_sub_mb_num;
130
7.60k
        uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag;
131
7.60k
        pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod + (PRED_8x8 << 1) + 1;
132
133
22.1k
        for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
134
14.5k
        {
135
14.5k
            partition_size = PRED_8x8;
136
14.5k
            pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
137
14.5k
            if(uc_direct8x8inf == 1)
138
3.39k
            {
139
3.39k
                u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
140
3.39k
                mv_index = u2_sub_mb_ofst + u1_submb_col;
141
3.39k
                u1_num_sub_blks = 1;
142
3.39k
            }
143
11.1k
            else
144
11.1k
            {
145
                /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */
146
11.1k
                pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
147
11.1k
                u1_col_sub_mb_pred_mode = *pu1_col_zero_flag;
148
11.1k
                u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4;
149
11.1k
                partition_size = (UWORD8) ((u1_col_sub_mb_pred_mode) | (PRED_8x8 << 2));
150
11.1k
                mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
151
11.1k
                pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1);
152
11.1k
                u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode];
153
11.1k
            }
154
155
30.4k
            for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks; u1_sub_blk++, pu1_top_lt_sub_mb_idx++)
156
15.9k
            {
157
15.9k
                u1_sub_mb_num += *pu1_top_lt_sub_mb_idx;
158
15.9k
                mv_index += *pu1_top_lt_sub_mb_idx;
159
15.9k
                ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
160
15.9k
                ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
161
15.9k
                ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
162
15.9k
                i1_num_partitions++;
163
15.9k
                if(!uc_direct8x8inf) u1_submb_col = u1_sub_mb_num;
164
15.9k
                if((pu1_col_zero_flag_start[u1_submb_col] & 1) != u1_init_colzero_flag)
165
1.54k
                    ps_direct->u1_col_zeroflag_change = 1;
166
15.9k
            }
167
14.5k
            u1_sub_mb_num = *pu1_top_lt_mb_part_idx++;
168
14.5k
        }
169
7.60k
        ps_direct->i1_num_partitions = i1_num_partitions;
170
7.60k
    }
171
7.60k
}
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
74.7k
{
188
74.7k
    svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec;
189
74.7k
    mv_pred_t s_mv_pred = {0};
190
74.7k
    mv_pred_t *ps_mv;
191
74.7k
    UWORD8 u1_col_zero_flag, u1_direct_zero_pred_flag = 0;
192
74.7k
    UWORD32 u4_sub_mb_num;
193
74.7k
    UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
194
74.7k
    mv_pred_t *ps_mv_ntop_start;
195
74.7k
    mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_mb_num << 4);
196
74.7k
    UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth;
197
74.7k
    UWORD8 i;
198
74.7k
    WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1;
199
74.7k
    struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL,
200
74.7k
                        *ps_pic_buff1 = NULL;
201
202
74.7k
    UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b;
203
74.7k
    WORD16 i2_spat_pred_mv[4] = {0};
204
74.7k
    WORD16 *pi2_final_mv0, *pi2_final_mv1;
205
74.7k
    UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0;
206
74.7k
    UWORD32 *pui32_weight_ofsts = NULL;
207
74.7k
    directmv_t s_mvdirect = {0};
208
74.7k
    UWORD8 u1_colz;
209
74.7k
    UWORD8 u1_final_ref_idx = 0;
210
74.7k
    const UWORD8 *pu1_mb_parth = (const UWORD8 *) gau1_ih264d_mb_parth;
211
74.7k
    const UWORD8 *pu1_mb_partw = (const UWORD8 *) gau1_ih264d_mb_partw;
212
213
74.7k
    mv_pred_t s_temp_mv_pred = {0};
214
74.7k
    ps_mv_ntop_start =
215
74.7k
        ps_dec->ps_mv_cur + (u4_mb_num << 4) - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
216
217
74.7k
    u1_direct_zero_pred_flag =
218
74.7k
        ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, (ps_mv_nmb_start + ps_dec->u1_sub_mb_num),
219
74.7k
                          ps_mv_ntop_start + (ps_dec->u1_sub_mb_num & 0x03), &s_mv_pred,
220
74.7k
                          ps_dec->u1_sub_mb_num, (u1_wd_x >> 2), 0, 1, B_DIRECT_SPATIAL);
221
222
74.7k
    i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0];
223
74.7k
    i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1];
224
74.7k
    i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2];
225
74.7k
    i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3];
226
227
74.7k
    i1_ref_frame0 = s_mv_pred.i1_ref_frame[0];
228
74.7k
    i1_ref_frame1 = s_mv_pred.i1_ref_frame[1];
229
230
74.7k
    i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0;
231
74.7k
    i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1;
232
233
74.7k
    i1_pred = 0;
234
235
74.7k
    {
236
74.7k
        WORD8 u1_ref_idx, u1_ref_idx1;
237
74.7k
        UWORD32 uc_Idx, uc_Idx1;
238
74.7k
        UWORD8 u1_scale_ref =
239
74.7k
            (ps_dec->ps_cur_slice->u1_mbaff_frame_flag && ps_cur_mb_info->u1_mb_field_decodingflag);
240
74.7k
        u1_final_ref_idx = i1_ref_frame0;
241
74.7k
        if(i1_ref_frame0 >= 0)
242
70.1k
        {
243
            /* convert RefIdx if it is MbAff */
244
70.1k
            u1_ref_idx = i1_ref_frame0;
245
70.1k
            u1_ref_idx1 = i1_ref_frame0;
246
70.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
70.1k
            ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1];
254
70.1k
            ps_ref_frame = ps_pic_buff0;
255
70.1k
            i1_pred = PRED_L0;
256
70.1k
        }
257
258
74.7k
        if(i1_ref_frame1 >= 0)
259
67.7k
        {
260
            /* convert RefIdx if it is MbAff */
261
67.7k
            u1_ref_idx = i1_ref_frame1;
262
67.7k
            u1_ref_idx1 = i1_ref_frame1;
263
67.7k
            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
67.7k
            ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1];
270
67.7k
            i1_pred = i1_pred | PRED_L1;
271
67.7k
        }
272
74.7k
        if(i1_ref_frame0 < 0)
273
4.65k
        {
274
4.65k
            ps_ref_frame = ps_pic_buff1;
275
4.65k
            u1_final_ref_idx = i1_ref_frame1;
276
4.65k
        }
277
278
74.7k
        u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0);
279
74.7k
        u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0);
280
281
74.7k
        if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
282
47.1k
        {
283
47.1k
            uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0) *
284
47.1k
                     ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
285
47.1k
            if(u1_scale_ref) uc_Idx >>= 1;
286
47.1k
            uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1;
287
47.1k
            uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1;
288
47.1k
            pui32_weight_ofsts = (UWORD32 *) &ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)];
289
290
47.1k
            if(i1_ref_frame0 < 0) pui32_weight_ofsts += 1;
291
292
47.1k
            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
47.1k
        }
304
74.7k
    }
305
306
74.7k
    s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0;
307
74.7k
    s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1;
308
74.7k
    s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
309
74.7k
    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
74.7k
    isvcd_one_to_one(ps_svc_lyr_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
317
74.7k
                     ps_dec->i4_submb_ofst, ps_cur_mb_info);
318
319
74.7k
    ps_col_pic = ps_dec->ps_col_pic;
320
74.7k
    if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag)
321
4.13k
    {
322
4.13k
        WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1;
323
        /* Most probable case */
324
4.13k
        u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]);
325
4.13k
        u1_col_zero_flag = u1_col_zero_flag & 0x01;
326
327
4.13k
        if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
328
4.13k
        {
329
4.13k
            i2_mv_x = 0;
330
4.13k
            i2_mv_y = 0;
331
4.13k
        }
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.13k
        if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
339
4.13k
        {
340
4.13k
            i2_mvX1 = 0;
341
4.13k
            i2_mvY1 = 0;
342
4.13k
        }
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.13k
        u4_sub_mb_num = ps_dec->u1_sub_mb_num;
350
4.13k
        u1_mb_partw = (u1_wd_x >> 2);
351
352
4.13k
        if(i1_ref_frame0 >= 0)
353
4.13k
        {
354
4.13k
            {
355
4.13k
                pred_info_pkd_t *ps_pred_pkd;
356
4.13k
                WORD16 i2_mv[2];
357
4.13k
                WORD8 i1_ref_idx = 0;
358
359
4.13k
                i2_mv[0] = i2_mv_x;
360
4.13k
                i2_mv[1] = i2_mv_y;
361
362
4.13k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
363
4.13k
                ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u4_sub_mb_num, i1_pred,
364
4.13k
                                      ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id, i1_ref_idx,
365
4.13k
                                      pui32_weight_ofsts, ps_pic_buff0->u1_pic_type);
366
4.13k
                ps_dec->u4_pred_info_pkd_idx++;
367
4.13k
                ps_cur_mb_info->u1_num_pred_parts++;
368
4.13k
            }
369
4.13k
        }
370
371
4.13k
        if(i1_ref_frame1 >= 0)
372
4.13k
        {
373
4.13k
            {
374
4.13k
                pred_info_pkd_t *ps_pred_pkd;
375
4.13k
                WORD16 i2_mv[2];
376
4.13k
                WORD8 i1_ref_idx = 0;
377
378
4.13k
                i2_mv[0] = i2_mvX1;
379
4.13k
                i2_mv[1] = i2_mvY1;
380
381
4.13k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
382
4.13k
                ih264d_fill_pred_info(i2_mv, u1_mb_partw, u1_mb_partw, u4_sub_mb_num, i1_pred,
383
4.13k
                                      ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx,
384
4.13k
                                      pui32_weight_ofsts, ps_pic_buff1->u1_pic_type);
385
4.13k
                ps_dec->u4_pred_info_pkd_idx++;
386
4.13k
                ps_cur_mb_info->u1_num_pred_parts++;
387
4.13k
            }
388
4.13k
        }
389
390
        /* Replication optimisation */
391
4.13k
        s_temp_mv_pred.i2_mv[0] = i2_mv_x;
392
4.13k
        s_temp_mv_pred.i2_mv[1] = i2_mv_y;
393
4.13k
        s_temp_mv_pred.i2_mv[2] = i2_mvX1;
394
4.13k
        s_temp_mv_pred.i2_mv[3] = i2_mvY1;
395
396
        /* Calculating colocated zero information */
397
4.13k
        {
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.13k
            UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0;
410
411
4.13k
            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.13k
            u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) |
419
4.13k
                      ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
420
4.13k
            u1_colz |= (u1_packed_mb_sub_mb_mode << 6);
421
4.13k
        }
422
4.13k
        ps_mv = ps_mv_nmb_start + u4_sub_mb_num;
423
4.13k
        if(ps_mv)
424
4.13k
        {
425
4.13k
            ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u4_sub_mb_num, u1_colz, u1_mb_partw,
426
4.13k
                               u1_mb_partw);
427
4.13k
        }
428
0
        else
429
0
        {
430
0
            return NOT_OK;
431
0
        }
432
433
4.13k
        if(u1_wd_x == MB_SIZE) ps_dec->u1_currB_type = 0;
434
435
4.13k
        return OK;
436
4.13k
    }
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
70.6k
    if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2))
446
2.27k
    {
447
2.27k
        ps_cur_mb_info->u1_Mux = 1;
448
2.27k
        if(i1_ref_frame0 >= 0)
449
1.74k
        {
450
1.74k
            {
451
1.74k
                pred_info_pkd_t *ps_pred_pkd;
452
1.74k
                WORD8 i1_ref_idx = 0;
453
454
1.74k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
455
1.74k
                ih264d_fill_pred_info(&(i2_spat_pred_mv[0]), 4, 4, 0, i1_pred, ps_pred_pkd,
456
1.74k
                                      ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
457
1.74k
                                      ps_pic_buff0->u1_pic_type);
458
1.74k
                ps_dec->u4_pred_info_pkd_idx++;
459
1.74k
                ps_cur_mb_info->u1_num_pred_parts++;
460
1.74k
            }
461
462
            /******    (0,0) Motion vectors DMA     *****/
463
1.74k
            {
464
1.74k
                pred_info_pkd_t *ps_pred_pkd;
465
1.74k
                WORD16 i2_mv[2];
466
1.74k
                WORD8 i1_ref_idx = 0;
467
468
1.74k
                i2_mv[0] = 0;
469
1.74k
                i2_mv[1] = 0;
470
471
1.74k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
472
1.74k
                ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd,
473
1.74k
                                      ps_pic_buff0->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
474
1.74k
                                      ps_pic_buff0->u1_pic_type);
475
1.74k
                ps_dec->u4_pred_info_pkd_idx++;
476
1.74k
                ps_cur_mb_info->u1_num_pred_parts++;
477
1.74k
            }
478
1.74k
        }
479
2.27k
        if(i1_ref_frame1 >= 0)
480
1.94k
        {
481
1.94k
            {
482
1.94k
                pred_info_pkd_t *ps_pred_pkd;
483
1.94k
                WORD8 i1_ref_idx = 0;
484
485
1.94k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
486
1.94k
                ih264d_fill_pred_info(&(i2_spat_pred_mv[2]), 4, 4, 0, i1_pred, ps_pred_pkd,
487
1.94k
                                      ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
488
1.94k
                                      ps_pic_buff1->u1_pic_type);
489
1.94k
                ps_dec->u4_pred_info_pkd_idx++;
490
1.94k
                ps_cur_mb_info->u1_num_pred_parts++;
491
1.94k
            }
492
493
            /******    (0,0) Motion vectors DMA     *****/
494
1.94k
            {
495
1.94k
                pred_info_pkd_t *ps_pred_pkd;
496
1.94k
                WORD16 i2_mv[2];
497
1.94k
                WORD8 i1_ref_idx = 0;
498
499
1.94k
                i2_mv[0] = 0;
500
1.94k
                i2_mv[1] = 0;
501
502
1.94k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
503
1.94k
                ih264d_fill_pred_info(i2_mv, 4, 4, 0, i1_pred, ps_pred_pkd,
504
1.94k
                                      ps_pic_buff1->u1_pic_buf_id, i1_ref_idx, pui32_weight_ofsts,
505
1.94k
                                      ps_pic_buff1->u1_pic_type);
506
1.94k
                ps_dec->u4_pred_info_pkd_idx++;
507
1.94k
                ps_cur_mb_info->u1_num_pred_parts++;
508
1.94k
            }
509
1.94k
        }
510
2.27k
    }
511
512
151k
    for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
513
80.4k
    {
514
80.4k
        partition_size = s_mvdirect.i1_partitionsize[i];
515
80.4k
        u4_sub_mb_num = s_mvdirect.i1_submb_num[i];
516
517
80.4k
        sub_partition = partition_size >> 2;
518
80.4k
        partition_size &= 0x3;
519
80.4k
        u1_mb_partw = pu1_mb_partw[partition_size];
520
80.4k
        u1_mb_parth = pu1_mb_parth[partition_size];
521
80.4k
        if(sub_partition != 0)
522
12.3k
        {
523
12.3k
            u1_mb_partw >>= 1;
524
12.3k
            u1_mb_parth >>= 1;
525
12.3k
        }
526
527
80.4k
        u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[i]);
528
80.4k
        u1_col_zero_flag = u1_col_zero_flag & 0x01;
529
530
        /*if(u1_col != u1_col_zero_flag)
531
         u1_init = 1;*/
532
533
80.4k
        pi2_final_mv0 = &i2_spat_pred_mv[0];
534
80.4k
        pi2_final_mv1 = &i2_spat_pred_mv[2];
535
536
80.4k
        if(ps_cur_mb_info->u1_Mux != 1)
537
69.9k
        {
538
69.9k
            if(i1_ref_frame0 >= 0)
539
65.7k
            {
540
65.7k
                {
541
65.7k
                    pred_info_pkd_t *ps_pred_pkd;
542
65.7k
                    WORD8 i1_ref_idx = 0;
543
544
65.7k
                    ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
545
65.7k
                    ih264d_fill_pred_info(pi2_final_mv0, u1_mb_partw, u1_mb_parth, u4_sub_mb_num,
546
65.7k
                                          i1_pred, ps_pred_pkd, ps_pic_buff0->u1_pic_buf_id,
547
65.7k
                                          i1_ref_idx, pui32_weight_ofsts,
548
65.7k
                                          ps_pic_buff0->u1_pic_type);
549
65.7k
                    ps_dec->u4_pred_info_pkd_idx++;
550
65.7k
                    ps_cur_mb_info->u1_num_pred_parts++;
551
65.7k
                }
552
65.7k
            }
553
554
69.9k
            if(i1_ref_frame1 >= 0)
555
62.4k
            {
556
62.4k
                pred_info_pkd_t *ps_pred_pkd;
557
62.4k
                WORD8 i1_ref_idx = 0;
558
559
62.4k
                ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
560
62.4k
                ih264d_fill_pred_info(pi2_final_mv1, u1_mb_partw, u1_mb_parth, u4_sub_mb_num,
561
62.4k
                                      i1_pred, ps_pred_pkd, ps_pic_buff1->u1_pic_buf_id, i1_ref_idx,
562
62.4k
                                      pui32_weight_ofsts, ps_pic_buff1->u1_pic_type);
563
62.4k
                ps_dec->u4_pred_info_pkd_idx++;
564
62.4k
                ps_cur_mb_info->u1_num_pred_parts++;
565
62.4k
            }
566
69.9k
        }
567
568
        /* Replication optimisation */
569
80.4k
        s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0];
570
80.4k
        s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1];
571
80.4k
        s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0];
572
80.4k
        s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1];
573
574
        /* Calculating colocated zero information */
575
80.4k
        {
576
80.4k
            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
80.4k
            UWORD8 u1_packed_mb_sub_mb_mode = sub_partition
586
80.4k
                                                  ? (s_mvdirect.i1_partitionsize[i])
587
80.4k
                                                  : ((s_mvdirect.i1_partitionsize[i]) << 2);
588
589
80.4k
            if(i1_ref_frame0 >= 0)
590
73.6k
            {
591
73.6k
                i2_mv_x = pi2_final_mv0[0];
592
73.6k
                i2_mv_y = pi2_final_mv0[1];
593
73.6k
            }
594
6.87k
            else
595
6.87k
            {
596
6.87k
                i2_mv_x = pi2_final_mv1[0];
597
6.87k
                i2_mv_y = pi2_final_mv1[1];
598
6.87k
            }
599
600
80.4k
            u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1) |
601
80.4k
                      ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
602
80.4k
            u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
603
80.4k
        }
604
80.4k
        ps_mv = ps_mv_nmb_start + u4_sub_mb_num;
605
80.4k
        if(ps_mv)
606
80.4k
        {
607
80.4k
            ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u4_sub_mb_num, u1_colz, u1_mb_parth,
608
80.4k
                               u1_mb_partw);
609
80.4k
        }
610
0
        else
611
0
        {
612
0
            return NOT_OK;
613
0
        }
614
80.4k
    }
615
70.6k
    i = 0;
616
70.6k
    if(i1_ref_frame0 >= 0) ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd;
617
70.6k
    if(i1_ref_frame1 >= 0) ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd;
618
619
70.6k
    return OK;
620
70.6k
}