Coverage Report

Created: 2025-12-29 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/svc/isvcd_process_epslice.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_epslice.c
24
 *
25
 * @brief
26
 *  Contains routines that decode a I slice type
27
 *
28
 * @author
29
 *  Kishore
30
 *
31
 * @remarks
32
 *  None
33
 *
34
 *******************************************************************************
35
 */
36
37
#include <assert.h>
38
#include <string.h>
39
40
#include "ih264_typedefs.h"
41
#include "ih264_macros.h"
42
#include "ih264_platform_macros.h"
43
#include "ih264d_bitstrm.h"
44
#include "ih264d_defs.h"
45
#include "ih264d_debug.h"
46
#include "isvcd_structs.h"
47
#include "ih264d_defs.h"
48
#include "ih264d_parse_cavlc.h"
49
#include "ih264d_mb_utils.h"
50
#include "ih264d_deblocking.h"
51
#include "ih264d_dpb_manager.h"
52
#include "ih264d_mvpred.h"
53
#include "ih264d_inter_pred.h"
54
#include "ih264d_process_pslice.h"
55
#include "isvcd_process_epslice.h"
56
#include "ih264d_error_handler.h"
57
#include "ih264d_cabac.h"
58
#include "ih264d_debug.h"
59
#include "ih264d_tables.h"
60
#include "ih264d_parse_slice.h"
61
#include "ih264d_utils.h"
62
#include "ih264d_parse_islice.h"
63
#include "ih264d_process_bslice.h"
64
#include "ih264d_process_intra_mb.h"
65
#include "isvcd_mode_mv_resamp.h"
66
#include "ih264_debug.h"
67
68
/*!
69
 **************************************************************************
70
 * \if Function name : isvcd_retrive_infer_mode_mv \endif
71
 *
72
 * \brief
73
 *
74
 * \return
75
 *    0 on Success and Error code otherwise
76
 **************************************************************************
77
 */
78
void isvcd_retrive_infer_mode_mv(svc_dec_lyr_struct_t *ps_svc_lyr_dec, mv_pred_t *ps_mvpred,
79
                                 UWORD8 u1_lx, UWORD8 u1_sub_mb_num)
80
288k
{
81
288k
    mode_motion_ctxt_t *ps_ctxt;
82
288k
    mv_pred_t *ps_motion_pred;
83
288k
    UWORD8 u1_tmp_lx = (u1_lx << 1);
84
85
288k
    ps_ctxt = (mode_motion_ctxt_t *) ps_svc_lyr_dec->pv_mode_mv_sample_ctxt;
86
288k
    ps_motion_pred = ps_ctxt->ps_motion_pred_struct;
87
288k
    ps_motion_pred += u1_sub_mb_num;
88
288k
    ps_mvpred->i2_mv[u1_tmp_lx] = ps_motion_pred->i2_mv[u1_tmp_lx];
89
288k
    ps_mvpred->i2_mv[u1_tmp_lx + 1] = ps_motion_pred->i2_mv[u1_tmp_lx + 1];
90
91
288k
    return;
92
288k
}
93
/*!
94
 **************************************************************************
95
 * \if Function name : isvcd_interlyr_motion_mode_pred \endif
96
 *
97
 * \brief
98
 *
99
 *
100
 * \return
101
 *    0 on Success and Error code otherwise
102
 **************************************************************************
103
 */
104
WORD32 isvcd_interlyr_motion_mode_pred(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
105
                                       dec_mb_info_t *ps_cur_mb_info,
106
                                       dec_svc_mb_info_t *ps_svc_cur_mb_info,
107
                                       parse_pmbarams_t *ps_mb_part_info,
108
                                       parse_part_params_t *ps_part)
109
7.00M
{
110
7.00M
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
111
7.00M
    WORD32 i4_inter_layer_pred_req_flag;
112
7.00M
    WORD32 i4_listx;
113
7.00M
    WORD32 i4_mb_mode = -1;
114
7.00M
    i4_inter_layer_pred_req_flag = SVCD_FALSE;
115
7.00M
    i4_listx = (ps_dec->ps_cur_slice->u1_slice_type == B_SLICE) ? 2 : 1;
116
    /* check Base mode flag and motion predcition flags */
117
7.00M
    if(1 == ps_svc_cur_mb_info->u1_base_mode_flag)
118
166k
    {
119
166k
        i4_inter_layer_pred_req_flag = SVCD_TRUE;
120
166k
    }
121
6.83M
    else
122
6.83M
    {
123
6.83M
        UWORD8 u1_mot_pred_flag;
124
125
        /* get the packed the motion pred flag of list 0 */
126
6.83M
        u1_mot_pred_flag = ps_svc_cur_mb_info->au1_motion_pred_flag[0];
127
128
        /* extract the last 4 bits */
129
6.83M
        u1_mot_pred_flag &= 0x0F;
130
131
6.83M
        if(0 != u1_mot_pred_flag)
132
24.6k
        {
133
24.6k
            i4_inter_layer_pred_req_flag = SVCD_TRUE;
134
24.6k
        }
135
136
        /* check for list 1 flags if required */
137
6.83M
        if((2 == i4_listx) && (SVCD_FALSE == i4_inter_layer_pred_req_flag))
138
95.0k
        {
139
            /* get the packed the motion pred flag of list 1 */
140
95.0k
            u1_mot_pred_flag = ps_svc_cur_mb_info->au1_motion_pred_flag[1];
141
142
            /* extract the last 4 bits */
143
95.0k
            u1_mot_pred_flag &= 0x0F;
144
145
95.0k
            if(0 != u1_mot_pred_flag)
146
4.77k
            {
147
4.77k
                i4_inter_layer_pred_req_flag = SVCD_TRUE;
148
4.77k
            }
149
95.0k
        }
150
6.83M
    }
151
152
7.00M
    if(SVCD_TRUE == i4_inter_layer_pred_req_flag)
153
196k
    {
154
196k
        mode_motion_ctxt_t *ps_ctxt;
155
196k
        mode_motion_lyr_ctxt *ps_lyr_mem;
156
157
196k
        ps_ctxt = (mode_motion_ctxt_t *) ps_svc_lyr_dec->pv_mode_mv_sample_ctxt;
158
        /* get the current layer ctxt */
159
196k
        ps_lyr_mem = &ps_ctxt->as_res_lyr_mem[ps_ctxt->i4_res_id];
160
161
196k
        {
162
196k
            ps_ctxt->i4_listx = i4_listx;
163
164
196k
            i4_mb_mode =
165
196k
                ps_lyr_mem->pf_inter_lyr_pred(ps_svc_lyr_dec->pv_mode_mv_sample_ctxt, ps_cur_mb_info,
166
196k
                                          ps_svc_cur_mb_info, ps_dec, ps_mb_part_info, ps_part);
167
196k
        }
168
196k
    }
169
7.00M
    return i4_mb_mode;
170
7.00M
}
171
/*!
172
 **************************************************************************
173
 * \if Function name : isvcd_mv_pred_ref_tfr_nby2_epmb \endif
174
 *
175
 * \brief
176
 *
177
 * \return
178
 *    0 on Success and Error code otherwise
179
 **************************************************************************
180
 */
181
WORD32 isvcd_mv_pred_ref_tfr_nby2_epmb(dec_struct_t *ps_dec, UWORD32 u4_mb_idx, UWORD32 u4_num_mbs)
182
1.20M
{
183
1.20M
    svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) ps_dec;
184
1.20M
    parse_pmbarams_t *ps_mb_part_info;
185
1.20M
    parse_part_params_t *ps_part;
186
1.20M
    mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start;
187
1.20M
    UWORD32 i, j;
188
1.20M
    const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
189
1.20M
    dec_mb_info_t *ps_cur_mb_info;
190
1.20M
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
191
1.20M
    WORD32 i2_mv_x, i2_mv_y;
192
193
1.20M
    ps_dec->i4_submb_ofst -= (u4_num_mbs - u4_mb_idx) << 4;
194
1.20M
    ps_mb_part_info = ps_dec->ps_parse_mb_data;
195
1.20M
    ps_part = ps_dec->ps_parse_part_params;
196
197
    /* N/2 Mb MvPred and Transfer Setup Loop */
198
8.07M
    for(i = u4_mb_idx; i < u4_num_mbs; i++, ps_mb_part_info++)
199
6.86M
    {
200
6.86M
        UWORD32 u1_colz;
201
6.86M
        UWORD32 u1_field;
202
6.86M
        mv_pred_t s_mvPred = {0};
203
6.86M
        mv_pred_t *ps_mv_pred = &s_mvPred;
204
205
6.86M
        *ps_mv_pred = ps_dec->s_default_mv_pred;
206
207
6.86M
        ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
208
209
        /* Restore the slice scratch MbX and MbY context */
210
6.86M
        ps_cur_mb_info = ps_dec->ps_nmb_info + i;
211
6.86M
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + i;
212
6.86M
        u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
213
214
6.86M
        ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4);
215
6.86M
        ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx;
216
6.86M
        ps_dec->u2_mby = ps_cur_mb_info->u2_mby;
217
6.86M
        ps_dec->u2_mv_2mb[i & 0x1] = 0;
218
219
        /* Look for MV Prediction and Reference Transfer in Non-I Mbs */
220
6.86M
        if(!ps_mb_part_info->u4_isI_mb)
221
6.86M
        {
222
6.86M
            UWORD32 u1_blk_no;
223
6.86M
            WORD32 i1_ref_idx, i1_ref_idx1;
224
6.86M
            UWORD32 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num;
225
6.86M
            UWORD32 u1_num_part, u1_num_ref, u1_wd, u1_ht;
226
6.86M
            UWORD32 *pu4_wt_offst, **ppu4_wt_ofst;
227
6.86M
            UWORD32 u1_scale_ref, u4_bot_mb;
228
6.86M
            WORD8 *pi1_ref_idx = ps_mb_part_info->i1_ref_idx[0];
229
6.86M
            pic_buffer_t *ps_ref_frame, **pps_ref_frame;
230
6.86M
            deblk_mb_t *ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i;
231
6.86M
            WORD32 i4_mb_mode_svc;
232
6.86M
            UWORD8 u1_motion_pred_flag_l0 = ps_svc_cur_mb_info->au1_motion_pred_flag[0];
233
234
            /* MB Level initialisations */
235
6.86M
            ps_dec->u4_num_pmbair = i >> u1_mbaff;
236
6.86M
            ps_dec->u4_mb_idx_mv = i;
237
6.86M
            ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst;
238
6.86M
            pps_ref_frame = ps_dec->ps_ref_pic_buf_lx[0];
239
240
6.86M
            i4_mb_mode_svc = isvcd_interlyr_motion_mode_pred(
241
6.86M
                ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, ps_mb_part_info, ps_part);
242
243
6.86M
            if((-1 == i4_mb_mode_svc) || (SVC_INTER_MB == i4_mb_mode_svc))
244
6.84M
            {
245
6.84M
                ps_mv_ntop_start =
246
6.84M
                    ps_mv_nmb_start - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
247
248
6.84M
                u1_num_part = ps_mb_part_info->u1_num_part;
249
6.84M
                ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1;
250
6.84M
                ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx;
251
6.84M
                ps_cur_mb_info->u1_num_pred_parts = 0;
252
253
                /****************************************************/
254
                /* weighted u4_ofst pointer calculations, this loop  */
255
                /* runs maximum 4 times, even in direct cases       */
256
                /****************************************************/
257
6.84M
                u1_scale_ref = u1_mbaff & u1_field;
258
259
6.84M
                u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb;
260
6.84M
                if(ps_dec->ps_cur_pps->u1_wted_pred_flag)
261
3.61M
                {
262
3.61M
                    u1_num_ref = MIN(u1_num_part, 4);
263
7.24M
                    for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++)
264
3.63M
                    {
265
3.63M
                        i1_ref_idx = pi1_ref_idx[u1_blk_no];
266
3.63M
                        if(u1_scale_ref) i1_ref_idx >>= 1;
267
3.63M
                        pu4_wt_offst = (UWORD32 *) &ps_dec->pu4_wt_ofsts[2 * X3(i1_ref_idx)];
268
3.63M
                        ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst;
269
3.63M
                    }
270
3.61M
                }
271
3.23M
                else
272
3.23M
                {
273
3.23M
                    ppu4_wt_ofst[0] = NULL;
274
3.23M
                    ppu4_wt_ofst[1] = NULL;
275
3.23M
                    ppu4_wt_ofst[2] = NULL;
276
3.23M
                    ppu4_wt_ofst[3] = NULL;
277
3.23M
                }
278
279
                /**************************************************/
280
                /* Loop on Partitions                             */
281
                /**************************************************/
282
13.7M
                for(j = 0; j < u1_num_part; j++, ps_part++)
283
6.94M
                {
284
6.94M
                    u1_sub_mb_num = ps_part->u1_sub_mb_num;
285
6.94M
                    ps_dec->u1_sub_mb_num = u1_sub_mb_num;
286
287
6.94M
                    if(PART_NOT_DIRECT != ps_part->u1_is_direct)
288
6.70M
                    {
289
                        /* Mb Skip Mode */
290
                        /* Setting the default and other members of MvPred Structure */
291
6.70M
                        s_mvPred.i2_mv[2] = -1;
292
6.70M
                        s_mvPred.i2_mv[3] = -1;
293
6.70M
                        s_mvPred.i1_ref_frame[0] = 0;
294
6.70M
                        i1_ref_idx = (u1_scale_ref && u4_bot_mb) ? MAX_REF_BUFS : 0;
295
6.70M
                        ps_ref_frame = pps_ref_frame[i1_ref_idx];
296
6.70M
                        s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
297
6.70M
                        s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
298
6.70M
                        pu4_wt_offst = (UWORD32 *) &ps_dec->pu4_wt_ofsts[0];
299
300
6.70M
                        ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start, ps_mv_ntop_start,
301
6.70M
                                          &s_mvPred, 0, 4, 0, 1, MB_SKIP);
302
303
6.70M
                        {
304
6.70M
                            pred_info_pkd_t *ps_pred_pkd;
305
6.70M
                            ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
306
6.70M
                            ih264d_fill_pred_info(s_mvPred.i2_mv, 4, 4, 0, PRED_L0, ps_pred_pkd,
307
6.70M
                                                  ps_ref_frame->u1_pic_buf_id,
308
6.70M
                                                  (i1_ref_idx >> u1_scale_ref), pu4_wt_offst,
309
6.70M
                                                  ps_ref_frame->u1_pic_type);
310
311
6.70M
                            ps_dec->u4_pred_info_pkd_idx++;
312
6.70M
                            ps_cur_mb_info->u1_num_pred_parts++;
313
6.70M
                        }
314
315
                        /* Storing colocated zero information */
316
6.70M
                        u1_colz = ((ABS(s_mvPred.i2_mv[0]) <= 1) && (ABS(s_mvPred.i2_mv[1]) <= 1)) +
317
6.70M
                                  (u1_field << 1);
318
319
6.70M
                        if(ps_mv_nmb_start)
320
6.70M
                        {
321
6.70M
                            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, u1_colz, 4,
322
6.70M
                                               4);
323
6.70M
                        }
324
0
                        else
325
0
                        {
326
0
                            return NOT_OK;
327
0
                        }
328
6.70M
                    }
