xref: /aosp_15_r20/external/libavc/decoder/svc/isvcd_ii_pred.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker /**
21*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
22*495ae853SAndroid Build Coastguard Worker  * @file
23*495ae853SAndroid Build Coastguard Worker  *  isvcd_ii_pred.c
24*495ae853SAndroid Build Coastguard Worker  *
25*495ae853SAndroid Build Coastguard Worker  * @brief
26*495ae853SAndroid Build Coastguard Worker  *  Contains routines that resample for SVC resampling
27*495ae853SAndroid Build Coastguard Worker  *
28*495ae853SAndroid Build Coastguard Worker  * @author
29*495ae853SAndroid Build Coastguard Worker  *  Kishore
30*495ae853SAndroid Build Coastguard Worker  *
31*495ae853SAndroid Build Coastguard Worker  * @par List of Functions:
32*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ii_pred_res_init()
33*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ii_get_ref_mb_mode()
34*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ii_get_ref_projections()
35*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ii_pred_compute_flags_mb()
36*495ae853SAndroid Build Coastguard Worker  *  - isvcd_ii_pred_mb()
37*495ae853SAndroid Build Coastguard Worker  *
38*495ae853SAndroid Build Coastguard Worker  * @remarks
39*495ae853SAndroid Build Coastguard Worker  *  None
40*495ae853SAndroid Build Coastguard Worker  *
41*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
42*495ae853SAndroid Build Coastguard Worker  */
43*495ae853SAndroid Build Coastguard Worker 
44*495ae853SAndroid Build Coastguard Worker #include <assert.h>
45*495ae853SAndroid Build Coastguard Worker #include <string.h>
46*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
53*495ae853SAndroid Build Coastguard Worker #include "isvcd_structs.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
69*495ae853SAndroid Build Coastguard Worker #include "isvcd_mode_mv_resamp.h"
70*495ae853SAndroid Build Coastguard Worker #include "isvcd_ii_pred.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
72*495ae853SAndroid Build Coastguard Worker 
73*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
74*495ae853SAndroid Build Coastguard Worker /*                                                                           */
75*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_ii_pred_res_init                                    */
76*495ae853SAndroid Build Coastguard Worker /*                                                                           */
77*495ae853SAndroid Build Coastguard Worker /*  Description   : this function initialises the resolution level params    */
78*495ae853SAndroid Build Coastguard Worker /*                  into the context structure                               */
79*495ae853SAndroid Build Coastguard Worker /*                                                                           */
80*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_ii_pred_ctxt: Intra inter pred  handle                */
81*495ae853SAndroid Build Coastguard Worker /*                  pi2_ref_loc_x             : pointer to buffer having the */
82*495ae853SAndroid Build Coastguard Worker /*                                              projected locations horz     */
83*495ae853SAndroid Build Coastguard Worker /*                  pi2_ref_loc_y             : pointer to buffer having the */
84*495ae853SAndroid Build Coastguard Worker /*                                              projected location vertical  */
85*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
86*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
87*495ae853SAndroid Build Coastguard Worker /*                                                                           */
88*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
89*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
90*495ae853SAndroid Build Coastguard Worker /*                                                                           */
91*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
92*495ae853SAndroid Build Coastguard Worker /*                                                                           */
93*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
94*495ae853SAndroid Build Coastguard Worker /*                                                                           */
95*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
96*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
97*495ae853SAndroid Build Coastguard Worker /*                                                                           */
98*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ii_pred_res_init(void * pv_svc_dec)99*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ii_pred_res_init(void *pv_svc_dec)
100*495ae853SAndroid Build Coastguard Worker {
101*495ae853SAndroid Build Coastguard Worker     /* local vaiables */
102*495ae853SAndroid Build Coastguard Worker     intra_inter_pred_ctxt_t *ps_ii_pred_ctxt;
103*495ae853SAndroid Build Coastguard Worker     mode_motion_ctxt_t *ps_ctxt;
104*495ae853SAndroid Build Coastguard Worker     mode_motion_lyr_ctxt *ps_lyr_mem;
105*495ae853SAndroid Build Coastguard Worker     WORD32 i4_base_res_flag;
106*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
107*495ae853SAndroid Build Coastguard Worker 
108*495ae853SAndroid Build Coastguard Worker     res_prms_t *ps_res_prms = &ps_svc_lyr_dec->s_res_prms;
109*495ae853SAndroid Build Coastguard Worker     ps_ii_pred_ctxt = (intra_inter_pred_ctxt_t *) ps_svc_lyr_dec->pv_ii_pred_ctxt;
110*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (mode_motion_ctxt_t *) ps_svc_lyr_dec->pv_mode_mv_sample_ctxt;
111*495ae853SAndroid Build Coastguard Worker     i4_base_res_flag = ps_svc_lyr_dec->u1_base_res_flag;
112*495ae853SAndroid Build Coastguard Worker 
113*495ae853SAndroid Build Coastguard Worker     if((0 != ps_svc_lyr_dec->u1_layer_id) && (SVCD_FALSE == i4_base_res_flag))
114*495ae853SAndroid Build Coastguard Worker     {
115*495ae853SAndroid Build Coastguard Worker         /* if not first resolution layer */
116*495ae853SAndroid Build Coastguard Worker         ps_ii_pred_ctxt->i4_ref_res_lyr_wd = ps_ii_pred_ctxt->i4_cur_res_lyr_wd;
117*495ae853SAndroid Build Coastguard Worker         ps_ii_pred_ctxt->i4_ref_res_lyr_ht = ps_ii_pred_ctxt->i4_cur_res_lyr_ht;
118*495ae853SAndroid Build Coastguard Worker     }
119*495ae853SAndroid Build Coastguard Worker 
120*495ae853SAndroid Build Coastguard Worker     if ((ps_ctxt->i4_res_id >= 0) && (ps_ctxt->i4_res_id <= 2))
121*495ae853SAndroid Build Coastguard Worker     {
122*495ae853SAndroid Build Coastguard Worker         ps_lyr_mem = &ps_ctxt->as_res_lyr_mem[ps_ctxt->i4_res_id];
123*495ae853SAndroid Build Coastguard Worker 
124*495ae853SAndroid Build Coastguard Worker         ps_ii_pred_ctxt->pi2_ref_loc_x = ps_lyr_mem->pi2_ref_loc_x;
125*495ae853SAndroid Build Coastguard Worker         ps_ii_pred_ctxt->pi2_ref_loc_y = ps_lyr_mem->pi2_ref_loc_y;
126*495ae853SAndroid Build Coastguard Worker     }
127*495ae853SAndroid Build Coastguard Worker     /* Store the dimensions */
128*495ae853SAndroid Build Coastguard Worker     ps_ii_pred_ctxt->i4_cur_res_lyr_wd = ps_res_prms->i4_res_width;
129*495ae853SAndroid Build Coastguard Worker     ps_ii_pred_ctxt->i4_cur_res_lyr_ht = ps_res_prms->i4_res_height;
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker     return (OK);
132*495ae853SAndroid Build Coastguard Worker }
133*495ae853SAndroid Build Coastguard Worker 
134*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
135*495ae853SAndroid Build Coastguard Worker /*                                                                           */
136*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_ii_get_ref_mb_mode                                  */
137*495ae853SAndroid Build Coastguard Worker /*                                                                           */
138*495ae853SAndroid Build Coastguard Worker /*  Description   : This function is used to find the mb type of the         */
139*495ae853SAndroid Build Coastguard Worker /*                  corresponding MB in the reference layer is INTER or      */
140*495ae853SAndroid Build Coastguard Worker /*                  INTRA                                                    */
141*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pu1_ref_mb_modes : ref mb modes buffer pointer           */
142*495ae853SAndroid Build Coastguard Worker /*                  i4_ref_mode_stride : mb mode buffer stride               */
143*495ae853SAndroid Build Coastguard Worker /*                  i4_x_ref : reference location X                          */
144*495ae853SAndroid Build Coastguard Worker /*                  i4_y_ref : reference location Y                          */
145*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
146*495ae853SAndroid Build Coastguard Worker /*  Processing    : it derives the byte corresponding to reference MB and    */
147*495ae853SAndroid Build Coastguard Worker /*                  and gets the mb type                                     */
148*495ae853SAndroid Build Coastguard Worker /*  Outputs       : none                                                     */
149*495ae853SAndroid Build Coastguard Worker /*  Returns       : SVCD_TRUE if INTRA MB else SVCD_FALSE                    */
150*495ae853SAndroid Build Coastguard Worker /*                                                                           */
151*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
152*495ae853SAndroid Build Coastguard Worker /*                                                                           */
153*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
154*495ae853SAndroid Build Coastguard Worker /*                                                                           */
155*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
156*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
157*495ae853SAndroid Build Coastguard Worker /*                                                                           */
158*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ii_get_ref_mb_mode(WORD8 * pi1_ref_mb_modes,WORD32 i4_ref_mode_stride,WORD32 i4_ref_mode_size,WORD32 i4_x_ref,WORD32 i4_y_ref)159*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ii_get_ref_mb_mode(WORD8 *pi1_ref_mb_modes, WORD32 i4_ref_mode_stride,
160*495ae853SAndroid Build Coastguard Worker                                 WORD32 i4_ref_mode_size, WORD32 i4_x_ref, WORD32 i4_y_ref)
161*495ae853SAndroid Build Coastguard Worker {
162*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
163*495ae853SAndroid Build Coastguard Worker     inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
164*495ae853SAndroid Build Coastguard Worker     WORD8 i1_mb_mode;
165*495ae853SAndroid Build Coastguard Worker 
166*495ae853SAndroid Build Coastguard Worker     i4_mb_x = (i4_x_ref >> MB_WIDTH_SHIFT);
167*495ae853SAndroid Build Coastguard Worker     i4_mb_y = (i4_y_ref >> MB_HEIGHT_SHIFT);
168*495ae853SAndroid Build Coastguard Worker 
169*495ae853SAndroid Build Coastguard Worker     /* get the location of the byte which has the current mb mode */
170*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes += (i4_mb_y * i4_ref_mode_stride * i4_ref_mode_size);
171*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_modes += (i4_mb_x * i4_ref_mode_size);
172*495ae853SAndroid Build Coastguard Worker     ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes;
173*495ae853SAndroid Build Coastguard Worker     i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
174*495ae853SAndroid Build Coastguard Worker 
175*495ae853SAndroid Build Coastguard Worker     if(i1_mb_mode <= SVC_INTER_MB)
176*495ae853SAndroid Build Coastguard Worker     {
177*495ae853SAndroid Build Coastguard Worker         /* INTER */
178*495ae853SAndroid Build Coastguard Worker         return (SVCD_FALSE);
179*495ae853SAndroid Build Coastguard Worker     }
180*495ae853SAndroid Build Coastguard Worker     else
181*495ae853SAndroid Build Coastguard Worker     {
182*495ae853SAndroid Build Coastguard Worker         /* INTRA */
183*495ae853SAndroid Build Coastguard Worker         return (SVCD_TRUE);
184*495ae853SAndroid Build Coastguard Worker     }
185*495ae853SAndroid Build Coastguard Worker }
186*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
187*495ae853SAndroid Build Coastguard Worker /*                                                                           */
188*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_ii_get_ref_projections                              */
189*495ae853SAndroid Build Coastguard Worker /*                                                                           */
190*495ae853SAndroid Build Coastguard Worker /*  Description   : this function projects the corners of current MB and     */
191*495ae853SAndroid Build Coastguard Worker /*                  finds out if any point is falling into an INTRA MB in    */
192*495ae853SAndroid Build Coastguard Worker /*                  reference layer. it also calculates the intersection     */
193*495ae853SAndroid Build Coastguard Worker /*                  point of MB boundaries in the projected region           */
194*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_ctxt : Intra Inter context pointer                    */
195*495ae853SAndroid Build Coastguard Worker /*                  ps_ii_mb_ctxt : Curretn MB context pointer               */
196*495ae853SAndroid Build Coastguard Worker /*                  ps_ref_mb_mode : reference MB mode buffer descriptor     */
197*495ae853SAndroid Build Coastguard Worker /*                  i4_mb_x : MB_X of current MB                             */
198*495ae853SAndroid Build Coastguard Worker /*                  i4_mb_y : MB_Y of current MB                             */
199*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
200*495ae853SAndroid Build Coastguard Worker /*  Processing    : it derives the intra status of the corners and calculates*/
201*495ae853SAndroid Build Coastguard Worker /*                  the intersection point                                   */
202*495ae853SAndroid Build Coastguard Worker /*  Outputs       : non                                                      */
203*495ae853SAndroid Build Coastguard Worker /*  Returns       : SVCD_TRUE or SVCD_FALSE                                  */
204*495ae853SAndroid Build Coastguard Worker /*                                                                           */
205*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
206*495ae853SAndroid Build Coastguard Worker /*                                                                           */
207*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
208*495ae853SAndroid Build Coastguard Worker /*                                                                           */
209*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
210*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
211*495ae853SAndroid Build Coastguard Worker /*                                                                           */
212*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ii_get_ref_projections(intra_inter_pred_ctxt_t * ps_ctxt,intra_inter_mb_t * ps_ii_mb_ctxt,mem_element_t * ps_ref_mb_mode,WORD32 i4_mb_x,WORD32 i4_mb_y)213*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ii_get_ref_projections(intra_inter_pred_ctxt_t *ps_ctxt,
214*495ae853SAndroid Build Coastguard Worker                                     intra_inter_mb_t *ps_ii_mb_ctxt, mem_element_t *ps_ref_mb_mode,
215*495ae853SAndroid Build Coastguard Worker                                     WORD32 i4_mb_x, WORD32 i4_mb_y)
216*495ae853SAndroid Build Coastguard Worker {
217*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_loc_x;
218*495ae853SAndroid Build Coastguard Worker     WORD16 *pi2_ref_loc_y;
219*495ae853SAndroid Build Coastguard Worker     WORD8 *pi1_ref_mb_mode;
220*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_mode_stride;
221*495ae853SAndroid Build Coastguard Worker     WORD32 i4_element_size;
222*495ae853SAndroid Build Coastguard Worker     WORD32 i4_ref_x, i4_ref_y;
223*495ae853SAndroid Build Coastguard Worker     WORD32 i4_frame_x, i4_frame_y;
224*495ae853SAndroid Build Coastguard Worker     WORD32 i4_flag;
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker     pi2_ref_loc_x = ps_ctxt->pi2_ref_loc_x;
227*495ae853SAndroid Build Coastguard Worker     pi2_ref_loc_y = ps_ctxt->pi2_ref_loc_y;
228*495ae853SAndroid Build Coastguard Worker 
229*495ae853SAndroid Build Coastguard Worker     pi1_ref_mb_mode = (WORD8 *) ps_ref_mb_mode->pv_buffer;
230*495ae853SAndroid Build Coastguard Worker     i4_ref_mode_stride = ps_ref_mb_mode->i4_num_element_stride;
231*495ae853SAndroid Build Coastguard Worker     i4_element_size = ps_ref_mb_mode->i4_element_size;
232*495ae853SAndroid Build Coastguard Worker 
233*495ae853SAndroid Build Coastguard Worker     /* get the current MB frame positions */
234*495ae853SAndroid Build Coastguard Worker     i4_frame_x = i4_mb_x << 4;
235*495ae853SAndroid Build Coastguard Worker     i4_frame_y = i4_mb_y << 4;
236*495ae853SAndroid Build Coastguard Worker 
237*495ae853SAndroid Build Coastguard Worker     /* reset the flag */
238*495ae853SAndroid Build Coastguard Worker     i4_flag = SVCD_FALSE;
239*495ae853SAndroid Build Coastguard Worker 
240*495ae853SAndroid Build Coastguard Worker     /* project the (0,0) of current MB and get the ref MB mode */
241*495ae853SAndroid Build Coastguard Worker     i4_ref_x = pi2_ref_loc_x[i4_frame_x];
242*495ae853SAndroid Build Coastguard Worker     i4_ref_y = pi2_ref_loc_y[i4_frame_y];
243*495ae853SAndroid Build Coastguard Worker 
244*495ae853SAndroid Build Coastguard Worker     if((i4_ref_x < ps_ctxt->i4_ref_res_lyr_wd) && (i4_ref_y < ps_ctxt->i4_ref_res_lyr_ht))
245*495ae853SAndroid Build Coastguard Worker     {
246*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_top_left_intra_flag = isvcd_ii_get_ref_mb_mode(
247*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_mode, i4_ref_mode_stride, i4_element_size, i4_ref_x, i4_ref_y);
248*495ae853SAndroid Build Coastguard Worker     }
249*495ae853SAndroid Build Coastguard Worker     else
250*495ae853SAndroid Build Coastguard Worker     {
251*495ae853SAndroid Build Coastguard Worker         /* If projection is outside the picture boundary */
252*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_top_left_intra_flag = SVCD_FALSE;
253*495ae853SAndroid Build Coastguard Worker     }
254*495ae853SAndroid Build Coastguard Worker     /* project the (15,0) of current MB and get the ref MB mode */
255*495ae853SAndroid Build Coastguard Worker     i4_ref_x = pi2_ref_loc_x[i4_frame_x + 15];
256*495ae853SAndroid Build Coastguard Worker     i4_ref_y = pi2_ref_loc_y[i4_frame_y];
257*495ae853SAndroid Build Coastguard Worker 
258*495ae853SAndroid Build Coastguard Worker     if((i4_ref_x < ps_ctxt->i4_ref_res_lyr_wd) && (i4_ref_y < ps_ctxt->i4_ref_res_lyr_ht))
259*495ae853SAndroid Build Coastguard Worker     {
260*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_top_rt_intra_flag = isvcd_ii_get_ref_mb_mode(
261*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_mode, i4_ref_mode_stride, i4_element_size, i4_ref_x, i4_ref_y);
262*495ae853SAndroid Build Coastguard Worker     }
263*495ae853SAndroid Build Coastguard Worker     else
264*495ae853SAndroid Build Coastguard Worker     {
265*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_top_rt_intra_flag = SVCD_FALSE;
266*495ae853SAndroid Build Coastguard Worker     }
267*495ae853SAndroid Build Coastguard Worker 
268*495ae853SAndroid Build Coastguard Worker     /* project the (0,15) of current MB and get the ref MB mode */
269*495ae853SAndroid Build Coastguard Worker     i4_ref_x = pi2_ref_loc_x[i4_frame_x];
270*495ae853SAndroid Build Coastguard Worker     i4_ref_y = pi2_ref_loc_y[i4_frame_y + 15];
271*495ae853SAndroid Build Coastguard Worker 
272*495ae853SAndroid Build Coastguard Worker     if((i4_ref_x < ps_ctxt->i4_ref_res_lyr_wd) && (i4_ref_y < ps_ctxt->i4_ref_res_lyr_ht))
273*495ae853SAndroid Build Coastguard Worker     {
274*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_bot_left_intra_flag = isvcd_ii_get_ref_mb_mode(
275*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_mode, i4_ref_mode_stride, i4_element_size, i4_ref_x, i4_ref_y);
276*495ae853SAndroid Build Coastguard Worker     }
277*495ae853SAndroid Build Coastguard Worker     else
278*495ae853SAndroid Build Coastguard Worker     {
279*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_bot_left_intra_flag = SVCD_FALSE;
280*495ae853SAndroid Build Coastguard Worker     }
281*495ae853SAndroid Build Coastguard Worker 
282*495ae853SAndroid Build Coastguard Worker     /* project the (15,15) of current MB and get the ref MB mode */
283*495ae853SAndroid Build Coastguard Worker     i4_ref_x = pi2_ref_loc_x[i4_frame_x + 15];
284*495ae853SAndroid Build Coastguard Worker     i4_ref_y = pi2_ref_loc_y[i4_frame_y + 15];
285*495ae853SAndroid Build Coastguard Worker 
286*495ae853SAndroid Build Coastguard Worker     if((i4_ref_x < ps_ctxt->i4_ref_res_lyr_wd) && (i4_ref_y < ps_ctxt->i4_ref_res_lyr_ht))
287*495ae853SAndroid Build Coastguard Worker     {
288*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_bot_rt_intra_flag = isvcd_ii_get_ref_mb_mode(
289*495ae853SAndroid Build Coastguard Worker             pi1_ref_mb_mode, i4_ref_mode_stride, i4_element_size, i4_ref_x, i4_ref_y);
290*495ae853SAndroid Build Coastguard Worker     }
291*495ae853SAndroid Build Coastguard Worker     else
292*495ae853SAndroid Build Coastguard Worker     {
293*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_bot_rt_intra_flag = SVCD_FALSE;
294*495ae853SAndroid Build Coastguard Worker     }
295*495ae853SAndroid Build Coastguard Worker 
296*495ae853SAndroid Build Coastguard Worker     /* if any of the 4 cormers are falling into intra region
297*495ae853SAndroid Build Coastguard Worker       set the INTRA INTER Flag */
298*495ae853SAndroid Build Coastguard Worker     if((SVCD_TRUE == ps_ii_mb_ctxt->u1_top_left_intra_flag) ||
299*495ae853SAndroid Build Coastguard Worker        (SVCD_TRUE == ps_ii_mb_ctxt->u1_top_rt_intra_flag) ||
300*495ae853SAndroid Build Coastguard Worker        (SVCD_TRUE == ps_ii_mb_ctxt->u1_bot_left_intra_flag) ||
301*495ae853SAndroid Build Coastguard Worker        (SVCD_TRUE == ps_ii_mb_ctxt->u1_bot_rt_intra_flag))
302*495ae853SAndroid Build Coastguard Worker     {
303*495ae853SAndroid Build Coastguard Worker         i4_flag = SVCD_TRUE;
304*495ae853SAndroid Build Coastguard Worker     }
305*495ae853SAndroid Build Coastguard Worker 
306*495ae853SAndroid Build Coastguard Worker     /* derive the intersection point of MB boundaries */
307*495ae853SAndroid Build Coastguard Worker     if(SVCD_TRUE == i4_flag)
308*495ae853SAndroid Build Coastguard Worker     {
309*495ae853SAndroid Build Coastguard Worker         WORD32 i4_intr_x, i4_intr_y;
310*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ref_mb_init_x, i4_ref_mb_init_y;
311*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ctr;
312*495ae853SAndroid Build Coastguard Worker 
313*495ae853SAndroid Build Coastguard Worker         /* set the variables to initial values */
314*495ae853SAndroid Build Coastguard Worker         i4_intr_x = 0;
315*495ae853SAndroid Build Coastguard Worker         i4_intr_y = 0;
316*495ae853SAndroid Build Coastguard Worker         i4_ref_mb_init_x = pi2_ref_loc_x[i4_frame_x] >> MB_WIDTH_SHIFT;
317*495ae853SAndroid Build Coastguard Worker         i4_ref_mb_init_y = pi2_ref_loc_y[i4_frame_y] >> MB_HEIGHT_SHIFT;
318*495ae853SAndroid Build Coastguard Worker 
319*495ae853SAndroid Build Coastguard Worker         /* loop until an Mb boundary is found in horizontal direction */
320*495ae853SAndroid Build Coastguard Worker         for(i4_ctr = 0; i4_ctr < MB_WIDTH; i4_ctr++)
321*495ae853SAndroid Build Coastguard Worker         {
322*495ae853SAndroid Build Coastguard Worker             i4_ref_x = pi2_ref_loc_x[i4_frame_x + i4_ctr];
323*495ae853SAndroid Build Coastguard Worker             i4_ref_x >>= MB_WIDTH_SHIFT;
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker             /* check if the locations are falling into same MB */
326*495ae853SAndroid Build Coastguard Worker             if(i4_ref_x != i4_ref_mb_init_x)
327*495ae853SAndroid Build Coastguard Worker             {
328*495ae853SAndroid Build Coastguard Worker                 break;
329*495ae853SAndroid Build Coastguard Worker             }
330*495ae853SAndroid Build Coastguard Worker             /* increment the position */
331*495ae853SAndroid Build Coastguard Worker             i4_intr_x++;
332*495ae853SAndroid Build Coastguard Worker         }
333*495ae853SAndroid Build Coastguard Worker 
334*495ae853SAndroid Build Coastguard Worker         /* loop until an Mb boundary is found in vertical direction */
335*495ae853SAndroid Build Coastguard Worker         for(i4_ctr = 0; i4_ctr < MB_HEIGHT; i4_ctr++)
336*495ae853SAndroid Build Coastguard Worker         {
337*495ae853SAndroid Build Coastguard Worker             i4_ref_y = pi2_ref_loc_y[i4_frame_y + i4_ctr];
338*495ae853SAndroid Build Coastguard Worker             i4_ref_y >>= MB_HEIGHT_SHIFT;
339*495ae853SAndroid Build Coastguard Worker 
340*495ae853SAndroid Build Coastguard Worker             /* check if the locations are falling into same MB */
341*495ae853SAndroid Build Coastguard Worker             if(i4_ref_y != i4_ref_mb_init_y)
342*495ae853SAndroid Build Coastguard Worker             {
343*495ae853SAndroid Build Coastguard Worker                 break;
344*495ae853SAndroid Build Coastguard Worker             }
345*495ae853SAndroid Build Coastguard Worker             /* increment the position */
346*495ae853SAndroid Build Coastguard Worker             i4_intr_y++;
347*495ae853SAndroid Build Coastguard Worker         }
348*495ae853SAndroid Build Coastguard Worker         /* store the intersection points */
349*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_intersection_x = i4_intr_x;
350*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_intersection_y = i4_intr_y;
351*495ae853SAndroid Build Coastguard Worker     }
352*495ae853SAndroid Build Coastguard Worker     else
353*495ae853SAndroid Build Coastguard Worker     {
354*495ae853SAndroid Build Coastguard Worker         /* set to default value */
355*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_intersection_x = 0;
356*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt->u1_intersection_y = 0;
357*495ae853SAndroid Build Coastguard Worker     }
358*495ae853SAndroid Build Coastguard Worker 
359*495ae853SAndroid Build Coastguard Worker     return (i4_flag);
360*495ae853SAndroid Build Coastguard Worker }
361*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
362*495ae853SAndroid Build Coastguard Worker /*                                                                           */
363*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_ii_pred_compute_flags_mb                            */
364*495ae853SAndroid Build Coastguard Worker /*                                                                           */
365*495ae853SAndroid Build Coastguard Worker /*  Description   : this function checks all the criteria for an MB to       */
366*495ae853SAndroid Build Coastguard Worker /*                  under go Inter-Intra prediction  and stores the MB mode  */
367*495ae853SAndroid Build Coastguard Worker /*                   as INTER_INTRA for appropriate MBs                      */
368*495ae853SAndroid Build Coastguard Worker /*  Inputs        : refer to comments below                                  */
369*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
370*495ae853SAndroid Build Coastguard Worker /*  Processing    : it checks the criteria for anMB to undergo Inter-Intra   */
371*495ae853SAndroid Build Coastguard Worker /*                  pred process and updates the MB mode                     */
372*495ae853SAndroid Build Coastguard Worker /*  Outputs       : MB mode set for each MB with INTRA-INTER status          */
373*495ae853SAndroid Build Coastguard Worker /*  Returns       : SVCD_EOK or SVCD_EFAIL                                   */
374*495ae853SAndroid Build Coastguard Worker /*                                                                           */
375*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
376*495ae853SAndroid Build Coastguard Worker /*                                                                           */
377*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
378*495ae853SAndroid Build Coastguard Worker /*                                                                           */
379*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
380*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
381*495ae853SAndroid Build Coastguard Worker /*                                                                           */
382*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ii_pred_compute_flags_mb(void * pv_ii_pred_ctxt,mem_element_t * ps_ref_mb_mode,mb_coord_t * ps_coord,void * pv_mb_prms,void * pv_svc_mb_prms,UWORD8 * pu1_ii_mb_mode)383*495ae853SAndroid Build Coastguard Worker WORD32 isvcd_ii_pred_compute_flags_mb(void *pv_ii_pred_ctxt, mem_element_t *ps_ref_mb_mode,
384*495ae853SAndroid Build Coastguard Worker                                       mb_coord_t *ps_coord, void *pv_mb_prms, void *pv_svc_mb_prms,
385*495ae853SAndroid Build Coastguard Worker                                       UWORD8 *pu1_ii_mb_mode)
386*495ae853SAndroid Build Coastguard Worker {
387*495ae853SAndroid Build Coastguard Worker     intra_inter_pred_ctxt_t *ps_ctxt;
388*495ae853SAndroid Build Coastguard Worker     WORD32 i4_mb_x, i4_mb_y;
389*495ae853SAndroid Build Coastguard Worker     dec_svc_mb_info_t *ps_svc_mb_prms;
390*495ae853SAndroid Build Coastguard Worker     UNUSED(pv_mb_prms);
391*495ae853SAndroid Build Coastguard Worker 
392*495ae853SAndroid Build Coastguard Worker     if((NULL == pv_ii_pred_ctxt) || (NULL == ps_ref_mb_mode) || (NULL == ps_coord) ||
393*495ae853SAndroid Build Coastguard Worker        (NULL == pu1_ii_mb_mode))
394*495ae853SAndroid Build Coastguard Worker     {
395*495ae853SAndroid Build Coastguard Worker         return NOT_OK;
396*495ae853SAndroid Build Coastguard Worker     }
397*495ae853SAndroid Build Coastguard Worker 
398*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_inter_pred_ctxt_t *) pv_ii_pred_ctxt;
399*495ae853SAndroid Build Coastguard Worker     ps_svc_mb_prms = (dec_svc_mb_info_t *) pv_svc_mb_prms;
400*495ae853SAndroid Build Coastguard Worker 
401*495ae853SAndroid Build Coastguard Worker     /* get mb co-ordinates */
402*495ae853SAndroid Build Coastguard Worker     i4_mb_x = ps_coord->u2_mb_x;
403*495ae853SAndroid Build Coastguard Worker     i4_mb_y = ps_coord->u2_mb_y;
404*495ae853SAndroid Build Coastguard Worker 
405*495ae853SAndroid Build Coastguard Worker     {
406*495ae853SAndroid Build Coastguard Worker         intra_inter_mb_t *ps_ii_mb_ctxt;
407*495ae853SAndroid Build Coastguard Worker         WORD32 i4_ii_flag;
408*495ae853SAndroid Build Coastguard Worker 
409*495ae853SAndroid Build Coastguard Worker         /* get the current MB strcuture pointer */
410*495ae853SAndroid Build Coastguard Worker         ps_ii_mb_ctxt = &ps_ctxt->s_intra_inter_mb_prms;
411*495ae853SAndroid Build Coastguard Worker 
412*495ae853SAndroid Build Coastguard Worker         /* reset the Intra Inter qualified flag for current MB */
413*495ae853SAndroid Build Coastguard Worker         i4_ii_flag = SVCD_FALSE;
414*495ae853SAndroid Build Coastguard Worker 
415*495ae853SAndroid Build Coastguard Worker         /* check for base mode flag and Inter MB status */
416*495ae853SAndroid Build Coastguard Worker         if(1 == ps_svc_mb_prms->u1_base_mode_flag)
417*495ae853SAndroid Build Coastguard Worker         {
418*495ae853SAndroid Build Coastguard Worker             /* call the function which calculates the projections
419*495ae853SAndroid Build Coastguard Worker                and returns whether current MB has to under go
420*495ae853SAndroid Build Coastguard Worker                Inter Intra Prediction */
421*495ae853SAndroid Build Coastguard Worker             i4_ii_flag = isvcd_ii_get_ref_projections(ps_ctxt, ps_ii_mb_ctxt, ps_ref_mb_mode,
422*495ae853SAndroid Build Coastguard Worker                                                       i4_mb_x, i4_mb_y);
423*495ae853SAndroid Build Coastguard Worker         }
424*495ae853SAndroid Build Coastguard Worker 
425*495ae853SAndroid Build Coastguard Worker         /* If the current MB requires Intra Inter prediction */
426*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == i4_ii_flag)
427*495ae853SAndroid Build Coastguard Worker         {
428*495ae853SAndroid Build Coastguard Worker             /* set the mb mode */
429*495ae853SAndroid Build Coastguard Worker             *pu1_ii_mb_mode = SVC_INTRA_INTER_MB;
430*495ae853SAndroid Build Coastguard Worker         }
431*495ae853SAndroid Build Coastguard Worker         else
432*495ae853SAndroid Build Coastguard Worker         {
433*495ae853SAndroid Build Coastguard Worker             /* set all MB params to default values */
434*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_bot_left_intra_flag = SVCD_FALSE;
435*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_bot_rt_intra_flag = SVCD_FALSE;
436*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_top_left_intra_flag = SVCD_FALSE;
437*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_top_rt_intra_flag = SVCD_FALSE;
438*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_intersection_x = 0;
439*495ae853SAndroid Build Coastguard Worker             ps_ii_mb_ctxt->u1_intersection_y = 0;
440*495ae853SAndroid Build Coastguard Worker 
441*495ae853SAndroid Build Coastguard Worker             /* set the mb mode to 0 (which has no interpretation) */
442*495ae853SAndroid Build Coastguard Worker             *pu1_ii_mb_mode = 0;
443*495ae853SAndroid Build Coastguard Worker         }
444*495ae853SAndroid Build Coastguard Worker     }
445*495ae853SAndroid Build Coastguard Worker     return (OK);
446*495ae853SAndroid Build Coastguard Worker }
447*495ae853SAndroid Build Coastguard Worker 
448*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
449*495ae853SAndroid Build Coastguard Worker /*                                                                           */
450*495ae853SAndroid Build Coastguard Worker /*  Function Name : isvcd_ii_pred_mb                                          */
451*495ae853SAndroid Build Coastguard Worker /*                                                                           */
452*495ae853SAndroid Build Coastguard Worker /*  Description   : This function performs the Intra-Inter Preduction of the */
453*495ae853SAndroid Build Coastguard Worker /*                  given MB                                                 */
454*495ae853SAndroid Build Coastguard Worker /*                                                                           */
455*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_mb_ctxt : Intra Inter mb context strcuture            */
456*495ae853SAndroid Build Coastguard Worker /*                  ps_mb_buf : current MB buffers strcuture pointer         */
457*495ae853SAndroid Build Coastguard Worker /*  Globals       : none                                                     */
458*495ae853SAndroid Build Coastguard Worker /*  Processing    : it processes all partitions based on the Intra flag      */
459*495ae853SAndroid Build Coastguard Worker /*                                                                           */
460*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Intra Inter Predecited and reconstructed MB              */
461*495ae853SAndroid Build Coastguard Worker /*  Returns       : none                                                     */
462*495ae853SAndroid Build Coastguard Worker /*                                                                           */
463*495ae853SAndroid Build Coastguard Worker /*  Issues        : none                                                     */
464*495ae853SAndroid Build Coastguard Worker /*                                                                           */
465*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
466*495ae853SAndroid Build Coastguard Worker /*                                                                           */
467*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
468*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Vijay                creation                        */
469*495ae853SAndroid Build Coastguard Worker /*                                                                           */
470*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
isvcd_ii_pred_mb(void * pv_svc_dec,dec_mb_info_t * ps_cur_mb_info)471*495ae853SAndroid Build Coastguard Worker void isvcd_ii_pred_mb(void *pv_svc_dec, dec_mb_info_t *ps_cur_mb_info)
472*495ae853SAndroid Build Coastguard Worker {
473*495ae853SAndroid Build Coastguard Worker     intra_inter_mb_t *ps_mb_ctxt;
474*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_rec_y, *pu1_rec_uv;
475*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_recon_luma;
476*495ae853SAndroid Build Coastguard Worker     WORD32 i4_recon_luma_stride;
477*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_recon_chroma;
478*495ae853SAndroid Build Coastguard Worker     WORD32 i4_recon_chroma_stride;
479*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_pred_luma;
480*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_pred_chroma;
481*495ae853SAndroid Build Coastguard Worker     WORD32 i4_pred_luma_stride;
482*495ae853SAndroid Build Coastguard Worker     WORD32 i4_pred_chroma_stride;
483*495ae853SAndroid Build Coastguard Worker     WORD32 i4_intr_x, i4_intr_y;
484*495ae853SAndroid Build Coastguard Worker     intra_inter_pred_ctxt_t *ps_ctxt;
485*495ae853SAndroid Build Coastguard Worker     pic_buffer_t *ps_frame_buf;
486*495ae853SAndroid Build Coastguard Worker     svc_dec_lyr_struct_t *ps_svc_lyr_dec = (svc_dec_lyr_struct_t *) pv_svc_dec;
487*495ae853SAndroid Build Coastguard Worker     dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec;
488*495ae853SAndroid Build Coastguard Worker 
489*495ae853SAndroid Build Coastguard Worker     ps_ctxt = (intra_inter_pred_ctxt_t *) ps_svc_lyr_dec->pv_ii_pred_ctxt;
490*495ae853SAndroid Build Coastguard Worker     ps_mb_ctxt = &ps_ctxt->s_intra_inter_mb_prms;
491*495ae853SAndroid Build Coastguard Worker     ps_frame_buf = ps_dec->ps_cur_pic;
492*495ae853SAndroid Build Coastguard Worker     i4_recon_luma_stride = ps_dec->u2_frm_wd_y;
493*495ae853SAndroid Build Coastguard Worker     i4_recon_chroma_stride = ps_dec->u2_frm_wd_uv;
494*495ae853SAndroid Build Coastguard Worker 
495*495ae853SAndroid Build Coastguard Worker     /* derive the intersection point */
496*495ae853SAndroid Build Coastguard Worker     i4_intr_x = ps_mb_ctxt->u1_intersection_x;
497*495ae853SAndroid Build Coastguard Worker     i4_intr_y = ps_mb_ctxt->u1_intersection_y;
498*495ae853SAndroid Build Coastguard Worker 
499*495ae853SAndroid Build Coastguard Worker     pu1_rec_y = ps_frame_buf->pu1_buf1 + (ps_cur_mb_info->u2_mbx << 4) +
500*495ae853SAndroid Build Coastguard Worker                 (i4_recon_luma_stride * (ps_cur_mb_info->u2_mby << 4));
501*495ae853SAndroid Build Coastguard Worker 
502*495ae853SAndroid Build Coastguard Worker     pu1_rec_uv = ps_frame_buf->pu1_buf2 + (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR +
503*495ae853SAndroid Build Coastguard Worker                  (i4_recon_chroma_stride * (ps_cur_mb_info->u2_mby << 3));
504*495ae853SAndroid Build Coastguard Worker 
505*495ae853SAndroid Build Coastguard Worker     pu1_pred_luma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma;
506*495ae853SAndroid Build Coastguard Worker     pu1_pred_chroma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma;
507*495ae853SAndroid Build Coastguard Worker     i4_pred_luma_stride = MB_SIZE;
508*495ae853SAndroid Build Coastguard Worker     i4_pred_chroma_stride = MB_SIZE;
509*495ae853SAndroid Build Coastguard Worker 
510*495ae853SAndroid Build Coastguard Worker     /* get the recon and residual buffer pointer */
511*495ae853SAndroid Build Coastguard Worker     pu1_recon_luma = pu1_rec_y;
512*495ae853SAndroid Build Coastguard Worker     pu1_recon_chroma = pu1_rec_uv;
513*495ae853SAndroid Build Coastguard Worker 
514*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
515*495ae853SAndroid Build Coastguard Worker     /* Reconstruct TOP_LEFT Partition                                        */
516*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
517*495ae853SAndroid Build Coastguard Worker     {
518*495ae853SAndroid Build Coastguard Worker         WORD32 i4_width, i4_height;
519*495ae853SAndroid Build Coastguard Worker 
520*495ae853SAndroid Build Coastguard Worker         /* assign the appropriate buffer params based on Intra status */
521*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_mb_ctxt->u1_top_left_intra_flag)
522*495ae853SAndroid Build Coastguard Worker         {
523*495ae853SAndroid Build Coastguard Worker             /* Luma Processing */
524*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_luma, i4_pred_luma_stride, pu1_recon_luma,
525*495ae853SAndroid Build Coastguard Worker                             i4_recon_luma_stride, i4_intr_x, i4_intr_y);
526*495ae853SAndroid Build Coastguard Worker 
527*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height for chroma */
528*495ae853SAndroid Build Coastguard Worker             i4_width = (((i4_intr_x + 1) >> 1) << 1);
529*495ae853SAndroid Build Coastguard Worker             i4_height = ((i4_intr_y + 1) & ~1);
530*495ae853SAndroid Build Coastguard Worker             i4_height >>= 1;
531*495ae853SAndroid Build Coastguard Worker             /* Chroma Processing (cb and cr interleaved) */
532*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_chroma, i4_pred_chroma_stride, pu1_recon_chroma,
533*495ae853SAndroid Build Coastguard Worker                             i4_recon_chroma_stride, i4_width, i4_height);
534*495ae853SAndroid Build Coastguard Worker         }
535*495ae853SAndroid Build Coastguard Worker     }
536*495ae853SAndroid Build Coastguard Worker 
537*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
538*495ae853SAndroid Build Coastguard Worker     /* Reconstruct TOP_RIGHT Partition                                       */
539*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
540*495ae853SAndroid Build Coastguard Worker     {
541*495ae853SAndroid Build Coastguard Worker         WORD32 i4_width, i4_height;
542*495ae853SAndroid Build Coastguard Worker 
543*495ae853SAndroid Build Coastguard Worker         /* assign the appropriate buffer params based on Intra status */
544*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_mb_ctxt->u1_top_rt_intra_flag)
545*495ae853SAndroid Build Coastguard Worker         {
546*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma += i4_intr_x;
547*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma += (((i4_intr_x + 1) >> 1) << 1);
548*495ae853SAndroid Build Coastguard Worker 
549*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Luma ------------------------ */
550*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer */
551*495ae853SAndroid Build Coastguard Worker             pu1_recon_luma = pu1_rec_y + i4_intr_x;
552*495ae853SAndroid Build Coastguard Worker 
553*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height for luma */
554*495ae853SAndroid Build Coastguard Worker             i4_width = MB_WIDTH - i4_intr_x;
555*495ae853SAndroid Build Coastguard Worker             i4_height = i4_intr_y;
556*495ae853SAndroid Build Coastguard Worker 
557*495ae853SAndroid Build Coastguard Worker             /* Luma Processing */
558*495ae853SAndroid Build Coastguard Worker             /* Luma Processing */
559*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_luma, i4_pred_luma_stride, pu1_recon_luma,
560*495ae853SAndroid Build Coastguard Worker                             i4_recon_luma_stride, i4_width, i4_height);
561*495ae853SAndroid Build Coastguard Worker 
562*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Chroma ----------------------- */
563*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height for luma */
564*495ae853SAndroid Build Coastguard Worker             i4_width = (BLOCK_WIDTH - ((i4_intr_x + 1) >> 1)) << 1;
565*495ae853SAndroid Build Coastguard Worker 
566*495ae853SAndroid Build Coastguard Worker             /* Height includes for both Cb & Cr */
567*495ae853SAndroid Build Coastguard Worker             i4_height = ((i4_intr_y + 1) & ~1);
568*495ae853SAndroid Build Coastguard Worker             i4_height >>= 1;
569*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer */
570*495ae853SAndroid Build Coastguard Worker             pu1_recon_chroma = pu1_rec_uv;
571*495ae853SAndroid Build Coastguard Worker             {
572*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_temp;
573*495ae853SAndroid Build Coastguard Worker                 i4_temp = (((i4_intr_x + 1) >> 1) << 1);
574*495ae853SAndroid Build Coastguard Worker                 pu1_recon_chroma += i4_temp;
575*495ae853SAndroid Build Coastguard Worker             }
576*495ae853SAndroid Build Coastguard Worker 
577*495ae853SAndroid Build Coastguard Worker             /* Chroma Processing (cb and cr  interleaved) */
578*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_chroma, i4_pred_chroma_stride, pu1_recon_chroma,
579*495ae853SAndroid Build Coastguard Worker                             i4_recon_chroma_stride, i4_width, i4_height);
580*495ae853SAndroid Build Coastguard Worker         }
581*495ae853SAndroid Build Coastguard Worker     }
582*495ae853SAndroid Build Coastguard Worker 
583*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
584*495ae853SAndroid Build Coastguard Worker     /* Reconstruct BOTTOM_LEFT Partition                                     */
585*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
586*495ae853SAndroid Build Coastguard Worker     {
587*495ae853SAndroid Build Coastguard Worker         WORD32 i4_width, i4_height;
588*495ae853SAndroid Build Coastguard Worker 
589*495ae853SAndroid Build Coastguard Worker         /* assign the appropriate buffer params based on Intra status */
590*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_mb_ctxt->u1_bot_left_intra_flag)
591*495ae853SAndroid Build Coastguard Worker         {
592*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma;
593*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma;
594*495ae853SAndroid Build Coastguard Worker 
595*495ae853SAndroid Build Coastguard Worker             /* increment to current vertical offset */
596*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma += i4_intr_y * i4_pred_luma_stride;
597*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma += (((i4_intr_y + 1) & ~1) >> 1) * i4_pred_chroma_stride;
598*495ae853SAndroid Build Coastguard Worker 
599*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Luma ----------------------- */
600*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer */
601*495ae853SAndroid Build Coastguard Worker             pu1_recon_luma = pu1_rec_y;
602*495ae853SAndroid Build Coastguard Worker             pu1_recon_luma += i4_intr_y * i4_recon_luma_stride;
603*495ae853SAndroid Build Coastguard Worker 
604*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height */
605*495ae853SAndroid Build Coastguard Worker             i4_width = i4_intr_x;
606*495ae853SAndroid Build Coastguard Worker             i4_height = MB_HEIGHT - i4_intr_y;
607*495ae853SAndroid Build Coastguard Worker 
608*495ae853SAndroid Build Coastguard Worker             /* Luma Processing */
609*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_luma, i4_pred_luma_stride, pu1_recon_luma,
610*495ae853SAndroid Build Coastguard Worker                             i4_recon_luma_stride, i4_width, i4_height);
611*495ae853SAndroid Build Coastguard Worker 
612*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Chroma ----------------------- */
613*495ae853SAndroid Build Coastguard Worker             pu1_recon_chroma = pu1_rec_uv;
614*495ae853SAndroid Build Coastguard Worker             {
615*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_temp;
616*495ae853SAndroid Build Coastguard Worker                 i4_temp = ((i4_intr_y + 1) & ~1) >> 1;
617*495ae853SAndroid Build Coastguard Worker                 pu1_recon_chroma += (i4_temp * i4_recon_chroma_stride);
618*495ae853SAndroid Build Coastguard Worker             }
619*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height */
620*495ae853SAndroid Build Coastguard Worker             i4_width = ((i4_intr_x + 1) >> 1) << 1;
621*495ae853SAndroid Build Coastguard Worker             i4_height = MB_HEIGHT - (i4_intr_y & ~1);
622*495ae853SAndroid Build Coastguard Worker             i4_height >>= 1;
623*495ae853SAndroid Build Coastguard Worker             /* Chroma Processing (cb and cr interleaved) */
624*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_chroma, i4_pred_chroma_stride, pu1_recon_chroma,
625*495ae853SAndroid Build Coastguard Worker                             i4_recon_chroma_stride, i4_width, i4_height);
626*495ae853SAndroid Build Coastguard Worker         }
627*495ae853SAndroid Build Coastguard Worker     }
628*495ae853SAndroid Build Coastguard Worker 
629*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
630*495ae853SAndroid Build Coastguard Worker     /* Reconstruct BOTTOM_RIGHT Partition                                    */
631*495ae853SAndroid Build Coastguard Worker     /*-----------------------------------------------------------------------*/
632*495ae853SAndroid Build Coastguard Worker     {
633*495ae853SAndroid Build Coastguard Worker         WORD32 i4_width, i4_height;
634*495ae853SAndroid Build Coastguard Worker 
635*495ae853SAndroid Build Coastguard Worker         /* assign the appropriate buffer params based on Intra status */
636*495ae853SAndroid Build Coastguard Worker         if(SVCD_TRUE == ps_mb_ctxt->u1_bot_rt_intra_flag)
637*495ae853SAndroid Build Coastguard Worker         {
638*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_luma;
639*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma = ps_svc_lyr_dec->pu1_ii_resamp_buffer_chroma;
640*495ae853SAndroid Build Coastguard Worker 
641*495ae853SAndroid Build Coastguard Worker             /* increment to current vertical offset */
642*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma += i4_intr_x;
643*495ae853SAndroid Build Coastguard Worker             pu1_pred_luma += i4_intr_y * i4_pred_luma_stride;
644*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma += (((i4_intr_y + 1) & ~1) >> 1) * i4_pred_chroma_stride;
645*495ae853SAndroid Build Coastguard Worker             pu1_pred_chroma += ((i4_intr_x + 1) >> 1) << 1;
646*495ae853SAndroid Build Coastguard Worker 
647*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Luma ----------------------- */
648*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer horz */
649*495ae853SAndroid Build Coastguard Worker             pu1_recon_luma = pu1_rec_y + i4_intr_x;
650*495ae853SAndroid Build Coastguard Worker 
651*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer vertical */
652*495ae853SAndroid Build Coastguard Worker             pu1_recon_luma += (i4_intr_y * i4_recon_luma_stride);
653*495ae853SAndroid Build Coastguard Worker 
654*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height */
655*495ae853SAndroid Build Coastguard Worker             i4_width = MB_WIDTH - i4_intr_x;
656*495ae853SAndroid Build Coastguard Worker             i4_height = MB_HEIGHT - i4_intr_y;
657*495ae853SAndroid Build Coastguard Worker 
658*495ae853SAndroid Build Coastguard Worker             /* Luma Processing */
659*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_luma, i4_pred_luma_stride, pu1_recon_luma,
660*495ae853SAndroid Build Coastguard Worker                             i4_recon_luma_stride, i4_width, i4_height);
661*495ae853SAndroid Build Coastguard Worker 
662*495ae853SAndroid Build Coastguard Worker             /* ----------------------- Chroma ----------------------- */
663*495ae853SAndroid Build Coastguard Worker             /* get the recon and residual buffer pointer horz */
664*495ae853SAndroid Build Coastguard Worker             pu1_recon_chroma = pu1_rec_uv;
665*495ae853SAndroid Build Coastguard Worker             {
666*495ae853SAndroid Build Coastguard Worker                 WORD32 i4_temp;
667*495ae853SAndroid Build Coastguard Worker                 i4_temp = ((i4_intr_y + 1) & ~1) >> 1;
668*495ae853SAndroid Build Coastguard Worker                 i4_temp *= i4_recon_chroma_stride;
669*495ae853SAndroid Build Coastguard Worker                 i4_temp += (((i4_intr_x + 1) >> 1) << 1);
670*495ae853SAndroid Build Coastguard Worker                 pu1_recon_chroma += i4_temp;
671*495ae853SAndroid Build Coastguard Worker             }
672*495ae853SAndroid Build Coastguard Worker 
673*495ae853SAndroid Build Coastguard Worker             /* assign appropriate width and height */
674*495ae853SAndroid Build Coastguard Worker             i4_width = (BLOCK_WIDTH - ((i4_intr_x + 1) >> 1)) << 1;
675*495ae853SAndroid Build Coastguard Worker             i4_height = MB_HEIGHT - (i4_intr_y & ~1);
676*495ae853SAndroid Build Coastguard Worker             i4_height >>= 1;
677*495ae853SAndroid Build Coastguard Worker             /* Chroma Processing (cb and cr interleaved) */
678*495ae853SAndroid Build Coastguard Worker             isvcd_copy_data(pu1_pred_chroma, i4_pred_chroma_stride, pu1_recon_chroma,
679*495ae853SAndroid Build Coastguard Worker                             i4_recon_chroma_stride, i4_width, i4_height);
680*495ae853SAndroid Build Coastguard Worker         }
681*495ae853SAndroid Build Coastguard Worker     }
682*495ae853SAndroid Build Coastguard Worker     return;
683*495ae853SAndroid Build Coastguard Worker }