329
240k
                    else
330
240k
                    {
331
240k
                        u1_sub_mb_x = u1_sub_mb_num & 0x03;
332
240k
                        u1_sub_mb_y = u1_sub_mb_num >> 2;
333
240k
                        u1_blk_no = (u1_num_part < 4)
334
240k
                                        ? j
335
240k
                                        : (((u1_sub_mb_y >> 1) << 1) + (u1_sub_mb_x >> 1));
336
337
240k
                        ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x;
338
240k
                        ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num;
339
340
240k
                        u1_wd = ps_part->u1_partwidth;
341
240k
                        u1_ht = ps_part->u1_partheight;
342
343
                        /* Populate the colpic info and reference frames */
344
240k
                        i1_ref_idx = pi1_ref_idx[u1_blk_no];
345
                        /********************************************************************/
346
                        /* If reference index is inferred from the base layer and it is     */
347
                        /* exceeding the number of active reference in the current layer.   */
348
                        /* Then reference index is clipped to the max in the current layer  */
349
                        /********************************************************************/
350
240k
                        if(ps_svc_cur_mb_info->u1_base_mode_flag == 1)
351
166k
                        {
352
166k
                            if(i1_ref_idx > (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1))
353
6.84k
                            {
354
6.84k
                                i1_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1;
355
6.84k
                            }
356
166k
                        }
357
240k
                        s_mvPred.i1_ref_frame[0] = i1_ref_idx;
358
359
240k
                        if((1 != ps_svc_cur_mb_info->u1_base_mode_flag) &&
360
74.0k
                           (0 == (u1_motion_pred_flag_l0 & (1 << u1_blk_no))))
361
46.8k
                        {
362
                            /********************************************************/
363
                            /* Predict Mv                                           */
364
                            /* Add Mv Residuals and store back                      */
365
                            /********************************************************/
366
46.8k
                            ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop,
367
46.8k
                                              &s_mvPred, u1_sub_mb_num, u1_wd, 0, 1,
368
46.8k
                                              ps_cur_mb_info->u1_mb_mc_mode);
369
370
46.8k
                            i2_mv_x = ps_mv_nmb->i2_mv[0];
371
46.8k
                            i2_mv_y = ps_mv_nmb->i2_mv[1];
372
46.8k
                            i2_mv_x += s_mvPred.i2_mv[0];
373
46.8k
                            i2_mv_y += s_mvPred.i2_mv[1];
374
46.8k
                            s_mvPred.i2_mv[0] = i2_mv_x;
375
46.8k
                            s_mvPred.i2_mv[1] = i2_mv_y;
376
46.8k
                        }
377
194k
                        else
378
194k
                        {
379
194k
                            isvcd_retrive_infer_mode_mv(ps_svc_lyr_dec, &s_mvPred, 0,
380
194k
                                                        u1_sub_mb_num);
381
382
194k
                            if(0 != (u1_motion_pred_flag_l0 & (1 << u1_blk_no)))
383
27.2k
                            {
384
27.2k
                                i2_mv_x = ps_mv_nmb->i2_mv[0];
385
27.2k
                                i2_mv_y = ps_mv_nmb->i2_mv[1];
386
27.2k
                                i2_mv_x += s_mvPred.i2_mv[0];
387
27.2k
                                i2_mv_y += s_mvPred.i2_mv[1];
388
27.2k
                                s_mvPred.i2_mv[0] = i2_mv_x;
389
27.2k
                                s_mvPred.i2_mv[1] = i2_mv_y;
390
27.2k
                            }
391
194k
                            i2_mv_x = s_mvPred.i2_mv[0];
392
194k
                            i2_mv_y = s_mvPred.i2_mv[1];
393
194k
                        }
394
                        /********************************************************/
395
                        /* Transfer setup call                                  */
396
                        /* convert RefIdx if it is MbAff                        */
397
                        /* Pass Weight Offset and refFrame                      */
398
                        /********************************************************/
399
240k
                        i1_ref_idx1 = i1_ref_idx >> u1_scale_ref;
400
240k
                        if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb))
401
0
                            i1_ref_idx1 += MAX_REF_BUFS;
402
240k
                        if(-1 == i1_ref_idx1) return NOT_OK;
403
240k
                        ps_ref_frame = pps_ref_frame[i1_ref_idx1];
404
240k
                        pu4_wt_offst = ppu4_wt_ofst[u1_blk_no];
405
406
240k
                        {
407
240k
                            pred_info_pkd_t *ps_pred_pkd;
408
240k
                            ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
409
240k
                            ih264d_fill_pred_info(s_mvPred.i2_mv, u1_wd, u1_ht, u1_sub_mb_num,
410
240k
                                                  PRED_L0, ps_pred_pkd, ps_ref_frame->u1_pic_buf_id,
411
240k
                                                  (i1_ref_idx >> u1_scale_ref), pu4_wt_offst,
412
240k
                                                  ps_ref_frame->u1_pic_type);
413
414
240k
                            ps_dec->u4_pred_info_pkd_idx++;
415
240k
                            ps_cur_mb_info->u1_num_pred_parts++;
416
240k
                        }
417
418
                        /* Fill colocated info in MvPred structure */
419
240k
                        s_mvPred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
420
240k
                        s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type;
421
422
                        /* Calculating colocated zero information */
423
240k
                        u1_colz = (u1_field << 1) |
424
240k
                                  ((i1_ref_idx == 0) && (ABS(i2_mv_x) <= 1) && (ABS(i2_mv_y) <= 1));
425
240k
                        u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no];
426
427
                        /* Replicate the motion vectors and colzero u4_flag  */
428
                        /* for all sub-partitions                         */
429
430
240k
                        if(ps_mv_nmb)
431
240k
                        {
432
240k
                            ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb, u1_sub_mb_num, u1_colz,
433
240k
                                               u1_ht, u1_wd);
434
240k
                        }
435
0
                        else
436
0
                        {
437
0
                            return NOT_OK;
438
0
                        }
439
240k
                    }
440
6.94M
                }
441
442
                /* to take care of 16 parttitions increment for base mode flag case*/
443
6.84M
                if(1 == ps_svc_cur_mb_info->u1_base_mode_flag)
444
110k
                {
445
110k
                    ps_part += (MAX_NUM_MB_PART - u1_num_part);
446
110k
                }
447
6.84M
            }
448
20.5k
            else
449
20.5k
            {
450
20.5k
                ps_cur_deblk_mb->u1_mb_type |= D_INTRA_IBL;
451
20.5k
                if((ps_svc_lyr_dec->u1_layer_identifier != TARGET_LAYER) &&
452
0
                   (DBLK_ENABLED == ps_dec->ps_cur_slice->u1_disable_dblk_filter_idc))
453
0
                {
454
0
                    ps_cur_deblk_mb->u1_deblocking_mode = MB_ENABLE_FILTERING;
455
0
                }
456
                /* to take care of 16 parttitions increment for base mode flag case*/
457
20.5k
                if(1 != ps_svc_cur_mb_info->u1_base_mode_flag)
458
0
                {
459
0
                    return NOT_OK;
460
0
                }
461
20.5k
                {
462
20.5k
                    ps_part += (MAX_NUM_MB_PART);
463
20.5k
                }
464
                /* Storing colocated zero information */
465
20.5k
                if(ps_mv_nmb_start)
466
20.5k
                {
467
20.5k
                    ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0,
468
20.5k
                                       (UWORD8) (u1_field << 1), 4, 4);
469
20.5k
                }
470
0
                else
471
0
                {
472
0
                    return NOT_OK;
473
0
                }
474
20.5k
            }
475
6.86M
        }
476
2.59k
        else
477
2.59k
        {
478
            /* Storing colocated zero information */
479
2.59k
            if(ps_mv_nmb_start)
480
2.59k
            {
481
2.59k
                ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, (UWORD8) (u1_field << 1),
482
2.59k
                                   4, 4);
483
2.59k
            }
484
0
            else
485
0
            {
486
0
                return NOT_OK;
487
0
            }
488
2.59k
        }
489
6.86M
    }
490
491
1.20M
    return OK;
492
1.20M
}
493
/*!
494
 **************************************************************************
495
 * \if Function name : isvcd_update_intra_mb_inter_layer_info \endif
496
 *
497
 * \brief : IT
498
 *    This function decodes an Inter MB fornfor ot target base layers
499
 *    Only for Progressive : saves residual for upper enhancement layers
500
 *
501
 * \return
502
 *    0 on Success and Error code otherwise
503
 **************************************************************************
504
 */
505
void isvcd_update_intra_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
506
                                            dec_mb_info_t *ps_cur_mb_info)
507
46.1k
{
508
46.1k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
509
46.1k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
510
46.1k
        (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
511
512
46.1k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTRA_MB;
513
46.1k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
514
46.1k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
515
46.1k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
516
46.1k
}
517
518
/*!
519
**************************************************************************
520
* \if Function name : isvcd_update_ipcm_mb_inter_layer_info \endif
521
*
522
* \brief : IT
523
*    This function decodes an IPM MB fornfor ot target base layers
524
*    Only for Progressive : saves residual for upper enhancement layers
525
*
526
* \return
527
*    0 on Success and Error code otherwise
528
**************************************************************************
529
*/
530
void isvcd_update_ipcm_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
531
                                           dec_mb_info_t *ps_cur_mb_info)
532
1.14k
{
533
1.14k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_IPCM_MB;
534
1.14k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
535
1.14k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
536
1.14k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
537
1.14k
}
538
539
/*!
540
**************************************************************************
541
* \if Function name : isvcd_update_ibl_mb_inter_layer_info \endif
542
*
543
* \brief : IT
544
*    This function decodes an IBL MB fornfor ot target base layers
545
*    Only for Progressive : saves residual for upper enhancement layers
546
*
547
* \return
548
*    0 on Success and Error code otherwise
549
**************************************************************************
550
*/
551
void isvcd_update_ibl_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
552
                                          dec_mb_info_t *ps_cur_mb_info)
553
91.5k
{
554
91.5k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_IBL_MB;
555
91.5k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
556
91.5k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
557
91.5k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
558
91.5k
}
559
/*!
560
**************************************************************************
561
* \if Function name : isvcd_update_inter_mb_inter_layer_info \endif
562
*
563
* \brief : IT
564
*    This function decodes an IBL MB fornfor ot target base layers
565
*    Only for Progressive : saves residual for upper enhancement layers
566
*
567
* \return
568
*    0 on Success and Error code otherwise
569
**************************************************************************
570
*/
571
void isvcd_update_inter_mb_inter_layer_info(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
572
                                            dec_mb_info_t *ps_cur_mb_info, UWORD8 u1_inference_mode)
573
145k
{
574
145k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
575
145k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
576
145k
        (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
577
145k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
578
145k
        u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
579
145k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
580
145k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
581
145k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
582
145k
        (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
583
145k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
584
6.61k
    {
585
        /* Four bits for Cb in DC only cbp */
586
6.61k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
587
6.61k
    }
588
145k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
589
6.68k
    {
590
        /* Four bits for Cr in DC only cbp */
591
6.68k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
592
6.68k
    }
593
145k
}
594
/*!
595
 **************************************************************************
596
 * \if Function name : isvcd_process_inter_mb_no_rsd_pred_non_target \endif
597
 *
598
 * \brief : IT
599
 *    This function decodes an Inter MB fornfor ot target base layers
600
 *    Only for Progressive : saves residual for upper enhancement layers
601
 *
602
 * \return
603
 *    0 on Success and Error code otherwise
604
 **************************************************************************
605
 */
606
WORD32 isvcd_process_inter_mb_no_rsd_pred_non_target(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
607
                                                     dec_mb_info_t *ps_cur_mb_info,
608
                                                     UWORD8 u1_inference_mode)
609
75.8k
{
610
75.8k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
611
75.8k
    UWORD16 u2_luma_stride, u2_chroma_stride;
612
75.8k
    WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
613
75.8k
    UWORD32 u4_luma_dc_only_csbp = 0;
614
75.8k
    UWORD32 u4_luma_dc_only_cbp = 0;
615
616
75.8k
    if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
617
0
    {
618
0
        return NOT_OK;
619
0
    }
620
75.8k
    u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
621
75.8k
    pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
622
75.8k
                       (ps_cur_mb_info->u2_mbx << 4) +
623
75.8k
                       ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
624
625
75.8k
    u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
626
75.8k
    pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
627
75.8k
                         (ps_cur_mb_info->u2_mbx << 4) +
628
75.8k
                         ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
629
630
75.8k
    if(!ps_cur_mb_info->u1_tran_form8x8)
631
71.0k
    {
632
71.0k
        u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
633
71.0k
    }
634
4.81k
    else
635
4.81k
    {
636
4.81k
        if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
637
266
        {
638
266
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
639
266
        }
640
4.55k
        else
641
4.55k
        {
642
4.55k
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
643
4.55k
        }
644
4.81k
    }
645
646
75.8k
    pi2_y_coeff = ps_dec->pi2_coeff_data;
647
    /* Inverse Transform and Reconstruction */
648
75.8k
    if(ps_cur_mb_info->u1_cbp & 0x0f)
649
13.7k
    {
650
13.7k
        if(!ps_cur_mb_info->u1_tran_form8x8)
651
8.93k
        {
652
8.93k
            UWORD32 i;
653
8.93k
            WORD16 ai2_tmp[16] = {0};
654
151k
            for(i = 0; i < 16; i++)
655
142k
            {
656
142k
                if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
657
51.5k
                {
658
51.5k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
659
51.5k
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
660
51.5k
                                      (i >> 2) * (u2_luma_stride << 2);
661
51.5k
                    PROFILE_DISABLE_IQ_IT_RECON()
662
51.5k
                    {
663
51.5k
                        if(CHECKBIT(u4_luma_dc_only_csbp, i))
664
6.30k
                        {
665
6.30k
                            ps_svc_lyr_dec->pf_iquant_itrans_luma_4x4_dc(
666
6.30k
                                pi2_level, pi2_out, u2_luma_stride,
667
6.30k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
668
6.30k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
669
6.30k
                                ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
670
6.30k
                        }
671
45.2k
                        else
672
45.2k
                        {
673
45.2k
                            ps_svc_lyr_dec->pf_iquant_itrans_luma_4x4(
674
45.2k
                                pi2_level, pi2_out, u2_luma_stride,
675
45.2k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
676
45.2k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
677
45.2k
                                ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
678
45.2k
                        }
679
51.5k
                    }
680
51.5k
                }
681
142k
            }
682
8.93k
        }
683
4.81k
        else
684
4.81k
        {
685
4.81k
            WORD16 *pi2_scale_matrix_ptr;
686
4.81k
            WORD32 i;
687
688
4.81k
            pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
689
690
24.0k
            for(i = 0; i < 4; i++)
691
19.2k
            {
692
19.2k
                WORD16 ai2_tmp[64] = {0};
693
19.2k
                WORD16 *pi16_levelBlock =
694
19.2k
                    pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
695
696
19.2k
                WORD16 *pi2_out =
697
19.2k
                    pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
698
19.2k
                if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
699
9.77k
                {
700
9.77k
                    PROFILE_DISABLE_IQ_IT_RECON()
701
9.77k
                    {
702
9.77k
                        if(CHECKBIT(u4_luma_dc_only_cbp, i))
703
2.06k
                        {
704
2.06k
                            ps_svc_lyr_dec->pf_iquant_itrans_luma_8x8_dc(
705
2.06k
                                pi16_levelBlock, pi2_out, u2_luma_stride,
706
2.06k
                                gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
707
2.06k
                                (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
708
2.06k
                                ai2_tmp, 0, NULL);
709
2.06k
                        }
710
7.70k
                        else
711
7.70k
                        {
712
7.70k
                            ps_svc_lyr_dec->pf_iquant_itrans_luma_8x8(
713
7.70k
                                pi16_levelBlock, pi2_out, u2_luma_stride,
714
7.70k
                                gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
715
7.70k
                                (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
716
7.70k
                                ai2_tmp, 0, NULL);
717
7.70k
                        }
718
9.77k
                    }
719
9.77k
                }
720
19.2k
            }
721
4.81k
        }
722
13.7k
    }
723
724
    /* Decode Chroma Block */
725
75.8k
    ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
726
    /*--------------------------------------------------------------------*/
727
    /* Chroma Blocks decoding                                             */
728
    /*--------------------------------------------------------------------*/
729
75.8k
    {
730
75.8k
        UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
731
732
75.8k
        if(u1_chroma_cbp != CBPC_ALLZERO)
733
7.49k
        {
734
7.49k
            UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
735
7.49k
            UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
736
7.49k
            UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
737
738
7.49k
            pi2_y_coeff = ps_dec->pi2_coeff_data;
739
740
7.49k
            {
741
7.49k
                UWORD32 i;
742
7.49k
                WORD16 ai2_tmp[16] = {0};
743
37.4k
                for(i = 0; i < 4; i++)
744
29.9k
                {
745
29.9k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
746
29.9k
                    WORD16 *pi2_out = pi2_chroma_res_ptr +
747
29.9k
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
748
29.9k
                                      (i >> 1) * (u2_chroma_stride << 2);
749
29.9k
                    PROFILE_DISABLE_IQ_IT_RECON()
750
29.9k
                    {
751
29.9k
                        if(CHECKBIT(u2_chroma_csbp, i))
752
4.26k
                        {
753
4.26k
                            ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4(
754
4.26k
                                pi2_level, pi2_out, u2_chroma_stride,
755
4.26k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
756
4.26k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
757
4.26k
                                ai2_tmp, pi2_level);
758
4.26k
                        }
759
25.7k
                        else if(pi2_level[0] != 0)
760
12.2k
                        {
761
12.2k
                            ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4_dc(
762
12.2k
                                pi2_level, pi2_out, u2_chroma_stride,
763
12.2k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
764
12.2k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
765
12.2k
                                ai2_tmp, pi2_level);
766
12.2k
                        }
767
29.9k
                    }
768
29.9k
                }
769
7.49k
            }
770
771
7.49k
            pi2_y_coeff += MB_CHROM_SIZE;
772
7.49k
            u2_chroma_csbp >>= 4;
773
774
7.49k
            {
775
7.49k
                UWORD32 i;
776
7.49k
                WORD16 ai2_tmp[16] = {0};
777
37.4k
                for(i = 0; i < 4; i++)
778
29.9k
                {
779
29.9k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
780
29.9k
                    WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
781
29.9k
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
782
29.9k
                                      (i >> 1) * (u2_chroma_stride << 2);
783
29.9k
                    PROFILE_DISABLE_IQ_IT_RECON()
784
29.9k
                    {
785
29.9k
                        if(CHECKBIT(u2_chroma_csbp, i))
786
4.79k
                        {
787
4.79k
                            ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4(
788
4.79k
                                pi2_level, pi2_out, u2_chroma_stride,
789
4.79k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
790
4.79k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
791
4.79k
                                ai2_tmp, pi2_level);
792
4.79k
                        }
793
25.1k
                        else if(pi2_level[0] != 0)
794
9.96k
                        {
795
9.96k
                            ps_svc_lyr_dec->pf_iquant_itrans_chroma_4x4_dc(
796
9.96k
                                pi2_level, pi2_out, u2_chroma_stride,
797
9.96k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
798
9.96k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
799
9.96k
                                ai2_tmp, pi2_level);
800
9.96k
                        }
801
29.9k
                    }
802
29.9k
                }
803
7.49k
            }
804
7.49k
        }
805
75.8k
    }
806
807
75.8k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
808
75.8k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
809
75.8k
        (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
810
75.8k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
811
75.8k
        u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
812
75.8k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
813
75.8k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
814
75.8k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
815
75.8k
        (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
816
75.8k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
817
4.08k
    {
818
        /* Four bits for Cb in DC only cbp */
819
4.08k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
820
4.08k
    }
821
75.8k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
822
3.96k
    {
823
        /* Four bits for Cr in DC only cbp */
824
3.96k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
825
3.96k
    }
826
75.8k
    return OK;
827
75.8k
}
828
829
/*!
830
 **************************************************************************
831
 * \if Function name : isvcd_process_inter_mb_rsd_pred_non_target \endif
832
 *
833
 * \brief : IT + Residual :
834
 *    This function decodes an Inter MB for non target layers
835
 *    Only for Progressive : saves residual + IT for upper enhancement layers
836
 *
837
 * \return
838
 *    0 on Success and Error code otherwise
839
 **************************************************************************
840
 */
841
WORD32 isvcd_process_inter_mb_rsd_pred_non_target(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
842
                                                  dec_mb_info_t *ps_cur_mb_info,
843
                                                  UWORD8 u1_inference_mode,
844
                                                  UWORD16 *pu2_res_luma_csbp)
845
0
{
846
0
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
847
0
    UWORD16 u2_luma_stride, u2_chroma_stride;
848
0
    WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
849
0
    UWORD32 u4_luma_dc_only_csbp = 0;
850
0
    UWORD32 u4_luma_dc_only_cbp = 0;
851
0
    UWORD16 u2_res_luma_csbp = 0;
852
0
    UWORD16 u2_res_chroma_csbp = 0, u2_res_chroma_nnz = 0;
853
0
    WORD32 ret;
854
855
0
    if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
856
0
    {
857
0
        return NOT_OK;
858
0
    }
859
0
    u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
860
0
    pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
861
0
                       (ps_cur_mb_info->u2_mbx << 4) +
862
0
                       ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
863
864
0
    u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
865
0
    pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
866
0
                         (ps_cur_mb_info->u2_mbx << 4) +
867
0
                         ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
868
869
    // residual prediction SVC
870
0
    ret = isvcd_process_residual_resample_mb(ps_svc_lyr_dec, ps_cur_mb_info);
871
0
    if(ret != OK)
872
0
    {
873
0
        return ret;
874
0
    }
875
876
0
    if(!ps_cur_mb_info->u1_tran_form8x8)
877
0
    {
878
0
        u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
879
0
    }
880
0
    else
881
0
    {
882
0
        if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
883
0
        {
884
0
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
885
0
        }
886
0
        else
887
0
        {
888
0
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
889
0
        }
890
0
    }
891
892
0
    *pu2_res_luma_csbp = 0;
893
0
    pi2_y_coeff = ps_dec->pi2_coeff_data;
894
    /* Inverse Transform and Reconstruction */
895
0
    if(ps_cur_mb_info->u1_cbp & 0x0f)
896
0
    {
897
0
        if(!ps_cur_mb_info->u1_tran_form8x8)
898
0
        {
899
0
            UWORD32 i;
900
0
            WORD16 ai2_tmp[16] = {0};
901
0
            for(i = 0; i < 16; i++)
902
0
            {
903
0
                if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
904
0
                {
905
0
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
906
0
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
907
0
                                      (i >> 2) * (u2_luma_stride << 2);
908
0
                    PROFILE_DISABLE_IQ_IT_RECON()
909
0
                    {
910
0
                        if(CHECKBIT(u4_luma_dc_only_csbp, i))
911
0
                        {
912
0
                            u2_res_luma_csbp =
913
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_4x4_dc(
914
0
                                    pi2_level, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
915
0
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
916
0
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
917
0
                                    ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
918
0
                        }
919
0
                        else
920
0
                        {
921
0
                            u2_res_luma_csbp = ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_4x4(
922
0
                                pi2_level, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
923
0
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
924
0
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
925
0
                                ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
926
0
                        }
927
0
                    }
928
0
                }
929
0
                else
930
0
                {
931
0
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
932
0
                                      (i >> 2) * (u2_luma_stride << 2);
933
934
0
                    u2_res_luma_csbp =
935
0
                        ps_svc_lyr_dec->pf_residual_luma_4x4(pi2_out, u2_luma_stride);
936
0
                }
937
0
                *pu2_res_luma_csbp |= (u2_res_luma_csbp << i);
938
0
            }
939
0
        }
940
0
        else
941
0
        {
942
0
            WORD16 *pi2_scale_matrix_ptr;
943
0
            WORD32 i;
944
945
0
            pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
946
947
0
            for(i = 0; i < 4; i++)
948
0
            {
949
0
                WORD16 ai2_tmp[64] = {0};
950
0
                WORD16 *pi16_levelBlock =
951
0
                    pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
952
953
0
                WORD16 *pi2_out =
954
0
                    pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
955
0
                if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
956
0
                {
957
0
                    PROFILE_DISABLE_IQ_IT_RECON()
958
0
                    {
959
0
                        if(CHECKBIT(u4_luma_dc_only_cbp, i))
960
0
                        {
961
0
                            u2_res_luma_csbp =
962
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_8x8_dc(
963
0
                                    pi16_levelBlock, pi2_out, pi2_out, u2_luma_stride,
964
0
                                    u2_luma_stride,
965
0
                                    gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
966
0
                                    (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
967
0
                                    ai2_tmp, 0, NULL);
968
0
                        }
969
0
                        else
970
0
                        {
971
0
                            u2_res_luma_csbp = ps_svc_lyr_dec->pf_iquant_itrans_residual_luma_8x8(
972
0
                                pi16_levelBlock, pi2_out, pi2_out, u2_luma_stride, u2_luma_stride,
973
0
                                gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
974
0
                                (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
975
0
                                ai2_tmp, 0, NULL);
976
0
                        }
977
0
                    }
978
0
                }
979
0
                else
980
0
                {
981
0
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) +
982
0
                                      (i >> 1) * (u2_luma_stride << 3);
983
984
0
                    u2_res_luma_csbp =
985
0
                        ps_svc_lyr_dec->pf_residual_luma_8x8(pi2_out, u2_luma_stride);
986
0
                }
987
0
                *pu2_res_luma_csbp |= (u2_res_luma_csbp << (((i >> 1) << 3) + ((i & 0x01) << 1)));
988
0
            }
989
0
        }
990
0
    }
991
0
    else
992
0
    {
993
0
        WORD16 *pi2_out = pi2_luma_res_ptr;
994
995
0
        *pu2_res_luma_csbp = ps_svc_lyr_dec->pf_residual_luma_16x16(pi2_out, u2_luma_stride);
996
0
    }
997
998
    /* Decode Chroma Block */
999
0
    ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
1000
    /*--------------------------------------------------------------------*/
1001
    /* Chroma Blocks decoding                                             */
1002
    /*--------------------------------------------------------------------*/
1003
0
    {
1004
0
        UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
1005
1006
0
        u2_res_chroma_nnz =
1007
0
            ps_svc_lyr_dec->pf_residual_chroma_cb_cr_8x8(pi2_chroma_res_ptr, u2_chroma_stride);
1008
1009
0
        if(u1_chroma_cbp != CBPC_ALLZERO)
1010
0
        {
1011
0
            UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
1012
0
            UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
1013
0
            UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
1014
1015
0
            pi2_y_coeff = ps_dec->pi2_coeff_data;
1016
1017
0
            {
1018
0
                UWORD32 i;
1019
0
                WORD16 ai2_tmp[16] = {0};
1020
0
                for(i = 0; i < 4; i++)
1021
0
                {
1022
0
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1023
0
                    WORD16 *pi2_out = pi2_chroma_res_ptr +
1024
0
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
1025
0
                                      (i >> 1) * (u2_chroma_stride << 2);
1026
0
                    PROFILE_DISABLE_IQ_IT_RECON()
1027
0
                    {
1028
0
                        if(CHECKBIT(u2_chroma_csbp, i))
1029
0
                        {
1030
0
                            u2_res_chroma_csbp =
1031
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4(
1032
0
                                    pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1033
0
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1034
0
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4],
1035
0
                                    u4_scale_u, ai2_tmp, pi2_level);
1036
0
                            u2_res_chroma_nnz &= (0XFF ^ (1 << i));
1037
0
                            u2_res_chroma_nnz |= (u2_res_chroma_csbp << i);
1038
0
                        }
1039
0
                        else if(pi2_level[0] != 0)
1040
0
                        {
1041
0
                            u2_res_chroma_csbp =
1042
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4_dc(
1043
0
                                    pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1044
0
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1045
0
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4],
1046
0
                                    u4_scale_u, ai2_tmp, pi2_level);
1047
0
                            u2_res_chroma_nnz &= (0XFF ^ (1 << i));
1048
0
                            u2_res_chroma_nnz |= (u2_res_chroma_csbp << i);
1049
0
                        }
1050
0
                    }
1051
0
                }
1052
0
            }
1053
1054
0
            pi2_y_coeff += MB_CHROM_SIZE;
1055
0
            u2_chroma_csbp >>= 4;
1056
1057
0
            {
1058
0
                UWORD32 i;
1059
0
                WORD16 ai2_tmp[16] = {0};
1060
0
                for(i = 0; i < 4; i++)
1061
0
                {
1062
0
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1063
0
                    WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
1064
0
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
1065
0
                                      (i >> 1) * (u2_chroma_stride << 2);
1066
0
                    PROFILE_DISABLE_IQ_IT_RECON()
1067
0
                    {
1068
0
                        if(CHECKBIT(u2_chroma_csbp, i))
1069
0
                        {
1070
0
                            u2_res_chroma_csbp =
1071
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4(
1072
0
                                    pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1073
0
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1074
0
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5],
1075
0
                                    u4_scale_v, ai2_tmp, pi2_level);
1076
0
                            u2_res_chroma_nnz &= (0XFF ^ (1 << (i + 4)));
1077
0
                            u2_res_chroma_nnz |= (u2_res_chroma_csbp << (i + 4));
1078
0
                        }
1079
0
                        else if(pi2_level[0] != 0)
1080
0
                        {
1081
0
                            u2_res_chroma_csbp =
1082
0
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_chroma_4x4_dc(
1083
0
                                    pi2_level, pi2_out, pi2_out, u2_chroma_stride, u2_chroma_stride,
1084
0
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1085
0
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5],
1086
0
                                    u4_scale_v, ai2_tmp, pi2_level);
1087
0
                            u2_res_chroma_nnz &= (0XFF ^ (1 << (i + 4)));
1088
0
                            u2_res_chroma_nnz |= (u2_res_chroma_csbp << (i + 4));
1089
0
                        }
1090
0
                    }
1091
0
                }
1092
0
            }
1093
0
        }
1094
0
    }
1095
1096
0
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1097
0
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1098
0
        (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1099
0
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
1100
0
        u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
1101
0
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
1102
1103
0
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = *pu2_res_luma_csbp;
1104
0
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = (UWORD8) u2_res_chroma_nnz;
1105
0
    return OK;
1106
0
}
1107
/*!
1108
**************************************************************************
1109
* \if Function name : isvcd_process_ii_mb \endif
1110
*
1111
* \brief
1112
*    This function decodes an intra inter mb
1113
*
1114
* \return
1115
*    0 on Success and Error code otherwise
1116
**************************************************************************
1117
*/
1118
WORD32 isvcd_process_ii_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1119
                           dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_num)
1120
128k
{
1121
128k
    res_prms_t *ps_res_prms;
1122
128k
    WORD32 i4_status;
1123
128k
    UWORD8 u1_ii_mb_mode = 0;
1124
128k
    mb_coord_t s_mb_coord = {0};
1125
128k
    mem_element_t s_ref_mb_mode = {0};
1126
128k
    svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1127
1128
128k
    ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1129
128k
    ps_res_prms = &ps_svc_lyr_dec->s_res_prms;
1130
128k
    s_mb_coord.u2_mb_x = ps_cur_mb_info->u2_mbx;
1131
128k
    s_mb_coord.u2_mb_y = ps_cur_mb_info->u2_mby;
1132
1133
    /* Restricted resolution change has significance only */
1134
    /* at resolution change layer                         */
1135
128k
    if(SVCD_FALSE == ps_res_prms->u1_rstrct_res_change_flag)
1136
128k
    {
1137
128k
        s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1138
128k
        s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1139
128k
        s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1140
1141
128k
        i4_status = isvcd_ii_pred_compute_flags_mb(ps_svc_lyr_dec->pv_ii_pred_ctxt, &s_ref_mb_mode,
1142
128k
                                                   &s_mb_coord, ps_cur_mb_info, ps_svc_cur_mb_info,
1143
128k
                                                   &u1_ii_mb_mode);
1144
1145
128k
        if(OK != i4_status)
1146
0
        {
1147
0
            return i4_status;
1148
0
        }
1149
128k
    }
1150
1151
128k
    if(SVC_INTRA_INTER_MB == u1_ii_mb_mode)
1152
15.1k
    {
1153
15.1k
        i4_status = isvcd_process_ibl_mb(ps_svc_lyr_dec, ps_cur_mb_info, u1_mb_num, 1);
1154
15.1k
        if(OK != i4_status)
1155
0
        {
1156
0
            return i4_status;
1157
0
        }
1158
15.1k
        isvcd_ii_pred_mb(ps_svc_lyr_dec, ps_cur_mb_info);
1159
15.1k
    }
1160
128k
    return OK;
1161
128k
}
1162
/*!
1163
 **************************************************************************
1164
 * \if Function name : isvcd_decode_recon_tfr_nmb_non_base_lyr \endif
1165
 *
1166
 * \brief
1167
 *
1168
 *
1169
 * \return
1170
 *    0 on Success and Error code otherwise
1171
 **************************************************************************
1172
 */
1173
WORD32 isvcd_decode_recon_tfr_nmb_non_base_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1174
                                               UWORD32 u4_mb_idx, UWORD32 u4_num_mbs,
1175
                                               UWORD32 u4_num_mbs_next, UWORD32 u4_tfr_n_mb,
1176
                                               UWORD32 u4_end_of_row)
1177
40.2k
{
1178
40.2k
    WORD32 i, j;
1179
40.2k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1180
40.2k
    UWORD32 u1_end_of_row_next;
1181
40.2k
    dec_mb_info_t *ps_cur_mb_info;
1182
40.2k
    dec_svc_mb_info_t *ps_svc_cur_mb_info;
1183
40.2k
    UWORD16 *pu2_res_luma_csbp;
1184
40.2k
    const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1185
40.2k
    const UWORD32 u1_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1186
40.2k
    const WORD32 u1_skip_th =
1187
40.2k
        ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? B_8x8 : PRED_8x8R0) : -1);
1188
40.2k
    const UWORD32 u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? 23 : 5) : 0);
1189
40.2k
    WORD32 ret = OK;
1190
1191
40.2k
    if(!((0 == ps_svc_lyr_dec->u1_base_res_flag) ||
1192
0
         ((1 == ps_svc_lyr_dec->u1_base_res_flag) &&
1193
0
          (1 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_no_inter_layer_pred_flag))))
1194
0
    {
1195
0
        return NOT_OK;
1196
0
    }
1197
    /* N Mb MC Loop */
1198
180k
    for(i = u4_mb_idx; i < u4_num_mbs; i++)
1199
139k
    {
1200
139k
        ps_cur_mb_info = ps_dec->ps_nmb_info + i;
1201
139k
        ps_dec->u4_dma_buf_idx = 0;
1202
139k
        ps_dec->u4_pred_info_idx = 0;
1203
1204
        /*Pointer assignment for Residual NNZ */
1205
139k
        pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
1206
139k
        pu2_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
1207
1208
139k
        if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1209
61.5k
        {
1210
61.5k
            {
1211
61.5k
                WORD32 pred_cnt = 0;
1212
61.5k
                pred_info_pkd_t *ps_pred_pkd;
1213
61.5k
                UWORD32 u4_pred_info_pkd_idx;
1214
1215
61.5k
                u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
1216
1217
173k
                while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
1218
112k
                {
1219
112k
                    ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
1220
1221
112k
                    ps_dec->p_form_mb_part_info(ps_pred_pkd, ps_dec, ps_cur_mb_info->u2_mbx,
1222
112k
                                                ps_cur_mb_info->u2_mby, (i >> u1_mbaff),
1223
112k
                                                ps_cur_mb_info);
1224
112k
                    u4_pred_info_pkd_idx++;
1225
112k
                    pred_cnt++;
1226
112k
                }
1227
61.5k
            }
1228
61.5k
            if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1229
61.5k
            {
1230
61.5k
                ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
1231
61.5k
            }
1232
61.5k
        }
1233
78.3k
        else if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
1234
41.5k
        {
1235
41.5k
            {
1236
41.5k
                WORD32 pred_cnt = 0;
1237
41.5k
                pred_info_pkd_t *ps_pred_pkd;
1238
41.5k
                UWORD32 u4_pred_info_pkd_idx;
1239
1240
41.5k
                u4_pred_info_pkd_idx = ps_cur_mb_info->u4_pred_info_pkd_idx;
1241
1242
103k
                while(pred_cnt < ps_cur_mb_info->u1_num_pred_parts)
1243
62.4k
                {
1244
62.4k
                    ps_pred_pkd = ps_dec->ps_pred_pkd + u4_pred_info_pkd_idx;
1245
1246
62.4k
                    ps_dec->p_form_mb_part_info(ps_pred_pkd, ps_dec, ps_cur_mb_info->u2_mbx,
1247
62.4k
                                                ps_cur_mb_info->u2_mby, (i >> u1_mbaff),
1248
62.4k
                                                ps_cur_mb_info);
1249
1250
62.4k
                    u4_pred_info_pkd_idx++;
1251
62.4k
                    pred_cnt++;
1252
62.4k
                }
1253
41.5k
            }
1254
41.5k
            if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1255
41.5k
            {
1256
                /* Decode MB skip */
1257
41.5k
                ps_dec->p_motion_compensate(ps_dec, ps_cur_mb_info);
1258
41.5k
            }
1259
1260
41.5k
            *pu2_res_luma_csbp = 0;
1261
41.5k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1262
41.5k
                ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1263
41.5k
                (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1264
41.5k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
1265
41.5k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
1266
41.5k
                ps_cur_mb_info->u1_tran_form8x8;
1267
41.5k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
1268
41.5k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
1269
41.5k
        }
1270
139k
    }
1271
1272
    /* N Mb IQ IT RECON  Loop */
1273
180k
    for(j = u4_mb_idx; j < i; j++)
1274
139k
    {
1275
139k
        ps_cur_mb_info = ps_dec->ps_nmb_info + j;
1276
139k
        ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + j;
1277
1278
139k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1279
139k
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1280
139k
            (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1281
1282
139k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_slice_id = (WORD8) ps_dec->u2_cur_slice_num;
1283
1284
        /*Pointer assignment for Residual NNZ */
1285
139k
        pu2_res_luma_csbp = ps_svc_lyr_dec->pu2_frm_res_luma_csbp + ps_cur_mb_info->u2_mbx;
1286
139k
        pu2_res_luma_csbp += ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_res_luma_csbp_stride;
1287
1288
139k
        if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1289
61.5k
        {
1290
61.5k
            if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1291
61.5k
            {
1292
                /* inter intra pred generation */
1293
61.5k
                if(SVCD_FALSE == ps_svc_lyr_dec->u1_dyadic_flag)
1294
25.3k
                {
1295
25.3k
                    ret =
1296
25.3k
                        isvcd_process_ii_mb(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, j);
1297
25.3k
                    if(ret != OK) return ret;
1298
25.3k
                }
1299
61.5k
                if(0 == ps_svc_cur_mb_info->u1_residual_prediction_flag)
1300
22.9k
                {
1301
                    // IT + Recon
1302
22.9k
                    ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
1303
22.9k
                    isvcd_update_inter_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info, 0);
1304
22.9k
                    *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1305
22.9k
                }
1306
38.6k
                else
1307
38.6k
                {
1308
                    // IT + Residual + Recon
1309
38.6k
                    ret = isvcd_process_inter_mb_rsd_pred_target_lyr(ps_svc_lyr_dec, ps_cur_mb_info,
1310
38.6k
                                                                     j, 0, pu2_res_luma_csbp);
1311
38.6k
                    if(ret != OK) return ret;
1312
38.6k
                }
1313
61.5k
            }
1314
0
            else if(ps_svc_lyr_dec->u1_layer_identifier == MEDIAL_ENHANCEMENT_LAYER)
1315
0
            {
1316
0
                if(0 == ps_svc_cur_mb_info->u1_residual_prediction_flag)
1317
0
                {
1318
                    // IT : to be consumed by Target
1319
0
                    ret = isvcd_process_inter_mb_no_rsd_pred_non_target(ps_svc_lyr_dec,
1320
0
                                                                        ps_cur_mb_info, 0);
1321
0
                    *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1322
0
                    if(ret != OK) return ret;
1323
0
                }
1324
0
                else
1325
0
                {
1326
                    // IT + Residual : to be consumed by target
1327
0
                    ret = isvcd_process_inter_mb_rsd_pred_non_target(ps_svc_lyr_dec, ps_cur_mb_info,
1328
0
                                                                     0, pu2_res_luma_csbp);
1329
0
                    if(ret != OK) return ret;
1330
0
                }
1331
0
            }
1332
0
            else
1333
0
            {
1334
0
                return NOT_OK;
1335
0
            }
1336
61.5k
        }
1337
78.3k
        else if((ps_cur_mb_info->u1_mb_type != MB_SKIP) && (ps_cur_mb_info->u1_mb_type != MB_INFER))
1338
8.15k
        {
1339
8.15k
            if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
1340
8.00k
            {
1341
8.00k
                ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
1342
8.00k
                ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
1343
8.00k
                isvcd_update_intra_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1344
8.00k
            }
1345
144
            else
1346
144
            {
1347
144
                isvcd_update_ipcm_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1348
144
            }
1349
8.15k
            *pu2_res_luma_csbp = 0;
1350
8.15k
        }
1351
70.1k
        else if(ps_cur_mb_info->u1_mb_type == MB_INFER)
1352
28.5k
        {
1353
            /* inter layer intra prediction : intra upsample, IQ, IT ,deblock */
1354
            /* Intra resample for IBL mode */
1355
28.5k
            ret = isvcd_process_ibl_mb(ps_svc_lyr_dec, ps_cur_mb_info, j, 0);
1356
28.5k
            if(ret != OK) return ret;
1357
28.5k
            ih264d_process_inter_mb(ps_dec, ps_cur_mb_info, j);
1358
28.5k
            isvcd_update_inter_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info, 1);
1359
28.5k
            *pu2_res_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
1360
1361
28.5k
            ps_dec->pi1_left_pred_mode[0] = DC;
1362
28.5k
            ps_dec->pi1_left_pred_mode[1] = DC;
1363
28.5k
            ps_dec->pi1_left_pred_mode[2] = DC;
1364
28.5k
            ps_dec->pi1_left_pred_mode[3] = DC;
1365
1366
28.5k
            ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[0] = DC;
1367
28.5k
            ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[1] = DC;
1368
28.5k
            ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[2] = DC;
1369
28.5k
            ps_cur_mb_info->ps_curmb->pi1_intrapredmodes[3] = DC;
1370
1371
28.5k
            isvcd_update_ibl_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1372
28.5k
        }
1373
1374
139k
        if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1375
139k
        {
1376
139k
            if(ps_dec->u4_num_cores < 3)
1377
139k
            {
1378
139k
                if(ps_dec->u4_app_disable_deblk_frm == 0)
1379
139k
                    ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
1380
139k
                                                      (UWORD16) (j >> u1_mbaff));
1381
139k
            }
1382
139k
        }
1383
0
        else if(ps_svc_lyr_dec->u1_layer_identifier == MEDIAL_ENHANCEMENT_LAYER)
1384
0
        {
1385
0
            if(ps_dec->u4_num_cores < 3)
1386
0
            {
1387
0
                if(ps_dec->u4_app_disable_deblk_frm == 0)
1388
0
                    ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info,
1389
0
                                                      (UWORD16) (j >> u1_mbaff));
1390
0
            }
1391
0
        }
1392
1393
139k
        if(ps_dec->u4_use_intrapred_line_copy)
1394
139k
        {
1395
139k
            ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
1396
139k
        }
1397
139k
    }
1398
1399
    /*MB deblocking*/
1400
40.2k
    if(ps_dec->u4_nmb_deblk == 1)
1401
40.2k
    {
1402
40.2k
        UWORD32 u4_wd_y, u4_wd_uv;
1403
40.2k
        tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
1404
40.2k
        UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1405
40.2k
        const WORD32 i4_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1406
40.2k
        const WORD32 i4_cr_qp_idx_ofst = ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1407
1408
40.2k
        u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
1409
40.2k
        u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
1410
1411
40.2k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u4_mb_idx;
1412
1413
40.2k
        ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
1414
40.2k
        ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
1415
1416
180k
        for(j = u4_mb_idx; j < i; j++)
1417
139k
        {
1418
139k
            if(ps_dec->u4_cur_deblk_mb_num > ps_dec->ps_cur_sps->u4_max_mb_addr)
1419
0
            {
1420
0
                return NOT_OK;
1421
0
            }
1422
139k
            ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt, i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
1423
139k
                                       u4_wd_y, u4_wd_uv);
1424
139k
        }
1425
40.2k
    }
1426
1427
40.2k
    if(u4_tfr_n_mb)
1428
40.2k
    {
1429
        /****************************************************************/
1430
        /* Check for End Of Row in Next iteration                       */
1431
        /****************************************************************/
1432
40.2k
        u1_end_of_row_next =
1433
40.2k
            u4_num_mbs_next && (u4_num_mbs_next <= (ps_dec->u4_recon_mb_grp >> u1_mbaff));
1434
1435
        /****************************************************************/
1436
        /* Transfer the Following things                                */
1437
        /* N-Mb DeblkParams Data    ( To Ext DeblkParams Buffer )       */
1438
        /* N-Mb Recon Data          ( To Ext Frame Buffer )             */
1439
        /* N-Mb Intrapredline Data  ( Updated Internally)               */
1440
        /* N-Mb MV Data             ( To Ext MV Buffer )                */
1441
        /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)    */
1442
        /****************************************************************/
1443
40.2k
        ih264d_transfer_mb_group_data(ps_dec, u4_num_mbs, u4_end_of_row, u1_end_of_row_next);
1444
40.2k
        ps_dec->u4_num_mbs_prev_nmb = u4_num_mbs;
1445
40.2k
        ps_dec->u4_pred_info_idx = 0;
1446
40.2k
        ps_dec->u4_dma_buf_idx = 0;
1447
40.2k
    }
1448
40.2k
    return OK;
1449
40.2k
}
1450
/*!
1451
 **************************************************************************
1452
 * \if Function name : isvcd_decode_recon_tfr_nmb_base_lyr \endif
1453
 *
1454
 * \brief
1455
 *
1456
 *
1457
 * \return
1458
 *    0 on Success and Error code otherwise
1459
 **************************************************************************
1460
 */
1461
WORD32 isvcd_decode_recon_tfr_nmb_base_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD32 u1_mb_idx,
1462
                                           UWORD32 u4_num_mbs, UWORD32 u4_num_mbs_next,
1463
                                           UWORD32 u4_tfr_n_mb, UWORD32 u4_end_of_row)
1464
254k
{
1465
254k
    WORD32 j;
1466
254k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1467
254k
    UWORD32 u1_end_of_row_next;
1468
254k
    dec_mb_info_t *ps_cur_mb_info;
1469
254k
    const UWORD32 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1470
254k
    const UWORD32 u1_slice_type = ps_dec->ps_cur_slice->u1_slice_type;
1471
254k
    const WORD32 u1_skip_th =
1472
254k
        ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? B_8x8 : PRED_8x8R0) : -1);
1473
254k
    const UWORD32 u1_ipcm_th = ((u1_slice_type != I_SLICE) ? (ps_dec->u1_B ? 23 : 5) : 0);
1474
254k
    WORD32 ret = OK;
1475
1476
254k
    if(1 != ps_svc_lyr_dec->u1_base_res_flag)
1477
0
    {
1478
0
        return NOT_OK;
1479
0
    }
1480
254k
    if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER)
1481
0
    {
1482
0
        return NOT_OK;
1483
0
    }
1484
1485
    /* N Mb IQ IT + Residual Store for Inter / + Recon for Intra Loop */
1486
1.38M
    for(j = u1_mb_idx; j < u4_num_mbs; j++)
1487
1.12M
    {
1488
1.12M
        ps_dec->u4_dma_buf_idx = 0;
1489
1.12M
        ps_dec->u4_pred_info_idx = 0;
1490
1.12M
        ps_cur_mb_info = ps_dec->ps_nmb_info + j;
1491
1492
1.12M
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
1493
1.12M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
1494
1.12M
            (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
1495
1496
1.12M
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_slice_id = (WORD8) ps_dec->u2_cur_slice_num;
1497
1498
1.12M
        if(ps_cur_mb_info->u1_mb_type == MB_SKIP)
1499
1.02M
        {
1500
1.02M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode = SVC_INTER_MB;
1501
1.02M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size =
1502
1.02M
                ps_cur_mb_info->u1_tran_form8x8;
1503
1.02M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = 0;
1504
1.02M
            ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz = 0;
1505
1.02M
        }
1506
103k
        else if(ps_cur_mb_info->u1_mb_type <= u1_skip_th)
1507
75.8k
        {
1508
            /* Only IT : Store Residual (WORD16) for Higher Layers : Base layer*/
1509
75.8k
            ret = isvcd_process_inter_mb_no_rsd_pred_non_target(ps_svc_lyr_dec, ps_cur_mb_info, 0);
1510
75.8k
            if(ret != OK) return ret;
1511
75.8k
        }
1512
27.2k
        else if(ps_cur_mb_info->u1_mb_type != MB_SKIP)
1513
27.2k
        {
1514
27.2k
            if((u1_ipcm_th + 25) != ps_cur_mb_info->u1_mb_type)
1515
26.3k
            {
1516
26.3k
                ps_cur_mb_info->u1_mb_type -= (u1_skip_th + 1);
1517
26.3k
                ih264d_process_intra_mb(ps_dec, ps_cur_mb_info, j);
1518
26.3k
                isvcd_update_intra_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1519
26.3k
            }
1520
831
            else
1521
831
            {
1522
831
                isvcd_update_ipcm_mb_inter_layer_info(ps_svc_lyr_dec, ps_cur_mb_info);
1523
831
            }
1524
27.2k
        }
1525
1526
1.12M
        if(ps_dec->u4_use_intrapred_line_copy)
1527
1.12M
        {
1528
1.12M
            ih264d_copy_intra_pred_line(ps_dec, ps_cur_mb_info, j);
1529
1.12M
        }
1530
1.12M
    }
1531
1532
    /*MB deblocking*/
1533
254k
    if(ps_dec->u4_nmb_deblk == 1)
1534
254k
    {
1535
254k
        UWORD32 u4_wd_y, u4_wd_uv;
1536
254k
        tfr_ctxt_t *ps_tfr_cxt = &(ps_dec->s_tran_addrecon);
1537
254k
        UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
1538
254k
        const WORD32 i4_cb_qp_idx_ofst = ps_dec->ps_cur_pps->i1_chroma_qp_index_offset;
1539
254k
        const WORD32 i4_cr_qp_idx_ofst = ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset;
1540
1541
254k
        u4_wd_y = ps_dec->u2_frm_wd_y << u1_field_pic_flag;
1542
254k
        u4_wd_uv = ps_dec->u2_frm_wd_uv << u1_field_pic_flag;
1543
1544
254k
        ps_cur_mb_info = ps_dec->ps_nmb_info + u1_mb_idx;
1545
1546
254k
        ps_dec->u4_deblk_mb_x = ps_cur_mb_info->u2_mbx;
1547
254k
        ps_dec->u4_deblk_mb_y = ps_cur_mb_info->u2_mby;
1548
1549
1.38M
        for(j = u1_mb_idx; j < u4_num_mbs; j++)
1550
1.12M
        {
1551
            /* IN SVC base layers only intra MB's Need to be deblocked*/
1552
1.12M
            deblk_mb_t *ps_top_mb, *ps_left_mb, *ps_cur_mb;
1553
1.12M
            ps_cur_mb = ps_dec->ps_cur_deblk_mb;
1554
1.12M
            if(!(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_FILTERING))
1555
27.2k
            {
1556
27.2k
                if(ps_dec->u4_deblk_mb_x)
1557
14.6k
                {
1558
14.6k
                    ps_left_mb = ps_cur_mb - 1;
1559
14.6k
                }
1560
12.5k
                else
1561
12.5k
                {
1562
12.5k
                    ps_left_mb = NULL;
1563
12.5k
                }
1564
27.2k
                if(ps_dec->u4_deblk_mb_y != 0)
1565
20.7k
                {
1566
20.7k
                    ps_top_mb = ps_cur_mb - (ps_dec->u2_frm_wd_in_mbs);
1567
20.7k
                }
1568
6.48k
                else
1569
6.48k
                {
1570
6.48k
                    ps_top_mb = NULL;
1571
6.48k
                }
1572
1573
27.2k
                if(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_LEFT_EDGE) ps_left_mb = NULL;
1574
27.2k
                if(ps_cur_mb->u1_deblocking_mode & MB_DISABLE_TOP_EDGE) ps_top_mb = NULL;
1575
1576
                /* Top Horizontal Edge*/
1577
27.2k
                if(NULL != ps_top_mb)
1578
20.7k
                {
1579
20.7k
                    if(!(ps_top_mb->u1_mb_type & D_INTRA_MB))
1580
13.6k
                    {
1581
13.6k
                        ps_cur_mb->u4_bs_table[0] = 0;
1582
13.6k
                    }
1583
20.7k
                }
1584
6.48k
                else
1585
6.48k
                {
1586
6.48k
                    ps_cur_mb->u4_bs_table[0] = 0;
1587
6.48k
                }
1588
1589
                /* Left Vertical Edge*/
1590
27.2k
                if(NULL != ps_left_mb)
1591
14.6k
                {
1592
14.6k
                    if(!(ps_left_mb->u1_mb_type & D_INTRA_MB))
1593
8.71k
                    {
1594
8.71k
                        ps_cur_mb->u4_bs_table[4] = 0;
1595
8.71k
                    }
1596
14.6k
                }
1597
12.5k
                else
1598
12.5k
                {
1599
12.5k
                    ps_cur_mb->u4_bs_table[4] = 0;
1600
12.5k
                }
1601
27.2k
            }
1602
1603
1.12M
            if(ps_dec->u4_cur_deblk_mb_num > ps_dec->ps_cur_sps->u4_max_mb_addr)
1604
0
            {
1605
0
                return NOT_OK;
1606
0
            }
1607
1608
1.12M
            ih264d_deblock_mb_nonmbaff(ps_dec, ps_tfr_cxt, i4_cb_qp_idx_ofst, i4_cr_qp_idx_ofst,
1609
1.12M
                                       u4_wd_y, u4_wd_uv);
1610
1.12M
        }
1611
254k
    }
1612
1613
254k
    if(u4_tfr_n_mb)
1614
254k
    {
1615
        /****************************************************************/
1616
        /* Check for End Of Row in Next iteration                       */
1617
        /****************************************************************/
1618
254k
        u1_end_of_row_next =
1619
254k
            u4_num_mbs_next && (u4_num_mbs_next <= (ps_dec->u4_recon_mb_grp >> u1_mbaff));
1620
1621
        /****************************************************************/
1622
        /* Transfer the Following things                                */
1623
        /* N-Mb DeblkParams Data    ( To Ext DeblkParams Buffer )       */
1624
        /* N-Mb Recon Data          ( To Ext Frame Buffer )             */
1625
        /* N-Mb Intrapredline Data  ( Updated Internally)               */
1626
        /* N-Mb MV Data             ( To Ext MV Buffer )                */
1627
        /* N-Mb MVTop/TopRight Data ( To Int MV Top Scratch Buffers)    */
1628
        /****************************************************************/
1629
254k
        ih264d_transfer_mb_group_data(ps_dec, u4_num_mbs, u4_end_of_row, u1_end_of_row_next);
1630
254k
        ps_dec->u4_num_mbs_prev_nmb = u4_num_mbs;
1631
254k
        ps_dec->u4_pred_info_idx = 0;
1632
254k
        ps_dec->u4_dma_buf_idx = 0;
1633
254k
    }
1634
254k
    return OK;
1635
254k
}
1636
/*!
1637
**************************************************************************
1638
* \if Function name : isvcd_process_ibl_mb \endif
1639
*
1640
* \brief
1641
*    This function decodes an ibl mb
1642
*
1643
*
1644
* \return
1645
*
1646
**************************************************************************
1647
*/
1648
WORD32 isvcd_process_ibl_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info,
1649
                            UWORD32 u4_mb_num, UWORD8 u1_inter_intra_mode)
1650
106k
{
1651
106k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1652
106k
    intra_sampling_ctxt_t *ps_ctxt;
1653
106k
    svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1654
106k
    pic_buffer_t *ps_frame_buf = ps_dec->ps_cur_pic;
1655
106k
    pic_buffer_t *ps_frame_buf_ref_layer;
1656
106k
    intra_samp_lyr_ctxt *ps_lyr_ctxt;
1657
106k
    mem_element_t s_ref_mb_mode = {0};
1658
106k
    mem_element_t s_inp_luma = {0};
1659
106k
    mem_element_t s_inp_chroma = {0};
1660
106k
    mem_element_t s_out_luma = {0};
1661
106k
    mem_element_t s_out_chroma = {0};
1662
106k
    WORD32 i4_ref_x_luma, i4_ref_y_luma, i4_luma_incr = 0;
1663
106k
    WORD32 i4_ref_x_chroma, i4_ref_y_chroma, i4_chroma_incr = 0;
1664
106k
    UWORD32 u4_cur_y_stride, u4_cur_uv_stride;
1665
106k
    UWORD32 u4_ref_y_stride, u4_ref_uv_stride;
1666
106k
    WORD32 i4_ref_luma_instra_sample_correction_offset = 0;
1667
106k
    WORD32 i4_ref_chroma_instra_sample_correction_offset = 0;
1668
106k
    ref_mb_map_t *ps_x_off_len_luma;
1669
106k
    ref_mb_map_t *ps_y_off_len_luma;
1670
106k
    ref_mb_map_t *ps_x_off_len_chroma;
1671
106k
    ref_mb_map_t *ps_y_off_len_chroma;
1672
106k
    mb_coord_t s_mb_coord = {0};
1673
106k
    WORD32 ret = OK;
1674
106k
    UNUSED(u4_mb_num);
1675
1676
106k
    ps_ctxt = (intra_sampling_ctxt_t *) ps_svc_lyr_dec->pv_intra_sample_ctxt;
1677
106k
    ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1678
1679
106k
    ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1680
106k
    u4_cur_y_stride = ps_dec->u2_frm_wd_y;
1681
106k
    u4_cur_uv_stride = ps_dec->u2_frm_wd_uv;
1682
106k
    u4_ref_y_stride = ps_svc_dec_ref_layer->s_dec.u2_frm_wd_y;
1683
106k
    u4_ref_uv_stride = ps_svc_dec_ref_layer->s_dec.u2_frm_wd_uv;
1684
1685
106k
    ps_frame_buf_ref_layer = ps_svc_dec_ref_layer->s_dec.ps_cur_pic;
1686
106k
    if(0 == u1_inter_intra_mode)
1687
91.5k
    {
1688
91.5k
        s_out_luma.pv_buffer = ps_frame_buf->pu1_buf1 + (ps_cur_mb_info->u2_mbx << 4) +
1689
91.5k
                               (u4_cur_y_stride * (ps_cur_mb_info->u2_mby << 4));
1690
91.5k
        s_out_luma.i4_element_size = 1;
1691
91.5k
        s_out_luma.i4_num_element_stride = u4_cur_y_stride;
1692
1693
91.5k
        s_out_chroma.pv_buffer = ps_frame_buf->pu1_buf2 +
1694
91.5k
                                 (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR +
1695
91.5k
                                 (u4_cur_uv_stride * (ps_cur_mb_info->u2_mby << 3));
1696
91.5k
        s_out_chroma.i4_element_size = 1;
1697
91.5k
        s_out_chroma.i4_num_element_stride = u4_cur_uv_stride;
1698
91.5k
    }
1699
15.1k
    else
1700
15.1k
    {
1701
15.1k
        if(SVCD_TRUE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1702
0
        {
1703
0
            return NOT_OK;
1704
0
        }
1705
1706
15.1k
        s_out_luma.pv_buffer = ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma;
1707
15.1k
        s_out_luma.i4_element_size = 1;
1708
15.1k
        s_out_luma.i4_num_element_stride = MB_SIZE;
1709
1710
15.1k
        s_out_chroma.pv_buffer = ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma;
1711
15.1k
        s_out_chroma.i4_element_size = 1;
1712
15.1k
        s_out_chroma.i4_num_element_stride = MB_SIZE;
1713
15.1k
    }
1714
1715
    /* get the projected locations buffer pointers */
1716
106k
    {
1717
106k
        intra_samp_map_ctxt_t *ps_luma_map, *ps_chroma_map;
1718
1719
106k
        ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1720
106k
        ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1721
1722
106k
        ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
1723
106k
        ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
1724
106k
        ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
1725
106k
        ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
1726
106k
    }
1727
106k
    i4_ref_x_luma = ps_svc_lyr_dec->ps_intsam_luma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1728
106k
    i4_ref_y_luma = ps_svc_lyr_dec->ps_intsam_luma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1729
1730
106k
    i4_luma_incr = ps_x_off_len_luma[ps_cur_mb_info->u2_mbx].i2_offset - i4_ref_x_luma;
1731
106k
    i4_luma_incr +=
1732
106k
        (ps_y_off_len_luma[ps_cur_mb_info->u2_mby].i2_offset - i4_ref_y_luma) * u4_ref_y_stride;
1733
1734
106k
    i4_ref_x_chroma = ps_svc_lyr_dec->ps_intsam_chroma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1735
106k
    i4_ref_y_chroma = ps_svc_lyr_dec->ps_intsam_chroma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1736
1737
106k
    i4_chroma_incr = ps_x_off_len_chroma[ps_cur_mb_info->u2_mbx].i2_offset - i4_ref_x_chroma;
1738
106k
    i4_chroma_incr <<= 1;
1739
106k
    i4_chroma_incr += (ps_y_off_len_chroma[ps_cur_mb_info->u2_mby].i2_offset - i4_ref_y_chroma) *
1740
106k
                      u4_ref_uv_stride;
1741
106k
    if(SVCD_FALSE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1742
46.6k
    {
1743
46.6k
        i4_ref_x_luma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_wd_y - 1), i4_ref_x_luma);
1744
46.6k
        i4_ref_y_luma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_ht_y - 1), i4_ref_y_luma);
1745
46.6k
    }
1746
1747
106k
    i4_ref_luma_instra_sample_correction_offset =
1748
106k
        i4_ref_x_luma + (i4_ref_y_luma) * (WORD32) u4_ref_y_stride;
1749
1750
106k
    s_inp_luma.pv_buffer = ps_frame_buf_ref_layer->pu1_buf1 + i4_luma_incr +
1751
106k
                           i4_ref_luma_instra_sample_correction_offset;
1752
106k
    s_inp_luma.i4_element_size = 1;
1753
106k
    s_inp_luma.i4_num_element_stride = u4_ref_y_stride;
1754
1755
106k
    if(SVCD_FALSE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1756
46.6k
    {
1757
46.6k
        i4_ref_x_chroma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_wd_uv - 1), i4_ref_x_chroma);
1758
46.6k
        i4_ref_y_chroma = CLIP3(0, (ps_svc_dec_ref_layer->s_dec.u2_frm_ht_uv - 1), i4_ref_y_chroma);
1759
46.6k
    }
1760
106k
    i4_ref_chroma_instra_sample_correction_offset =
1761
106k
        (i4_ref_x_chroma << 1) + (i4_ref_y_chroma) * (WORD32) u4_ref_uv_stride;
1762
1763
106k
    s_inp_chroma.pv_buffer = ps_frame_buf_ref_layer->pu1_buf2 + i4_chroma_incr +
1764
106k
                             i4_ref_chroma_instra_sample_correction_offset;
1765
106k
    s_inp_chroma.i4_element_size = 1;
1766
106k
    s_inp_chroma.i4_num_element_stride = u4_ref_uv_stride;
1767
1768
106k
    s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1769
106k
    s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1770
106k
    s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1771
1772
106k
    s_mb_coord.u2_mb_x = ps_cur_mb_info->u2_mbx;
1773
106k
    s_mb_coord.u2_mb_y = ps_cur_mb_info->u2_mby;
1774
1775
106k
    if(SVCD_TRUE == ps_svc_lyr_dec->s_res_prms.u1_dyadic_flag)
1776
59.9k
    {
1777
59.9k
        ret = isvcd_intra_resamp_mb_dyadic(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1778
59.9k
                                           &s_out_luma, &s_out_chroma, &s_mb_coord, ps_svc_lyr_dec);
1779
59.9k
    }
1780
46.6k
    else
1781
46.6k
    {
1782
46.6k
        ret = isvcd_intra_resamp_mb(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1783
46.6k
                                    &s_out_luma, &s_out_chroma, &s_mb_coord);
1784
46.6k
    }
1785
106k
    if(OK != ret) return ret;
1786
106k
    return OK;
1787
106k
}
1788
/*!
1789
**************************************************************************
1790
* \if Function name : isvcd_process_residual_resample_mb \endif
1791
*
1792
* \brief
1793
*    This function decodes a residual resample mb
1794
*
1795
*
1796
* \return
1797
*
1798
**************************************************************************
1799
*/
1800
WORD32 isvcd_process_residual_resample_mb(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1801
                                          dec_mb_info_t *ps_cur_mb_info)
1802
150k
{
1803
150k
    residual_sampling_ctxt_t *ps_ctxt;
1804
150k
    svc_dec_lyr_struct_t *ps_svc_dec_ref_layer;
1805
150k
    res_lyr_ctxt *ps_lyr_ctxt;
1806
150k
    mem_element_t s_ref_mb_mode = {0};
1807
150k
    mem_element_t s_inp_luma = {0};
1808
150k
    mem_element_t s_inp_chroma = {0};
1809
150k
    mem_element_t s_out_luma = {0};
1810
150k
    mem_element_t s_out_chroma = {0};
1811
1812
    /* projected locations pointer */
1813
150k
    ref_mb_map_t *ps_x_off_len_luma;
1814
150k
    ref_mb_map_t *ps_y_off_len_luma;
1815
150k
    ref_mb_map_t *ps_x_off_len_chroma;
1816
150k
    ref_mb_map_t *ps_y_off_len_chroma;
1817
150k
    WORD32 i4_ref_x_luma, i4_ref_y_luma;
1818
150k
    WORD32 i4_ref_x_chroma, i4_ref_y_chroma;
1819
150k
    WORD32 i4_ref_luma_ressam_correction_offset = 0;
1820
150k
    WORD32 i4_ref_chroma_ressam_correction_offset = 0;
1821
150k
    WORD32 i4_inp_luma_stride, i4_inp_chroma_stride;
1822
150k
    WORD32 i4_out_luma_stride, i4_out_chroma_stride;
1823
150k
    WORD32 i4_inp_luma_offset = 0, i4_inp_chroma_offset = 0;
1824
150k
    WORD32 ret;
1825
1826
150k
    ps_svc_dec_ref_layer = ps_svc_lyr_dec->ps_dec_svc_ref_layer;
1827
150k
    ps_ctxt = (residual_sampling_ctxt_t *) ps_svc_lyr_dec->pv_residual_sample_ctxt;
1828
150k
    ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
1829
1830
150k
    i4_inp_luma_stride = ps_svc_dec_ref_layer->u2_residual_resample_luma_stride;
1831
150k
    i4_inp_chroma_stride = ps_svc_dec_ref_layer->u2_residual_resample_chroma_stride;
1832
150k
    i4_out_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
1833
150k
    i4_out_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
1834
1835
150k
    {
1836
150k
        residual_samp_map_ctxt_t *ps_luma_map, *ps_chroma_map;
1837
1838
150k
        ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
1839
150k
        ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
1840
150k
        ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
1841
150k
        ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
1842
150k
        ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
1843
150k
        ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
1844
150k
    }
1845
150k
    i4_ref_x_luma = ps_svc_lyr_dec->ps_ressam_luma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1846
150k
    i4_ref_y_luma = ps_svc_lyr_dec->ps_ressam_luma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1847
1848
150k
    i4_ref_x_chroma = ps_svc_lyr_dec->ps_ressam_chroma_map_horz[ps_cur_mb_info->u2_mbx].i2_offset;
1849
150k
    i4_ref_y_chroma = ps_svc_lyr_dec->ps_ressam_chroma_map_vert[ps_cur_mb_info->u2_mby].i2_offset;
1850
1851
150k
    i4_ref_x_luma = CLIP3(0, (ps_lyr_ctxt->i4_ref_width - 1), i4_ref_x_luma);
1852
150k
    i4_ref_y_luma = CLIP3(0, (ps_lyr_ctxt->i4_ref_height - 1), i4_ref_y_luma);
1853
150k
    i4_ref_x_chroma = CLIP3(0, ((ps_lyr_ctxt->i4_ref_width >> 1) - 1), i4_ref_x_chroma);
1854
150k
    i4_ref_y_chroma = CLIP3(0, ((ps_lyr_ctxt->i4_ref_height >> 1) - 1), i4_ref_y_chroma);
1855
1856
150k
    {
1857
150k
        WORD32 i4_offset_x, i4_offset_y;
1858
1859
150k
        i4_offset_x = ps_x_off_len_luma[ps_cur_mb_info->u2_mbx].i2_offset;
1860
150k
        i4_offset_y = ps_y_off_len_luma[ps_cur_mb_info->u2_mby].i2_offset;
1861
1862
        /* check for offsets inside frame dimensions */
1863
150k
        if(0 <= i4_offset_x)
1864
103k
        {
1865
            /* validity of pointer passed */
1866
103k
            if(!(i4_offset_x >= i4_ref_x_luma))
1867
0
            {
1868
0
                return NOT_OK;
1869
0
            }
1870
103k
            i4_inp_luma_offset += (i4_offset_x - i4_ref_x_luma);
1871
103k
        }
1872
1873
150k
        if(0 <= i4_offset_y)
1874
128k
        {
1875
            /* validity of pointer passed */
1876
128k
            if(!(i4_offset_y >= i4_ref_y_luma))
1877
0
            {
1878
0
                return NOT_OK;
1879
0
            }
1880
128k
            i4_inp_luma_offset += (i4_offset_y - i4_ref_y_luma) * i4_inp_luma_stride;
1881
128k
        }
1882
1883
150k
        i4_offset_x = ps_x_off_len_chroma[ps_cur_mb_info->u2_mbx].i2_offset;
1884
150k
        i4_offset_y = ps_y_off_len_chroma[ps_cur_mb_info->u2_mby].i2_offset;
1885
1886
        /* check for offsets inside frame dimensions */
1887
150k
        if(0 <= i4_offset_x)
1888
103k
        {
1889
            /* validity of pointer passed */
1890
103k
            if(!(i4_offset_x >= i4_ref_x_chroma))
1891
0
            {
1892
0
                return NOT_OK;
1893
0
            }
1894
103k
            i4_inp_chroma_offset += (i4_offset_x - i4_ref_x_chroma) << 1;
1895
103k
        }
1896
1897
150k
        if(0 <= i4_offset_y)
1898
128k
        {
1899
            /* validity of pointer passed */
1900
128k
            if(!(i4_offset_y >= i4_ref_y_chroma))
1901
0
            {
1902
0
                return NOT_OK;
1903
0
            }
1904
128k
            i4_inp_chroma_offset += (i4_offset_y - i4_ref_y_chroma) * (i4_inp_chroma_stride << 1);
1905
128k
        }
1906
150k
    }
1907
1908
150k
    i4_ref_luma_ressam_correction_offset = i4_ref_x_luma + (i4_ref_y_luma) *i4_inp_luma_stride;
1909
1910
150k
    s_inp_luma.pv_buffer = ps_svc_dec_ref_layer->pi2_il_residual_resample_mb_luma_frm_start +
1911
150k
                           i4_inp_luma_offset + i4_ref_luma_ressam_correction_offset;
1912
150k
    s_inp_luma.i4_element_size = 1;
1913
150k
    s_inp_luma.i4_num_element_stride = i4_inp_luma_stride;
1914
1915
150k
    i4_ref_chroma_ressam_correction_offset =
1916
150k
        (i4_ref_x_chroma << 1) + (i4_ref_y_chroma) *i4_inp_chroma_stride;
1917
1918
150k
    s_inp_chroma.pv_buffer = ps_svc_dec_ref_layer->pi2_il_residual_resample_mb_chroma_frm_start +
1919
150k
                             i4_inp_chroma_offset + i4_ref_chroma_ressam_correction_offset;
1920
150k
    s_inp_chroma.i4_element_size = 1;
1921
150k
    s_inp_chroma.i4_num_element_stride = i4_inp_luma_stride;
1922
1923
150k
    s_ref_mb_mode.pv_buffer = ps_svc_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
1924
150k
    s_ref_mb_mode.i4_element_size = sizeof(inter_lyr_mb_prms_t);
1925
150k
    s_ref_mb_mode.i4_num_element_stride = ps_svc_dec_ref_layer->u2_inter_lyr_mb_prms_stride;
1926
1927
150k
    s_out_luma.i4_element_size = 1;
1928
150k
    s_out_luma.pv_buffer =
1929
150k
        ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
1930
150k
        ((ps_cur_mb_info->u2_mbx << 4) +
1931
150k
         (i4_out_luma_stride * (ps_cur_mb_info->u2_mby << 4)) * s_out_luma.i4_element_size);
1932
1933
150k
    s_out_luma.i4_num_element_stride = i4_out_luma_stride;
1934
1935
150k
    s_out_chroma.i4_element_size = 1;
1936
150k
    s_out_chroma.pv_buffer =
1937
150k
        ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
1938
150k
        ((ps_cur_mb_info->u2_mbx << 4) +
1939
150k
         (i4_out_chroma_stride * (ps_cur_mb_info->u2_mby << 3)) * s_out_chroma.i4_element_size);
1940
150k
    s_out_chroma.i4_num_element_stride = i4_out_chroma_stride;
1941
1942
150k
    ret = ps_lyr_ctxt->pf_residual_samp_mb(ps_ctxt, &s_inp_luma, &s_inp_chroma, &s_ref_mb_mode,
1943
150k
                                           &s_out_luma, &s_out_chroma, ps_cur_mb_info->u2_mbx,
1944
150k
                                           ps_cur_mb_info->u2_mby);
1945
150k
    if(ret != OK)
1946
0
    {
1947
0
        return ret;
1948
0
    }
1949
150k
    return OK;
1950
150k
}
1951
1952
/*!
1953
 **************************************************************************
1954
 * \if Function name : isvcd_process_inter_mb_rsd_pred_target_lyr \endif
1955
 *
1956
 * \brief IT+ Residual + Recon
1957
 *    This function decodes an Inter MB.
1958
 *
1959
 *
1960
 * \return
1961
 *    0 on Success and Error code otherwise
1962
 **************************************************************************
1963
 */
1964
WORD32 isvcd_process_inter_mb_rsd_pred_target_lyr(svc_dec_lyr_struct_t *ps_svc_lyr_dec,
1965
                                                  dec_mb_info_t *ps_cur_mb_info, UWORD32 u4_mb_num,
1966
                                                  UWORD8 u1_inference_mode,
1967
                                                  UWORD16 *pu2_res_luma_csbp)
1968
150k
{
1969
150k
    UWORD8 *pu1_rec_y, *pu1_rec_u;
1970
150k
    dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
1971
150k
    UWORD32 ui_rec_width, u4_recwidth_cr;
1972
150k
    UWORD16 u2_luma_stride, u2_chroma_stride;
1973
150k
    WORD16 *pi2_y_coeff, *pi2_luma_res_ptr, *pi2_chroma_res_ptr;
1974
150k
    UWORD32 u1_mb_field_decoding_flag;
1975
150k
    const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
1976
150k
    UWORD32 uc_botMb;
1977
150k
    UWORD32 u4_num_pmbair;
1978
150k
    tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
1979
150k
    UWORD32 u4_luma_dc_only_csbp = 0;
1980
150k
    UWORD32 u4_luma_dc_only_cbp = 0;
1981
150k
    UWORD16 u2_res_luma_csbp = 0;
1982
150k
    WORD32 ret;
1983
1984
150k
    if(0 != ps_dec->ps_cur_slice->u1_mbaff_frame_flag)
1985
0
    {
1986
0
        return NOT_OK;
1987
0
    }
1988
150k
    uc_botMb = 1 - ps_cur_mb_info->u1_topmb;
1989
150k
    u4_num_pmbair = (u4_mb_num >> u1_mbaff);
1990
150k
    u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
1991
1992
150k
    pu1_rec_y = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
1993
150k
    pu1_rec_u = ps_frame_buf->pu1_dest_u + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
1994
150k
    ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
1995
150k
    u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
1996
1997
150k
    u2_luma_stride = ps_svc_lyr_dec->u2_residual_resample_luma_stride;
1998
150k
    pi2_luma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_luma_frm_start +
1999
150k
                       (ps_cur_mb_info->u2_mbx << 4) +
2000
150k
                       ((ps_cur_mb_info->u2_mby << 4) * u2_luma_stride);
2001
2002
150k
    u2_chroma_stride = ps_svc_lyr_dec->u2_residual_resample_chroma_stride;
2003
150k
    pi2_chroma_res_ptr = ps_svc_lyr_dec->pi2_il_residual_resample_mb_chroma_frm_start +
2004
150k
                         (ps_cur_mb_info->u2_mbx << 4) +
2005
150k
                         ((ps_cur_mb_info->u2_mby << 3) * u2_chroma_stride);
2006
2007
150k
    ret = isvcd_process_residual_resample_mb(ps_svc_lyr_dec, ps_cur_mb_info);
2008
150k
    if(ret != OK)
2009
0
    {
2010
0
        return ret;
2011
0
    }
2012
150k
    if(u1_mbaff)
2013
0
    {
2014
0
        if(uc_botMb)
2015
0
        {
2016
0
            pu1_rec_y += (u1_mb_field_decoding_flag ? (ui_rec_width >> 1) : (ui_rec_width << 4));
2017
0
            pu1_rec_u +=
2018
0
                (u1_mb_field_decoding_flag ? (u4_recwidth_cr >> 1) : (u4_recwidth_cr << 3));
2019
0
        }
2020
0
    }
2021
2022
150k
    if(!ps_cur_mb_info->u1_tran_form8x8)
2023
141k
    {
2024
141k
        u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
2025
141k
    }
2026
9.25k
    else
2027
9.25k
    {
2028
9.25k
        if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
2029
3.26k
        {
2030
3.26k
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec, ps_cur_mb_info, 0);
2031
3.26k
        }
2032
5.99k
        else
2033
5.99k
        {
2034
5.99k
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec, ps_cur_mb_info);
2035
5.99k
        }
2036
9.25k
    }
2037
2038
150k
    *pu2_res_luma_csbp = 0;
2039
150k
    pi2_y_coeff = ps_dec->pi2_coeff_data;
2040
2041
    /* Inverse Transform and Reconstruction */
2042
150k
    if(ps_cur_mb_info->u1_cbp & 0x0f)
2043
23.9k
    {
2044
23.9k
        if(!ps_cur_mb_info->u1_tran_form8x8)
2045
14.6k
        {
2046
14.6k
            UWORD32 i;
2047
14.6k
            WORD16 ai2_tmp[16] = {0};
2048
249k
            for(i = 0; i < 16; i++)
2049
234k
            {
2050
234k
                if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
2051
45.0k
                {
2052
45.0k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2053
45.0k
                    UWORD8 *pu1_pred_sblk =
2054
45.0k
                        pu1_rec_y + ((i & 0x3) * BLK_SIZE) + (i >> 2) * (ui_rec_width << 2);
2055
45.0k
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
2056
45.0k
                                      (i >> 2) * (u2_luma_stride << 2);
2057
45.0k
                    PROFILE_DISABLE_IQ_IT_RECON()
2058
45.0k
                    {
2059
45.0k
                        if(CHECKBIT(u4_luma_dc_only_csbp, i))
2060
4.66k
                        {
2061
4.66k
                            u2_res_luma_csbp =
2062
4.66k
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_4x4_dc(
2063
4.66k
                                    pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width,
2064
4.66k
                                    u2_luma_stride, ui_rec_width,
2065
4.66k
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
2066
4.66k
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
2067
4.66k
                                    ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
2068
4.66k
                        }
2069
40.3k
                        else
2070
40.3k
                        {
2071
40.3k
                            u2_res_luma_csbp =
2072
40.3k
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_4x4(
2073
40.3k
                                    pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width,
2074
40.3k
                                    u2_luma_stride, ui_rec_width,
2075
40.3k
                                    gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
2076
40.3k
                                    (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[3],
2077
40.3k
                                    ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0, NULL);
2078
40.3k
                        }
2079
45.0k
                    }
2080
45.0k
                }
2081
189k
                else
2082
189k
                {
2083
189k
                    UWORD8 *pu1_pred_sblk =
2084
189k
                        pu1_rec_y + ((i & 0x3) * BLK_SIZE) + (i >> 2) * (ui_rec_width << 2);
2085
189k
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x3) * BLK_SIZE) +
2086
189k
                                      (i >> 2) * (u2_luma_stride << 2);
2087
2088
189k
                    u2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_4x4(
2089
189k
                        pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride,
2090
189k
                        ui_rec_width);
2091
189k
                }
2092
234k
                *pu2_res_luma_csbp |= (u2_res_luma_csbp << i);
2093
234k
            }
2094
14.6k
        }
2095
9.25k
        else
2096
9.25k
        {
2097
9.25k
            WORD16 *pi2_scale_matrix_ptr;
2098
9.25k
            WORD32 i;
2099
2100
9.25k
            pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist8x8[1];
2101
2102
46.2k
            for(i = 0; i < 4; i++)
2103
37.0k
            {
2104
37.0k
                WORD16 ai2_tmp[64] = {0};
2105
37.0k
                WORD16 *pi16_levelBlock =
2106
37.0k
                    pi2_y_coeff + (i << 6); /* move to the next 8x8 adding 64 */
2107
2108
37.0k
                UWORD8 *pu1_pred_sblk =
2109
37.0k
                    pu1_rec_y + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (ui_rec_width << 3);
2110
37.0k
                WORD16 *pi2_out =
2111
37.0k
                    pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (u2_luma_stride << 3);
2112
37.0k
                if(CHECKBIT(ps_cur_mb_info->u1_cbp, i))
2113
21.9k
                {
2114
21.9k
                    PROFILE_DISABLE_IQ_IT_RECON()
2115
21.9k
                    {
2116
21.9k
                        if(CHECKBIT(u4_luma_dc_only_cbp, i))
2117
3.12k
                        {
2118
3.12k
                            u2_res_luma_csbp =
2119
3.12k
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_8x8_dc(
2120
3.12k
                                    pi16_levelBlock, pu1_pred_sblk, pi2_out, pu1_pred_sblk,
2121
3.12k
                                    ui_rec_width, u2_luma_stride, ui_rec_width,
2122
3.12k
                                    gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
2123
3.12k
                                    (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
2124
3.12k
                                    ai2_tmp, 0, NULL);
2125
3.12k
                        }
2126
18.8k
                        else
2127
18.8k
                        {
2128
18.8k
                            u2_res_luma_csbp =
2129
18.8k
                                ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_luma_8x8(
2130
18.8k
                                    pi16_levelBlock, pu1_pred_sblk, pi2_out, pu1_pred_sblk,
2131
18.8k
                                    ui_rec_width, u2_luma_stride, ui_rec_width,
2132
18.8k
                                    gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
2133
18.8k
                                    (UWORD16 *) pi2_scale_matrix_ptr, ps_cur_mb_info->u1_qp_div6,
2134
18.8k
                                    ai2_tmp, 0, NULL);
2135
18.8k
                        }
2136
21.9k
                    }
2137
21.9k
                }
2138
15.0k
                else
2139
15.0k
                {
2140
15.0k
                    UWORD8 *pu1_pred_sblk =
2141
15.0k
                        pu1_rec_y + ((i & 0x1) * BLK8x8SIZE) + (i >> 1) * (ui_rec_width << 3);
2142
15.0k
                    WORD16 *pi2_out = pi2_luma_res_ptr + ((i & 0x1) * BLK8x8SIZE) +
2143
15.0k
                                      (i >> 1) * (u2_luma_stride << 3);
2144
2145
15.0k
                    u2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_8x8(
2146
15.0k
                        pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride,
2147
15.0k
                        ui_rec_width);
2148
15.0k
                }
2149
37.0k
                *pu2_res_luma_csbp |= (u2_res_luma_csbp << (((i >> 1) << 3) + ((i & 0x01) << 1)));
2150
37.0k
            }
2151
9.25k
        }
2152
23.9k
    }
2153
126k
    else
2154
126k
    {
2155
126k
        UWORD8 *pu1_pred_sblk = pu1_rec_y;
2156
126k
        WORD16 *pi2_out = pi2_luma_res_ptr;
2157
2158
126k
        *pu2_res_luma_csbp = ps_svc_lyr_dec->pf_pred_residual_recon_luma_16x16(
2159
126k
            pu1_pred_sblk, pi2_out, pu1_pred_sblk, ui_rec_width, u2_luma_stride, ui_rec_width);
2160
126k
    }
2161
2162
    /* Decode Chroma Block */
2163
150k
    ih264d_unpack_chroma_coeff4x4_mb(ps_dec, ps_cur_mb_info);
2164
    /*--------------------------------------------------------------------*/
2165
    /* Chroma Blocks decoding                                             */
2166
    /*--------------------------------------------------------------------*/
2167
150k
    {
2168
150k
        UWORD8 u1_chroma_cbp = (UWORD8) (ps_cur_mb_info->u1_cbp >> 4);
2169
2170
150k
        if(u1_chroma_cbp != CBPC_ALLZERO)
2171
12.0k
        {
2172
12.0k
            UWORD32 u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
2173
12.0k
            UWORD32 u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
2174
12.0k
            UWORD16 u2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
2175
2176
12.0k
            pi2_y_coeff = ps_dec->pi2_coeff_data;
2177
2178
12.0k
            {
2179
12.0k
                UWORD32 i;
2180
12.0k
                WORD16 ai2_tmp[16] = {0};
2181
60.4k
                for(i = 0; i < 4; i++)
2182
48.3k
                {
2183
48.3k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2184
48.3k
                    UWORD8 *pu1_pred_sblk = pu1_rec_u + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2185
48.3k
                                            (i >> 1) * (u4_recwidth_cr << 2);
2186
48.3k
                    WORD16 *pi2_out = pi2_chroma_res_ptr +
2187
48.3k
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2188
48.3k
                                      (i >> 1) * (u2_chroma_stride << 2);
2189
48.3k
                    PROFILE_DISABLE_IQ_IT_RECON()
2190
48.3k
                    {
2191
48.3k
                        if(CHECKBIT(u2_chroma_csbp, i))
2192
4.12k
                        {
2193
4.12k
                            ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4(
2194
4.12k
                                pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2195
4.12k
                                u2_chroma_stride, u4_recwidth_cr,
2196
4.12k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
2197
4.12k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
2198
4.12k
                                ai2_tmp, pi2_level);
2199
4.12k
                        }
2200
44.2k
                        else if(pi2_level[0] != 0)
2201
24.2k
                        {
2202
24.2k
                            ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4_dc(
2203
24.2k
                                pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2204
24.2k
                                u2_chroma_stride, u4_recwidth_cr,
2205
24.2k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
2206
24.2k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[4], u4_scale_u,
2207
24.2k
                                ai2_tmp, pi2_level);
2208
24.2k
                        }
2209
19.9k
                        else
2210
19.9k
                        {
2211
19.9k
                            ps_svc_lyr_dec->pf_pred_residual_recon_chroma_4x4(
2212
19.9k
                                pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2213
19.9k
                                u2_chroma_stride, u4_recwidth_cr);
2214
19.9k
                        }
2215
48.3k
                    }
2216
48.3k
                }
2217
12.0k
            }
2218
2219
12.0k
            pi2_y_coeff += MB_CHROM_SIZE;
2220
12.0k
            u2_chroma_csbp >>= 4;
2221
2222
12.0k
            {
2223
12.0k
                UWORD32 i;
2224
12.0k
                WORD16 ai2_tmp[16] = {0};
2225
60.4k
                for(i = 0; i < 4; i++)
2226
48.3k
                {
2227
48.3k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
2228
48.3k
                    UWORD8 *pu1_pred_sblk = pu1_rec_u + 1 +
2229
48.3k
                                            ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2230
48.3k
                                            (i >> 1) * (u4_recwidth_cr << 2);
2231
48.3k
                    WORD16 *pi2_out = pi2_chroma_res_ptr + 1 +
2232
48.3k
                                      ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR) +
2233
48.3k
                                      (i >> 1) * (u2_chroma_stride << 2);
2234
48.3k
                    PROFILE_DISABLE_IQ_IT_RECON()
2235
48.3k
                    {
2236
48.3k
                        if(CHECKBIT(u2_chroma_csbp, i))
2237
3.50k
                        {
2238
3.50k
                            ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4(
2239
3.50k
                                pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2240
3.50k
                                u2_chroma_stride, u4_recwidth_cr,
2241
3.50k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
2242
3.50k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
2243
3.50k
                                ai2_tmp, pi2_level);
2244
3.50k
                        }
2245
44.8k
                        else if(pi2_level[0] != 0)
2246
21.8k
                        {
2247
21.8k
                            ps_svc_lyr_dec->pf_iquant_itrans_residual_recon_chroma_4x4_dc(
2248
21.8k
                                pi2_level, pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2249
21.8k
                                u2_chroma_stride, u4_recwidth_cr,
2250
21.8k
                                gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
2251
21.8k
                                (UWORD16 *) ps_dec->s_high_profile.i2_scalinglist4x4[5], u4_scale_v,
2252
21.8k
                                ai2_tmp, pi2_level);
2253
21.8k
                        }
2254
23.0k
                        else
2255
23.0k
                        {
2256
23.0k
                            ps_svc_lyr_dec->pf_pred_residual_recon_chroma_4x4(
2257
23.0k
                                pu1_pred_sblk, pi2_out, pu1_pred_sblk, u4_recwidth_cr,
2258
23.0k
                                u2_chroma_stride, u4_recwidth_cr);
2259
23.0k
                        }
2260
48.3k
                    }
2261
48.3k
                }
2262
12.0k
            }
2263
12.0k
        }
2264
138k
        else
2265
138k
        {
2266
            /* Cr*/
2267
138k
            {
2268
138k
                UWORD8 *pu1_pred_sblk = pu1_rec_u;
2269
138k
                WORD16 *pi2_out = pi2_chroma_res_ptr;
2270
2271
138k
                ps_svc_lyr_dec->pf_pred_residual_recon_chroma_8x8(pu1_pred_sblk, pi2_out,
2272
138k
                                                                  pu1_pred_sblk, u4_recwidth_cr,
2273
138k
                                                                  u2_chroma_stride, u4_recwidth_cr);
2274
138k
            }
2275
2276
            /* Cb*/
2277
138k
            {
2278
138k
                UWORD8 *pu1_pred_sblk = pu1_rec_u + 1;
2279
138k
                WORD16 *pi2_out = pi2_chroma_res_ptr + 1;
2280
138k
                ps_svc_lyr_dec->pf_pred_residual_recon_chroma_8x8(pu1_pred_sblk, pi2_out,
2281
138k
                                                                  pu1_pred_sblk, u4_recwidth_cr,
2282
138k
                                                                  u2_chroma_stride, u4_recwidth_cr);
2283
138k
            }
2284
138k
        }
2285
150k
    }
2286
150k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb =
2287
150k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_frm_start + ps_cur_mb_info->u2_mbx +
2288
150k
        (ps_svc_lyr_dec->u2_inter_lyr_mb_prms_stride * (ps_cur_mb_info->u2_mby));
2289
150k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_mb_mode =
2290
150k
        u1_inference_mode ? SVC_IBL_MB : SVC_INTER_MB;
2291
150k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->i1_tx_size = ps_cur_mb_info->u1_tran_form8x8;
2292
150k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u2_luma_nnz = ps_cur_mb_info->u2_luma_csbp;
2293
150k
    ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz =
2294
150k
        (UWORD8) ps_cur_mb_info->u2_chroma_csbp;
2295
150k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 1))
2296
7.20k
    {
2297
        /* Four bits for Cb in DC only cbp */
2298
7.20k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0x0F;
2299
7.20k
    }
2300
150k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 2))
2301
7.31k
    {
2302
        /* Four bits for Cr in DC only cbp */
2303
7.31k
        ps_svc_lyr_dec->ps_inter_lyr_mb_prms_cur_mb->u1_chroma_nnz |= 0xF0;
2304
7.31k
    }
2305
150k
    return (0);
2306
150k
}