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_resamp_svc.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 * @remarks
32*495ae853SAndroid Build Coastguard Worker * None
33*495ae853SAndroid Build Coastguard Worker *
34*495ae853SAndroid Build Coastguard Worker *******************************************************************************
35*495ae853SAndroid Build Coastguard Worker */
36*495ae853SAndroid Build Coastguard Worker
37*495ae853SAndroid Build Coastguard Worker #include <assert.h>
38*495ae853SAndroid Build Coastguard Worker #include <string.h>
39*495ae853SAndroid Build Coastguard Worker
40*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
42*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
43*495ae853SAndroid Build Coastguard Worker #include "ih264d_bitstrm.h"
44*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_cavlc.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_mb_utils.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264d_deblocking.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264d_dpb_manager.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264d_mvpred.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264d_inter_pred.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_pslice.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264d_cabac.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264d_debug.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264d_tables.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_slice.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264d_parse_islice.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_bslice.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264d_process_intra_mb.h"
64*495ae853SAndroid Build Coastguard Worker #include "isvcd_resamp_svc.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
66*495ae853SAndroid Build Coastguard Worker
67*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
68*495ae853SAndroid Build Coastguard Worker /* */
69*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_get_ceil_log2 */
70*495ae853SAndroid Build Coastguard Worker /* */
71*495ae853SAndroid Build Coastguard Worker /* Description : this function returns the CeilLog2 of the given number */
72*495ae853SAndroid Build Coastguard Worker /* */
73*495ae853SAndroid Build Coastguard Worker /* */
74*495ae853SAndroid Build Coastguard Worker /* Inputs : i4_input : input number */
75*495ae853SAndroid Build Coastguard Worker /* Globals : none */
76*495ae853SAndroid Build Coastguard Worker /* Processing : it calculate the bits and returns it */
77*495ae853SAndroid Build Coastguard Worker /* */
78*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
79*495ae853SAndroid Build Coastguard Worker /* Returns : ceil of log to base 2 */
80*495ae853SAndroid Build Coastguard Worker /* */
81*495ae853SAndroid Build Coastguard Worker /* Issues : none */
82*495ae853SAndroid Build Coastguard Worker /* */
83*495ae853SAndroid Build Coastguard Worker /* Revision History: */
84*495ae853SAndroid Build Coastguard Worker /* */
85*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
86*495ae853SAndroid Build Coastguard Worker /* 05 04 2009 vijayakumar creation */
87*495ae853SAndroid Build Coastguard Worker /* */
88*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_get_ceil_log2(WORD32 i4_input)89*495ae853SAndroid Build Coastguard Worker WORD32 svcd_get_ceil_log2(WORD32 i4_input)
90*495ae853SAndroid Build Coastguard Worker {
91*495ae853SAndroid Build Coastguard Worker WORD32 i4_bits = 0;
92*495ae853SAndroid Build Coastguard Worker
93*495ae853SAndroid Build Coastguard Worker /* check for negative number */
94*495ae853SAndroid Build Coastguard Worker ASSERT(i4_input >= 0);
95*495ae853SAndroid Build Coastguard Worker
96*495ae853SAndroid Build Coastguard Worker i4_input--;
97*495ae853SAndroid Build Coastguard Worker while(i4_input > 0)
98*495ae853SAndroid Build Coastguard Worker {
99*495ae853SAndroid Build Coastguard Worker i4_bits++;
100*495ae853SAndroid Build Coastguard Worker i4_input >>= 1;
101*495ae853SAndroid Build Coastguard Worker } /* endof while input > 0 loop */
102*495ae853SAndroid Build Coastguard Worker return (i4_bits);
103*495ae853SAndroid Build Coastguard Worker }
104*495ae853SAndroid Build Coastguard Worker
105*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
106*495ae853SAndroid Build Coastguard Worker /* */
107*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_2d_memset */
108*495ae853SAndroid Build Coastguard Worker /* */
109*495ae853SAndroid Build Coastguard Worker /* Description : Function performs 2D memset operation */
110*495ae853SAndroid Build Coastguard Worker /* */
111*495ae853SAndroid Build Coastguard Worker /* */
112*495ae853SAndroid Build Coastguard Worker /* Inputs : 1. Buffer pointer */
113*495ae853SAndroid Build Coastguard Worker /* 2. width */
114*495ae853SAndroid Build Coastguard Worker /* 3. Height */
115*495ae853SAndroid Build Coastguard Worker /* 4. Stride */
116*495ae853SAndroid Build Coastguard Worker /* 5. value */
117*495ae853SAndroid Build Coastguard Worker /* Globals : None */
118*495ae853SAndroid Build Coastguard Worker /* Processing : calls memset fucntion */
119*495ae853SAndroid Build Coastguard Worker /* */
120*495ae853SAndroid Build Coastguard Worker /* Outputs : Updates the buffer */
121*495ae853SAndroid Build Coastguard Worker /* Returns : status */
122*495ae853SAndroid Build Coastguard Worker /* */
123*495ae853SAndroid Build Coastguard Worker /* Issues : None */
124*495ae853SAndroid Build Coastguard Worker /* */
125*495ae853SAndroid Build Coastguard Worker /* Revision History: */
126*495ae853SAndroid Build Coastguard Worker /* */
127*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
128*495ae853SAndroid Build Coastguard Worker /* 24 06 2009 Kishore Draft */
129*495ae853SAndroid Build Coastguard Worker /* */
130*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_2d_memset(void * pv_buf,WORD32 i4_width,WORD32 i4_ht,WORD32 i4_stride,WORD32 i4_val)131*495ae853SAndroid Build Coastguard Worker void svcd_2d_memset(void *pv_buf, WORD32 i4_width, WORD32 i4_ht, WORD32 i4_stride, WORD32 i4_val)
132*495ae853SAndroid Build Coastguard Worker {
133*495ae853SAndroid Build Coastguard Worker WORD32 i4_y;
134*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
135*495ae853SAndroid Build Coastguard Worker
136*495ae853SAndroid Build Coastguard Worker pu1_buf = (UWORD8 *) pv_buf;
137*495ae853SAndroid Build Coastguard Worker
138*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < i4_ht; i4_y++)
139*495ae853SAndroid Build Coastguard Worker {
140*495ae853SAndroid Build Coastguard Worker memset(pu1_buf, i4_val, i4_width);
141*495ae853SAndroid Build Coastguard Worker
142*495ae853SAndroid Build Coastguard Worker /* Increment the pointer */
143*495ae853SAndroid Build Coastguard Worker pu1_buf += i4_stride;
144*495ae853SAndroid Build Coastguard Worker }
145*495ae853SAndroid Build Coastguard Worker }
146*495ae853SAndroid Build Coastguard Worker
147*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
148*495ae853SAndroid Build Coastguard Worker /* */
149*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_copy_data */
150*495ae853SAndroid Build Coastguard Worker /* */
151*495ae853SAndroid Build Coastguard Worker /* Description : this module copies the data from source to destination */
152*495ae853SAndroid Build Coastguard Worker /* the amount of data to be copied is passed as input */
153*495ae853SAndroid Build Coastguard Worker /* */
154*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_src : pointer to the source buffer */
155*495ae853SAndroid Build Coastguard Worker /* u2_src_stride : source buffer stride */
156*495ae853SAndroid Build Coastguard Worker /* pu1_dst : pointer to the destination buffer */
157*495ae853SAndroid Build Coastguard Worker /* u2_dst_stride : destination buffer stride */
158*495ae853SAndroid Build Coastguard Worker /* u4_num_bytes : number of bytes to be copied */
159*495ae853SAndroid Build Coastguard Worker /* u4_num_lines : number of lines to be copied */
160*495ae853SAndroid Build Coastguard Worker /* Globals : none */
161*495ae853SAndroid Build Coastguard Worker /* Processing : it does a memcpy from source to destination */
162*495ae853SAndroid Build Coastguard Worker /* */
163*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
164*495ae853SAndroid Build Coastguard Worker /* Returns : none */
165*495ae853SAndroid Build Coastguard Worker /* Issues : both buffers are assumed to be 2-D buffers */
166*495ae853SAndroid Build Coastguard Worker /* */
167*495ae853SAndroid Build Coastguard Worker /* Revision History: */
168*495ae853SAndroid Build Coastguard Worker /* */
169*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
170*495ae853SAndroid Build Coastguard Worker /* 29 04 2009 vijayakumar creation */
171*495ae853SAndroid Build Coastguard Worker /* */
172*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_copy_data(UWORD8 * pu1_src,WORD32 i4_src_stride,UWORD8 * pu1_dst,WORD32 i4_dst_stride,WORD32 i4_num_bytes,WORD32 i4_num_lines)173*495ae853SAndroid Build Coastguard Worker void svcd_copy_data(UWORD8 *pu1_src, WORD32 i4_src_stride, UWORD8 *pu1_dst, WORD32 i4_dst_stride,
174*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_bytes, WORD32 i4_num_lines)
175*495ae853SAndroid Build Coastguard Worker {
176*495ae853SAndroid Build Coastguard Worker WORD32 i4_vert_lines;
177*495ae853SAndroid Build Coastguard Worker
178*495ae853SAndroid Build Coastguard Worker ASSERT(NULL != pu1_src);
179*495ae853SAndroid Build Coastguard Worker ASSERT(NULL != pu1_dst);
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker /* loop for copy all the lines requried */
182*495ae853SAndroid Build Coastguard Worker for(i4_vert_lines = 0; i4_vert_lines < i4_num_lines; i4_vert_lines++)
183*495ae853SAndroid Build Coastguard Worker {
184*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, i4_num_bytes);
185*495ae853SAndroid Build Coastguard Worker pu1_src += i4_src_stride;
186*495ae853SAndroid Build Coastguard Worker pu1_dst += i4_dst_stride;
187*495ae853SAndroid Build Coastguard Worker }
188*495ae853SAndroid Build Coastguard Worker return;
189*495ae853SAndroid Build Coastguard Worker }
190*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
191*495ae853SAndroid Build Coastguard Worker /* */
192*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_copy_data_semiplanr */
193*495ae853SAndroid Build Coastguard Worker /* */
194*495ae853SAndroid Build Coastguard Worker /* Description : this module copies the data from source to destination */
195*495ae853SAndroid Build Coastguard Worker /* the amount of data to be copied is passed as input */
196*495ae853SAndroid Build Coastguard Worker /* */
197*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_src : pointer to the source buffer */
198*495ae853SAndroid Build Coastguard Worker /* i4_src_stride : source buffer stride */
199*495ae853SAndroid Build Coastguard Worker /* pu1_dst1 : pointer to the destination buffer 1 */
200*495ae853SAndroid Build Coastguard Worker /* pu1_dst2 : pointer to the destination buffer 2 */
201*495ae853SAndroid Build Coastguard Worker /* i4_dst_stride : destination buffer stride */
202*495ae853SAndroid Build Coastguard Worker /* i4_num_bytes : number of bytes to be copied */
203*495ae853SAndroid Build Coastguard Worker /* i4_num_lines : number of lines to be copied */
204*495ae853SAndroid Build Coastguard Worker /* Globals : none */
205*495ae853SAndroid Build Coastguard Worker /* Processing : it does a memcpy from source to destination */
206*495ae853SAndroid Build Coastguard Worker /* */
207*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
208*495ae853SAndroid Build Coastguard Worker /* Returns : none */
209*495ae853SAndroid Build Coastguard Worker /* Issues : both buffers are assumed to be 2-D buffers */
210*495ae853SAndroid Build Coastguard Worker /* */
211*495ae853SAndroid Build Coastguard Worker /* Revision History: */
212*495ae853SAndroid Build Coastguard Worker /* */
213*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
214*495ae853SAndroid Build Coastguard Worker /* 29 04 2009 vijayakumar creation */
215*495ae853SAndroid Build Coastguard Worker /* */
216*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_copy_data_semiplanr(UWORD8 * pu1_src,WORD32 i4_src_stride,UWORD8 * pu1_dst1,UWORD8 * pu1_dst2,WORD32 i4_dst_stride,WORD32 i4_num_bytes,WORD32 i4_num_lines)217*495ae853SAndroid Build Coastguard Worker void svcd_copy_data_semiplanr(UWORD8 *pu1_src, WORD32 i4_src_stride, UWORD8 *pu1_dst1,
218*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst2, WORD32 i4_dst_stride, WORD32 i4_num_bytes,
219*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_lines)
220*495ae853SAndroid Build Coastguard Worker {
221*495ae853SAndroid Build Coastguard Worker WORD32 i4_vert_lines, u4_i;
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker if(NULL == pu1_src) ||(NULL == pu1_dst1) ||(NULL == pu1_dst2)){return;}
224*495ae853SAndroid Build Coastguard Worker
225*495ae853SAndroid Build Coastguard Worker /* loop for copy all the lines requried */
226*495ae853SAndroid Build Coastguard Worker for(i4_vert_lines = 0; i4_vert_lines < i4_num_lines; i4_vert_lines++)
227*495ae853SAndroid Build Coastguard Worker {
228*495ae853SAndroid Build Coastguard Worker for(u4_i = 0; u4_i < i4_num_bytes; u4_i++)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker *(pu1_dst1 + u4_i) = *(pu1_src + (2 * u4_i));
231*495ae853SAndroid Build Coastguard Worker *(pu1_dst2 + u4_i) = *(pu1_src + (2 * u4_i) + 1);
232*495ae853SAndroid Build Coastguard Worker }
233*495ae853SAndroid Build Coastguard Worker
234*495ae853SAndroid Build Coastguard Worker pu1_src += i4_src_stride;
235*495ae853SAndroid Build Coastguard Worker pu1_dst1 += i4_dst_stride;
236*495ae853SAndroid Build Coastguard Worker pu1_dst2 += i4_dst_stride;
237*495ae853SAndroid Build Coastguard Worker }
238*495ae853SAndroid Build Coastguard Worker return;
239*495ae853SAndroid Build Coastguard Worker }
240*495ae853SAndroid Build Coastguard Worker
241*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
242*495ae853SAndroid Build Coastguard Worker /* */
243*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_get_ref_layer_avlblty_dyadic */
244*495ae853SAndroid Build Coastguard Worker /* */
245*495ae853SAndroid Build Coastguard Worker /* Description : This function is used to find the mb type of the */
246*495ae853SAndroid Build Coastguard Worker /* corresponding MB in the reference layer for dyadic cases */
247*495ae853SAndroid Build Coastguard Worker /* */
248*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_intra_samp_ctxt : intra samp context */
249*495ae853SAndroid Build Coastguard Worker /* pi1_ref_mb_modes : ref mb modes buffer pointer */
250*495ae853SAndroid Build Coastguard Worker /* i4_ref_mode_stride : mb mode buffer stride */
251*495ae853SAndroid Build Coastguard Worker /* i4_ref_mb_x : reference MB location X */
252*495ae853SAndroid Build Coastguard Worker /* i4_ref_mb_y : reference MB location Y */
253*495ae853SAndroid Build Coastguard Worker /* pi4_mb_type : pointer to store the mb type */
254*495ae853SAndroid Build Coastguard Worker /* i1_curr_slice_id : slice id of current MB */
255*495ae853SAndroid Build Coastguard Worker /* i1_cons_intr_samp_flag :constrained intra resampling flag*/
256*495ae853SAndroid Build Coastguard Worker /* Globals : none */
257*495ae853SAndroid Build Coastguard Worker /* Processing : it derives the bit corresponding to reference MB and */
258*495ae853SAndroid Build Coastguard Worker /* stores the mbtype as INTRA if the bit is set */
259*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
260*495ae853SAndroid Build Coastguard Worker /* Returns : none */
261*495ae853SAndroid Build Coastguard Worker /* */
262*495ae853SAndroid Build Coastguard Worker /* Issues : none */
263*495ae853SAndroid Build Coastguard Worker /* */
264*495ae853SAndroid Build Coastguard Worker /* Revision History: */
265*495ae853SAndroid Build Coastguard Worker /* */
266*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
267*495ae853SAndroid Build Coastguard Worker /* 26 06 2009 vijayakumar creation */
268*495ae853SAndroid Build Coastguard Worker /* */
269*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_get_ref_layer_avlblty_dyadic(WORD8 * pi1_ref_mb_modes,WORD32 i4_ref_mode_stride,WORD32 i4_element_size,WORD32 i4_ref_mb_x,WORD32 i4_ref_mb_y,WORD32 * pi4_avlblty,WORD8 i1_curr_slice_id,WORD8 i1_cons_intr_samp_flag)270*495ae853SAndroid Build Coastguard Worker void svcd_get_ref_layer_avlblty_dyadic(WORD8 *pi1_ref_mb_modes, WORD32 i4_ref_mode_stride,
271*495ae853SAndroid Build Coastguard Worker WORD32 i4_element_size, WORD32 i4_ref_mb_x,
272*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_mb_y, WORD32 *pi4_avlblty,
273*495ae853SAndroid Build Coastguard Worker WORD8 i1_curr_slice_id, WORD8 i1_cons_intr_samp_flag)
274*495ae853SAndroid Build Coastguard Worker {
275*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
276*495ae853SAndroid Build Coastguard Worker WORD8 i1_mb_mode;
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker /* get the location of the byte which has the current mb mode */
279*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_modes += (i4_ref_mb_y * i4_ref_mode_stride * i4_element_size);
280*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_modes += (i4_ref_mb_x * i4_element_size);
281*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_modes;
282*495ae853SAndroid Build Coastguard Worker i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
283*495ae853SAndroid Build Coastguard Worker
284*495ae853SAndroid Build Coastguard Worker if(0 > i1_mb_mode)
285*495ae853SAndroid Build Coastguard Worker {
286*495ae853SAndroid Build Coastguard Worker /* INTER */
287*495ae853SAndroid Build Coastguard Worker *pi4_avlblty = 0;
288*495ae853SAndroid Build Coastguard Worker }
289*495ae853SAndroid Build Coastguard Worker else
290*495ae853SAndroid Build Coastguard Worker {
291*495ae853SAndroid Build Coastguard Worker /* INTRA */
292*495ae853SAndroid Build Coastguard Worker *pi4_avlblty = 1;
293*495ae853SAndroid Build Coastguard Worker }
294*495ae853SAndroid Build Coastguard Worker
295*495ae853SAndroid Build Coastguard Worker /* if constrained intra flag is 1 then check for same slice id */
296*495ae853SAndroid Build Coastguard Worker if(1 == i1_cons_intr_samp_flag)
297*495ae853SAndroid Build Coastguard Worker {
298*495ae853SAndroid Build Coastguard Worker if(1 == *pi4_avlblty)
299*495ae853SAndroid Build Coastguard Worker {
300*495ae853SAndroid Build Coastguard Worker /* check for different slice idc */
301*495ae853SAndroid Build Coastguard Worker if(i1_mb_mode != i1_curr_slice_id)
302*495ae853SAndroid Build Coastguard Worker {
303*495ae853SAndroid Build Coastguard Worker /* store the mode as not available for upsampling */
304*495ae853SAndroid Build Coastguard Worker *pi4_avlblty = 0;
305*495ae853SAndroid Build Coastguard Worker }
306*495ae853SAndroid Build Coastguard Worker }
307*495ae853SAndroid Build Coastguard Worker }
308*495ae853SAndroid Build Coastguard Worker }
309*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
310*495ae853SAndroid Build Coastguard Worker /* */
311*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_diagonal_construct_dyadic */
312*495ae853SAndroid Build Coastguard Worker /* */
313*495ae853SAndroid Build Coastguard Worker /* Description : This function fills the unavaible pixels in the reference*/
314*495ae853SAndroid Build Coastguard Worker /* array with diagonally constructed samples */
315*495ae853SAndroid Build Coastguard Worker /* Inputs : i4_x :current position in reference array X to be filled */
316*495ae853SAndroid Build Coastguard Worker /* i4_y :current position in reference array Y to be filled */
317*495ae853SAndroid Build Coastguard Worker /* i4_xd_index : diagonal index in horizontal direction */
318*495ae853SAndroid Build Coastguard Worker /* i4_yd_index : diagonal index in vertical direction */
319*495ae853SAndroid Build Coastguard Worker /* pu1_refarray : popinter to reference array */
320*495ae853SAndroid Build Coastguard Worker /* i4_refarray_wd: width of the reference array */
321*495ae853SAndroid Build Coastguard Worker /* Globals : none */
322*495ae853SAndroid Build Coastguard Worker /* Processing : Fills the sample which is unavailable with filtered */
323*495ae853SAndroid Build Coastguard Worker /* diagonal samples */
324*495ae853SAndroid Build Coastguard Worker /* Outputs : pixel filled */
325*495ae853SAndroid Build Coastguard Worker /* Returns : constructed pixel */
326*495ae853SAndroid Build Coastguard Worker /* */
327*495ae853SAndroid Build Coastguard Worker /* Issues : none */
328*495ae853SAndroid Build Coastguard Worker /* */
329*495ae853SAndroid Build Coastguard Worker /* Revision History: */
330*495ae853SAndroid Build Coastguard Worker /* */
331*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
332*495ae853SAndroid Build Coastguard Worker /* 03 12 2010 Nithya creation */
333*495ae853SAndroid Build Coastguard Worker /* */
334*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_diagonal_construct_dyadic(WORD32 i4_x,WORD32 i4_y,WORD32 i4_xd_index,WORD32 i4_yd_index,UWORD8 * pu1_refarray,WORD32 i4_refarray_wd)335*495ae853SAndroid Build Coastguard Worker UWORD8 svcd_diagonal_construct_dyadic(WORD32 i4_x, WORD32 i4_y, WORD32 i4_xd_index,
336*495ae853SAndroid Build Coastguard Worker WORD32 i4_yd_index, UWORD8 *pu1_refarray,
337*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_wd)
338*495ae853SAndroid Build Coastguard Worker {
339*495ae853SAndroid Build Coastguard Worker WORD32 i4_diff_hor_ver, i4_sgn_xy;
340*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc, i4_yc;
341*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp1, i4_samp2, i4_samp3;
342*495ae853SAndroid Build Coastguard Worker WORD32 i4_result;
343*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp;
344*495ae853SAndroid Build Coastguard Worker
345*495ae853SAndroid Build Coastguard Worker i4_diff_hor_ver = ABS(i4_xd_index) - ABS(i4_yd_index);
346*495ae853SAndroid Build Coastguard Worker i4_sgn_xy = SIGN(i4_xd_index * i4_yd_index);
347*495ae853SAndroid Build Coastguard Worker
348*495ae853SAndroid Build Coastguard Worker if(i4_diff_hor_ver > 0)
349*495ae853SAndroid Build Coastguard Worker {
350*495ae853SAndroid Build Coastguard Worker i4_xc = i4_x - (i4_sgn_xy * i4_yd_index);
351*495ae853SAndroid Build Coastguard Worker i4_yc = i4_y - i4_yd_index;
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker pu1_tmp = pu1_refarray + (i4_yc * i4_refarray_wd);
354*495ae853SAndroid Build Coastguard Worker
355*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp[i4_xc - 1];
356*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp[i4_xc];
357*495ae853SAndroid Build Coastguard Worker i4_samp3 = pu1_tmp[i4_xc + 1];
358*495ae853SAndroid Build Coastguard Worker }
359*495ae853SAndroid Build Coastguard Worker else if(i4_diff_hor_ver < 0)
360*495ae853SAndroid Build Coastguard Worker {
361*495ae853SAndroid Build Coastguard Worker i4_xc = i4_x - i4_xd_index;
362*495ae853SAndroid Build Coastguard Worker i4_yc = i4_y - (i4_sgn_xy * i4_xd_index);
363*495ae853SAndroid Build Coastguard Worker
364*495ae853SAndroid Build Coastguard Worker pu1_tmp = pu1_refarray + ((i4_yc - 1) * i4_refarray_wd);
365*495ae853SAndroid Build Coastguard Worker
366*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp[i4_xc];
367*495ae853SAndroid Build Coastguard Worker pu1_tmp += i4_refarray_wd;
368*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp[i4_xc];
369*495ae853SAndroid Build Coastguard Worker pu1_tmp += i4_refarray_wd;
370*495ae853SAndroid Build Coastguard Worker i4_samp3 = pu1_tmp[i4_xc];
371*495ae853SAndroid Build Coastguard Worker }
372*495ae853SAndroid Build Coastguard Worker else
373*495ae853SAndroid Build Coastguard Worker {
374*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_xd, i4_ref_yd;
375*495ae853SAndroid Build Coastguard Worker
376*495ae853SAndroid Build Coastguard Worker i4_ref_xd = i4_x - i4_xd_index;
377*495ae853SAndroid Build Coastguard Worker i4_ref_yd = i4_y - i4_yd_index;
378*495ae853SAndroid Build Coastguard Worker
379*495ae853SAndroid Build Coastguard Worker i4_xc = i4_ref_xd + SIGN(i4_xd_index);
380*495ae853SAndroid Build Coastguard Worker i4_yc = i4_ref_yd + SIGN(i4_yd_index);
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker pu1_tmp = pu1_refarray + (i4_ref_yd * i4_refarray_wd);
383*495ae853SAndroid Build Coastguard Worker
384*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp[i4_xc];
385*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp[i4_ref_xd];
386*495ae853SAndroid Build Coastguard Worker pu1_tmp = pu1_refarray + (i4_yc * i4_refarray_wd);
387*495ae853SAndroid Build Coastguard Worker i4_samp3 = pu1_tmp[i4_ref_xd];
388*495ae853SAndroid Build Coastguard Worker }
389*495ae853SAndroid Build Coastguard Worker
390*495ae853SAndroid Build Coastguard Worker i4_result = (i4_samp1 + (i4_samp2 << 1) + i4_samp3 + 2) >> 2;
391*495ae853SAndroid Build Coastguard Worker
392*495ae853SAndroid Build Coastguard Worker pu1_tmp = pu1_refarray + (i4_y * i4_refarray_wd);
393*495ae853SAndroid Build Coastguard Worker /* Store the filled sample */
394*495ae853SAndroid Build Coastguard Worker pu1_tmp[i4_x] = i4_result;
395*495ae853SAndroid Build Coastguard Worker
396*495ae853SAndroid Build Coastguard Worker return (i4_result);
397*495ae853SAndroid Build Coastguard Worker }
398*495ae853SAndroid Build Coastguard Worker
399*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
400*495ae853SAndroid Build Coastguard Worker /* */
401*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_corner_samp_dyadic */
402*495ae853SAndroid Build Coastguard Worker /* */
403*495ae853SAndroid Build Coastguard Worker /* Description : This function fills the corner sample in the reference */
404*495ae853SAndroid Build Coastguard Worker /* array with diagonally constructed samples */
405*495ae853SAndroid Build Coastguard Worker /* Inputs : i4_x :current position in reference array X to be filled */
406*495ae853SAndroid Build Coastguard Worker /* i4_y :current position in reference array Y to be filled */
407*495ae853SAndroid Build Coastguard Worker /* i4_xd_index : diagonal index in horizontal direction */
408*495ae853SAndroid Build Coastguard Worker /* i4_yd_index : diagonal index in vertical direction */
409*495ae853SAndroid Build Coastguard Worker /* pu1_refarray_y : pointer to luma reference array */
410*495ae853SAndroid Build Coastguard Worker /* pu1_refarray_cb : pointer to Cb reference array */
411*495ae853SAndroid Build Coastguard Worker /* pu1_refarray_cr : pointer to Cr reference array */
412*495ae853SAndroid Build Coastguard Worker /* Globals : none */
413*495ae853SAndroid Build Coastguard Worker /* Processing : Fills the sample which is unavailable with filtered */
414*495ae853SAndroid Build Coastguard Worker /* diagonal samples */
415*495ae853SAndroid Build Coastguard Worker /* Outputs : pixel filled */
416*495ae853SAndroid Build Coastguard Worker /* Returns : none */
417*495ae853SAndroid Build Coastguard Worker /* */
418*495ae853SAndroid Build Coastguard Worker /* Issues : none */
419*495ae853SAndroid Build Coastguard Worker /* */
420*495ae853SAndroid Build Coastguard Worker /* Revision History: */
421*495ae853SAndroid Build Coastguard Worker /* */
422*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
423*495ae853SAndroid Build Coastguard Worker /* 03 12 2010 Nithya creation */
424*495ae853SAndroid Build Coastguard Worker /* */
425*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_corner_samp_dyadic(WORD32 i4_x,WORD32 i4_y,WORD32 i4_xD,WORD32 i4_yD,UWORD8 * pu1_refarray_y,UWORD8 * pu1_refarray_cb,UWORD8 * pu1_refarray_cr)426*495ae853SAndroid Build Coastguard Worker void svcd_corner_samp_dyadic(WORD32 i4_x, WORD32 i4_y, WORD32 i4_xD, WORD32 i4_yD,
427*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_refarray_y, UWORD8 *pu1_refarray_cb,
428*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_refarray_cr)
429*495ae853SAndroid Build Coastguard Worker {
430*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_xD, i4_ref_yD;
431*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_ref_xD, i4_c_ref_yD;
432*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc, i4_yc;
433*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xc, i4_c_yc;
434*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp1, i4_samp2;
435*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
436*495ae853SAndroid Build Coastguard Worker
437*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x - i4_xD;
438*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y - i4_yD;
439*495ae853SAndroid Build Coastguard Worker i4_xc = i4_ref_xD + SIGN(i4_xD);
440*495ae853SAndroid Build Coastguard Worker i4_yc = i4_ref_yD + SIGN(i4_yD);
441*495ae853SAndroid Build Coastguard Worker
442*495ae853SAndroid Build Coastguard Worker /* Luma */
443*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_y + (i4_yc * DYADIC_REF_W_Y);
444*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp_src[i4_ref_xD];
445*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_y + (i4_ref_yD * DYADIC_REF_W_Y);
446*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp_src[i4_xc];
447*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
448*495ae853SAndroid Build Coastguard Worker
449*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
450*495ae853SAndroid Build Coastguard Worker
451*495ae853SAndroid Build Coastguard Worker /* Chroma */
452*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
453*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
454*495ae853SAndroid Build Coastguard Worker i4_c_xc = i4_c_ref_xD + SIGN(i4_xD);
455*495ae853SAndroid Build Coastguard Worker i4_c_yc = i4_c_ref_yD + SIGN(i4_yD);
456*495ae853SAndroid Build Coastguard Worker
457*495ae853SAndroid Build Coastguard Worker /* Cb */
458*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cb + (i4_c_yc * DYADIC_REF_W_C);
459*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp_src[i4_c_ref_xD];
460*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
461*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp_src[i4_c_xc];
462*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
463*495ae853SAndroid Build Coastguard Worker
464*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_c_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
465*495ae853SAndroid Build Coastguard Worker
466*495ae853SAndroid Build Coastguard Worker /* Cr */
467*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cr + (i4_c_yc * DYADIC_REF_W_C);
468*495ae853SAndroid Build Coastguard Worker i4_samp1 = pu1_tmp_src[i4_c_ref_xD];
469*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
470*495ae853SAndroid Build Coastguard Worker i4_samp2 = pu1_tmp_src[i4_c_xc];
471*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
472*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_c_ref_xD] = (i4_samp1 + i4_samp2 + 1) >> 1;
473*495ae853SAndroid Build Coastguard Worker }
474*495ae853SAndroid Build Coastguard Worker
475*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
476*495ae853SAndroid Build Coastguard Worker /* */
477*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_reflayer_construction_dyadic */
478*495ae853SAndroid Build Coastguard Worker /* */
479*495ae853SAndroid Build Coastguard Worker /* Description : This function constructs the reference array buffer */
480*495ae853SAndroid Build Coastguard Worker /* for dyadic cases used for intra resampling of a */
481*495ae853SAndroid Build Coastguard Worker /* component in an MB */
482*495ae853SAndroid Build Coastguard Worker /* */
483*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_intra_samp_ctxt : intra sampling context */
484*495ae853SAndroid Build Coastguard Worker /* ps_ref_mb_mode_map : ref layer mb mode buffer desc */
485*495ae853SAndroid Build Coastguard Worker /* pu1_inp_luma : luma input (reference layer data) */
486*495ae853SAndroid Build Coastguard Worker /* pu1_inp_chroma : chroma input (reference layer data) */
487*495ae853SAndroid Build Coastguard Worker /* i4_inp_luma_stride : luma input buffer stride */
488*495ae853SAndroid Build Coastguard Worker /* i4_inp_chroma_stride : chroma input buffer stride */
489*495ae853SAndroid Build Coastguard Worker /* i4_top : indicates whether the core 8x8 reference block */
490*495ae853SAndroid Build Coastguard Worker /* is one of 0 and 1 or one of 2 and 3 */
491*495ae853SAndroid Build Coastguard Worker /* i4_left : indicates whether the core 8x8 reference block */
492*495ae853SAndroid Build Coastguard Worker /* is one of 0 and 2 or one of 1 and 3 */
493*495ae853SAndroid Build Coastguard Worker /* ps_ref_mb_coord : coordinates of the reference MB */
494*495ae853SAndroid Build Coastguard Worker /* Globals : none */
495*495ae853SAndroid Build Coastguard Worker /* Processing : it fills the reference layer data if they are falling in */
496*495ae853SAndroid Build Coastguard Worker /* INTRA MB region. If all the pixels are not filled it */
497*495ae853SAndroid Build Coastguard Worker /* calls the border extension algorithm to fill them */
498*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
499*495ae853SAndroid Build Coastguard Worker /* Returns : none */
500*495ae853SAndroid Build Coastguard Worker /* */
501*495ae853SAndroid Build Coastguard Worker /* Issues : none */
502*495ae853SAndroid Build Coastguard Worker /* */
503*495ae853SAndroid Build Coastguard Worker /* Revision History: */
504*495ae853SAndroid Build Coastguard Worker /* */
505*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
506*495ae853SAndroid Build Coastguard Worker /* 02 12 2010 Nithya creation */
507*495ae853SAndroid Build Coastguard Worker /* */
508*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_reflayer_construction_dyadic(void * pv_intra_samp_ctxt,mem_element_t * ps_ref_mb_mode_map,UWORD8 * pu1_inp_luma,UWORD8 * pu1_inp_chroma,WORD32 i4_inp_luma_stride,WORD32 i4_inp_chroma_stride,WORD32 i4_top,WORD32 i4_left,UWORD16 u2_mb_x,UWORD16 u2_mb_y)509*495ae853SAndroid Build Coastguard Worker void svcd_reflayer_construction_dyadic(void *pv_intra_samp_ctxt, mem_element_t *ps_ref_mb_mode_map,
510*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp_luma, UWORD8 *pu1_inp_chroma,
511*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_luma_stride, WORD32 i4_inp_chroma_stride,
512*495ae853SAndroid Build Coastguard Worker WORD32 i4_top, WORD32 i4_left, UWORD16 u2_mb_x,
513*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_y)
514*495ae853SAndroid Build Coastguard Worker {
515*495ae853SAndroid Build Coastguard Worker /* Index variables */
516*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
517*495ae853SAndroid Build Coastguard Worker WORD32 i4_x0, i4_y0;
518*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc0, i4_yc0;
519*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_xD, i4_ref_yD;
520*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_ref_xD, i4_c_ref_yD;
521*495ae853SAndroid Build Coastguard Worker
522*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
523*495ae853SAndroid Build Coastguard Worker /* Context and reference layer related variables */
524*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
525*495ae853SAndroid Build Coastguard Worker intra_sampling_ctxt_t *ps_ctxt;
526*495ae853SAndroid Build Coastguard Worker intra_samp_lyr_ctxt *ps_lyr_ctxt;
527*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_mb_modes;
528*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_mode_stride;
529*495ae853SAndroid Build Coastguard Worker WORD32 i4_element_size;
530*495ae853SAndroid Build Coastguard Worker WORD32 i4_mbaddr_y;
531*495ae853SAndroid Build Coastguard Worker WORD32 i4_mbaddr_x;
532*495ae853SAndroid Build Coastguard Worker
533*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
534*495ae853SAndroid Build Coastguard Worker /* Temp Variables for Mapping context */
535*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
536*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_wd_in_mbs;
537*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_ht_in_mbs;
538*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_wd_luma, i4_refarray_wd_chroma;
539*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_ht_luma, i4_refarray_ht_chroma;
540*495ae853SAndroid Build Coastguard Worker WORD32 i4_avlblty;
541*495ae853SAndroid Build Coastguard Worker WORD8 i1_cons_intr_samp_flag;
542*495ae853SAndroid Build Coastguard Worker WORD8 i1_slice_id;
543*495ae853SAndroid Build Coastguard Worker WORD8 i1_corner_samp_avlbl_flag;
544*495ae853SAndroid Build Coastguard Worker UWORD8 u1_ny_avlblty;
545*495ae853SAndroid Build Coastguard Worker
546*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
547*495ae853SAndroid Build Coastguard Worker /* Local Pointer Declaration for arrays in Mapping context */
548*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
549*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_refarray_luma;
550*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_refarray_cb, *pu1_refarray_cr;
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
553*495ae853SAndroid Build Coastguard Worker /* Derivation of local variables */
554*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
555*495ae853SAndroid Build Coastguard Worker ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
556*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
557*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_modes = (WORD8 *) ps_ref_mb_mode_map->pv_buffer;
558*495ae853SAndroid Build Coastguard Worker i4_ref_mode_stride = ps_ref_mb_mode_map->i4_num_element_stride;
559*495ae853SAndroid Build Coastguard Worker i4_element_size = ps_ref_mb_mode_map->i4_element_size;
560*495ae853SAndroid Build Coastguard Worker
561*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
562*495ae853SAndroid Build Coastguard Worker /* get the constrained intra resampling flag */
563*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
564*495ae853SAndroid Build Coastguard Worker i1_cons_intr_samp_flag = ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag;
565*495ae853SAndroid Build Coastguard Worker
566*495ae853SAndroid Build Coastguard Worker ASSERT(NULL != pi1_ref_mb_modes);
567*495ae853SAndroid Build Coastguard Worker
568*495ae853SAndroid Build Coastguard Worker i4_ref_wd_in_mbs = ps_lyr_ctxt->i4_ref_width >> 4;
569*495ae853SAndroid Build Coastguard Worker i4_ref_ht_in_mbs = ps_lyr_ctxt->i4_ref_height >> 4;
570*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma = ps_ctxt->pu1_refarray_buffer;
571*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb = ps_ctxt->pu1_refarray_cb;
572*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr = ps_ctxt->pu1_refarray_cr;
573*495ae853SAndroid Build Coastguard Worker
574*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
575*495ae853SAndroid Build Coastguard Worker /* Get the coordinates of the reference layer MB */
576*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
577*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x = u2_mb_x;
578*495ae853SAndroid Build Coastguard Worker i4_mbaddr_y = u2_mb_y;
579*495ae853SAndroid Build Coastguard Worker
580*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
581*495ae853SAndroid Build Coastguard Worker /* Getting the size of the valid area of ref array to be brought in */
582*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
583*495ae853SAndroid Build Coastguard Worker i4_refarray_wd_luma = 20;
584*495ae853SAndroid Build Coastguard Worker i4_refarray_ht_luma = 20;
585*495ae853SAndroid Build Coastguard Worker i4_refarray_wd_chroma = i4_refarray_wd_luma >> 1;
586*495ae853SAndroid Build Coastguard Worker i4_refarray_ht_chroma = i4_refarray_ht_luma >> 1;
587*495ae853SAndroid Build Coastguard Worker
588*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
589*495ae853SAndroid Build Coastguard Worker /* Derivation of ref slice MB idc */
590*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
591*495ae853SAndroid Build Coastguard Worker if(1 == i1_cons_intr_samp_flag)
592*495ae853SAndroid Build Coastguard Worker {
593*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
594*495ae853SAndroid Build Coastguard Worker WORD8 *pi1_ref_mb_mode_tmp;
595*495ae853SAndroid Build Coastguard Worker WORD8 i1_mb_mode;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker /* get the location of the byte which has the current mb mode */
598*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_mode_tmp = pi1_ref_mb_modes;
599*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_mode_tmp += (i4_mbaddr_y * i4_ref_mode_stride * i4_element_size);
600*495ae853SAndroid Build Coastguard Worker pi1_ref_mb_mode_tmp += (i4_mbaddr_x * i4_element_size);
601*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) pi1_ref_mb_mode_tmp;
602*495ae853SAndroid Build Coastguard Worker i1_mb_mode = ps_inter_lyr_mb_prms->i1_mb_mode;
603*495ae853SAndroid Build Coastguard Worker
604*495ae853SAndroid Build Coastguard Worker /* The reference layer MB should be intra */
605*495ae853SAndroid Build Coastguard Worker ASSERT(i1_mb_mode >= 0);
606*495ae853SAndroid Build Coastguard Worker i1_slice_id = i1_mb_mode;
607*495ae853SAndroid Build Coastguard Worker }
608*495ae853SAndroid Build Coastguard Worker else
609*495ae853SAndroid Build Coastguard Worker {
610*495ae853SAndroid Build Coastguard Worker /* set to non valid value */
611*495ae853SAndroid Build Coastguard Worker i1_slice_id = -1;
612*495ae853SAndroid Build Coastguard Worker }
613*495ae853SAndroid Build Coastguard Worker
614*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
615*495ae853SAndroid Build Coastguard Worker /* Bring in the reference array */
616*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
617*495ae853SAndroid Build Coastguard Worker {
618*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
619*495ae853SAndroid Build Coastguard Worker WORD32 i4_src_stride, i4_dst_stride;
620*495ae853SAndroid Build Coastguard Worker
621*495ae853SAndroid Build Coastguard Worker /* Copy luma */
622*495ae853SAndroid Build Coastguard Worker i4_src_stride = i4_inp_luma_stride;
623*495ae853SAndroid Build Coastguard Worker i4_dst_stride = DYADIC_REF_W_Y;
624*495ae853SAndroid Build Coastguard Worker pu1_src = pu1_inp_luma;
625*495ae853SAndroid Build Coastguard Worker pu1_dst = pu1_refarray_luma;
626*495ae853SAndroid Build Coastguard Worker svcd_copy_data(pu1_src, i4_src_stride, pu1_dst, i4_dst_stride, i4_refarray_wd_luma,
627*495ae853SAndroid Build Coastguard Worker i4_refarray_ht_luma);
628*495ae853SAndroid Build Coastguard Worker // Semi planar
629*495ae853SAndroid Build Coastguard Worker i4_src_stride = i4_inp_chroma_stride;
630*495ae853SAndroid Build Coastguard Worker i4_dst_stride = DYADIC_REF_W_C;
631*495ae853SAndroid Build Coastguard Worker pu1_src = pu1_inp_chroma;
632*495ae853SAndroid Build Coastguard Worker svcd_copy_data_semiplanr(pu1_src, i4_src_stride, pu1_refarray_cb, pu1_refarray_cr,
633*495ae853SAndroid Build Coastguard Worker i4_dst_stride, i4_refarray_wd_chroma, i4_refarray_ht_chroma);
634*495ae853SAndroid Build Coastguard Worker }
635*495ae853SAndroid Build Coastguard Worker
636*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
637*495ae853SAndroid Build Coastguard Worker /* Get the availability of 5 neighboring MBs */
638*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
639*495ae853SAndroid Build Coastguard Worker {
640*495ae853SAndroid Build Coastguard Worker /* mb_x + left, mb_y + top */
641*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
642*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x + i4_left, i4_mbaddr_y + i4_top, &i4_avlblty,
643*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
644*495ae853SAndroid Build Coastguard Worker u1_ny_avlblty = i4_avlblty;
645*495ae853SAndroid Build Coastguard Worker
646*495ae853SAndroid Build Coastguard Worker /* mb_x + left, mb_y */
647*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
648*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x + i4_left, i4_mbaddr_y, &i4_avlblty,
649*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
650*495ae853SAndroid Build Coastguard Worker u1_ny_avlblty += (i4_avlblty << 1);
651*495ae853SAndroid Build Coastguard Worker
652*495ae853SAndroid Build Coastguard Worker /* mb_x, mb_y + top */
653*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
654*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x, i4_mbaddr_y + i4_top, &i4_avlblty,
655*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
656*495ae853SAndroid Build Coastguard Worker u1_ny_avlblty += (i4_avlblty << 2);
657*495ae853SAndroid Build Coastguard Worker
658*495ae853SAndroid Build Coastguard Worker /* mb_x - left, mb_y + top */
659*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
660*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x - i4_left, i4_mbaddr_y + i4_top, &i4_avlblty,
661*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
662*495ae853SAndroid Build Coastguard Worker u1_ny_avlblty += (i4_avlblty << 3);
663*495ae853SAndroid Build Coastguard Worker
664*495ae853SAndroid Build Coastguard Worker /* mb_x + left, mb_y - top */
665*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
666*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x + i4_left, i4_mbaddr_y - i4_top, &i4_avlblty,
667*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
668*495ae853SAndroid Build Coastguard Worker u1_ny_avlblty += (i4_avlblty << 4);
669*495ae853SAndroid Build Coastguard Worker }
670*495ae853SAndroid Build Coastguard Worker
671*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
672*495ae853SAndroid Build Coastguard Worker /* Filling the unavailable samples, if any */
673*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
674*495ae853SAndroid Build Coastguard Worker if(0x7 == u1_ny_avlblty)
675*495ae853SAndroid Build Coastguard Worker {
676*495ae853SAndroid Build Coastguard Worker /* All are available, exit */
677*495ae853SAndroid Build Coastguard Worker return;
678*495ae853SAndroid Build Coastguard Worker }
679*495ae853SAndroid Build Coastguard Worker
680*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x7))
681*495ae853SAndroid Build Coastguard Worker {
682*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
683*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
684*495ae853SAndroid Build Coastguard Worker
685*495ae853SAndroid Build Coastguard Worker /* Set the 4 corner samples to (x-xD,y-yD) */
686*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
687*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
688*495ae853SAndroid Build Coastguard Worker
689*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
690*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
691*495ae853SAndroid Build Coastguard Worker
692*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
693*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
694*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
695*495ae853SAndroid Build Coastguard Worker
696*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0] = pu1_tmp_src[i4_ref_xD];
697*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
698*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0] = pu1_tmp_src[i4_ref_xD];
699*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
700*495ae853SAndroid Build Coastguard Worker
701*495ae853SAndroid Build Coastguard Worker /* Set the corner sample of Cb and Cr to (x-xD,y-yD) */
702*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
703*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
704*495ae853SAndroid Build Coastguard Worker
705*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
706*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
707*495ae853SAndroid Build Coastguard Worker
708*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
709*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
710*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
711*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
712*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
713*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
714*495ae853SAndroid Build Coastguard Worker }
715*495ae853SAndroid Build Coastguard Worker
716*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x5))
717*495ae853SAndroid Build Coastguard Worker {
718*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
719*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker /* Copy (x0,ref_yD), (x0+1,ref_yD), ..., (x0+7,ref_yD) to */
722*495ae853SAndroid Build Coastguard Worker /* (x0,y0), (x0+1,y0), ..., (x0+7,y0) and */
723*495ae853SAndroid Build Coastguard Worker /* (x0,y0+1), (x0+1,y0+1), ..., (x0+7,y0+1) */
724*495ae853SAndroid Build Coastguard Worker i4_x0 = 2;
725*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
726*495ae853SAndroid Build Coastguard Worker if(i4_left > 0)
727*495ae853SAndroid Build Coastguard Worker {
728*495ae853SAndroid Build Coastguard Worker i4_x0 += 8;
729*495ae853SAndroid Build Coastguard Worker }
730*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
731*495ae853SAndroid Build Coastguard Worker
732*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
733*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
734*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
735*495ae853SAndroid Build Coastguard Worker
736*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0; i4_x < i4_x0 + 8; i4_x++)
737*495ae853SAndroid Build Coastguard Worker {
738*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x] = pu1_tmp_src[i4_x];
739*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x] = pu1_tmp_src[i4_x];
740*495ae853SAndroid Build Coastguard Worker }
741*495ae853SAndroid Build Coastguard Worker
742*495ae853SAndroid Build Coastguard Worker /* Cb and Cr copy */
743*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
744*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
745*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
748*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
749*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
750*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
751*495ae853SAndroid Build Coastguard Worker
752*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_xc0; i4_x < i4_xc0 + 4; i4_x++)
753*495ae853SAndroid Build Coastguard Worker {
754*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x] = pu1_tmp_src1[i4_x];
755*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x] = pu1_tmp_src2[i4_x];
756*495ae853SAndroid Build Coastguard Worker }
757*495ae853SAndroid Build Coastguard Worker }
758*495ae853SAndroid Build Coastguard Worker
759*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x3))
760*495ae853SAndroid Build Coastguard Worker {
761*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst1, *pu1_tmp_dst2;
762*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
763*495ae853SAndroid Build Coastguard Worker
764*495ae853SAndroid Build Coastguard Worker /* Copy (ref_xD,y0) to (x0,y0) and (x0+1,y0); */
765*495ae853SAndroid Build Coastguard Worker /* copy (ref_xD,y0+1) to (x0,y0+1) and (x0+1,y0+1); ... ;*/
766*495ae853SAndroid Build Coastguard Worker /* copy (ref_xD,y0+7) to (x0,y0+7) and (x0+1,y0+7) */
767*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
768*495ae853SAndroid Build Coastguard Worker i4_y0 = 2;
769*495ae853SAndroid Build Coastguard Worker if(i4_top > 0)
770*495ae853SAndroid Build Coastguard Worker {
771*495ae853SAndroid Build Coastguard Worker i4_y0 += 8;
772*495ae853SAndroid Build Coastguard Worker }
773*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
774*495ae853SAndroid Build Coastguard Worker
775*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
776*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_tmp_src;
777*495ae853SAndroid Build Coastguard Worker
778*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0; i4_y < i4_y0 + 8; i4_y++)
779*495ae853SAndroid Build Coastguard Worker {
780*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0] = pu1_tmp_src[i4_ref_xD];
781*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
782*495ae853SAndroid Build Coastguard Worker pu1_tmp_src += DYADIC_REF_W_Y;
783*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 += DYADIC_REF_W_Y;
784*495ae853SAndroid Build Coastguard Worker }
785*495ae853SAndroid Build Coastguard Worker
786*495ae853SAndroid Build Coastguard Worker /* Cb and Cr copy */
787*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
788*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
789*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
790*495ae853SAndroid Build Coastguard Worker
791*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
792*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_tmp_src1;
793*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
794*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_src2;
795*495ae853SAndroid Build Coastguard Worker
796*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_yc0; i4_y < i4_yc0 + 4; i4_y++)
797*495ae853SAndroid Build Coastguard Worker {
798*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
799*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
800*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 += DYADIC_REF_W_C;
801*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 += DYADIC_REF_W_C;
802*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 += DYADIC_REF_W_C;
803*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 += DYADIC_REF_W_C;
804*495ae853SAndroid Build Coastguard Worker }
805*495ae853SAndroid Build Coastguard Worker }
806*495ae853SAndroid Build Coastguard Worker
807*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x4))
808*495ae853SAndroid Build Coastguard Worker {
809*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x8))
810*495ae853SAndroid Build Coastguard Worker {
811*495ae853SAndroid Build Coastguard Worker /* (mb_x-left,mb_y+top) not available */
812*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
813*495ae853SAndroid Build Coastguard Worker
814*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 - i4_left;
815*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
816*495ae853SAndroid Build Coastguard Worker
817*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
818*495ae853SAndroid Build Coastguard Worker
819*495ae853SAndroid Build Coastguard Worker /* Copy (x0,ref_yD) and (x0+1,ref_yD) to (x0,y0) and (x0+1,y0), and */
820*495ae853SAndroid Build Coastguard Worker /* to (x0,y0+1) and (x0+1,y0+1) */
821*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
822*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
823*495ae853SAndroid Build Coastguard Worker
824*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_x0];
825*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_x0 + 1];
826*495ae853SAndroid Build Coastguard Worker
827*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst += DYADIC_REF_W_Y;
828*495ae853SAndroid Build Coastguard Worker
829*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_x0];
830*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_x0 + 1];
831*495ae853SAndroid Build Coastguard Worker
832*495ae853SAndroid Build Coastguard Worker /* Cb copy */
833*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
834*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
835*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
836*495ae853SAndroid Build Coastguard Worker
837*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
838*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
839*495ae853SAndroid Build Coastguard Worker
840*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_xc0];
841*495ae853SAndroid Build Coastguard Worker
842*495ae853SAndroid Build Coastguard Worker /* Cr copy */
843*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
844*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
845*495ae853SAndroid Build Coastguard Worker
846*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_xc0];
847*495ae853SAndroid Build Coastguard Worker
848*495ae853SAndroid Build Coastguard Worker } /* if (mb_x-left,mb_y+top) not available */
849*495ae853SAndroid Build Coastguard Worker else
850*495ae853SAndroid Build Coastguard Worker {
851*495ae853SAndroid Build Coastguard Worker WORD32 i4_xD, i4_yD;
852*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xD, i4_c_yD;
853*495ae853SAndroid Build Coastguard Worker UWORD8 u1_filled_samp;
854*495ae853SAndroid Build Coastguard Worker
855*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
856*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x - i4_left, i4_mbaddr_y, &i4_avlblty,
857*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
858*495ae853SAndroid Build Coastguard Worker i1_corner_samp_avlbl_flag = i4_avlblty;
859*495ae853SAndroid Build Coastguard Worker
860*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 - i4_left;
861*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
862*495ae853SAndroid Build Coastguard Worker
863*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
864*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
865*495ae853SAndroid Build Coastguard Worker
866*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
867*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - (i4_left * 7) - (i4_left >> 1);
868*495ae853SAndroid Build Coastguard Worker
869*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
870*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
871*495ae853SAndroid Build Coastguard Worker
872*495ae853SAndroid Build Coastguard Worker i4_xD = i4_x0 - i4_ref_xD;
873*495ae853SAndroid Build Coastguard Worker i4_yD = i4_y0 - i4_ref_yD;
874*495ae853SAndroid Build Coastguard Worker
875*495ae853SAndroid Build Coastguard Worker i4_c_xD = i4_xc0 - i4_c_ref_xD;
876*495ae853SAndroid Build Coastguard Worker i4_c_yD = i4_yc0 - i4_c_ref_yD;
877*495ae853SAndroid Build Coastguard Worker
878*495ae853SAndroid Build Coastguard Worker /* Fill corner sample if not available */
879*495ae853SAndroid Build Coastguard Worker if(!i1_corner_samp_avlbl_flag)
880*495ae853SAndroid Build Coastguard Worker {
881*495ae853SAndroid Build Coastguard Worker svcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
882*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, pu1_refarray_cr);
883*495ae853SAndroid Build Coastguard Worker }
884*495ae853SAndroid Build Coastguard Worker
885*495ae853SAndroid Build Coastguard Worker /* Call diagonal construction for luma */
886*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
887*495ae853SAndroid Build Coastguard Worker {
888*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
889*495ae853SAndroid Build Coastguard Worker {
890*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
891*495ae853SAndroid Build Coastguard Worker i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
892*495ae853SAndroid Build Coastguard Worker i4_xD++;
893*495ae853SAndroid Build Coastguard Worker }
894*495ae853SAndroid Build Coastguard Worker i4_yD++;
895*495ae853SAndroid Build Coastguard Worker i4_xD -= 2;
896*495ae853SAndroid Build Coastguard Worker }
897*495ae853SAndroid Build Coastguard Worker
898*495ae853SAndroid Build Coastguard Worker /* Call diagonal construction for chroma */
899*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
900*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, DYADIC_REF_W_C);
901*495ae853SAndroid Build Coastguard Worker
902*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
903*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr, DYADIC_REF_W_C);
904*495ae853SAndroid Build Coastguard Worker }
905*495ae853SAndroid Build Coastguard Worker }
906*495ae853SAndroid Build Coastguard Worker
907*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x2))
908*495ae853SAndroid Build Coastguard Worker {
909*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 0x10))
910*495ae853SAndroid Build Coastguard Worker {
911*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src, *pu1_tmp_dst;
912*495ae853SAndroid Build Coastguard Worker
913*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
914*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 - i4_top;
915*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
916*495ae853SAndroid Build Coastguard Worker
917*495ae853SAndroid Build Coastguard Worker /* Copy (ref_xD,y0) to (x0,y0), (x0+1,y0), and */
918*495ae853SAndroid Build Coastguard Worker /* copy (ref_xD,y0+1) to (x0,y0+1), (x0+1,y0+1) */
919*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
920*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
921*495ae853SAndroid Build Coastguard Worker
922*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_ref_xD];
923*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
924*495ae853SAndroid Build Coastguard Worker
925*495ae853SAndroid Build Coastguard Worker pu1_tmp_src += DYADIC_REF_W_Y;
926*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst += DYADIC_REF_W_Y;
927*495ae853SAndroid Build Coastguard Worker
928*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0] = pu1_tmp_src[i4_ref_xD];
929*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = pu1_tmp_src[i4_ref_xD];
930*495ae853SAndroid Build Coastguard Worker
931*495ae853SAndroid Build Coastguard Worker /* Cb copy */
932*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
933*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
934*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
935*495ae853SAndroid Build Coastguard Worker
936*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
937*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
938*495ae853SAndroid Build Coastguard Worker
939*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_c_ref_xD];
940*495ae853SAndroid Build Coastguard Worker
941*495ae853SAndroid Build Coastguard Worker /* Cr copy */
942*495ae853SAndroid Build Coastguard Worker pu1_tmp_src = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
943*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_tmp_src;
944*495ae853SAndroid Build Coastguard Worker
945*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_xc0] = pu1_tmp_src[i4_c_ref_xD];
946*495ae853SAndroid Build Coastguard Worker
947*495ae853SAndroid Build Coastguard Worker } /* if (mb_x+left,mb_y-top) not available */
948*495ae853SAndroid Build Coastguard Worker else
949*495ae853SAndroid Build Coastguard Worker {
950*495ae853SAndroid Build Coastguard Worker WORD32 i4_xD, i4_yD;
951*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xD, i4_c_yD;
952*495ae853SAndroid Build Coastguard Worker UWORD8 u1_filled_samp;
953*495ae853SAndroid Build Coastguard Worker
954*495ae853SAndroid Build Coastguard Worker svcd_get_ref_layer_avlblty_dyadic(pi1_ref_mb_modes, i4_ref_mode_stride, i4_element_size,
955*495ae853SAndroid Build Coastguard Worker i4_mbaddr_x, i4_mbaddr_y - i4_top, &i4_avlblty,
956*495ae853SAndroid Build Coastguard Worker i1_slice_id, i1_cons_intr_samp_flag);
957*495ae853SAndroid Build Coastguard Worker i1_corner_samp_avlbl_flag = i4_avlblty;
958*495ae853SAndroid Build Coastguard Worker
959*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
960*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 - i4_top;
961*495ae853SAndroid Build Coastguard Worker
962*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
963*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
964*495ae853SAndroid Build Coastguard Worker
965*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
966*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - (i4_top * 7) - (i4_top >> 1);
967*495ae853SAndroid Build Coastguard Worker
968*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
969*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
970*495ae853SAndroid Build Coastguard Worker
971*495ae853SAndroid Build Coastguard Worker i4_xD = i4_x0 - i4_ref_xD;
972*495ae853SAndroid Build Coastguard Worker i4_yD = i4_y0 - i4_ref_yD;
973*495ae853SAndroid Build Coastguard Worker
974*495ae853SAndroid Build Coastguard Worker i4_c_xD = i4_xc0 - i4_c_ref_xD;
975*495ae853SAndroid Build Coastguard Worker i4_c_yD = i4_yc0 - i4_c_ref_yD;
976*495ae853SAndroid Build Coastguard Worker
977*495ae853SAndroid Build Coastguard Worker if(!i1_corner_samp_avlbl_flag)
978*495ae853SAndroid Build Coastguard Worker {
979*495ae853SAndroid Build Coastguard Worker svcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
980*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, pu1_refarray_cr);
981*495ae853SAndroid Build Coastguard Worker }
982*495ae853SAndroid Build Coastguard Worker
983*495ae853SAndroid Build Coastguard Worker /* Call diagonal consrtuction for luma */
984*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
985*495ae853SAndroid Build Coastguard Worker {
986*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
987*495ae853SAndroid Build Coastguard Worker {
988*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
989*495ae853SAndroid Build Coastguard Worker i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
990*495ae853SAndroid Build Coastguard Worker i4_xD++;
991*495ae853SAndroid Build Coastguard Worker }
992*495ae853SAndroid Build Coastguard Worker i4_yD++;
993*495ae853SAndroid Build Coastguard Worker i4_xD -= 2;
994*495ae853SAndroid Build Coastguard Worker }
995*495ae853SAndroid Build Coastguard Worker
996*495ae853SAndroid Build Coastguard Worker /* Call diagonal construction for chroma */
997*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
998*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, DYADIC_REF_W_C);
999*495ae853SAndroid Build Coastguard Worker
1000*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
1001*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr, DYADIC_REF_W_C);
1002*495ae853SAndroid Build Coastguard Worker }
1003*495ae853SAndroid Build Coastguard Worker }
1004*495ae853SAndroid Build Coastguard Worker
1005*495ae853SAndroid Build Coastguard Worker if(u1_ny_avlblty & 1)
1006*495ae853SAndroid Build Coastguard Worker {
1007*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 2))
1008*495ae853SAndroid Build Coastguard Worker {
1009*495ae853SAndroid Build Coastguard Worker /* (mb_x+left,mb_y) is unavailable */
1010*495ae853SAndroid Build Coastguard Worker WORD32 i4_xD, i4_yD;
1011*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xD, i4_c_yD;
1012*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_dst;
1013*495ae853SAndroid Build Coastguard Worker UWORD8 u1_filled_samp;
1014*495ae853SAndroid Build Coastguard Worker
1015*495ae853SAndroid Build Coastguard Worker i1_corner_samp_avlbl_flag = (u1_ny_avlblty & 4) >> 2;
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
1018*495ae853SAndroid Build Coastguard Worker i4_y0 = 2;
1019*495ae853SAndroid Build Coastguard Worker i4_ref_yD = 1;
1020*495ae853SAndroid Build Coastguard Worker if(i4_top > 0)
1021*495ae853SAndroid Build Coastguard Worker {
1022*495ae853SAndroid Build Coastguard Worker i4_y0 += 8;
1023*495ae853SAndroid Build Coastguard Worker i4_ref_yD = 18;
1024*495ae853SAndroid Build Coastguard Worker }
1025*495ae853SAndroid Build Coastguard Worker
1026*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - (i4_left) - (i4_left >> 1);
1027*495ae853SAndroid Build Coastguard Worker
1028*495ae853SAndroid Build Coastguard Worker i4_xD = i4_x0 - i4_ref_xD;
1029*495ae853SAndroid Build Coastguard Worker i4_yD = i4_y0 - i4_ref_yD;
1030*495ae853SAndroid Build Coastguard Worker
1031*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
1032*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
1033*495ae853SAndroid Build Coastguard Worker
1034*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
1035*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
1036*495ae853SAndroid Build Coastguard Worker
1037*495ae853SAndroid Build Coastguard Worker i4_c_xD = i4_xc0 - i4_c_ref_xD;
1038*495ae853SAndroid Build Coastguard Worker i4_c_yD = i4_yc0 - i4_c_ref_yD;
1039*495ae853SAndroid Build Coastguard Worker
1040*495ae853SAndroid Build Coastguard Worker /* Fill corner sample if unavailable */
1041*495ae853SAndroid Build Coastguard Worker if(!i1_corner_samp_avlbl_flag)
1042*495ae853SAndroid Build Coastguard Worker {
1043*495ae853SAndroid Build Coastguard Worker svcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
1044*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, pu1_refarray_cr);
1045*495ae853SAndroid Build Coastguard Worker }
1046*495ae853SAndroid Build Coastguard Worker
1047*495ae853SAndroid Build Coastguard Worker /* Call the diagonal construction for the 8 rows */
1048*495ae853SAndroid Build Coastguard Worker if(i4_top == i4_left)
1049*495ae853SAndroid Build Coastguard Worker {
1050*495ae853SAndroid Build Coastguard Worker /* if top * left = 1 */
1051*495ae853SAndroid Build Coastguard Worker /* (x0,y0) */
1052*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0, i4_y0, i4_xD, i4_yD,
1053*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1054*495ae853SAndroid Build Coastguard Worker
1055*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
1056*495ae853SAndroid Build Coastguard Worker
1057*495ae853SAndroid Build Coastguard Worker /* (x0,y0+1), ..., (x0,y0+7) and */
1058*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0), ..., (x0+1,y0+6) */
1059*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0 + 1; i4_y < i4_y0 + 8; i4_y++)
1060*495ae853SAndroid Build Coastguard Worker {
1061*495ae853SAndroid Build Coastguard Worker i4_yD++;
1062*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1063*495ae853SAndroid Build Coastguard Worker i4_x0, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1064*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = u1_filled_samp;
1065*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst += DYADIC_REF_W_Y;
1066*495ae853SAndroid Build Coastguard Worker }
1067*495ae853SAndroid Build Coastguard Worker
1068*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0+7) */
1069*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1070*495ae853SAndroid Build Coastguard Worker i4_x0 + 1, i4_y0 + 7, i4_xD + 1, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1071*495ae853SAndroid Build Coastguard Worker }
1072*495ae853SAndroid Build Coastguard Worker else
1073*495ae853SAndroid Build Coastguard Worker {
1074*495ae853SAndroid Build Coastguard Worker /* top * left = -1 */
1075*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0) */
1076*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0 + 1, i4_y0, i4_xD + 1, i4_yD,
1077*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1078*495ae853SAndroid Build Coastguard Worker
1079*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
1080*495ae853SAndroid Build Coastguard Worker
1081*495ae853SAndroid Build Coastguard Worker /* (x0,y0), ..., (x0,y0+6) and */
1082*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0+1), ..., (x0+1,y0+7) */
1083*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0; i4_y < i4_y0 + 7; i4_y++)
1084*495ae853SAndroid Build Coastguard Worker {
1085*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1086*495ae853SAndroid Build Coastguard Worker i4_x0, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1087*495ae853SAndroid Build Coastguard Worker
1088*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst += DYADIC_REF_W_Y;
1089*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x0 + 1] = u1_filled_samp;
1090*495ae853SAndroid Build Coastguard Worker i4_yD++;
1091*495ae853SAndroid Build Coastguard Worker }
1092*495ae853SAndroid Build Coastguard Worker /* (x0,y0+7) */
1093*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0, i4_y0 + 7, i4_xD, i4_yD,
1094*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1095*495ae853SAndroid Build Coastguard Worker }
1096*495ae853SAndroid Build Coastguard Worker
1097*495ae853SAndroid Build Coastguard Worker /* For Cb and Cr */
1098*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_yc0; i4_y < i4_yc0 + 4; i4_y++)
1099*495ae853SAndroid Build Coastguard Worker {
1100*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_y, i4_c_xD, i4_c_yD,
1101*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, DYADIC_REF_W_C);
1102*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_y, i4_c_xD, i4_c_yD,
1103*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr, DYADIC_REF_W_C);
1104*495ae853SAndroid Build Coastguard Worker i4_c_yD++;
1105*495ae853SAndroid Build Coastguard Worker }
1106*495ae853SAndroid Build Coastguard Worker
1107*495ae853SAndroid Build Coastguard Worker } /* (mb_x+left,mb_y) is unavailable */
1108*495ae853SAndroid Build Coastguard Worker
1109*495ae853SAndroid Build Coastguard Worker if(!(u1_ny_avlblty & 4))
1110*495ae853SAndroid Build Coastguard Worker {
1111*495ae853SAndroid Build Coastguard Worker /* (mb_x,mb_y+top) is unavailable */
1112*495ae853SAndroid Build Coastguard Worker WORD32 i4_xD, i4_yD;
1113*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xD, i4_c_yD;
1114*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_dst;
1115*495ae853SAndroid Build Coastguard Worker UWORD8 u1_filled_samp;
1116*495ae853SAndroid Build Coastguard Worker
1117*495ae853SAndroid Build Coastguard Worker i1_corner_samp_avlbl_flag = (u1_ny_avlblty & 2) >> 1;
1118*495ae853SAndroid Build Coastguard Worker
1119*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + (i4_top);
1120*495ae853SAndroid Build Coastguard Worker i4_x0 = 2;
1121*495ae853SAndroid Build Coastguard Worker i4_ref_xD = 1;
1122*495ae853SAndroid Build Coastguard Worker if(i4_left > 0)
1123*495ae853SAndroid Build Coastguard Worker {
1124*495ae853SAndroid Build Coastguard Worker i4_x0 += 8;
1125*495ae853SAndroid Build Coastguard Worker i4_ref_xD = 18;
1126*495ae853SAndroid Build Coastguard Worker }
1127*495ae853SAndroid Build Coastguard Worker
1128*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
1129*495ae853SAndroid Build Coastguard Worker
1130*495ae853SAndroid Build Coastguard Worker i4_xD = i4_x0 - i4_ref_xD;
1131*495ae853SAndroid Build Coastguard Worker i4_yD = i4_y0 - i4_ref_yD;
1132*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
1133*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
1134*495ae853SAndroid Build Coastguard Worker
1135*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
1136*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
1137*495ae853SAndroid Build Coastguard Worker i4_c_xD = i4_xc0 - i4_c_ref_xD;
1138*495ae853SAndroid Build Coastguard Worker i4_c_yD = i4_yc0 - i4_c_ref_yD;
1139*495ae853SAndroid Build Coastguard Worker
1140*495ae853SAndroid Build Coastguard Worker if(!i1_corner_samp_avlbl_flag)
1141*495ae853SAndroid Build Coastguard Worker {
1142*495ae853SAndroid Build Coastguard Worker svcd_corner_samp_dyadic(i4_x0, i4_y0, i4_xD, i4_yD, pu1_refarray_luma,
1143*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, pu1_refarray_cr);
1144*495ae853SAndroid Build Coastguard Worker }
1145*495ae853SAndroid Build Coastguard Worker
1146*495ae853SAndroid Build Coastguard Worker /* Call the diagonal construction for the 2 rows */
1147*495ae853SAndroid Build Coastguard Worker if(i4_top == i4_left)
1148*495ae853SAndroid Build Coastguard Worker {
1149*495ae853SAndroid Build Coastguard Worker /* if top * left = 1 */
1150*495ae853SAndroid Build Coastguard Worker /* (x0,y0) */
1151*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0, i4_y0, i4_xD, i4_yD,
1152*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1153*495ae853SAndroid Build Coastguard Worker
1154*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_luma + ((i4_y0 + 1) * DYADIC_REF_W_Y);
1155*495ae853SAndroid Build Coastguard Worker
1156*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0), ..., (x0+7,y0) and */
1157*495ae853SAndroid Build Coastguard Worker /* (x0,y0+1), ..., (x0+6,y0+1) */
1158*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0 + 1; i4_x < i4_x0 + 8; i4_x++)
1159*495ae853SAndroid Build Coastguard Worker {
1160*495ae853SAndroid Build Coastguard Worker i4_xD++;
1161*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1162*495ae853SAndroid Build Coastguard Worker i4_x, i4_y0, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1163*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x - 1] = u1_filled_samp;
1164*495ae853SAndroid Build Coastguard Worker }
1165*495ae853SAndroid Build Coastguard Worker
1166*495ae853SAndroid Build Coastguard Worker /* (x0+7,y0+1) */
1167*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1168*495ae853SAndroid Build Coastguard Worker i4_x0 + 7, i4_y0 + 1, i4_xD, i4_yD + 1, pu1_refarray_luma, DYADIC_REF_W_Y);
1169*495ae853SAndroid Build Coastguard Worker }
1170*495ae853SAndroid Build Coastguard Worker else
1171*495ae853SAndroid Build Coastguard Worker {
1172*495ae853SAndroid Build Coastguard Worker /* top * left = -1 */
1173*495ae853SAndroid Build Coastguard Worker /* (x0,y0+1) */
1174*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0, i4_y0 + 1, i4_xD, i4_yD + 1,
1175*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1176*495ae853SAndroid Build Coastguard Worker
1177*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst = pu1_refarray_luma + ((i4_y0 + 1) * DYADIC_REF_W_Y);
1178*495ae853SAndroid Build Coastguard Worker
1179*495ae853SAndroid Build Coastguard Worker /* (x0,y0), ..., (x0,y0+6) and */
1180*495ae853SAndroid Build Coastguard Worker /* (x0+1,y0+1), ..., (x0+1,y0+7) */
1181*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0; i4_x < i4_x0 + 7; i4_x++)
1182*495ae853SAndroid Build Coastguard Worker {
1183*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1184*495ae853SAndroid Build Coastguard Worker i4_x, i4_y0, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1185*495ae853SAndroid Build Coastguard Worker
1186*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst[i4_x + 1] = u1_filled_samp;
1187*495ae853SAndroid Build Coastguard Worker i4_xD++;
1188*495ae853SAndroid Build Coastguard Worker }
1189*495ae853SAndroid Build Coastguard Worker /* (x0+7,y0) */
1190*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x0 + 7, i4_y0, i4_xD, i4_yD,
1191*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma, DYADIC_REF_W_Y);
1192*495ae853SAndroid Build Coastguard Worker }
1193*495ae853SAndroid Build Coastguard Worker
1194*495ae853SAndroid Build Coastguard Worker /* For Cb and Cr */
1195*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_xc0; i4_x < i4_xc0 + 4; i4_x++)
1196*495ae853SAndroid Build Coastguard Worker {
1197*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x, i4_yc0, i4_c_xD, i4_c_yD,
1198*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, DYADIC_REF_W_C);
1199*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_x, i4_yc0, i4_c_xD, i4_c_yD,
1200*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr, DYADIC_REF_W_C);
1201*495ae853SAndroid Build Coastguard Worker i4_c_xD++;
1202*495ae853SAndroid Build Coastguard Worker }
1203*495ae853SAndroid Build Coastguard Worker
1204*495ae853SAndroid Build Coastguard Worker } /* (mb_x,mb_y+top) is unavailable */
1205*495ae853SAndroid Build Coastguard Worker } /* if (mb_x+left,mb_y+top) not available */
1206*495ae853SAndroid Build Coastguard Worker else
1207*495ae853SAndroid Build Coastguard Worker {
1208*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_dst1, *pu1_tmp_dst2;
1209*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_tmp_src1, *pu1_tmp_src2;
1210*495ae853SAndroid Build Coastguard Worker
1211*495ae853SAndroid Build Coastguard Worker if(0x02 == (u1_ny_avlblty & 0x6))
1212*495ae853SAndroid Build Coastguard Worker {
1213*495ae853SAndroid Build Coastguard Worker /* (mb_x+left,mb_y) available, (mb_x,mb_y+top) unavailable */
1214*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
1215*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
1216*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
1217*495ae853SAndroid Build Coastguard Worker
1218*495ae853SAndroid Build Coastguard Worker /* Copy (x0,ref_yD), (x0+1,ref_yD) to */
1219*495ae853SAndroid Build Coastguard Worker /* (x0,y0), (x0+1,y0), and (x0,y0+1), (x0+1,y0+1) */
1220*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_luma + (i4_ref_yD * DYADIC_REF_W_Y);
1221*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
1222*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_dst1 + DYADIC_REF_W_Y;
1223*495ae853SAndroid Build Coastguard Worker
1224*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0] = pu1_tmp_src1[i4_x0];
1225*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0] = pu1_tmp_src1[i4_x0];
1226*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src1[i4_x0 + 1];
1227*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src1[i4_x0 + 1];
1228*495ae853SAndroid Build Coastguard Worker
1229*495ae853SAndroid Build Coastguard Worker /* Cb and Cr copy */
1230*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
1231*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
1232*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
1233*495ae853SAndroid Build Coastguard Worker
1234*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_cb + (i4_c_ref_yD * DYADIC_REF_W_C);
1235*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
1236*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_refarray_cr + (i4_c_ref_yD * DYADIC_REF_W_C);
1237*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
1238*495ae853SAndroid Build Coastguard Worker
1239*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_xc0];
1240*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_xc0];
1241*495ae853SAndroid Build Coastguard Worker
1242*495ae853SAndroid Build Coastguard Worker } /* if (mb_x+left,mb_y) available, (mb_x,mb_y+top) unavailable */
1243*495ae853SAndroid Build Coastguard Worker else if(0x04 == (u1_ny_avlblty & 0x6))
1244*495ae853SAndroid Build Coastguard Worker {
1245*495ae853SAndroid Build Coastguard Worker /* (mb_x+left,mb_y) unavailable, (mb_x,mb_y+top) available */
1246*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
1247*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
1248*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
1249*495ae853SAndroid Build Coastguard Worker
1250*495ae853SAndroid Build Coastguard Worker /* Copy (ref_xD,y0) to (x0,y0) and (x0+1,y0) */
1251*495ae853SAndroid Build Coastguard Worker /* copy (ref_xD,y0+1) to (x0,y0+1) and (x0+1,y0+1) */
1252*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_luma + (i4_y0 * DYADIC_REF_W_Y);
1253*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_tmp_src1;
1254*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_tmp_src1 + DYADIC_REF_W_Y;
1255*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_src2;
1256*495ae853SAndroid Build Coastguard Worker
1257*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0] = pu1_tmp_src1[i4_ref_xD];
1258*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_x0 + 1] = pu1_tmp_src1[i4_ref_xD];
1259*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0] = pu1_tmp_src2[i4_ref_xD];
1260*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_x0 + 1] = pu1_tmp_src2[i4_ref_xD];
1261*495ae853SAndroid Build Coastguard Worker
1262*495ae853SAndroid Build Coastguard Worker /* Copy Cb and Cr */
1263*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
1264*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
1265*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
1266*495ae853SAndroid Build Coastguard Worker
1267*495ae853SAndroid Build Coastguard Worker pu1_tmp_src1 = pu1_refarray_cb + (i4_yc0 * DYADIC_REF_W_C);
1268*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1 = pu1_tmp_src1;
1269*495ae853SAndroid Build Coastguard Worker pu1_tmp_src2 = pu1_refarray_cr + (i4_yc0 * DYADIC_REF_W_C);
1270*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2 = pu1_tmp_src2;
1271*495ae853SAndroid Build Coastguard Worker
1272*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst1[i4_xc0] = pu1_tmp_src1[i4_c_ref_xD];
1273*495ae853SAndroid Build Coastguard Worker pu1_tmp_dst2[i4_xc0] = pu1_tmp_src2[i4_c_ref_xD];
1274*495ae853SAndroid Build Coastguard Worker
1275*495ae853SAndroid Build Coastguard Worker } /* if (mb_x+left,mb_y) unavailable, (mb_x,mb_y+top) available */
1276*495ae853SAndroid Build Coastguard Worker else if(0x6 == (u1_ny_avlblty & 0x6))
1277*495ae853SAndroid Build Coastguard Worker {
1278*495ae853SAndroid Build Coastguard Worker /* (mb_x+left,mb_y) available, (mb_x,mb_y+top) available */
1279*495ae853SAndroid Build Coastguard Worker WORD32 i4_xD, i4_yD;
1280*495ae853SAndroid Build Coastguard Worker WORD32 i4_c_xD, i4_c_yD;
1281*495ae853SAndroid Build Coastguard Worker UWORD8 u1_filled_samp;
1282*495ae853SAndroid Build Coastguard Worker
1283*495ae853SAndroid Build Coastguard Worker i4_y0 = 9 + (i4_top << 3) + i4_top;
1284*495ae853SAndroid Build Coastguard Worker i4_x0 = 9 + (i4_left << 3) + i4_left;
1285*495ae853SAndroid Build Coastguard Worker
1286*495ae853SAndroid Build Coastguard Worker i4_ref_xD = i4_x0 - i4_left - (i4_left >> 1);
1287*495ae853SAndroid Build Coastguard Worker i4_ref_yD = i4_y0 - i4_top - (i4_top >> 1);
1288*495ae853SAndroid Build Coastguard Worker
1289*495ae853SAndroid Build Coastguard Worker i4_xD = i4_x0 - i4_ref_xD;
1290*495ae853SAndroid Build Coastguard Worker i4_yD = i4_y0 - i4_ref_yD;
1291*495ae853SAndroid Build Coastguard Worker i4_xc0 = i4_x0 >> 1;
1292*495ae853SAndroid Build Coastguard Worker i4_yc0 = i4_y0 >> 1;
1293*495ae853SAndroid Build Coastguard Worker
1294*495ae853SAndroid Build Coastguard Worker i4_c_ref_xD = i4_ref_xD >> 1;
1295*495ae853SAndroid Build Coastguard Worker i4_c_ref_yD = i4_ref_yD >> 1;
1296*495ae853SAndroid Build Coastguard Worker i4_c_xD = i4_xc0 - i4_c_ref_xD;
1297*495ae853SAndroid Build Coastguard Worker i4_c_yD = i4_yc0 - i4_c_ref_yD;
1298*495ae853SAndroid Build Coastguard Worker
1299*495ae853SAndroid Build Coastguard Worker /* Call diagonal construction for luma */
1300*495ae853SAndroid Build Coastguard Worker for(i4_y = i4_y0; i4_y < i4_y0 + 2; i4_y++)
1301*495ae853SAndroid Build Coastguard Worker {
1302*495ae853SAndroid Build Coastguard Worker for(i4_x = i4_x0; i4_x < i4_x0 + 2; i4_x++)
1303*495ae853SAndroid Build Coastguard Worker {
1304*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(
1305*495ae853SAndroid Build Coastguard Worker i4_x, i4_y, i4_xD, i4_yD, pu1_refarray_luma, DYADIC_REF_W_Y);
1306*495ae853SAndroid Build Coastguard Worker i4_xD++;
1307*495ae853SAndroid Build Coastguard Worker }
1308*495ae853SAndroid Build Coastguard Worker i4_yD++;
1309*495ae853SAndroid Build Coastguard Worker i4_xD -= 2;
1310*495ae853SAndroid Build Coastguard Worker }
1311*495ae853SAndroid Build Coastguard Worker
1312*495ae853SAndroid Build Coastguard Worker /* Call diagonal construction for chroma */
1313*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
1314*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb, DYADIC_REF_W_C);
1315*495ae853SAndroid Build Coastguard Worker
1316*495ae853SAndroid Build Coastguard Worker u1_filled_samp = svcd_diagonal_construct_dyadic(i4_xc0, i4_yc0, i4_c_xD, i4_c_yD,
1317*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr, DYADIC_REF_W_C);
1318*495ae853SAndroid Build Coastguard Worker
1319*495ae853SAndroid Build Coastguard Worker } /* if (mb_x+left,mb_y) available, (mb_x,mb_y+top) available */
1320*495ae853SAndroid Build Coastguard Worker } /* (mb_x+left,mb_y+top) available */
1321*495ae853SAndroid Build Coastguard Worker return;
1322*495ae853SAndroid Build Coastguard Worker }
1323*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1324*495ae853SAndroid Build Coastguard Worker /* */
1325*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_interpolate_base_luma_dyadic */
1326*495ae853SAndroid Build Coastguard Worker /* */
1327*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1328*495ae853SAndroid Build Coastguard Worker /* intra resampling for dyadic scaling ratios */
1329*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_inp_buf : ptr to the 12x12 reference sample buffer */
1330*495ae853SAndroid Build Coastguard Worker /* pi2_tmp_filt_buf : ptr to the 12x16 buffer to hold the */
1331*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1332*495ae853SAndroid Build Coastguard Worker /* pu1_out_buf : output buffer pointer */
1333*495ae853SAndroid Build Coastguard Worker /* i4_out_stride : output buffer stride */
1334*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1335*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction followed */
1336*495ae853SAndroid Build Coastguard Worker /* by horizontal direction */
1337*495ae853SAndroid Build Coastguard Worker /* Outputs : resampled pixels */
1338*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1339*495ae853SAndroid Build Coastguard Worker /* */
1340*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1341*495ae853SAndroid Build Coastguard Worker /* */
1342*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1343*495ae853SAndroid Build Coastguard Worker /* */
1344*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1345*495ae853SAndroid Build Coastguard Worker /* 03 12 2010 Nithya creation */
1346*495ae853SAndroid Build Coastguard Worker /* */
1347*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_interpolate_base_luma_dyadic(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride)1348*495ae853SAndroid Build Coastguard Worker void svcd_interpolate_base_luma_dyadic(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
1349*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_buf, WORD32 i4_out_stride)
1350*495ae853SAndroid Build Coastguard Worker {
1351*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1352*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1353*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1, i4_samp_2, i4_samp_3;
1354*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1355*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_src_stride;
1356*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp, *pu1_out;
1357*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1358*495ae853SAndroid Build Coastguard Worker
1359*495ae853SAndroid Build Coastguard Worker /* Filter coefficient values for phase 4 */
1360*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = -3;
1361*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = 28;
1362*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8;
1363*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = -1;
1364*495ae853SAndroid Build Coastguard Worker
1365*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 12;
1366*495ae853SAndroid Build Coastguard Worker i4_src_stride = DYADIC_REF_W_Y;
1367*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1368*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1369*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_buf;
1370*495ae853SAndroid Build Coastguard Worker
1371*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
1372*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < 12; i4_x++)
1373*495ae853SAndroid Build Coastguard Worker {
1374*495ae853SAndroid Build Coastguard Worker /* y = 0, y_phase = 12 */
1375*495ae853SAndroid Build Coastguard Worker i4_samp_0 = pu1_inp[i4_x];
1376*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1377*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1378*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1379*495ae853SAndroid Build Coastguard Worker i4_samp_2 = pu1_inp[i4_x];
1380*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1381*495ae853SAndroid Build Coastguard Worker i4_samp_3 = pu1_inp[i4_x];
1382*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1383*495ae853SAndroid Build Coastguard Worker
1384*495ae853SAndroid Build Coastguard Worker /* since y_phase 12 for y = 0 */
1385*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_3;
1386*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_2;
1387*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_1;
1388*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_0;
1389*495ae853SAndroid Build Coastguard Worker
1390*495ae853SAndroid Build Coastguard Worker /* Store the output */
1391*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1392*495ae853SAndroid Build Coastguard Worker
1393*495ae853SAndroid Build Coastguard Worker /* Increment the output ptr */
1394*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1395*495ae853SAndroid Build Coastguard Worker
1396*495ae853SAndroid Build Coastguard Worker for(i4_y = 1; i4_y < 15; i4_y += 2)
1397*495ae853SAndroid Build Coastguard Worker {
1398*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1399*495ae853SAndroid Build Coastguard Worker i4_samp_1 = i4_samp_2;
1400*495ae853SAndroid Build Coastguard Worker i4_samp_2 = i4_samp_3;
1401*495ae853SAndroid Build Coastguard Worker i4_samp_3 = pu1_inp[i4_x];
1402*495ae853SAndroid Build Coastguard Worker
1403*495ae853SAndroid Build Coastguard Worker /* y_phase is 4 for odd values of y */
1404*495ae853SAndroid Build Coastguard Worker /* and 12 for even values of y */
1405*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1406*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1407*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_2;
1408*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_3;
1409*495ae853SAndroid Build Coastguard Worker
1410*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_3;
1411*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_2;
1412*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_2 * i4_coeff_1;
1413*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_3 * i4_coeff_0;
1414*495ae853SAndroid Build Coastguard Worker
1415*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1416*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1417*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1418*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_2;
1419*495ae853SAndroid Build Coastguard Worker
1420*495ae853SAndroid Build Coastguard Worker /* Incrementing the pointers */
1421*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1422*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1423*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1424*495ae853SAndroid Build Coastguard Worker
1425*495ae853SAndroid Build Coastguard Worker /* y = 15, y_phase = 4 */
1426*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1427*495ae853SAndroid Build Coastguard Worker i4_samp_1 = i4_samp_2;
1428*495ae853SAndroid Build Coastguard Worker i4_samp_2 = i4_samp_3;
1429*495ae853SAndroid Build Coastguard Worker i4_samp_3 = pu1_inp[i4_x];
1430*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1431*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1432*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_2;
1433*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_3;
1434*495ae853SAndroid Build Coastguard Worker
1435*495ae853SAndroid Build Coastguard Worker /* Store the output */
1436*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1437*495ae853SAndroid Build Coastguard Worker
1438*495ae853SAndroid Build Coastguard Worker /* Reinitializing the ptrs */
1439*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1440*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1441*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1442*495ae853SAndroid Build Coastguard Worker
1443*495ae853SAndroid Build Coastguard Worker /* Horizontal interpolation */
1444*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < 16; i4_y++)
1445*495ae853SAndroid Build Coastguard Worker {
1446*495ae853SAndroid Build Coastguard Worker /* x = 0, x_phase = 12 */
1447*495ae853SAndroid Build Coastguard Worker i4_samp_0 = *pi2_tmp++;
1448*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1449*495ae853SAndroid Build Coastguard Worker i4_samp_2 = *pi2_tmp++;
1450*495ae853SAndroid Build Coastguard Worker i4_samp_3 = *pi2_tmp++;
1451*495ae853SAndroid Build Coastguard Worker
1452*495ae853SAndroid Build Coastguard Worker /* since x_phase 12 for x = 0 */
1453*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_3;
1454*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_2;
1455*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_1;
1456*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_0;
1457*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 512;
1458*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 10;
1459*495ae853SAndroid Build Coastguard Worker
1460*495ae853SAndroid Build Coastguard Worker /* Store the output */
1461*495ae853SAndroid Build Coastguard Worker pu1_out[0] = CLIPUCHAR(i4_rslt_1);
1462*495ae853SAndroid Build Coastguard Worker
1463*495ae853SAndroid Build Coastguard Worker for(i4_x = 1; i4_x < 15; i4_x += 2)
1464*495ae853SAndroid Build Coastguard Worker {
1465*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1466*495ae853SAndroid Build Coastguard Worker i4_samp_1 = i4_samp_2;
1467*495ae853SAndroid Build Coastguard Worker i4_samp_2 = i4_samp_3;
1468*495ae853SAndroid Build Coastguard Worker i4_samp_3 = *pi2_tmp++;
1469*495ae853SAndroid Build Coastguard Worker
1470*495ae853SAndroid Build Coastguard Worker /* x_phase is 4 for odd values of x */
1471*495ae853SAndroid Build Coastguard Worker /* and 12 for even values of x */
1472*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1473*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1474*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_2;
1475*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_3;
1476*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 512;
1477*495ae853SAndroid Build Coastguard Worker
1478*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_3;
1479*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_2;
1480*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_2 * i4_coeff_1;
1481*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_3 * i4_coeff_0;
1482*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += 512;
1483*495ae853SAndroid Build Coastguard Worker
1484*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 10;
1485*495ae853SAndroid Build Coastguard Worker i4_rslt_2 >>= 10;
1486*495ae853SAndroid Build Coastguard Worker
1487*495ae853SAndroid Build Coastguard Worker /* Store the output */
1488*495ae853SAndroid Build Coastguard Worker pu1_out[i4_x] = CLIPUCHAR(i4_rslt_1);
1489*495ae853SAndroid Build Coastguard Worker pu1_out[i4_x + 1] = CLIPUCHAR(i4_rslt_2);
1490*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1491*495ae853SAndroid Build Coastguard Worker
1492*495ae853SAndroid Build Coastguard Worker /* x = 15 */
1493*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1494*495ae853SAndroid Build Coastguard Worker i4_samp_1 = i4_samp_2;
1495*495ae853SAndroid Build Coastguard Worker i4_samp_2 = i4_samp_3;
1496*495ae853SAndroid Build Coastguard Worker i4_samp_3 = *pi2_tmp++;
1497*495ae853SAndroid Build Coastguard Worker
1498*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1499*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1500*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_2 * i4_coeff_2;
1501*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_3 * i4_coeff_3;
1502*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 512;
1503*495ae853SAndroid Build Coastguard Worker
1504*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 10;
1505*495ae853SAndroid Build Coastguard Worker
1506*495ae853SAndroid Build Coastguard Worker /* Store the output */
1507*495ae853SAndroid Build Coastguard Worker pu1_out[i4_x] = CLIPUCHAR(i4_rslt_1);
1508*495ae853SAndroid Build Coastguard Worker
1509*495ae853SAndroid Build Coastguard Worker /* Increment the output ptr */
1510*495ae853SAndroid Build Coastguard Worker pu1_out += i4_out_stride;
1511*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1512*495ae853SAndroid Build Coastguard Worker
1513*495ae853SAndroid Build Coastguard Worker } /* svcd_interpolate_base_luma_dyadic */
1514*495ae853SAndroid Build Coastguard Worker
1515*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1516*495ae853SAndroid Build Coastguard Worker /* */
1517*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_vert_interpol_chroma_dyadic_1 */
1518*495ae853SAndroid Build Coastguard Worker /* */
1519*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1520*495ae853SAndroid Build Coastguard Worker /* vertical intra resampling for dyadic scaling ratios for */
1521*495ae853SAndroid Build Coastguard Worker /* chroma for the following ref_lyr_chroma_phase_y_plus1 and*/
1522*495ae853SAndroid Build Coastguard Worker /* chroma_phase_y_plus1: */
1523*495ae853SAndroid Build Coastguard Worker /* ref_lyr cur_lyr */
1524*495ae853SAndroid Build Coastguard Worker /* 0 0 */
1525*495ae853SAndroid Build Coastguard Worker /* 1 0 */
1526*495ae853SAndroid Build Coastguard Worker /* 1 1 */
1527*495ae853SAndroid Build Coastguard Worker /* 1 2 */
1528*495ae853SAndroid Build Coastguard Worker /* 2 1 */
1529*495ae853SAndroid Build Coastguard Worker /* 2 2 */
1530*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_inp_buf : ptr to the 6x6 reference sample buffer */
1531*495ae853SAndroid Build Coastguard Worker /* pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the */
1532*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1533*495ae853SAndroid Build Coastguard Worker /* i4_phase_0 : y phase for even values of y */
1534*495ae853SAndroid Build Coastguard Worker /* i4_phase_1 : y phase for odd values of y */
1535*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1536*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction */
1537*495ae853SAndroid Build Coastguard Worker /* Outputs : vertically resampled samples */
1538*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1539*495ae853SAndroid Build Coastguard Worker /* */
1540*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1541*495ae853SAndroid Build Coastguard Worker /* */
1542*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1543*495ae853SAndroid Build Coastguard Worker /* */
1544*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1545*495ae853SAndroid Build Coastguard Worker /* 06 12 2010 Nithya creation */
1546*495ae853SAndroid Build Coastguard Worker /* */
1547*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_vert_interpol_chroma_dyadic_1(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)1548*495ae853SAndroid Build Coastguard Worker void svcd_vert_interpol_chroma_dyadic_1(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
1549*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase_0, WORD32 i4_phase_1)
1550*495ae853SAndroid Build Coastguard Worker {
1551*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1552*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1553*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1;
1554*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1555*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_src_stride;
1556*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp;
1557*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1558*495ae853SAndroid Build Coastguard Worker
1559*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = 8 - i4_phase_0;
1560*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = i4_phase_0;
1561*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8 - i4_phase_1;
1562*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = i4_phase_1;
1563*495ae853SAndroid Build Coastguard Worker
1564*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1565*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1566*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 6;
1567*495ae853SAndroid Build Coastguard Worker i4_src_stride = DYADIC_REF_W_C;
1568*495ae853SAndroid Build Coastguard Worker
1569*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
1570*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < 6; i4_x++)
1571*495ae853SAndroid Build Coastguard Worker {
1572*495ae853SAndroid Build Coastguard Worker /* y = 0, y_phase = phase_0 */
1573*495ae853SAndroid Build Coastguard Worker i4_samp_0 = pu1_inp[i4_x];
1574*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1575*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1576*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1577*495ae853SAndroid Build Coastguard Worker
1578*495ae853SAndroid Build Coastguard Worker /* since y_phase = phase_0 for y = 0 */
1579*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1580*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1581*495ae853SAndroid Build Coastguard Worker
1582*495ae853SAndroid Build Coastguard Worker /* Store the output */
1583*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1584*495ae853SAndroid Build Coastguard Worker
1585*495ae853SAndroid Build Coastguard Worker /* Increment the output ptr */
1586*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1587*495ae853SAndroid Build Coastguard Worker
1588*495ae853SAndroid Build Coastguard Worker for(i4_y = 1; i4_y < 7; i4_y += 2)
1589*495ae853SAndroid Build Coastguard Worker {
1590*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1591*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1592*495ae853SAndroid Build Coastguard Worker
1593*495ae853SAndroid Build Coastguard Worker /* y_phase is phase_1 for odd values of y */
1594*495ae853SAndroid Build Coastguard Worker /* and phase_0 for even values of y */
1595*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_2;
1596*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_3;
1597*495ae853SAndroid Build Coastguard Worker
1598*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_0;
1599*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_1;
1600*495ae853SAndroid Build Coastguard Worker
1601*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1602*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1603*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1604*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_2;
1605*495ae853SAndroid Build Coastguard Worker
1606*495ae853SAndroid Build Coastguard Worker /* Incrementing the pointers */
1607*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1608*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1609*495ae853SAndroid Build Coastguard Worker
1610*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1611*495ae853SAndroid Build Coastguard Worker
1612*495ae853SAndroid Build Coastguard Worker /* y = 7, y_phase = phase_1 */
1613*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1614*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1615*495ae853SAndroid Build Coastguard Worker
1616*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_2;
1617*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_3;
1618*495ae853SAndroid Build Coastguard Worker
1619*495ae853SAndroid Build Coastguard Worker /* Store the output */
1620*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1621*495ae853SAndroid Build Coastguard Worker
1622*495ae853SAndroid Build Coastguard Worker /* Reinitializing the ptrs */
1623*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1624*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1625*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1626*495ae853SAndroid Build Coastguard Worker } /* svcd_vert_interpol_chroma_dyadic_1 */
1627*495ae853SAndroid Build Coastguard Worker
1628*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1629*495ae853SAndroid Build Coastguard Worker /* */
1630*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_vert_interpol_chroma_dyadic_2 */
1631*495ae853SAndroid Build Coastguard Worker /* */
1632*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1633*495ae853SAndroid Build Coastguard Worker /* vertical intra resampling for dyadic scaling ratios for */
1634*495ae853SAndroid Build Coastguard Worker /* chroma for the following ref_lyr_chroma_phase_y_plus1 and*/
1635*495ae853SAndroid Build Coastguard Worker /* chroma_phase_y_plus1: */
1636*495ae853SAndroid Build Coastguard Worker /* ref_lyr cur_lyr */
1637*495ae853SAndroid Build Coastguard Worker /* 0 1 */
1638*495ae853SAndroid Build Coastguard Worker /* 0 2 */
1639*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_inp_buf : ptr to the 6x6 reference sample buffer */
1640*495ae853SAndroid Build Coastguard Worker /* pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the */
1641*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1642*495ae853SAndroid Build Coastguard Worker /* i4_phase_0 : y phase for even values of y */
1643*495ae853SAndroid Build Coastguard Worker /* i4_phase_1 : y phase for odd values of y */
1644*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1645*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction */
1646*495ae853SAndroid Build Coastguard Worker /* Outputs : vertically resampled samples */
1647*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1648*495ae853SAndroid Build Coastguard Worker /* */
1649*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1650*495ae853SAndroid Build Coastguard Worker /* */
1651*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1652*495ae853SAndroid Build Coastguard Worker /* */
1653*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1654*495ae853SAndroid Build Coastguard Worker /* 06 12 2010 Nithya creation */
1655*495ae853SAndroid Build Coastguard Worker /* */
1656*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_vert_interpol_chroma_dyadic_2(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)1657*495ae853SAndroid Build Coastguard Worker void svcd_vert_interpol_chroma_dyadic_2(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
1658*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase_0, WORD32 i4_phase_1)
1659*495ae853SAndroid Build Coastguard Worker {
1660*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1661*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1662*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1;
1663*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1664*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_src_stride;
1665*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp;
1666*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1667*495ae853SAndroid Build Coastguard Worker
1668*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = 8 - i4_phase_0;
1669*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = i4_phase_0;
1670*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8 - i4_phase_1;
1671*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = i4_phase_1;
1672*495ae853SAndroid Build Coastguard Worker
1673*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1674*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 6;
1675*495ae853SAndroid Build Coastguard Worker i4_src_stride = DYADIC_REF_W_C;
1676*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf + i4_src_stride;
1677*495ae853SAndroid Build Coastguard Worker
1678*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
1679*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < 6; i4_x++)
1680*495ae853SAndroid Build Coastguard Worker {
1681*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1682*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1683*495ae853SAndroid Build Coastguard Worker
1684*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < 8; i4_y += 2)
1685*495ae853SAndroid Build Coastguard Worker {
1686*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1687*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1688*495ae853SAndroid Build Coastguard Worker
1689*495ae853SAndroid Build Coastguard Worker /* y_phase is phase_1 for odd values of y */
1690*495ae853SAndroid Build Coastguard Worker /* and phase_0 for even values of y */
1691*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1692*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1693*495ae853SAndroid Build Coastguard Worker
1694*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_2;
1695*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_3;
1696*495ae853SAndroid Build Coastguard Worker
1697*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1698*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1699*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1700*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_2;
1701*495ae853SAndroid Build Coastguard Worker
1702*495ae853SAndroid Build Coastguard Worker /* Incrementing the pointers */
1703*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1704*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1705*495ae853SAndroid Build Coastguard Worker
1706*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1707*495ae853SAndroid Build Coastguard Worker
1708*495ae853SAndroid Build Coastguard Worker /* Reinitializing the ptrs */
1709*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf + i4_src_stride;
1710*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1711*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1712*495ae853SAndroid Build Coastguard Worker } /* svcd_vert_interpol_chroma_dyadic_2 */
1713*495ae853SAndroid Build Coastguard Worker
1714*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1715*495ae853SAndroid Build Coastguard Worker /* */
1716*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_vert_interpol_chroma_dyadic_3 */
1717*495ae853SAndroid Build Coastguard Worker /* */
1718*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1719*495ae853SAndroid Build Coastguard Worker /* vertical intra resampling for dyadic scaling ratios for */
1720*495ae853SAndroid Build Coastguard Worker /* chroma for the following ref_lyr_chroma_phase_y_plus1 and*/
1721*495ae853SAndroid Build Coastguard Worker /* chroma_phase_y_plus1: */
1722*495ae853SAndroid Build Coastguard Worker /* ref_lyr cur_lyr */
1723*495ae853SAndroid Build Coastguard Worker /* 2 0 */
1724*495ae853SAndroid Build Coastguard Worker /* Inputs : pu1_inp_buf : ptr to the 6x6 reference sample buffer */
1725*495ae853SAndroid Build Coastguard Worker /* pi2_tmp_filt_buf : ptr to the 6x8 buffer to hold the */
1726*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1727*495ae853SAndroid Build Coastguard Worker /* i4_phase_0 : y phase for even values of y */
1728*495ae853SAndroid Build Coastguard Worker /* i4_phase_1 : y phase for odd values of y */
1729*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1730*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction */
1731*495ae853SAndroid Build Coastguard Worker /* Outputs : vertically resampled samples */
1732*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1733*495ae853SAndroid Build Coastguard Worker /* */
1734*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1735*495ae853SAndroid Build Coastguard Worker /* */
1736*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1737*495ae853SAndroid Build Coastguard Worker /* */
1738*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1739*495ae853SAndroid Build Coastguard Worker /* 13 12 2010 Nithya creation */
1740*495ae853SAndroid Build Coastguard Worker /* */
1741*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_vert_interpol_chroma_dyadic_3(UWORD8 * pu1_inp_buf,WORD16 * pi2_tmp_filt_buf,WORD32 i4_phase_0,WORD32 i4_phase_1)1742*495ae853SAndroid Build Coastguard Worker void svcd_vert_interpol_chroma_dyadic_3(UWORD8 *pu1_inp_buf, WORD16 *pi2_tmp_filt_buf,
1743*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase_0, WORD32 i4_phase_1)
1744*495ae853SAndroid Build Coastguard Worker {
1745*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1746*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1747*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1;
1748*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1749*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_src_stride;
1750*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp;
1751*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1752*495ae853SAndroid Build Coastguard Worker
1753*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = 8 - i4_phase_0;
1754*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = i4_phase_0;
1755*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8 - i4_phase_1;
1756*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = i4_phase_1;
1757*495ae853SAndroid Build Coastguard Worker
1758*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1759*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 6;
1760*495ae853SAndroid Build Coastguard Worker i4_src_stride = DYADIC_REF_W_C;
1761*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1762*495ae853SAndroid Build Coastguard Worker
1763*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
1764*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < 6; i4_x++)
1765*495ae853SAndroid Build Coastguard Worker {
1766*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1767*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1768*495ae853SAndroid Build Coastguard Worker
1769*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < 8; i4_y += 2)
1770*495ae853SAndroid Build Coastguard Worker {
1771*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1772*495ae853SAndroid Build Coastguard Worker i4_samp_1 = pu1_inp[i4_x];
1773*495ae853SAndroid Build Coastguard Worker
1774*495ae853SAndroid Build Coastguard Worker /* y_phase is phase_1 for odd values of y */
1775*495ae853SAndroid Build Coastguard Worker /* and phase_0 for even values of y */
1776*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1777*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1778*495ae853SAndroid Build Coastguard Worker
1779*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_2;
1780*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_3;
1781*495ae853SAndroid Build Coastguard Worker
1782*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1783*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_1;
1784*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1785*495ae853SAndroid Build Coastguard Worker pi2_tmp[i4_x] = i4_rslt_2;
1786*495ae853SAndroid Build Coastguard Worker
1787*495ae853SAndroid Build Coastguard Worker /* Incrementing the pointers */
1788*495ae853SAndroid Build Coastguard Worker pi2_tmp += i4_filt_stride;
1789*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_src_stride;
1790*495ae853SAndroid Build Coastguard Worker
1791*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1792*495ae853SAndroid Build Coastguard Worker
1793*495ae853SAndroid Build Coastguard Worker /* Reinitializing the ptrs */
1794*495ae853SAndroid Build Coastguard Worker pu1_inp = pu1_inp_buf;
1795*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1796*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1797*495ae853SAndroid Build Coastguard Worker } /* svcd_vert_interpol_chroma_dyadic_3 */
1798*495ae853SAndroid Build Coastguard Worker
1799*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1800*495ae853SAndroid Build Coastguard Worker /* */
1801*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_horz_interpol_chroma_dyadic_1 */
1802*495ae853SAndroid Build Coastguard Worker /* */
1803*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1804*495ae853SAndroid Build Coastguard Worker /* horizontal intra resampling for dyadic scaling ratios for*/
1805*495ae853SAndroid Build Coastguard Worker /* chroma with following ref_lyr_chroma_phase_x_plus1_flag */
1806*495ae853SAndroid Build Coastguard Worker /* and chroma_phase_x_plus1_flag: */
1807*495ae853SAndroid Build Coastguard Worker /* ref_lyr cur_lyr */
1808*495ae853SAndroid Build Coastguard Worker /* 0 0 */
1809*495ae853SAndroid Build Coastguard Worker /* 1 0 */
1810*495ae853SAndroid Build Coastguard Worker /* 1 1 */
1811*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_tmp_filt_buf : ptr to the 6x8 buffer containing the */
1812*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1813*495ae853SAndroid Build Coastguard Worker /* pu1_out_buf : pointer to the output buffer */
1814*495ae853SAndroid Build Coastguard Worker /* i4_out_stride : output buffer stride */
1815*495ae853SAndroid Build Coastguard Worker /* i4_phase_0 : x phase for even values of x */
1816*495ae853SAndroid Build Coastguard Worker /* i4_phase_1 : x phase for odd values of x */
1817*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1818*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction */
1819*495ae853SAndroid Build Coastguard Worker /* Outputs : resampled samples */
1820*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1821*495ae853SAndroid Build Coastguard Worker /* */
1822*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1823*495ae853SAndroid Build Coastguard Worker /* */
1824*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1825*495ae853SAndroid Build Coastguard Worker /* */
1826*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1827*495ae853SAndroid Build Coastguard Worker /* 06 12 2010 Nithya creation */
1828*495ae853SAndroid Build Coastguard Worker /* */
1829*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_horz_interpol_chroma_dyadic_1(WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride,WORD32 i4_phase_0,WORD32 i4_phase_1)1830*495ae853SAndroid Build Coastguard Worker void svcd_horz_interpol_chroma_dyadic_1(WORD16 *pi2_tmp_filt_buf, UWORD8 *pu1_out_buf,
1831*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_stride, WORD32 i4_phase_0, WORD32 i4_phase_1)
1832*495ae853SAndroid Build Coastguard Worker {
1833*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1834*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1835*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1;
1836*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1837*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_dst_stride;
1838*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out;
1839*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1840*495ae853SAndroid Build Coastguard Worker
1841*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = 8 - i4_phase_0;
1842*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = i4_phase_0;
1843*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8 - i4_phase_1;
1844*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = i4_phase_1;
1845*495ae853SAndroid Build Coastguard Worker
1846*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_buf;
1847*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf;
1848*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 6;
1849*495ae853SAndroid Build Coastguard Worker i4_dst_stride = i4_out_stride;
1850*495ae853SAndroid Build Coastguard Worker
1851*495ae853SAndroid Build Coastguard Worker /* Horizontal interpolation */
1852*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < 8; i4_y++)
1853*495ae853SAndroid Build Coastguard Worker {
1854*495ae853SAndroid Build Coastguard Worker /* x = 0, x_phase = phase_0 */
1855*495ae853SAndroid Build Coastguard Worker i4_samp_0 = *pi2_tmp++;
1856*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1857*495ae853SAndroid Build Coastguard Worker
1858*495ae853SAndroid Build Coastguard Worker /* since x_phase = phase_0 for x = 0 */
1859*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1860*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1861*495ae853SAndroid Build Coastguard Worker
1862*495ae853SAndroid Build Coastguard Worker /* Round to 8-bit value */
1863*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 32;
1864*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 6;
1865*495ae853SAndroid Build Coastguard Worker
1866*495ae853SAndroid Build Coastguard Worker /* Store the output */
1867*495ae853SAndroid Build Coastguard Worker pu1_out[0] = i4_rslt_1;
1868*495ae853SAndroid Build Coastguard Worker
1869*495ae853SAndroid Build Coastguard Worker for(i4_x = 1; i4_x < 7; i4_x += 2)
1870*495ae853SAndroid Build Coastguard Worker {
1871*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1872*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1873*495ae853SAndroid Build Coastguard Worker
1874*495ae853SAndroid Build Coastguard Worker /* x_phase is phase_1 for odd values of x */
1875*495ae853SAndroid Build Coastguard Worker /* and phase_0 for even values of x */
1876*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_2;
1877*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_3;
1878*495ae853SAndroid Build Coastguard Worker
1879*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_0;
1880*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_1;
1881*495ae853SAndroid Build Coastguard Worker
1882*495ae853SAndroid Build Coastguard Worker /* Rounding to 8-bit values */
1883*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 32;
1884*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 6;
1885*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += 32;
1886*495ae853SAndroid Build Coastguard Worker i4_rslt_2 >>= 6;
1887*495ae853SAndroid Build Coastguard Worker
1888*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1889*495ae853SAndroid Build Coastguard Worker pu1_out[2 * i4_x] = i4_rslt_1;
1890*495ae853SAndroid Build Coastguard Worker pu1_out[2 * (i4_x + 1)] = i4_rslt_2;
1891*495ae853SAndroid Build Coastguard Worker
1892*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1893*495ae853SAndroid Build Coastguard Worker
1894*495ae853SAndroid Build Coastguard Worker /* y = 7, y_phase = phase_1 */
1895*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1896*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1897*495ae853SAndroid Build Coastguard Worker
1898*495ae853SAndroid Build Coastguard Worker /* since x_phase = phase_1 for x = 7 */
1899*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_2;
1900*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_3;
1901*495ae853SAndroid Build Coastguard Worker
1902*495ae853SAndroid Build Coastguard Worker /* Round to 8-bit value */
1903*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 32;
1904*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 6;
1905*495ae853SAndroid Build Coastguard Worker
1906*495ae853SAndroid Build Coastguard Worker /* Store the output */
1907*495ae853SAndroid Build Coastguard Worker pu1_out[2 * 7] = i4_rslt_1;
1908*495ae853SAndroid Build Coastguard Worker
1909*495ae853SAndroid Build Coastguard Worker /* Incrementing the output ptr */
1910*495ae853SAndroid Build Coastguard Worker pu1_out += i4_dst_stride;
1911*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1912*495ae853SAndroid Build Coastguard Worker } /* svcd_horz_interpol_chroma_dyadic_1 */
1913*495ae853SAndroid Build Coastguard Worker
1914*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1915*495ae853SAndroid Build Coastguard Worker /* */
1916*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_horz_interpol_chroma_dyadic_2 */
1917*495ae853SAndroid Build Coastguard Worker /* */
1918*495ae853SAndroid Build Coastguard Worker /* Description : This function takes the reference array buffer & performs*/
1919*495ae853SAndroid Build Coastguard Worker /* horizontal intra resampling for dyadic scaling ratios for*/
1920*495ae853SAndroid Build Coastguard Worker /* chroma with following ref_lyr_chroma_phase_x_plus1_flag */
1921*495ae853SAndroid Build Coastguard Worker /* and chroma_phase_x_plus1_flag: */
1922*495ae853SAndroid Build Coastguard Worker /* ref_lyr cur_lyr */
1923*495ae853SAndroid Build Coastguard Worker /* 0 1 */
1924*495ae853SAndroid Build Coastguard Worker /* Inputs : pi2_tmp_filt_buf : ptr to the 6x8 buffer containing the */
1925*495ae853SAndroid Build Coastguard Worker /* vertically interpolated data */
1926*495ae853SAndroid Build Coastguard Worker /* pu1_out_buf : pointer to the output buffer */
1927*495ae853SAndroid Build Coastguard Worker /* i4_out_stride : output buffer stride */
1928*495ae853SAndroid Build Coastguard Worker /* i4_phase_0 : x phase for even values of x */
1929*495ae853SAndroid Build Coastguard Worker /* i4_phase_1 : x phase for odd values of x */
1930*495ae853SAndroid Build Coastguard Worker /* Globals : none */
1931*495ae853SAndroid Build Coastguard Worker /* Processing : it does the interpolation in vertical direction */
1932*495ae853SAndroid Build Coastguard Worker /* Outputs : resampled samples */
1933*495ae853SAndroid Build Coastguard Worker /* Returns : none */
1934*495ae853SAndroid Build Coastguard Worker /* */
1935*495ae853SAndroid Build Coastguard Worker /* Issues : none */
1936*495ae853SAndroid Build Coastguard Worker /* */
1937*495ae853SAndroid Build Coastguard Worker /* Revision History: */
1938*495ae853SAndroid Build Coastguard Worker /* */
1939*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
1940*495ae853SAndroid Build Coastguard Worker /* 06 12 2010 Nithya creation */
1941*495ae853SAndroid Build Coastguard Worker /* */
1942*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_horz_interpol_chroma_dyadic_2(WORD16 * pi2_tmp_filt_buf,UWORD8 * pu1_out_buf,WORD32 i4_out_stride,WORD32 i4_phase_0,WORD32 i4_phase_1)1943*495ae853SAndroid Build Coastguard Worker void svcd_horz_interpol_chroma_dyadic_2(WORD16 *pi2_tmp_filt_buf, UWORD8 *pu1_out_buf,
1944*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_stride, WORD32 i4_phase_0, WORD32 i4_phase_1)
1945*495ae853SAndroid Build Coastguard Worker {
1946*495ae853SAndroid Build Coastguard Worker WORD32 i4_x, i4_y;
1947*495ae853SAndroid Build Coastguard Worker WORD32 i4_coeff_0, i4_coeff_1, i4_coeff_2, i4_coeff_3;
1948*495ae853SAndroid Build Coastguard Worker WORD32 i4_samp_0, i4_samp_1;
1949*495ae853SAndroid Build Coastguard Worker WORD32 i4_rslt_1, i4_rslt_2;
1950*495ae853SAndroid Build Coastguard Worker WORD32 i4_filt_stride, i4_dst_stride;
1951*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out;
1952*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp;
1953*495ae853SAndroid Build Coastguard Worker
1954*495ae853SAndroid Build Coastguard Worker i4_coeff_0 = 8 - i4_phase_0;
1955*495ae853SAndroid Build Coastguard Worker i4_coeff_1 = i4_phase_0;
1956*495ae853SAndroid Build Coastguard Worker i4_coeff_2 = 8 - i4_phase_1;
1957*495ae853SAndroid Build Coastguard Worker i4_coeff_3 = i4_phase_1;
1958*495ae853SAndroid Build Coastguard Worker
1959*495ae853SAndroid Build Coastguard Worker pu1_out = pu1_out_buf;
1960*495ae853SAndroid Build Coastguard Worker pi2_tmp = pi2_tmp_filt_buf + 1;
1961*495ae853SAndroid Build Coastguard Worker i4_filt_stride = 6;
1962*495ae853SAndroid Build Coastguard Worker i4_dst_stride = i4_out_stride;
1963*495ae853SAndroid Build Coastguard Worker
1964*495ae853SAndroid Build Coastguard Worker /* Horizontal interpolation */
1965*495ae853SAndroid Build Coastguard Worker for(i4_y = 0; i4_y < 8; i4_y++)
1966*495ae853SAndroid Build Coastguard Worker {
1967*495ae853SAndroid Build Coastguard Worker /* x = 0, x_phase = phase_0 */
1968*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1969*495ae853SAndroid Build Coastguard Worker
1970*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < 8; i4_x += 2)
1971*495ae853SAndroid Build Coastguard Worker {
1972*495ae853SAndroid Build Coastguard Worker i4_samp_0 = i4_samp_1;
1973*495ae853SAndroid Build Coastguard Worker i4_samp_1 = *pi2_tmp++;
1974*495ae853SAndroid Build Coastguard Worker
1975*495ae853SAndroid Build Coastguard Worker /* x_phase is phase_1 for odd values of x */
1976*495ae853SAndroid Build Coastguard Worker /* and phase_0 for even values of x */
1977*495ae853SAndroid Build Coastguard Worker i4_rslt_1 = i4_samp_0 * i4_coeff_0;
1978*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += i4_samp_1 * i4_coeff_1;
1979*495ae853SAndroid Build Coastguard Worker
1980*495ae853SAndroid Build Coastguard Worker i4_rslt_2 = i4_samp_0 * i4_coeff_2;
1981*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += i4_samp_1 * i4_coeff_3;
1982*495ae853SAndroid Build Coastguard Worker
1983*495ae853SAndroid Build Coastguard Worker /* Rounding to 8-bit values */
1984*495ae853SAndroid Build Coastguard Worker i4_rslt_1 += 32;
1985*495ae853SAndroid Build Coastguard Worker i4_rslt_1 >>= 6;
1986*495ae853SAndroid Build Coastguard Worker i4_rslt_2 += 32;
1987*495ae853SAndroid Build Coastguard Worker i4_rslt_2 >>= 6;
1988*495ae853SAndroid Build Coastguard Worker
1989*495ae853SAndroid Build Coastguard Worker /* Storing the results */
1990*495ae853SAndroid Build Coastguard Worker pu1_out[2 * i4_x] = i4_rslt_1;
1991*495ae853SAndroid Build Coastguard Worker pu1_out[2 * (i4_x + 1)] = i4_rslt_2;
1992*495ae853SAndroid Build Coastguard Worker
1993*495ae853SAndroid Build Coastguard Worker } /* End of loop over x */
1994*495ae853SAndroid Build Coastguard Worker
1995*495ae853SAndroid Build Coastguard Worker /* Incrementing the ptrs */
1996*495ae853SAndroid Build Coastguard Worker pi2_tmp += 1;
1997*495ae853SAndroid Build Coastguard Worker pu1_out += i4_dst_stride;
1998*495ae853SAndroid Build Coastguard Worker } /* End of loop over y */
1999*495ae853SAndroid Build Coastguard Worker } /* svcd_horz_interpol_chroma_dyadic_2 */
2000*495ae853SAndroid Build Coastguard Worker
2001*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2002*495ae853SAndroid Build Coastguard Worker /* */
2003*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_intra_samp_mb_dyadic */
2004*495ae853SAndroid Build Coastguard Worker /* */
2005*495ae853SAndroid Build Coastguard Worker /* Description : MB level function which performs the intra resampling */
2006*495ae853SAndroid Build Coastguard Worker /* of data of an MB (luma and chroma inclusive) for dyadic */
2007*495ae853SAndroid Build Coastguard Worker /* scaling ratios */
2008*495ae853SAndroid Build Coastguard Worker /* */
2009*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_intra_samp_ctxt : intra sampling context */
2010*495ae853SAndroid Build Coastguard Worker /* ps_ref_luma : reference layer luma data buffer desc */
2011*495ae853SAndroid Build Coastguard Worker /* ps_ref_chroma : reference layer chroma data buffer desc */
2012*495ae853SAndroid Build Coastguard Worker /* ps_ref_mb_mode_map : ref layer mb mode map buff desc */
2013*495ae853SAndroid Build Coastguard Worker /* ps_curr_luma : current layer out luma buffer desc */
2014*495ae853SAndroid Build Coastguard Worker /* ps_curr_chroma : current layer out chroma buffer desc */
2015*495ae853SAndroid Build Coastguard Worker /* x,y : current mb coorinate */
2016*495ae853SAndroid Build Coastguard Worker /* Globals : none */
2017*495ae853SAndroid Build Coastguard Worker /* Processing : it calls the reference layer construction followed by */
2018*495ae853SAndroid Build Coastguard Worker /* interpolation function for luma and cb and cr */
2019*495ae853SAndroid Build Coastguard Worker /* Outputs : inter resampled data of current MB */
2020*495ae853SAndroid Build Coastguard Worker /* Returns : none */
2021*495ae853SAndroid Build Coastguard Worker /* */
2022*495ae853SAndroid Build Coastguard Worker /* Issues : none */
2023*495ae853SAndroid Build Coastguard Worker /* */
2024*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2025*495ae853SAndroid Build Coastguard Worker /* */
2026*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2027*495ae853SAndroid Build Coastguard Worker /* 07 12 2010 Nithya creation */
2028*495ae853SAndroid Build Coastguard Worker /* */
2029*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_intra_samp_mb_dyadic(void * pv_intra_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_mb_mode_map,mem_element_t * ps_curr_luma,mem_element_t * ps_curr_chroma,UWORD16 u2_mb_x,UWORD16 u2_mb_y,void * pv_dec)2030*495ae853SAndroid Build Coastguard Worker void svcd_intra_samp_mb_dyadic(void *pv_intra_samp_ctxt, mem_element_t *ps_ref_luma,
2031*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_mb_mode_map,
2032*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_curr_luma, mem_element_t *ps_curr_chroma,
2033*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_x, UWORD16 u2_mb_y, void *pv_dec)
2034*495ae853SAndroid Build Coastguard Worker {
2035*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2036*495ae853SAndroid Build Coastguard Worker /* I/O buffer params */
2037*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2038*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp_luma, *pu1_inp_chroma;
2039*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_luma, *pu1_out_chroma;
2040*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_out_cb, *pu1_out_cr;
2041*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_refarray_luma, *pu1_refarray_cb, *pu1_refarray_cr;
2042*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_tmp_filt_buf;
2043*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_luma_stride, i4_inp_chroma_stride;
2044*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_luma_stride, i4_out_chroma_stride;
2045*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_x_ref, u2_mb_y_ref;
2046*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *) pv_dec;
2047*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
2048*495ae853SAndroid Build Coastguard Worker dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
2049*495ae853SAndroid Build Coastguard Worker
2050*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2051*495ae853SAndroid Build Coastguard Worker /* Intra resampling ctxt pointers */
2052*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2053*495ae853SAndroid Build Coastguard Worker intra_sampling_ctxt_t *ps_ctxt;
2054*495ae853SAndroid Build Coastguard Worker intra_samp_lyr_ctxt *ps_lyr_ctxt;
2055*495ae853SAndroid Build Coastguard Worker res_prms_t *ps_res_prms;
2056*495ae853SAndroid Build Coastguard Worker
2057*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2058*495ae853SAndroid Build Coastguard Worker /* reference and current layer MB coordinates */
2059*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2060*495ae853SAndroid Build Coastguard Worker WORD32 i4_scaled_mb_x, i4_scaled_mb_y;
2061*495ae853SAndroid Build Coastguard Worker WORD32 i4_top, i4_left;
2062*495ae853SAndroid Build Coastguard Worker
2063*495ae853SAndroid Build Coastguard Worker ps_svc_slice_params = &ps_slice->s_svc_slice_params;
2064*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2065*495ae853SAndroid Build Coastguard Worker /* Pointer derivation */
2066*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2067*495ae853SAndroid Build Coastguard Worker ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
2068*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
2069*495ae853SAndroid Build Coastguard Worker ps_res_prms = ps_ctxt->ps_res_prms;
2070*495ae853SAndroid Build Coastguard Worker
2071*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2072*495ae853SAndroid Build Coastguard Worker /* MB coordinate derivation */
2073*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2074*495ae853SAndroid Build Coastguard Worker i4_scaled_mb_x = u2_mb_x - (ps_svc_slice_params->i4_scaled_ref_layer_left_offset >> 4);
2075*495ae853SAndroid Build Coastguard Worker // (ps_res_prms->s_ref_lyr_scaled_offset.i2_left >> 4); SVC_DEC_EXT_REVIEW
2076*495ae853SAndroid Build Coastguard Worker i4_scaled_mb_y = u2_mb_y - (ps_svc_slice_params->i4_scaled_ref_layer_top_offset >> 4);
2077*495ae853SAndroid Build Coastguard Worker //(ps_res_prms->s_ref_lyr_scaled_offset.i2_top >> 4); SVC_DEC_EXT_REVIEW
2078*495ae853SAndroid Build Coastguard Worker
2079*495ae853SAndroid Build Coastguard Worker if(i4_scaled_mb_x & 0x1)
2080*495ae853SAndroid Build Coastguard Worker {
2081*495ae853SAndroid Build Coastguard Worker i4_left = 1;
2082*495ae853SAndroid Build Coastguard Worker }
2083*495ae853SAndroid Build Coastguard Worker else
2084*495ae853SAndroid Build Coastguard Worker {
2085*495ae853SAndroid Build Coastguard Worker i4_left = -1;
2086*495ae853SAndroid Build Coastguard Worker }
2087*495ae853SAndroid Build Coastguard Worker if(i4_scaled_mb_y & 0x1)
2088*495ae853SAndroid Build Coastguard Worker {
2089*495ae853SAndroid Build Coastguard Worker i4_top = 1;
2090*495ae853SAndroid Build Coastguard Worker }
2091*495ae853SAndroid Build Coastguard Worker else
2092*495ae853SAndroid Build Coastguard Worker {
2093*495ae853SAndroid Build Coastguard Worker i4_top = -1;
2094*495ae853SAndroid Build Coastguard Worker }
2095*495ae853SAndroid Build Coastguard Worker
2096*495ae853SAndroid Build Coastguard Worker u2_mb_x_ref = (i4_scaled_mb_x >> 1);
2097*495ae853SAndroid Build Coastguard Worker u2_mb_y_ref = (i4_scaled_mb_y >> 1);
2098*495ae853SAndroid Build Coastguard Worker
2099*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2100*495ae853SAndroid Build Coastguard Worker /* Reference Array Consrtuction - luma and chroma */
2101*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2102*495ae853SAndroid Build Coastguard Worker
2103*495ae853SAndroid Build Coastguard Worker pu1_inp_luma = (UWORD8 *) ps_ref_luma->pv_buffer;
2104*495ae853SAndroid Build Coastguard Worker pu1_inp_chroma = (UWORD8 *) ps_ref_chroma->pv_buffer;
2105*495ae853SAndroid Build Coastguard Worker
2106*495ae853SAndroid Build Coastguard Worker i4_inp_luma_stride = ps_ref_luma->i4_num_element_stride;
2107*495ae853SAndroid Build Coastguard Worker i4_inp_chroma_stride = ps_ref_chroma->i4_num_element_stride;
2108*495ae853SAndroid Build Coastguard Worker
2109*495ae853SAndroid Build Coastguard Worker /* ------- Constructing refSampleArray ----------------------- */
2110*495ae853SAndroid Build Coastguard Worker svcd_reflayer_construction_dyadic(pv_intra_samp_ctxt, ps_ref_mb_mode_map, pu1_inp_luma,
2111*495ae853SAndroid Build Coastguard Worker pu1_inp_chroma, i4_inp_luma_stride, i4_inp_chroma_stride,
2112*495ae853SAndroid Build Coastguard Worker i4_top, i4_left, u2_mb_x_ref, u2_mb_y_ref);
2113*495ae853SAndroid Build Coastguard Worker
2114*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2115*495ae853SAndroid Build Coastguard Worker /* LUMA INTERPOLATION */
2116*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2117*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma = ps_ctxt->pu1_refarray_buffer;
2118*495ae853SAndroid Build Coastguard Worker if(1 == i4_top)
2119*495ae853SAndroid Build Coastguard Worker {
2120*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma += (DYADIC_REF_W_Y << 3);
2121*495ae853SAndroid Build Coastguard Worker }
2122*495ae853SAndroid Build Coastguard Worker if(1 == i4_left)
2123*495ae853SAndroid Build Coastguard Worker {
2124*495ae853SAndroid Build Coastguard Worker pu1_refarray_luma += 8;
2125*495ae853SAndroid Build Coastguard Worker }
2126*495ae853SAndroid Build Coastguard Worker pu1_out_luma = (UWORD8 *) ps_curr_luma->pv_buffer;
2127*495ae853SAndroid Build Coastguard Worker i4_out_luma_stride = ps_curr_luma->i4_num_element_stride;
2128*495ae853SAndroid Build Coastguard Worker pi2_tmp_filt_buf = (WORD16 *) ps_ctxt->pi4_temp_interpolation_buffer;
2129*495ae853SAndroid Build Coastguard Worker
2130*495ae853SAndroid Build Coastguard Worker svcd_interpolate_base_luma_dyadic(pu1_refarray_luma, pi2_tmp_filt_buf, pu1_out_luma,
2131*495ae853SAndroid Build Coastguard Worker i4_out_luma_stride);
2132*495ae853SAndroid Build Coastguard Worker
2133*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2134*495ae853SAndroid Build Coastguard Worker /* CHROMA INTERPOLATION */
2135*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
2136*495ae853SAndroid Build Coastguard Worker pu1_out_chroma = (UWORD8 *) ps_curr_chroma->pv_buffer;
2137*495ae853SAndroid Build Coastguard Worker i4_out_chroma_stride =
2138*495ae853SAndroid Build Coastguard Worker ps_curr_chroma->i4_num_element_stride; // << 1; SVC_DEC_REVIEW_INTRA_RESAMPLE
2139*495ae853SAndroid Build Coastguard Worker
2140*495ae853SAndroid Build Coastguard Worker /* CB */
2141*495ae853SAndroid Build Coastguard Worker pu1_out_cb = pu1_out_chroma;
2142*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb = ps_ctxt->pu1_refarray_cb;
2143*495ae853SAndroid Build Coastguard Worker
2144*495ae853SAndroid Build Coastguard Worker if(1 == i4_top)
2145*495ae853SAndroid Build Coastguard Worker {
2146*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb += (DYADIC_REF_W_C << 2);
2147*495ae853SAndroid Build Coastguard Worker }
2148*495ae853SAndroid Build Coastguard Worker if(1 == i4_left)
2149*495ae853SAndroid Build Coastguard Worker {
2150*495ae853SAndroid Build Coastguard Worker pu1_refarray_cb += 4;
2151*495ae853SAndroid Build Coastguard Worker }
2152*495ae853SAndroid Build Coastguard Worker
2153*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
2154*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_vert_chroma_interpol(pu1_refarray_cb, pi2_tmp_filt_buf,
2155*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_y_phase_0, ps_lyr_ctxt->i4_y_phase_1);
2156*495ae853SAndroid Build Coastguard Worker
2157*495ae853SAndroid Build Coastguard Worker /* Horizontal interpolation */
2158*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_horz_chroma_interpol(pi2_tmp_filt_buf, pu1_out_cb, i4_out_chroma_stride,
2159*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_x_phase_0, ps_lyr_ctxt->i4_x_phase_1);
2160*495ae853SAndroid Build Coastguard Worker
2161*495ae853SAndroid Build Coastguard Worker /* CR */
2162*495ae853SAndroid Build Coastguard Worker pu1_out_cr = pu1_out_chroma + 1;
2163*495ae853SAndroid Build Coastguard Worker // (i4_out_chroma_stride >> 1); SVC_DEC_REVIEW_INTRA_RESAMPLE
2164*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr = ps_ctxt->pu1_refarray_cr;
2165*495ae853SAndroid Build Coastguard Worker
2166*495ae853SAndroid Build Coastguard Worker if(1 == i4_top)
2167*495ae853SAndroid Build Coastguard Worker {
2168*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr += (DYADIC_REF_W_C << 2);
2169*495ae853SAndroid Build Coastguard Worker }
2170*495ae853SAndroid Build Coastguard Worker if(1 == i4_left)
2171*495ae853SAndroid Build Coastguard Worker {
2172*495ae853SAndroid Build Coastguard Worker pu1_refarray_cr += 4;
2173*495ae853SAndroid Build Coastguard Worker }
2174*495ae853SAndroid Build Coastguard Worker
2175*495ae853SAndroid Build Coastguard Worker /* Vertical interpolation */
2176*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_vert_chroma_interpol(pu1_refarray_cr, pi2_tmp_filt_buf,
2177*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_y_phase_0, ps_lyr_ctxt->i4_y_phase_1);
2178*495ae853SAndroid Build Coastguard Worker
2179*495ae853SAndroid Build Coastguard Worker /* Horizontal interpolation */
2180*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_horz_chroma_interpol(pi2_tmp_filt_buf, pu1_out_cr, i4_out_chroma_stride,
2181*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_x_phase_0, ps_lyr_ctxt->i4_x_phase_1);
2182*495ae853SAndroid Build Coastguard Worker return;
2183*495ae853SAndroid Build Coastguard Worker }
2184*495ae853SAndroid Build Coastguard Worker
2185*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2186*495ae853SAndroid Build Coastguard Worker /* */
2187*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_residual_chroma_dyadic_alt */
2188*495ae853SAndroid Build Coastguard Worker /* */
2189*495ae853SAndroid Build Coastguard Worker /* Description : this fucntion does the upsampling of chroma residuals for*/
2190*495ae853SAndroid Build Coastguard Worker /* Dyadic cases and specific chroma phase cases */
2191*495ae853SAndroid Build Coastguard Worker /* */
2192*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */
2193*495ae853SAndroid Build Coastguard Worker /* pu1_inp_data : input 8 bit data pointer */
2194*495ae853SAndroid Build Coastguard Worker /* i4_inp_data_stride : input buffer stride */
2195*495ae853SAndroid Build Coastguard Worker /* pi2_out_res : output 16 bit buffer pointer */
2196*495ae853SAndroid Build Coastguard Worker /* i4_out_res_stride : Output buffer stride */
2197*495ae853SAndroid Build Coastguard Worker /* pu1_inp_bitmap : input packed sign bit data pointer */
2198*495ae853SAndroid Build Coastguard Worker /* i4_inp_bitmap_stride : sign bit buffer stride */
2199*495ae853SAndroid Build Coastguard Worker /* i4_start_bit_pos : bit position in the byte of packed */
2200*495ae853SAndroid Build Coastguard Worker /* sign values */
2201*495ae853SAndroid Build Coastguard Worker /* Globals : none */
2202*495ae853SAndroid Build Coastguard Worker /* Processing : it does the upsampling with intial phase values */
2203*495ae853SAndroid Build Coastguard Worker /* */
2204*495ae853SAndroid Build Coastguard Worker /* Outputs : Upsampled residuals for chroma */
2205*495ae853SAndroid Build Coastguard Worker /* Returns : none */
2206*495ae853SAndroid Build Coastguard Worker /* */
2207*495ae853SAndroid Build Coastguard Worker /* Issues : none */
2208*495ae853SAndroid Build Coastguard Worker /* */
2209*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2210*495ae853SAndroid Build Coastguard Worker /* */
2211*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2212*495ae853SAndroid Build Coastguard Worker /* 25 09 2010 vijayakumar creation */
2213*495ae853SAndroid Build Coastguard Worker /* */
2214*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_residual_chroma_dyadic_alt(void * pv_residual_samp_ctxt,UWORD16 u2_mb_x,UWORD16 u2_mb_y,mem_element_t * ps_ref_mb_mode,UWORD8 * pu1_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride,UWORD8 * pu1_inp_bitmap,WORD32 i4_inp_bitmap_stride,WORD32 i4_cr_flag)2215*495ae853SAndroid Build Coastguard Worker void svcd_residual_chroma_dyadic_alt(void *pv_residual_samp_ctxt, UWORD16 u2_mb_x, UWORD16 u2_mb_y,
2216*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_ref_mb_mode, UWORD8 *pu1_inp_data,
2217*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
2218*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_res_stride, UWORD8 *pu1_inp_bitmap,
2219*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_bitmap_stride, WORD32 i4_cr_flag)
2220*495ae853SAndroid Build Coastguard Worker {
2221*495ae853SAndroid Build Coastguard Worker residual_sampling_ctxt_t *ps_ctxt;
2222*495ae853SAndroid Build Coastguard Worker res_lyr_ctxt *ps_lyr_ctxt;
2223*495ae853SAndroid Build Coastguard Worker ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
2224*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
2225*495ae853SAndroid Build Coastguard Worker /* ----------------- Processing ------------------------------- */
2226*495ae853SAndroid Build Coastguard Worker {
2227*495ae853SAndroid Build Coastguard Worker ref_pixel_map_t *ps_pos_phase;
2228*495ae853SAndroid Build Coastguard Worker residual_samp_map_ctxt_t *ps_chroma_map;
2229*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_chroma;
2230*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_chroma;
2231*495ae853SAndroid Build Coastguard Worker
2232*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
2233*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_ref_data_byte, *pu1_ref_sign_byte;
2234*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array;
2235*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase1, i4_phase2;
2236*495ae853SAndroid Build Coastguard Worker WORD32 i4_start_bit_pos = 0;
2237*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_x, i4_offset_y;
2238*495ae853SAndroid Build Coastguard Worker WORD32 i4_chrm_horz_int_mode, i4_chrm_vert_int_mode;
2239*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_intp_ctr = SUB_BLOCK_HEIGHT;
2240*495ae853SAndroid Build Coastguard Worker
2241*495ae853SAndroid Build Coastguard Worker ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
2242*495ae853SAndroid Build Coastguard Worker ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
2243*495ae853SAndroid Build Coastguard Worker ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
2244*495ae853SAndroid Build Coastguard Worker
2245*495ae853SAndroid Build Coastguard Worker /* get the actual offset for the buffers */
2246*495ae853SAndroid Build Coastguard Worker i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset;
2247*495ae853SAndroid Build Coastguard Worker i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset;
2248*495ae853SAndroid Build Coastguard Worker
2249*495ae853SAndroid Build Coastguard Worker {
2250*495ae853SAndroid Build Coastguard Worker UWORD8 u1_mask;
2251*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_x, i4_mb_y;
2252*495ae853SAndroid Build Coastguard Worker WORD32 i4_chrm_nnz;
2253*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_element_stride;
2254*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms, *ps_inter_lyr_mb_prms_curr;
2255*495ae853SAndroid Build Coastguard Worker
2256*495ae853SAndroid Build Coastguard Worker u1_mask = (SVCD_TRUE == i4_cr_flag) ? 0xF0 : 0x0F;
2257*495ae853SAndroid Build Coastguard Worker
2258*495ae853SAndroid Build Coastguard Worker /* Top Left */
2259*495ae853SAndroid Build Coastguard Worker i4_mb_x = i4_offset_x >> 3;
2260*495ae853SAndroid Build Coastguard Worker i4_mb_y = i4_offset_y >> 3;
2261*495ae853SAndroid Build Coastguard Worker
2262*495ae853SAndroid Build Coastguard Worker /* get the location of the byte which has the current mb mode */
2263*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms = ps_ref_mb_mode->pv_buffer;
2264*495ae853SAndroid Build Coastguard Worker i4_num_element_stride = ps_ref_mb_mode->i4_num_element_stride;
2265*495ae853SAndroid Build Coastguard Worker
2266*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
2267*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
2268*495ae853SAndroid Build Coastguard Worker
2269*495ae853SAndroid Build Coastguard Worker i4_chrm_nnz = ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
2270*495ae853SAndroid Build Coastguard Worker
2271*495ae853SAndroid Build Coastguard Worker /* Top Right */
2272*495ae853SAndroid Build Coastguard Worker i4_mb_x = (i4_offset_x + 4) >> 3;
2273*495ae853SAndroid Build Coastguard Worker
2274*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
2275*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
2276*495ae853SAndroid Build Coastguard Worker
2277*495ae853SAndroid Build Coastguard Worker i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
2278*495ae853SAndroid Build Coastguard Worker
2279*495ae853SAndroid Build Coastguard Worker /* Bottom Left */
2280*495ae853SAndroid Build Coastguard Worker i4_mb_x = i4_offset_x >> 3;
2281*495ae853SAndroid Build Coastguard Worker i4_mb_y = (i4_offset_y + 4) >> 3;
2282*495ae853SAndroid Build Coastguard Worker
2283*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
2284*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
2285*495ae853SAndroid Build Coastguard Worker
2286*495ae853SAndroid Build Coastguard Worker i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
2287*495ae853SAndroid Build Coastguard Worker
2288*495ae853SAndroid Build Coastguard Worker /* Bottom Right */
2289*495ae853SAndroid Build Coastguard Worker i4_mb_x = (i4_offset_x + 4) >> 3;
2290*495ae853SAndroid Build Coastguard Worker
2291*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr = ps_inter_lyr_mb_prms + i4_mb_x;
2292*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms_curr += i4_mb_y * i4_num_element_stride;
2293*495ae853SAndroid Build Coastguard Worker
2294*495ae853SAndroid Build Coastguard Worker i4_chrm_nnz |= ps_inter_lyr_mb_prms_curr->u1_chroma_nnz & u1_mask;
2295*495ae853SAndroid Build Coastguard Worker
2296*495ae853SAndroid Build Coastguard Worker if(0 == i4_chrm_nnz)
2297*495ae853SAndroid Build Coastguard Worker {
2298*495ae853SAndroid Build Coastguard Worker return;
2299*495ae853SAndroid Build Coastguard Worker }
2300*495ae853SAndroid Build Coastguard Worker }
2301*495ae853SAndroid Build Coastguard Worker
2302*495ae853SAndroid Build Coastguard Worker i4_chrm_horz_int_mode = ps_lyr_ctxt->i4_chrm_horz_int_mode;
2303*495ae853SAndroid Build Coastguard Worker i4_chrm_vert_int_mode = ps_lyr_ctxt->i4_chrm_vert_int_mode;
2304*495ae853SAndroid Build Coastguard Worker
2305*495ae853SAndroid Build Coastguard Worker if(0 == i4_chrm_horz_int_mode)
2306*495ae853SAndroid Build Coastguard Worker {
2307*495ae853SAndroid Build Coastguard Worker if(i4_offset_x >= 0)
2308*495ae853SAndroid Build Coastguard Worker {
2309*495ae853SAndroid Build Coastguard Worker pu1_inp_data++;
2310*495ae853SAndroid Build Coastguard Worker if(0 == ((i4_offset_x + 1) & 7))
2311*495ae853SAndroid Build Coastguard Worker {
2312*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap++;
2313*495ae853SAndroid Build Coastguard Worker }
2314*495ae853SAndroid Build Coastguard Worker }
2315*495ae853SAndroid Build Coastguard Worker }
2316*495ae853SAndroid Build Coastguard Worker
2317*495ae853SAndroid Build Coastguard Worker if(0 == i4_chrm_vert_int_mode)
2318*495ae853SAndroid Build Coastguard Worker {
2319*495ae853SAndroid Build Coastguard Worker if(i4_offset_y >= 0)
2320*495ae853SAndroid Build Coastguard Worker {
2321*495ae853SAndroid Build Coastguard Worker pu1_inp_data += i4_inp_data_stride;
2322*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap += i4_inp_bitmap_stride;
2323*495ae853SAndroid Build Coastguard Worker }
2324*495ae853SAndroid Build Coastguard Worker }
2325*495ae853SAndroid Build Coastguard Worker else
2326*495ae853SAndroid Build Coastguard Worker {
2327*495ae853SAndroid Build Coastguard Worker /* extra additional row of interpolation required for this case */
2328*495ae853SAndroid Build Coastguard Worker i4_horz_intp_ctr++;
2329*495ae853SAndroid Build Coastguard Worker }
2330*495ae853SAndroid Build Coastguard Worker
2331*495ae853SAndroid Build Coastguard Worker /* set the appropriate bit pos */
2332*495ae853SAndroid Build Coastguard Worker if(1 == (u2_mb_x & 1))
2333*495ae853SAndroid Build Coastguard Worker {
2334*495ae853SAndroid Build Coastguard Worker i4_start_bit_pos = 4;
2335*495ae853SAndroid Build Coastguard Worker }
2336*495ae853SAndroid Build Coastguard Worker
2337*495ae853SAndroid Build Coastguard Worker /* ----------- Horizontal Interpolation ---------------- */
2338*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data;
2339*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte = pu1_inp_bitmap;
2340*495ae853SAndroid Build Coastguard Worker ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase;
2341*495ae853SAndroid Build Coastguard Worker
2342*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
2343*495ae853SAndroid Build Coastguard Worker i4_phase1 = ps_pos_phase[0].i2_phase;
2344*495ae853SAndroid Build Coastguard Worker i4_phase2 = (i4_phase1 + 8) & 0x0F;
2345*495ae853SAndroid Build Coastguard Worker
2346*495ae853SAndroid Build Coastguard Worker /* interchange the phase values for corner case */
2347*495ae853SAndroid Build Coastguard Worker if(1 == i4_chrm_horz_int_mode)
2348*495ae853SAndroid Build Coastguard Worker {
2349*495ae853SAndroid Build Coastguard Worker WORD32 i4_temp;
2350*495ae853SAndroid Build Coastguard Worker i4_temp = i4_phase1;
2351*495ae853SAndroid Build Coastguard Worker i4_phase1 = i4_phase2;
2352*495ae853SAndroid Build Coastguard Worker i4_phase2 = i4_temp;
2353*495ae853SAndroid Build Coastguard Worker }
2354*495ae853SAndroid Build Coastguard Worker
2355*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < i4_horz_intp_ctr; i4_i++)
2356*495ae853SAndroid Build Coastguard Worker {
2357*495ae853SAndroid Build Coastguard Worker WORD16 i2_coeff1, i2_coeff2;
2358*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign;
2359*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign_byte = *pu1_ref_sign_byte;
2360*495ae853SAndroid Build Coastguard Worker
2361*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (pu1_ref_data_byte[0]);
2362*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_start_bit_pos);
2363*495ae853SAndroid Build Coastguard Worker
2364*495ae853SAndroid Build Coastguard Worker /* if signed number */
2365*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2366*495ae853SAndroid Build Coastguard Worker {
2367*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2368*495ae853SAndroid Build Coastguard Worker }
2369*495ae853SAndroid Build Coastguard Worker
2370*495ae853SAndroid Build Coastguard Worker if(0 == i4_chrm_horz_int_mode)
2371*495ae853SAndroid Build Coastguard Worker {
2372*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2373*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 4;
2374*495ae853SAndroid Build Coastguard Worker }
2375*495ae853SAndroid Build Coastguard Worker
2376*495ae853SAndroid Build Coastguard Worker {
2377*495ae853SAndroid Build Coastguard Worker /* unroll count 1 */
2378*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (pu1_ref_data_byte[1]);
2379*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 1));
2380*495ae853SAndroid Build Coastguard Worker
2381*495ae853SAndroid Build Coastguard Worker /* if signed number */
2382*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2383*495ae853SAndroid Build Coastguard Worker {
2384*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2385*495ae853SAndroid Build Coastguard Worker }
2386*495ae853SAndroid Build Coastguard Worker
2387*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2388*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
2389*495ae853SAndroid Build Coastguard Worker
2390*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
2391*495ae853SAndroid Build Coastguard Worker
2392*495ae853SAndroid Build Coastguard Worker /* unroll count 2 */
2393*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (pu1_ref_data_byte[2]);
2394*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 2));
2395*495ae853SAndroid Build Coastguard Worker
2396*495ae853SAndroid Build Coastguard Worker /* if signed number */
2397*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2398*495ae853SAndroid Build Coastguard Worker {
2399*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2400*495ae853SAndroid Build Coastguard Worker }
2401*495ae853SAndroid Build Coastguard Worker
2402*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2403*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1);
2404*495ae853SAndroid Build Coastguard Worker
2405*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1);
2406*495ae853SAndroid Build Coastguard Worker
2407*495ae853SAndroid Build Coastguard Worker /* unroll count 3 */
2408*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (pu1_ref_data_byte[3]);
2409*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 3));
2410*495ae853SAndroid Build Coastguard Worker
2411*495ae853SAndroid Build Coastguard Worker /* if signed number */
2412*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2413*495ae853SAndroid Build Coastguard Worker {
2414*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2415*495ae853SAndroid Build Coastguard Worker }
2416*495ae853SAndroid Build Coastguard Worker
2417*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2418*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
2419*495ae853SAndroid Build Coastguard Worker
2420*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
2421*495ae853SAndroid Build Coastguard Worker }
2422*495ae853SAndroid Build Coastguard Worker
2423*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2424*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff2 << 4;
2425*495ae853SAndroid Build Coastguard Worker
2426*495ae853SAndroid Build Coastguard Worker if(1 == i4_chrm_horz_int_mode)
2427*495ae853SAndroid Build Coastguard Worker {
2428*495ae853SAndroid Build Coastguard Worker WORD32 i4_bit_pos = i4_start_bit_pos + 4;
2429*495ae853SAndroid Build Coastguard Worker
2430*495ae853SAndroid Build Coastguard Worker if(8 == i4_bit_pos)
2431*495ae853SAndroid Build Coastguard Worker {
2432*495ae853SAndroid Build Coastguard Worker u1_sign_byte = *(pu1_ref_sign_byte + 1);
2433*495ae853SAndroid Build Coastguard Worker i4_bit_pos = 0;
2434*495ae853SAndroid Build Coastguard Worker }
2435*495ae853SAndroid Build Coastguard Worker
2436*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (pu1_ref_data_byte[4]);
2437*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2438*495ae853SAndroid Build Coastguard Worker
2439*495ae853SAndroid Build Coastguard Worker /* if signed number */
2440*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2441*495ae853SAndroid Build Coastguard Worker {
2442*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2443*495ae853SAndroid Build Coastguard Worker }
2444*495ae853SAndroid Build Coastguard Worker
2445*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2446*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 4;
2447*495ae853SAndroid Build Coastguard Worker }
2448*495ae853SAndroid Build Coastguard Worker
2449*495ae853SAndroid Build Coastguard Worker /* vertical loop updates */
2450*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data + ((i4_i + 1) * i4_inp_data_stride);
2451*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte += i4_inp_bitmap_stride;
2452*495ae853SAndroid Build Coastguard Worker }
2453*495ae853SAndroid Build Coastguard Worker
2454*495ae853SAndroid Build Coastguard Worker /* ----------- Vertical Interpolation ---------------- */
2455*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
2456*495ae853SAndroid Build Coastguard Worker ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase;
2457*495ae853SAndroid Build Coastguard Worker i4_phase1 = ps_pos_phase[0].i2_phase;
2458*495ae853SAndroid Build Coastguard Worker i4_phase2 = (i4_phase1 + 8) & 0x0F;
2459*495ae853SAndroid Build Coastguard Worker
2460*495ae853SAndroid Build Coastguard Worker /* interchange the phase values for corner case */
2461*495ae853SAndroid Build Coastguard Worker if(0 != i4_chrm_vert_int_mode)
2462*495ae853SAndroid Build Coastguard Worker {
2463*495ae853SAndroid Build Coastguard Worker WORD32 i4_temp;
2464*495ae853SAndroid Build Coastguard Worker i4_temp = i4_phase1;
2465*495ae853SAndroid Build Coastguard Worker i4_phase1 = i4_phase2;
2466*495ae853SAndroid Build Coastguard Worker i4_phase2 = i4_temp;
2467*495ae853SAndroid Build Coastguard Worker }
2468*495ae853SAndroid Build Coastguard Worker
2469*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
2470*495ae853SAndroid Build Coastguard Worker {
2471*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out;
2472*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_temp;
2473*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_samp_1, i4_horz_samp_2;
2474*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_res;
2475*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp = pi4_ref_array;
2476*495ae853SAndroid Build Coastguard Worker
2477*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2478*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2479*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2480*495ae853SAndroid Build Coastguard Worker
2481*495ae853SAndroid Build Coastguard Worker if(1 != i4_chrm_vert_int_mode)
2482*495ae853SAndroid Build Coastguard Worker {
2483*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 8) >> 4;
2484*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2485*495ae853SAndroid Build Coastguard Worker }
2486*495ae853SAndroid Build Coastguard Worker
2487*495ae853SAndroid Build Coastguard Worker if(2 == i4_chrm_vert_int_mode)
2488*495ae853SAndroid Build Coastguard Worker {
2489*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2490*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2491*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 8) >> 4;
2492*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2493*495ae853SAndroid Build Coastguard Worker }
2494*495ae853SAndroid Build Coastguard Worker
2495*495ae853SAndroid Build Coastguard Worker {
2496*495ae853SAndroid Build Coastguard Worker /* unroll count 1 */
2497*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
2498*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2499*495ae853SAndroid Build Coastguard Worker
2500*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2501*495ae853SAndroid Build Coastguard Worker *pi2_out =
2502*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
2503*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2504*495ae853SAndroid Build Coastguard Worker
2505*495ae853SAndroid Build Coastguard Worker /* unroll count 2 */
2506*495ae853SAndroid Build Coastguard Worker *pi2_out =
2507*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
2508*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2509*495ae853SAndroid Build Coastguard Worker
2510*495ae853SAndroid Build Coastguard Worker /* unroll count 3 */
2511*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2512*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2513*495ae853SAndroid Build Coastguard Worker
2514*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2515*495ae853SAndroid Build Coastguard Worker *pi2_out =
2516*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8;
2517*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2518*495ae853SAndroid Build Coastguard Worker
2519*495ae853SAndroid Build Coastguard Worker /* unroll count 4 */
2520*495ae853SAndroid Build Coastguard Worker *pi2_out =
2521*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8;
2522*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2523*495ae853SAndroid Build Coastguard Worker
2524*495ae853SAndroid Build Coastguard Worker /* unroll count 5 */
2525*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
2526*495ae853SAndroid Build Coastguard Worker
2527*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2528*495ae853SAndroid Build Coastguard Worker *pi2_out =
2529*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
2530*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2531*495ae853SAndroid Build Coastguard Worker
2532*495ae853SAndroid Build Coastguard Worker /* unroll count 6 */
2533*495ae853SAndroid Build Coastguard Worker *pi2_out =
2534*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
2535*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2536*495ae853SAndroid Build Coastguard Worker }
2537*495ae853SAndroid Build Coastguard Worker
2538*495ae853SAndroid Build Coastguard Worker if(2 != i4_chrm_vert_int_mode)
2539*495ae853SAndroid Build Coastguard Worker {
2540*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2541*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_2 + 8) >> 4;
2542*495ae853SAndroid Build Coastguard Worker
2543*495ae853SAndroid Build Coastguard Worker if(1 == i4_chrm_vert_int_mode)
2544*495ae853SAndroid Build Coastguard Worker {
2545*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2546*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2547*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2548*495ae853SAndroid Build Coastguard Worker
2549*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2550*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 8) >> 4;
2551*495ae853SAndroid Build Coastguard Worker }
2552*495ae853SAndroid Build Coastguard Worker }
2553*495ae853SAndroid Build Coastguard Worker
2554*495ae853SAndroid Build Coastguard Worker /* horizontal loop updates */
2555*495ae853SAndroid Build Coastguard Worker pi4_ref_array++;
2556*495ae853SAndroid Build Coastguard Worker pi2_out_res++;
2557*495ae853SAndroid Build Coastguard Worker }
2558*495ae853SAndroid Build Coastguard Worker }
2559*495ae853SAndroid Build Coastguard Worker return;
2560*495ae853SAndroid Build Coastguard Worker }
2561*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2562*495ae853SAndroid Build Coastguard Worker /* */
2563*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_residual_chroma_dyadic */
2564*495ae853SAndroid Build Coastguard Worker /* */
2565*495ae853SAndroid Build Coastguard Worker /* Description : this fucntion does the upsampling of chroma residuals for*/
2566*495ae853SAndroid Build Coastguard Worker /* Dyadic cases */
2567*495ae853SAndroid Build Coastguard Worker /* */
2568*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */
2569*495ae853SAndroid Build Coastguard Worker /* pu1_inp_data : input 8 bit data pointer */
2570*495ae853SAndroid Build Coastguard Worker /* i4_inp_data_stride : input buffer stride */
2571*495ae853SAndroid Build Coastguard Worker /* pi2_out_res : output 16 bit buffer pointer */
2572*495ae853SAndroid Build Coastguard Worker /* i4_out_res_stride : Output buffer stride */
2573*495ae853SAndroid Build Coastguard Worker /* pu1_inp_bitmap : input packed sign bit data pointer */
2574*495ae853SAndroid Build Coastguard Worker /* i4_inp_bitmap_stride : sign bit buffer stride */
2575*495ae853SAndroid Build Coastguard Worker /* i4_start_bit_pos : bit position in the byte of packed */
2576*495ae853SAndroid Build Coastguard Worker /* sign values */
2577*495ae853SAndroid Build Coastguard Worker /* Globals : none */
2578*495ae853SAndroid Build Coastguard Worker /* Processing : it does the upsampling with intial phase values */
2579*495ae853SAndroid Build Coastguard Worker /* */
2580*495ae853SAndroid Build Coastguard Worker /* Outputs : Upsampled residuals for chroma */
2581*495ae853SAndroid Build Coastguard Worker /* Returns : none */
2582*495ae853SAndroid Build Coastguard Worker /* */
2583*495ae853SAndroid Build Coastguard Worker /* Issues : none */
2584*495ae853SAndroid Build Coastguard Worker /* */
2585*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2586*495ae853SAndroid Build Coastguard Worker /* */
2587*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2588*495ae853SAndroid Build Coastguard Worker /* 25 09 2010 vijayakumar creation */
2589*495ae853SAndroid Build Coastguard Worker /* */
2590*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_residual_chroma_dyadic(void * pv_residual_samp_ctxt,UWORD8 * pu1_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride,UWORD8 * pu1_inp_bitmap,WORD32 i4_inp_bitmap_stride,WORD32 i4_start_bit_pos)2591*495ae853SAndroid Build Coastguard Worker void svcd_residual_chroma_dyadic(void *pv_residual_samp_ctxt, UWORD8 *pu1_inp_data,
2592*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
2593*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_res_stride, UWORD8 *pu1_inp_bitmap,
2594*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_bitmap_stride, WORD32 i4_start_bit_pos)
2595*495ae853SAndroid Build Coastguard Worker {
2596*495ae853SAndroid Build Coastguard Worker residual_sampling_ctxt_t *ps_ctxt;
2597*495ae853SAndroid Build Coastguard Worker res_lyr_ctxt *ps_lyr_ctxt;
2598*495ae853SAndroid Build Coastguard Worker ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
2599*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
2600*495ae853SAndroid Build Coastguard Worker /* ----------------- Processing ------------------------------- */
2601*495ae853SAndroid Build Coastguard Worker {
2602*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
2603*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_ref_data_byte, *pu1_ref_sign_byte;
2604*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array;
2605*495ae853SAndroid Build Coastguard Worker ref_pixel_map_t *ps_pos_phase;
2606*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase1, i4_phase2;
2607*495ae853SAndroid Build Coastguard Worker
2608*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data;
2609*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte = pu1_inp_bitmap;
2610*495ae853SAndroid Build Coastguard Worker ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_pos_phase;
2611*495ae853SAndroid Build Coastguard Worker
2612*495ae853SAndroid Build Coastguard Worker /* ----------- Horizontal Interpolation ---------------- */
2613*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
2614*495ae853SAndroid Build Coastguard Worker i4_phase1 = ps_pos_phase[0].i2_phase;
2615*495ae853SAndroid Build Coastguard Worker i4_phase2 = (i4_phase1 + 8) & 0x0F;
2616*495ae853SAndroid Build Coastguard Worker
2617*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++)
2618*495ae853SAndroid Build Coastguard Worker {
2619*495ae853SAndroid Build Coastguard Worker WORD16 i2_coeff1, i2_coeff2;
2620*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign;
2621*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign_byte = *pu1_ref_sign_byte;
2622*495ae853SAndroid Build Coastguard Worker
2623*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (pu1_ref_data_byte[0]);
2624*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_start_bit_pos);
2625*495ae853SAndroid Build Coastguard Worker
2626*495ae853SAndroid Build Coastguard Worker /* if signed number */
2627*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2628*495ae853SAndroid Build Coastguard Worker {
2629*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2630*495ae853SAndroid Build Coastguard Worker }
2631*495ae853SAndroid Build Coastguard Worker
2632*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2633*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 4;
2634*495ae853SAndroid Build Coastguard Worker
2635*495ae853SAndroid Build Coastguard Worker {
2636*495ae853SAndroid Build Coastguard Worker /* unroll count 1 */
2637*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (pu1_ref_data_byte[1]);
2638*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 1));
2639*495ae853SAndroid Build Coastguard Worker
2640*495ae853SAndroid Build Coastguard Worker /* if signed number */
2641*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2642*495ae853SAndroid Build Coastguard Worker {
2643*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2644*495ae853SAndroid Build Coastguard Worker }
2645*495ae853SAndroid Build Coastguard Worker
2646*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2647*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
2648*495ae853SAndroid Build Coastguard Worker
2649*495ae853SAndroid Build Coastguard Worker /* unroll count 2 */
2650*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
2651*495ae853SAndroid Build Coastguard Worker
2652*495ae853SAndroid Build Coastguard Worker /* unroll count 3 */
2653*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (pu1_ref_data_byte[2]);
2654*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 2));
2655*495ae853SAndroid Build Coastguard Worker
2656*495ae853SAndroid Build Coastguard Worker /* if signed number */
2657*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2658*495ae853SAndroid Build Coastguard Worker {
2659*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2660*495ae853SAndroid Build Coastguard Worker }
2661*495ae853SAndroid Build Coastguard Worker
2662*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2663*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff2 + i4_phase2 * i2_coeff1);
2664*495ae853SAndroid Build Coastguard Worker
2665*495ae853SAndroid Build Coastguard Worker /* unroll count 4 */
2666*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff2 + i4_phase1 * i2_coeff1);
2667*495ae853SAndroid Build Coastguard Worker
2668*495ae853SAndroid Build Coastguard Worker /* unroll count 5 */
2669*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (pu1_ref_data_byte[3]);
2670*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, (i4_start_bit_pos + 3));
2671*495ae853SAndroid Build Coastguard Worker
2672*495ae853SAndroid Build Coastguard Worker /* if signed number */
2673*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2674*495ae853SAndroid Build Coastguard Worker {
2675*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2676*495ae853SAndroid Build Coastguard Worker }
2677*495ae853SAndroid Build Coastguard Worker
2678*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2679*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase2) * i2_coeff1 + i4_phase2 * i2_coeff2);
2680*495ae853SAndroid Build Coastguard Worker
2681*495ae853SAndroid Build Coastguard Worker /* unroll count 6 */
2682*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((16 - i4_phase1) * i2_coeff1 + i4_phase1 * i2_coeff2);
2683*495ae853SAndroid Build Coastguard Worker }
2684*495ae853SAndroid Build Coastguard Worker
2685*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2686*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff2 << 4;
2687*495ae853SAndroid Build Coastguard Worker
2688*495ae853SAndroid Build Coastguard Worker /* vertical loop uopdates */
2689*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data + ((i4_i + 1) * i4_inp_data_stride);
2690*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte += i4_inp_bitmap_stride;
2691*495ae853SAndroid Build Coastguard Worker }
2692*495ae853SAndroid Build Coastguard Worker
2693*495ae853SAndroid Build Coastguard Worker /* ----------- Vertical Interpolation ---------------- */
2694*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) ps_ctxt->pi2_refarray_buffer;
2695*495ae853SAndroid Build Coastguard Worker ps_pos_phase = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_pos_phase;
2696*495ae853SAndroid Build Coastguard Worker i4_phase1 = ps_pos_phase[0].i2_phase;
2697*495ae853SAndroid Build Coastguard Worker i4_phase2 = (i4_phase1 + 8) & 0x0F;
2698*495ae853SAndroid Build Coastguard Worker
2699*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
2700*495ae853SAndroid Build Coastguard Worker {
2701*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out;
2702*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_temp;
2703*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_samp_1, i4_horz_samp_2;
2704*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_res;
2705*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp = pi4_ref_array;
2706*495ae853SAndroid Build Coastguard Worker
2707*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2708*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2709*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2710*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 8) >> 4;
2711*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2712*495ae853SAndroid Build Coastguard Worker
2713*495ae853SAndroid Build Coastguard Worker {
2714*495ae853SAndroid Build Coastguard Worker /* unroll count 1 */
2715*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
2716*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2717*495ae853SAndroid Build Coastguard Worker
2718*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2719*495ae853SAndroid Build Coastguard Worker *pi2_out =
2720*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
2721*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2722*495ae853SAndroid Build Coastguard Worker
2723*495ae853SAndroid Build Coastguard Worker /* unroll count 2 */
2724*495ae853SAndroid Build Coastguard Worker *pi2_out =
2725*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
2726*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2727*495ae853SAndroid Build Coastguard Worker
2728*495ae853SAndroid Build Coastguard Worker /* unroll count 3 */
2729*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2730*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
2731*495ae853SAndroid Build Coastguard Worker
2732*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2733*495ae853SAndroid Build Coastguard Worker *pi2_out =
2734*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_2 + i4_phase2 * i4_horz_samp_1 + 128) >> 8;
2735*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2736*495ae853SAndroid Build Coastguard Worker
2737*495ae853SAndroid Build Coastguard Worker /* unroll count 4 */
2738*495ae853SAndroid Build Coastguard Worker *pi2_out =
2739*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_2 + i4_phase1 * i4_horz_samp_1 + 128) >> 8;
2740*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2741*495ae853SAndroid Build Coastguard Worker
2742*495ae853SAndroid Build Coastguard Worker /* unroll count 5 */
2743*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
2744*495ae853SAndroid Build Coastguard Worker
2745*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2746*495ae853SAndroid Build Coastguard Worker *pi2_out =
2747*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase2) * i4_horz_samp_1 + i4_phase2 * i4_horz_samp_2 + 128) >> 8;
2748*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2749*495ae853SAndroid Build Coastguard Worker
2750*495ae853SAndroid Build Coastguard Worker /* unroll count 6 */
2751*495ae853SAndroid Build Coastguard Worker *pi2_out =
2752*495ae853SAndroid Build Coastguard Worker ((16 - i4_phase1) * i4_horz_samp_1 + i4_phase1 * i4_horz_samp_2 + 128) >> 8;
2753*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2754*495ae853SAndroid Build Coastguard Worker }
2755*495ae853SAndroid Build Coastguard Worker
2756*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2757*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_2 + 8) >> 4;
2758*495ae853SAndroid Build Coastguard Worker
2759*495ae853SAndroid Build Coastguard Worker /* horizontal loop updates */
2760*495ae853SAndroid Build Coastguard Worker pi4_ref_array++;
2761*495ae853SAndroid Build Coastguard Worker pi2_out_res++;
2762*495ae853SAndroid Build Coastguard Worker }
2763*495ae853SAndroid Build Coastguard Worker }
2764*495ae853SAndroid Build Coastguard Worker return;
2765*495ae853SAndroid Build Coastguard Worker }
2766*495ae853SAndroid Build Coastguard Worker
2767*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
2768*495ae853SAndroid Build Coastguard Worker /* */
2769*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_residual_luma_dyadic */
2770*495ae853SAndroid Build Coastguard Worker /* */
2771*495ae853SAndroid Build Coastguard Worker /* Description : this fucntion does the upsampling of luma residuals for */
2772*495ae853SAndroid Build Coastguard Worker /* Dyadic cases */
2773*495ae853SAndroid Build Coastguard Worker /* */
2774*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_residual_samp_ctxt : Residual upsampling context */
2775*495ae853SAndroid Build Coastguard Worker /* pu1_inp_data : input 8 bit data pointer */
2776*495ae853SAndroid Build Coastguard Worker /* i4_inp_data_stride : input buffer stride */
2777*495ae853SAndroid Build Coastguard Worker /* pi2_out_res : output 16 bit buffer pointer */
2778*495ae853SAndroid Build Coastguard Worker /* i4_out_res_stride : Output buffer stride */
2779*495ae853SAndroid Build Coastguard Worker /* pu1_inp_bitmap : input packed sign bit data pointer */
2780*495ae853SAndroid Build Coastguard Worker /* i4_inp_bitmap_stride : sign bit buffer stride */
2781*495ae853SAndroid Build Coastguard Worker /* ps_ref_mb_mode : reference mb mode pointer of base layer */
2782*495ae853SAndroid Build Coastguard Worker /* ps_coord : mb co-ordinate pointer */
2783*495ae853SAndroid Build Coastguard Worker /* Globals : none */
2784*495ae853SAndroid Build Coastguard Worker /* Processing : it does the upsampling with fixed phase values and */
2785*495ae853SAndroid Build Coastguard Worker /* reference layer transform size */
2786*495ae853SAndroid Build Coastguard Worker /* Outputs : Upsampled residuals for luma */
2787*495ae853SAndroid Build Coastguard Worker /* Returns : none */
2788*495ae853SAndroid Build Coastguard Worker /* */
2789*495ae853SAndroid Build Coastguard Worker /* Issues : none */
2790*495ae853SAndroid Build Coastguard Worker /* */
2791*495ae853SAndroid Build Coastguard Worker /* Revision History: */
2792*495ae853SAndroid Build Coastguard Worker /* */
2793*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
2794*495ae853SAndroid Build Coastguard Worker /* 25 09 2010 vijayakumar creation */
2795*495ae853SAndroid Build Coastguard Worker /* */
2796*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_residual_luma_dyadic(void * pv_residual_samp_ctxt,UWORD8 * pu1_inp_data,WORD32 i4_inp_data_stride,WORD16 * pi2_out_res,WORD32 i4_out_res_stride,UWORD8 * pu1_inp_bitmap,WORD32 i4_inp_bitmap_stride,mem_element_t * ps_ref_mb_mode,UWORD16 u2_mb_x,UWORD16 u2_mb_y,WORD32 i4_ref_nnz,WORD32 i4_ref_tx_size)2797*495ae853SAndroid Build Coastguard Worker void svcd_residual_luma_dyadic(void *pv_residual_samp_ctxt, UWORD8 *pu1_inp_data,
2798*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_data_stride, WORD16 *pi2_out_res,
2799*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_res_stride, UWORD8 *pu1_inp_bitmap,
2800*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_bitmap_stride, mem_element_t *ps_ref_mb_mode,
2801*495ae853SAndroid Build Coastguard Worker UWORD16 u2_mb_x, UWORD16 u2_mb_y, WORD32 i4_ref_nnz,
2802*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_tx_size)
2803*495ae853SAndroid Build Coastguard Worker
2804*495ae853SAndroid Build Coastguard Worker {
2805*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_refarray_buffer;
2806*495ae853SAndroid Build Coastguard Worker WORD32 i4_start_bit_pos = 0;
2807*495ae853SAndroid Build Coastguard Worker WORD32 i4_blk_ctr;
2808*495ae853SAndroid Build Coastguard Worker residual_sampling_ctxt_t *ps_ctxt;
2809*495ae853SAndroid Build Coastguard Worker
2810*495ae853SAndroid Build Coastguard Worker ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
2811*495ae853SAndroid Build Coastguard Worker pi2_refarray_buffer = ps_ctxt->pi2_refarray_buffer;
2812*495ae853SAndroid Build Coastguard Worker
2813*495ae853SAndroid Build Coastguard Worker /* based on transform size the counter and interpolation width and */
2814*495ae853SAndroid Build Coastguard Worker /* height are intialised as follows */
2815*495ae853SAndroid Build Coastguard Worker
2816*495ae853SAndroid Build Coastguard Worker if((i4_ref_tx_size) && (0 != i4_ref_nnz))
2817*495ae853SAndroid Build Coastguard Worker {
2818*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_ref_data_byte, *pu1_ref_sign_byte;
2819*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array;
2820*495ae853SAndroid Build Coastguard Worker WORD32 i4_i, i4_j;
2821*495ae853SAndroid Build Coastguard Worker
2822*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data;
2823*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte = pu1_inp_bitmap;
2824*495ae853SAndroid Build Coastguard Worker
2825*495ae853SAndroid Build Coastguard Worker /* ----------- Horizontal Interpolation ---------------- */
2826*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
2827*495ae853SAndroid Build Coastguard Worker
2828*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < BLOCK_HEIGHT; i4_i++)
2829*495ae853SAndroid Build Coastguard Worker {
2830*495ae853SAndroid Build Coastguard Worker WORD16 i2_coeff1, i2_coeff2;
2831*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign;
2832*495ae853SAndroid Build Coastguard Worker WORD32 i4_bit_pos = i4_start_bit_pos;
2833*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign_byte = *pu1_ref_sign_byte;
2834*495ae853SAndroid Build Coastguard Worker
2835*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (*pu1_ref_data_byte++);
2836*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2837*495ae853SAndroid Build Coastguard Worker
2838*495ae853SAndroid Build Coastguard Worker /* if signed number */
2839*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2840*495ae853SAndroid Build Coastguard Worker {
2841*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2842*495ae853SAndroid Build Coastguard Worker }
2843*495ae853SAndroid Build Coastguard Worker
2844*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2845*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 2;
2846*495ae853SAndroid Build Coastguard Worker
2847*495ae853SAndroid Build Coastguard Worker for(i4_j = 0; i4_j < 14; i4_j += 2)
2848*495ae853SAndroid Build Coastguard Worker {
2849*495ae853SAndroid Build Coastguard Worker i4_bit_pos++;
2850*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (*pu1_ref_data_byte++);
2851*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2852*495ae853SAndroid Build Coastguard Worker
2853*495ae853SAndroid Build Coastguard Worker /* if signed number */
2854*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2855*495ae853SAndroid Build Coastguard Worker {
2856*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2857*495ae853SAndroid Build Coastguard Worker }
2858*495ae853SAndroid Build Coastguard Worker
2859*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2860*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
2861*495ae853SAndroid Build Coastguard Worker
2862*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
2863*495ae853SAndroid Build Coastguard Worker
2864*495ae853SAndroid Build Coastguard Worker /* store the coeff 2 to coeff 1 */
2865*495ae853SAndroid Build Coastguard Worker /* (used in next iteration) */
2866*495ae853SAndroid Build Coastguard Worker i2_coeff1 = i2_coeff2;
2867*495ae853SAndroid Build Coastguard Worker }
2868*495ae853SAndroid Build Coastguard Worker
2869*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
2870*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 2;
2871*495ae853SAndroid Build Coastguard Worker
2872*495ae853SAndroid Build Coastguard Worker /* vertical loop uopdates */
2873*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data + ((i4_i + 1) * i4_inp_data_stride);
2874*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte += i4_inp_bitmap_stride;
2875*495ae853SAndroid Build Coastguard Worker }
2876*495ae853SAndroid Build Coastguard Worker
2877*495ae853SAndroid Build Coastguard Worker /* ----------- Vertical Interpolation ---------------- */
2878*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
2879*495ae853SAndroid Build Coastguard Worker
2880*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < MB_WIDTH; i4_i++)
2881*495ae853SAndroid Build Coastguard Worker {
2882*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_temp;
2883*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out;
2884*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_samp_1, i4_horz_samp_2;
2885*495ae853SAndroid Build Coastguard Worker
2886*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp = pi4_ref_array;
2887*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_res;
2888*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
2889*495ae853SAndroid Build Coastguard Worker
2890*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2891*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 2) >> 2;
2892*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2893*495ae853SAndroid Build Coastguard Worker
2894*495ae853SAndroid Build Coastguard Worker for(i4_j = 0; i4_j < 14; i4_j += 2)
2895*495ae853SAndroid Build Coastguard Worker {
2896*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += MB_WIDTH;
2897*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
2898*495ae853SAndroid Build Coastguard Worker
2899*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2900*495ae853SAndroid Build Coastguard Worker *pi2_out = ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
2901*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2902*495ae853SAndroid Build Coastguard Worker
2903*495ae853SAndroid Build Coastguard Worker *pi2_out = ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
2904*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
2905*495ae853SAndroid Build Coastguard Worker
2906*495ae853SAndroid Build Coastguard Worker /* store the coeff 2 to coeff 1 */
2907*495ae853SAndroid Build Coastguard Worker /* (used in next iteration) */
2908*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = i4_horz_samp_2;
2909*495ae853SAndroid Build Coastguard Worker }
2910*495ae853SAndroid Build Coastguard Worker
2911*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2912*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 2) >> 2;
2913*495ae853SAndroid Build Coastguard Worker
2914*495ae853SAndroid Build Coastguard Worker /* horizontal loop updates */
2915*495ae853SAndroid Build Coastguard Worker pi4_ref_array++;
2916*495ae853SAndroid Build Coastguard Worker pi2_out_res++;
2917*495ae853SAndroid Build Coastguard Worker }
2918*495ae853SAndroid Build Coastguard Worker }
2919*495ae853SAndroid Build Coastguard Worker else
2920*495ae853SAndroid Build Coastguard Worker {
2921*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
2922*495ae853SAndroid Build Coastguard Worker /* LOOP over number of blocks */
2923*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
2924*495ae853SAndroid Build Coastguard Worker for(i4_blk_ctr = 0; i4_blk_ctr < 4; i4_blk_ctr++)
2925*495ae853SAndroid Build Coastguard Worker {
2926*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_ref_data_byte, *pu1_ref_sign_byte;
2927*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array;
2928*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
2929*495ae853SAndroid Build Coastguard Worker
2930*495ae853SAndroid Build Coastguard Worker /* if reference layer is not coded then no processing */
2931*495ae853SAndroid Build Coastguard Worker if(0 != (i4_ref_nnz & 0x1))
2932*495ae853SAndroid Build Coastguard Worker {
2933*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data;
2934*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte = pu1_inp_bitmap;
2935*495ae853SAndroid Build Coastguard Worker
2936*495ae853SAndroid Build Coastguard Worker /* ----------- Horizontal Interpolation ---------------- */
2937*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
2938*495ae853SAndroid Build Coastguard Worker
2939*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < SUB_BLOCK_HEIGHT; i4_i++)
2940*495ae853SAndroid Build Coastguard Worker {
2941*495ae853SAndroid Build Coastguard Worker WORD16 i2_coeff1, i2_coeff2;
2942*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign;
2943*495ae853SAndroid Build Coastguard Worker WORD32 i4_bit_pos = i4_start_bit_pos;
2944*495ae853SAndroid Build Coastguard Worker UWORD8 u1_sign_byte = *pu1_ref_sign_byte;
2945*495ae853SAndroid Build Coastguard Worker ;
2946*495ae853SAndroid Build Coastguard Worker
2947*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (*pu1_ref_data_byte++);
2948*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2949*495ae853SAndroid Build Coastguard Worker
2950*495ae853SAndroid Build Coastguard Worker /* if signed number */
2951*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2952*495ae853SAndroid Build Coastguard Worker {
2953*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2954*495ae853SAndroid Build Coastguard Worker }
2955*495ae853SAndroid Build Coastguard Worker
2956*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
2957*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff1 << 2;
2958*495ae853SAndroid Build Coastguard Worker
2959*495ae853SAndroid Build Coastguard Worker {
2960*495ae853SAndroid Build Coastguard Worker /* unroll count 1 */
2961*495ae853SAndroid Build Coastguard Worker i4_bit_pos++;
2962*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (*pu1_ref_data_byte++);
2963*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2964*495ae853SAndroid Build Coastguard Worker
2965*495ae853SAndroid Build Coastguard Worker /* if signed number */
2966*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2967*495ae853SAndroid Build Coastguard Worker {
2968*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
2969*495ae853SAndroid Build Coastguard Worker }
2970*495ae853SAndroid Build Coastguard Worker
2971*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2972*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
2973*495ae853SAndroid Build Coastguard Worker
2974*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
2975*495ae853SAndroid Build Coastguard Worker
2976*495ae853SAndroid Build Coastguard Worker /* unroll count 2 */
2977*495ae853SAndroid Build Coastguard Worker i4_bit_pos++;
2978*495ae853SAndroid Build Coastguard Worker i2_coeff1 = (WORD16) (*pu1_ref_data_byte++);
2979*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2980*495ae853SAndroid Build Coastguard Worker
2981*495ae853SAndroid Build Coastguard Worker /* if signed number */
2982*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2983*495ae853SAndroid Build Coastguard Worker {
2984*495ae853SAndroid Build Coastguard Worker i2_coeff1 |= 0xFF00;
2985*495ae853SAndroid Build Coastguard Worker }
2986*495ae853SAndroid Build Coastguard Worker
2987*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
2988*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
2989*495ae853SAndroid Build Coastguard Worker
2990*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
2991*495ae853SAndroid Build Coastguard Worker
2992*495ae853SAndroid Build Coastguard Worker /* unroll count 3 */
2993*495ae853SAndroid Build Coastguard Worker i4_bit_pos++;
2994*495ae853SAndroid Build Coastguard Worker i2_coeff2 = (WORD16) (*pu1_ref_data_byte++);
2995*495ae853SAndroid Build Coastguard Worker u1_sign = (UWORD8) GET_BIT(u1_sign_byte, i4_bit_pos);
2996*495ae853SAndroid Build Coastguard Worker
2997*495ae853SAndroid Build Coastguard Worker /* if signed number */
2998*495ae853SAndroid Build Coastguard Worker if(u1_sign)
2999*495ae853SAndroid Build Coastguard Worker {
3000*495ae853SAndroid Build Coastguard Worker i2_coeff2 |= 0xFF00;
3001*495ae853SAndroid Build Coastguard Worker }
3002*495ae853SAndroid Build Coastguard Worker
3003*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
3004*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff1 << 1) + (i2_coeff1) + (i2_coeff2));
3005*495ae853SAndroid Build Coastguard Worker
3006*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = ((i2_coeff2 << 1) + (i2_coeff2) + (i2_coeff1));
3007*495ae853SAndroid Build Coastguard Worker }
3008*495ae853SAndroid Build Coastguard Worker
3009*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
3010*495ae853SAndroid Build Coastguard Worker *pi4_ref_array++ = i2_coeff2 << 2;
3011*495ae853SAndroid Build Coastguard Worker
3012*495ae853SAndroid Build Coastguard Worker /* vertical loop uopdates */
3013*495ae853SAndroid Build Coastguard Worker pu1_ref_data_byte = pu1_inp_data + ((i4_i + 1) * i4_inp_data_stride);
3014*495ae853SAndroid Build Coastguard Worker pu1_ref_sign_byte += i4_inp_bitmap_stride;
3015*495ae853SAndroid Build Coastguard Worker }
3016*495ae853SAndroid Build Coastguard Worker
3017*495ae853SAndroid Build Coastguard Worker /* ----------- Vertical Interpolation ---------------- */
3018*495ae853SAndroid Build Coastguard Worker pi4_ref_array = (WORD32 *) pi2_refarray_buffer;
3019*495ae853SAndroid Build Coastguard Worker
3020*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < BLOCK_WIDTH; i4_i++)
3021*495ae853SAndroid Build Coastguard Worker {
3022*495ae853SAndroid Build Coastguard Worker WORD32 *pi4_ref_array_temp;
3023*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out;
3024*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_samp_1, i4_horz_samp_2;
3025*495ae853SAndroid Build Coastguard Worker
3026*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp = pi4_ref_array;
3027*495ae853SAndroid Build Coastguard Worker pi2_out = pi2_out_res;
3028*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
3029*495ae853SAndroid Build Coastguard Worker
3030*495ae853SAndroid Build Coastguard Worker /* populate the first inter sample */
3031*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_1 + 2) >> 2;
3032*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3033*495ae853SAndroid Build Coastguard Worker
3034*495ae853SAndroid Build Coastguard Worker {
3035*495ae853SAndroid Build Coastguard Worker /* unroll loop count 1 */
3036*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
3037*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
3038*495ae853SAndroid Build Coastguard Worker
3039*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
3040*495ae853SAndroid Build Coastguard Worker *pi2_out =
3041*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
3042*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3043*495ae853SAndroid Build Coastguard Worker
3044*495ae853SAndroid Build Coastguard Worker *pi2_out =
3045*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
3046*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3047*495ae853SAndroid Build Coastguard Worker
3048*495ae853SAndroid Build Coastguard Worker /* unroll loop count 2 */
3049*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
3050*495ae853SAndroid Build Coastguard Worker i4_horz_samp_1 = *pi4_ref_array_temp;
3051*495ae853SAndroid Build Coastguard Worker
3052*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
3053*495ae853SAndroid Build Coastguard Worker *pi2_out =
3054*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
3055*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3056*495ae853SAndroid Build Coastguard Worker
3057*495ae853SAndroid Build Coastguard Worker *pi2_out =
3058*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
3059*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3060*495ae853SAndroid Build Coastguard Worker
3061*495ae853SAndroid Build Coastguard Worker /* unroll loop count 3 */
3062*495ae853SAndroid Build Coastguard Worker pi4_ref_array_temp += BLOCK_WIDTH;
3063*495ae853SAndroid Build Coastguard Worker i4_horz_samp_2 = *pi4_ref_array_temp;
3064*495ae853SAndroid Build Coastguard Worker
3065*495ae853SAndroid Build Coastguard Worker /* populate 2 samples based on current coeffs */
3066*495ae853SAndroid Build Coastguard Worker *pi2_out =
3067*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_1 << 1) + (i4_horz_samp_1) + (i4_horz_samp_2) + 8) >> 4;
3068*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3069*495ae853SAndroid Build Coastguard Worker
3070*495ae853SAndroid Build Coastguard Worker *pi2_out =
3071*495ae853SAndroid Build Coastguard Worker ((i4_horz_samp_2 << 1) + (i4_horz_samp_2) + (i4_horz_samp_1) + 8) >> 4;
3072*495ae853SAndroid Build Coastguard Worker pi2_out += i4_out_res_stride;
3073*495ae853SAndroid Build Coastguard Worker }
3074*495ae853SAndroid Build Coastguard Worker
3075*495ae853SAndroid Build Coastguard Worker /* populate the last inter sample */
3076*495ae853SAndroid Build Coastguard Worker *pi2_out = (i4_horz_samp_2 + 2) >> 2;
3077*495ae853SAndroid Build Coastguard Worker
3078*495ae853SAndroid Build Coastguard Worker /* horizontal loop updates */
3079*495ae853SAndroid Build Coastguard Worker pi4_ref_array++;
3080*495ae853SAndroid Build Coastguard Worker pi2_out_res++;
3081*495ae853SAndroid Build Coastguard Worker }
3082*495ae853SAndroid Build Coastguard Worker }
3083*495ae853SAndroid Build Coastguard Worker else
3084*495ae853SAndroid Build Coastguard Worker {
3085*495ae853SAndroid Build Coastguard Worker pi2_out_res += BLOCK_WIDTH;
3086*495ae853SAndroid Build Coastguard Worker }
3087*495ae853SAndroid Build Coastguard Worker
3088*495ae853SAndroid Build Coastguard Worker /* Block level loop updates */
3089*495ae853SAndroid Build Coastguard Worker if(1 == i4_blk_ctr)
3090*495ae853SAndroid Build Coastguard Worker {
3091*495ae853SAndroid Build Coastguard Worker i4_start_bit_pos = 0;
3092*495ae853SAndroid Build Coastguard Worker pu1_inp_data -= SUB_BLOCK_WIDTH;
3093*495ae853SAndroid Build Coastguard Worker pu1_inp_data += (i4_inp_data_stride * SUB_BLOCK_HEIGHT);
3094*495ae853SAndroid Build Coastguard Worker pi2_out_res -= MB_WIDTH;
3095*495ae853SAndroid Build Coastguard Worker pi2_out_res += (i4_out_res_stride * BLOCK_HEIGHT);
3096*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap += (i4_inp_bitmap_stride * SUB_BLOCK_HEIGHT);
3097*495ae853SAndroid Build Coastguard Worker i4_ref_nnz >>= 2;
3098*495ae853SAndroid Build Coastguard Worker }
3099*495ae853SAndroid Build Coastguard Worker else
3100*495ae853SAndroid Build Coastguard Worker {
3101*495ae853SAndroid Build Coastguard Worker pu1_inp_data += SUB_BLOCK_WIDTH;
3102*495ae853SAndroid Build Coastguard Worker i4_start_bit_pos = SUB_BLOCK_WIDTH;
3103*495ae853SAndroid Build Coastguard Worker }
3104*495ae853SAndroid Build Coastguard Worker
3105*495ae853SAndroid Build Coastguard Worker i4_ref_nnz >>= 1;
3106*495ae853SAndroid Build Coastguard Worker } /* end of loop over all the blocks */
3107*495ae853SAndroid Build Coastguard Worker }
3108*495ae853SAndroid Build Coastguard Worker return;
3109*495ae853SAndroid Build Coastguard Worker }
3110*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3111*495ae853SAndroid Build Coastguard Worker /* */
3112*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_residual_samp_mb_dyadic */
3113*495ae853SAndroid Build Coastguard Worker /* */
3114*495ae853SAndroid Build Coastguard Worker /* Description : MB level function whcih perform the residual resampling */
3115*495ae853SAndroid Build Coastguard Worker /* of data of an MB (luma and chroma insclusive) */
3116*495ae853SAndroid Build Coastguard Worker /* for Dyadic cases */
3117*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_residual_samp_ctxt : residual sampling context */
3118*495ae853SAndroid Build Coastguard Worker /* ps_ref_luma : reference layer luma data buffer desc */
3119*495ae853SAndroid Build Coastguard Worker /* ps_ref_chroma : reference layer chroma data buffer desc */
3120*495ae853SAndroid Build Coastguard Worker /* ps_ref_luma_bitmap : ref layer luma bit map buffer desc */
3121*495ae853SAndroid Build Coastguard Worker /* ps_ref_chroma_bitmap : ref layer chroma bit map buff des */
3122*495ae853SAndroid Build Coastguard Worker /* ps_ref_mb_mode : ref layer mb mode map buff desc */
3123*495ae853SAndroid Build Coastguard Worker /* ps_out_luma : current layer out luma buffer desc */
3124*495ae853SAndroid Build Coastguard Worker /* ps_out_chroma : current layer out chroma buffer desc */
3125*495ae853SAndroid Build Coastguard Worker /* x,y : current mb coorinate */
3126*495ae853SAndroid Build Coastguard Worker /* Globals : none */
3127*495ae853SAndroid Build Coastguard Worker /* Processing : it calls the reference layer construction followed by */
3128*495ae853SAndroid Build Coastguard Worker /* interplaotion function for luma and cb and cr */
3129*495ae853SAndroid Build Coastguard Worker /* Outputs : inter resampled data of current MB */
3130*495ae853SAndroid Build Coastguard Worker /* Returns : none */
3131*495ae853SAndroid Build Coastguard Worker /* */
3132*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3133*495ae853SAndroid Build Coastguard Worker /* */
3134*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3135*495ae853SAndroid Build Coastguard Worker /* */
3136*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3137*495ae853SAndroid Build Coastguard Worker /* 26 06 2009 vijayakumar creation */
3138*495ae853SAndroid Build Coastguard Worker /* */
3139*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_residual_samp_mb_dyadic(void * pv_residual_samp_ctxt,mem_element_t * ps_ref_luma,mem_element_t * ps_ref_chroma,mem_element_t * ps_ref_luma_bitmap,mem_element_t * ps_ref_chroma_bitmap,mem_element_t * ps_ref_mb_mode,mem_element_t * ps_out_luma,mem_element_t * ps_out_chroma,UWORD16 u2_mb_x,UWORD16 u2_mb_y)3140*495ae853SAndroid Build Coastguard Worker void svcd_residual_samp_mb_dyadic(void *pv_residual_samp_ctxt, mem_element_t *ps_ref_luma,
3141*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_ref_chroma, mem_element_t *ps_ref_luma_bitmap,
3142*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_ref_chroma_bitmap,
3143*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_ref_mb_mode, mem_element_t *ps_out_luma,
3144*495ae853SAndroid Build Coastguard Worker mem_element_t *ps_out_chroma, UWORD16 u2_mb_x, UWORD16 u2_mb_y)
3145*495ae853SAndroid Build Coastguard Worker {
3146*495ae853SAndroid Build Coastguard Worker residual_sampling_ctxt_t *ps_ctxt;
3147*495ae853SAndroid Build Coastguard Worker res_lyr_ctxt *ps_lyr_ctxt;
3148*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3149*495ae853SAndroid Build Coastguard Worker /* I/O buffer params */
3150*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3151*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp;
3152*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_inp_bitmap;
3153*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_out;
3154*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_stride;
3155*495ae853SAndroid Build Coastguard Worker WORD32 i4_inp_bitmap_stride;
3156*495ae853SAndroid Build Coastguard Worker WORD32 i4_out_stride;
3157*495ae853SAndroid Build Coastguard Worker WORD32 i4_bit_pos = 0;
3158*495ae853SAndroid Build Coastguard Worker WORD32 i4_luma_nnz;
3159*495ae853SAndroid Build Coastguard Worker WORD32 i4_chroma_nnz;
3160*495ae853SAndroid Build Coastguard Worker WORD32 i4_tx_size;
3161*495ae853SAndroid Build Coastguard Worker
3162*495ae853SAndroid Build Coastguard Worker ps_ctxt = (residual_sampling_ctxt_t *) pv_residual_samp_ctxt;
3163*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_ctxt->i4_res_lyr_id];
3164*495ae853SAndroid Build Coastguard Worker
3165*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3166*495ae853SAndroid Build Coastguard Worker /* LUMA PROCESSING */
3167*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3168*495ae853SAndroid Build Coastguard Worker pu1_inp = (UWORD8 *) ps_ref_luma->pv_buffer;
3169*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap = (UWORD8 *) ps_ref_luma_bitmap->pv_buffer;
3170*495ae853SAndroid Build Coastguard Worker pi2_out = (WORD16 *) ps_out_luma->pv_buffer;
3171*495ae853SAndroid Build Coastguard Worker
3172*495ae853SAndroid Build Coastguard Worker i4_inp_stride = ps_ref_luma->i4_num_element_stride;
3173*495ae853SAndroid Build Coastguard Worker i4_inp_bitmap_stride = ps_ref_luma_bitmap->i4_num_element_stride;
3174*495ae853SAndroid Build Coastguard Worker i4_out_stride = ps_out_luma->i4_num_element_stride;
3175*495ae853SAndroid Build Coastguard Worker
3176*495ae853SAndroid Build Coastguard Worker /* set the output buffer to 0 since not all block will be upsampled */
3177*495ae853SAndroid Build Coastguard Worker svcd_2d_memset(pi2_out, (MB_WIDTH << 1), MB_HEIGHT, (i4_out_stride << 1), 0);
3178*495ae853SAndroid Build Coastguard Worker
3179*495ae853SAndroid Build Coastguard Worker {
3180*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_x, i4_offset_y;
3181*495ae853SAndroid Build Coastguard Worker residual_samp_map_ctxt_t *ps_luma_map;
3182*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_luma;
3183*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_luma;
3184*495ae853SAndroid Build Coastguard Worker
3185*495ae853SAndroid Build Coastguard Worker ps_luma_map = &ps_lyr_ctxt->s_luma_map_ctxt;
3186*495ae853SAndroid Build Coastguard Worker ps_x_off_len_luma = ps_luma_map->ps_x_offset_length;
3187*495ae853SAndroid Build Coastguard Worker ps_y_off_len_luma = ps_luma_map->ps_y_offset_length;
3188*495ae853SAndroid Build Coastguard Worker
3189*495ae853SAndroid Build Coastguard Worker /* get the actual offset for the buffers */
3190*495ae853SAndroid Build Coastguard Worker i4_offset_x = ps_x_off_len_luma[u2_mb_x].i2_offset;
3191*495ae853SAndroid Build Coastguard Worker i4_offset_y = ps_y_off_len_luma[u2_mb_y].i2_offset;
3192*495ae853SAndroid Build Coastguard Worker
3193*495ae853SAndroid Build Coastguard Worker {
3194*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_inter_lyr_mb_prms;
3195*495ae853SAndroid Build Coastguard Worker WORD32 i4_mb_x, i4_mb_y;
3196*495ae853SAndroid Build Coastguard Worker UWORD16 u2_luma_mask = 0x0033;
3197*495ae853SAndroid Build Coastguard Worker UWORD8 u1_chrm_mask = 0x11;
3198*495ae853SAndroid Build Coastguard Worker WORD32 i4_luma_rt_sft_amt = 0;
3199*495ae853SAndroid Build Coastguard Worker WORD32 i4_chrm_rt_sft_amt = 0;
3200*495ae853SAndroid Build Coastguard Worker
3201*495ae853SAndroid Build Coastguard Worker i4_mb_x = ((i4_offset_x + 1) >> MB_WIDTH_SHIFT);
3202*495ae853SAndroid Build Coastguard Worker i4_mb_y = ((i4_offset_y + 1) >> MB_HEIGHT_SHIFT);
3203*495ae853SAndroid Build Coastguard Worker
3204*495ae853SAndroid Build Coastguard Worker /* get the location of the byte which has the current mb mode */
3205*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms = (inter_lyr_mb_prms_t *) ps_ref_mb_mode->pv_buffer;
3206*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms += i4_mb_x;
3207*495ae853SAndroid Build Coastguard Worker ps_inter_lyr_mb_prms += i4_mb_y * ps_ref_mb_mode->i4_num_element_stride;
3208*495ae853SAndroid Build Coastguard Worker
3209*495ae853SAndroid Build Coastguard Worker /* get the approp block in base layer in horz direction */
3210*495ae853SAndroid Build Coastguard Worker if(0 != ((i4_offset_x + 1) & 15))
3211*495ae853SAndroid Build Coastguard Worker {
3212*495ae853SAndroid Build Coastguard Worker u2_luma_mask <<= 2;
3213*495ae853SAndroid Build Coastguard Worker i4_luma_rt_sft_amt += 2;
3214*495ae853SAndroid Build Coastguard Worker
3215*495ae853SAndroid Build Coastguard Worker u1_chrm_mask <<= 1;
3216*495ae853SAndroid Build Coastguard Worker i4_chrm_rt_sft_amt += 1;
3217*495ae853SAndroid Build Coastguard Worker }
3218*495ae853SAndroid Build Coastguard Worker /* get the approp block in base layer in vert direction */
3219*495ae853SAndroid Build Coastguard Worker if(0 != ((i4_offset_y + 1) & 15))
3220*495ae853SAndroid Build Coastguard Worker {
3221*495ae853SAndroid Build Coastguard Worker u2_luma_mask <<= 8;
3222*495ae853SAndroid Build Coastguard Worker i4_luma_rt_sft_amt += 8;
3223*495ae853SAndroid Build Coastguard Worker
3224*495ae853SAndroid Build Coastguard Worker u1_chrm_mask <<= 2;
3225*495ae853SAndroid Build Coastguard Worker i4_chrm_rt_sft_amt += 2;
3226*495ae853SAndroid Build Coastguard Worker }
3227*495ae853SAndroid Build Coastguard Worker
3228*495ae853SAndroid Build Coastguard Worker /* extract the nnz and store it */
3229*495ae853SAndroid Build Coastguard Worker i4_luma_nnz = (ps_inter_lyr_mb_prms->u2_luma_nnz & u2_luma_mask) >> i4_luma_rt_sft_amt;
3230*495ae853SAndroid Build Coastguard Worker
3231*495ae853SAndroid Build Coastguard Worker i4_chroma_nnz =
3232*495ae853SAndroid Build Coastguard Worker (ps_inter_lyr_mb_prms->u1_chroma_nnz & u1_chrm_mask) >> i4_chrm_rt_sft_amt;
3233*495ae853SAndroid Build Coastguard Worker
3234*495ae853SAndroid Build Coastguard Worker i4_tx_size = GET_BIT(ps_inter_lyr_mb_prms->i1_mb_mode, 1);
3235*495ae853SAndroid Build Coastguard Worker }
3236*495ae853SAndroid Build Coastguard Worker
3237*495ae853SAndroid Build Coastguard Worker /* since in dyadic case the window width and height will be 10x10 */
3238*495ae853SAndroid Build Coastguard Worker /* and the window start offsets will be always 1 column left and */
3239*495ae853SAndroid Build Coastguard Worker /* 1 row above the block boundary. so the pointer and the required */
3240*495ae853SAndroid Build Coastguard Worker /* positions are appropriately modified */
3241*495ae853SAndroid Build Coastguard Worker if(i4_offset_x >= 0)
3242*495ae853SAndroid Build Coastguard Worker {
3243*495ae853SAndroid Build Coastguard Worker pu1_inp++;
3244*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap++;
3245*495ae853SAndroid Build Coastguard Worker }
3246*495ae853SAndroid Build Coastguard Worker
3247*495ae853SAndroid Build Coastguard Worker if(i4_offset_y >= 0)
3248*495ae853SAndroid Build Coastguard Worker {
3249*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_inp_stride;
3250*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap += i4_inp_bitmap_stride;
3251*495ae853SAndroid Build Coastguard Worker }
3252*495ae853SAndroid Build Coastguard Worker
3253*495ae853SAndroid Build Coastguard Worker svcd_residual_luma_dyadic(pv_residual_samp_ctxt, pu1_inp, i4_inp_stride, pi2_out,
3254*495ae853SAndroid Build Coastguard Worker i4_out_stride, pu1_inp_bitmap, i4_inp_bitmap_stride,
3255*495ae853SAndroid Build Coastguard Worker ps_ref_mb_mode, u2_mb_x, u2_mb_y, i4_luma_nnz, i4_tx_size);
3256*495ae853SAndroid Build Coastguard Worker }
3257*495ae853SAndroid Build Coastguard Worker
3258*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3259*495ae853SAndroid Build Coastguard Worker /* CHROMA PROCESSING */
3260*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3261*495ae853SAndroid Build Coastguard Worker /* CB */
3262*495ae853SAndroid Build Coastguard Worker pu1_inp = (UWORD8 *) ps_ref_chroma->pv_buffer;
3263*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap = (UWORD8 *) ps_ref_chroma_bitmap->pv_buffer;
3264*495ae853SAndroid Build Coastguard Worker pi2_out = (WORD16 *) ps_out_chroma->pv_buffer;
3265*495ae853SAndroid Build Coastguard Worker
3266*495ae853SAndroid Build Coastguard Worker i4_inp_stride = ps_ref_chroma->i4_num_element_stride << 1;
3267*495ae853SAndroid Build Coastguard Worker i4_inp_bitmap_stride = ps_ref_chroma_bitmap->i4_num_element_stride << 1;
3268*495ae853SAndroid Build Coastguard Worker i4_out_stride = ps_out_chroma->i4_num_element_stride << 1;
3269*495ae853SAndroid Build Coastguard Worker
3270*495ae853SAndroid Build Coastguard Worker /* set the output buffer to 0 since not all block will be upsampled */
3271*495ae853SAndroid Build Coastguard Worker svcd_2d_memset(pi2_out, (BLOCK_WIDTH << 1), MB_HEIGHT, (i4_out_stride), 0);
3272*495ae853SAndroid Build Coastguard Worker
3273*495ae853SAndroid Build Coastguard Worker /* choose the appropriate chroma processing routine */
3274*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc)
3275*495ae853SAndroid Build Coastguard Worker {
3276*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_x, i4_offset_y;
3277*495ae853SAndroid Build Coastguard Worker residual_samp_map_ctxt_t *ps_chroma_map;
3278*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len_chroma;
3279*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_y_off_len_chroma;
3280*495ae853SAndroid Build Coastguard Worker
3281*495ae853SAndroid Build Coastguard Worker ps_chroma_map = &ps_lyr_ctxt->s_chroma_map_ctxt;
3282*495ae853SAndroid Build Coastguard Worker ps_x_off_len_chroma = ps_chroma_map->ps_x_offset_length;
3283*495ae853SAndroid Build Coastguard Worker ps_y_off_len_chroma = ps_chroma_map->ps_y_offset_length;
3284*495ae853SAndroid Build Coastguard Worker
3285*495ae853SAndroid Build Coastguard Worker /* get the actual offset for the buffers */
3286*495ae853SAndroid Build Coastguard Worker i4_offset_x = ps_x_off_len_chroma[u2_mb_x].i2_offset;
3287*495ae853SAndroid Build Coastguard Worker i4_offset_y = ps_y_off_len_chroma[u2_mb_y].i2_offset;
3288*495ae853SAndroid Build Coastguard Worker
3289*495ae853SAndroid Build Coastguard Worker /* since in dyadic case the window width and height will be 6x6 */
3290*495ae853SAndroid Build Coastguard Worker /* and the window start offsets will be always 1 column left and */
3291*495ae853SAndroid Build Coastguard Worker /* 1 row above the block boundary. so the pointer and the required */
3292*495ae853SAndroid Build Coastguard Worker /* positions are appropriately modified */
3293*495ae853SAndroid Build Coastguard Worker if(i4_offset_x >= 0)
3294*495ae853SAndroid Build Coastguard Worker {
3295*495ae853SAndroid Build Coastguard Worker pu1_inp++;
3296*495ae853SAndroid Build Coastguard Worker if(0 == ((i4_offset_x + 1) & 7))
3297*495ae853SAndroid Build Coastguard Worker {
3298*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap++;
3299*495ae853SAndroid Build Coastguard Worker }
3300*495ae853SAndroid Build Coastguard Worker else
3301*495ae853SAndroid Build Coastguard Worker {
3302*495ae853SAndroid Build Coastguard Worker i4_bit_pos = 4;
3303*495ae853SAndroid Build Coastguard Worker }
3304*495ae853SAndroid Build Coastguard Worker }
3305*495ae853SAndroid Build Coastguard Worker
3306*495ae853SAndroid Build Coastguard Worker if(i4_offset_y >= 0)
3307*495ae853SAndroid Build Coastguard Worker {
3308*495ae853SAndroid Build Coastguard Worker pu1_inp += i4_inp_stride;
3309*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap += i4_inp_bitmap_stride;
3310*495ae853SAndroid Build Coastguard Worker }
3311*495ae853SAndroid Build Coastguard Worker
3312*495ae853SAndroid Build Coastguard Worker if(0 != (i4_chroma_nnz & 0x01))
3313*495ae853SAndroid Build Coastguard Worker {
3314*495ae853SAndroid Build Coastguard Worker svcd_residual_chroma_dyadic(pv_residual_samp_ctxt, pu1_inp, i4_inp_stride, pi2_out,
3315*495ae853SAndroid Build Coastguard Worker i4_out_stride, pu1_inp_bitmap, i4_inp_bitmap_stride,
3316*495ae853SAndroid Build Coastguard Worker i4_bit_pos);
3317*495ae853SAndroid Build Coastguard Worker }
3318*495ae853SAndroid Build Coastguard Worker }
3319*495ae853SAndroid Build Coastguard Worker else
3320*495ae853SAndroid Build Coastguard Worker {
3321*495ae853SAndroid Build Coastguard Worker svcd_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y, ps_ref_mb_mode,
3322*495ae853SAndroid Build Coastguard Worker pu1_inp, i4_inp_stride, pi2_out, i4_out_stride,
3323*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap, i4_inp_bitmap_stride, SVCD_FALSE);
3324*495ae853SAndroid Build Coastguard Worker }
3325*495ae853SAndroid Build Coastguard Worker
3326*495ae853SAndroid Build Coastguard Worker /* CR */
3327*495ae853SAndroid Build Coastguard Worker pu1_inp += (i4_inp_stride >> 1);
3328*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap += (i4_inp_bitmap_stride >> 1);
3329*495ae853SAndroid Build Coastguard Worker pi2_out += (i4_out_stride >> 1);
3330*495ae853SAndroid Build Coastguard Worker
3331*495ae853SAndroid Build Coastguard Worker if(SVCD_FALSE == ps_lyr_ctxt->i4_chrm_alt_proc)
3332*495ae853SAndroid Build Coastguard Worker {
3333*495ae853SAndroid Build Coastguard Worker if(0 != (i4_chroma_nnz & 0x10))
3334*495ae853SAndroid Build Coastguard Worker {
3335*495ae853SAndroid Build Coastguard Worker svcd_residual_chroma_dyadic(pv_residual_samp_ctxt, pu1_inp, i4_inp_stride, pi2_out,
3336*495ae853SAndroid Build Coastguard Worker i4_out_stride, pu1_inp_bitmap, i4_inp_bitmap_stride,
3337*495ae853SAndroid Build Coastguard Worker i4_bit_pos);
3338*495ae853SAndroid Build Coastguard Worker }
3339*495ae853SAndroid Build Coastguard Worker }
3340*495ae853SAndroid Build Coastguard Worker else
3341*495ae853SAndroid Build Coastguard Worker {
3342*495ae853SAndroid Build Coastguard Worker svcd_residual_chroma_dyadic_alt(pv_residual_samp_ctxt, u2_mb_x, u2_mb_y, ps_ref_mb_mode,
3343*495ae853SAndroid Build Coastguard Worker pu1_inp, i4_inp_stride, pi2_out, i4_out_stride,
3344*495ae853SAndroid Build Coastguard Worker pu1_inp_bitmap, i4_inp_bitmap_stride, SVCD_TRUE);
3345*495ae853SAndroid Build Coastguard Worker }
3346*495ae853SAndroid Build Coastguard Worker return;
3347*495ae853SAndroid Build Coastguard Worker }
3348*495ae853SAndroid Build Coastguard Worker
3349*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3350*495ae853SAndroid Build Coastguard Worker /* */
3351*495ae853SAndroid Build Coastguard Worker /* Function Name : svc_intra_resamp_generate_segment_lookup */
3352*495ae853SAndroid Build Coastguard Worker /* */
3353*495ae853SAndroid Build Coastguard Worker /* Description : This function generates segment lookup used to derive */
3354*495ae853SAndroid Build Coastguard Worker /* segments which have to be be intra resampled */
3355*495ae853SAndroid Build Coastguard Worker /* */
3356*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_lookup_table : look up table */
3357*495ae853SAndroid Build Coastguard Worker /* i4_dimension : dimension of the block which is used in*/
3358*495ae853SAndroid Build Coastguard Worker /* resampling process. */
3359*495ae853SAndroid Build Coastguard Worker /* i4_mb_size : size of the mb */
3360*495ae853SAndroid Build Coastguard Worker /* Globals : None */
3361*495ae853SAndroid Build Coastguard Worker /* Processing : This function generates segment lookup used to derive */
3362*495ae853SAndroid Build Coastguard Worker /* segments which have to be be intra resampled */
3363*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
3364*495ae853SAndroid Build Coastguard Worker /* Returns : none */
3365*495ae853SAndroid Build Coastguard Worker /* */
3366*495ae853SAndroid Build Coastguard Worker /* Issues : None */
3367*495ae853SAndroid Build Coastguard Worker /* */
3368*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3369*495ae853SAndroid Build Coastguard Worker /* */
3370*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3371*495ae853SAndroid Build Coastguard Worker /* 03 03 2011 A.D.Almeida Creation */
3372*495ae853SAndroid Build Coastguard Worker /* */
3373*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svc_intra_resamp_generate_segment_lookup(seg_lookup_desc_t * ps_seg_lookup_table,WORD32 i4_dimension,WORD32 i4_mb_size,WORD32 i4_shift_val)3374*495ae853SAndroid Build Coastguard Worker void svc_intra_resamp_generate_segment_lookup(seg_lookup_desc_t *ps_seg_lookup_table,
3375*495ae853SAndroid Build Coastguard Worker WORD32 i4_dimension, WORD32 i4_mb_size,
3376*495ae853SAndroid Build Coastguard Worker WORD32 i4_shift_val)
3377*495ae853SAndroid Build Coastguard Worker {
3378*495ae853SAndroid Build Coastguard Worker WORD32 i4_x;
3379*495ae853SAndroid Build Coastguard Worker WORD32 i4_position, i4_dist_prev_mb, i4_dist_next_mb;
3380*495ae853SAndroid Build Coastguard Worker UWORD8 u1_seg_dim;
3381*495ae853SAndroid Build Coastguard Worker UWORD8 u1_num_sgmts;
3382*495ae853SAndroid Build Coastguard Worker WORD32 i4_block_size = i4_mb_size >> 1;
3383*495ae853SAndroid Build Coastguard Worker UWORD8 u1_offset = 0;
3384*495ae853SAndroid Build Coastguard Worker seg_lookup_desc_t *ps_segments;
3385*495ae853SAndroid Build Coastguard Worker seg_description_t *ps_seg_desc;
3386*495ae853SAndroid Build Coastguard Worker
3387*495ae853SAndroid Build Coastguard Worker memset(ps_seg_lookup_table, 0, i4_mb_size * sizeof(seg_lookup_desc_t));
3388*495ae853SAndroid Build Coastguard Worker
3389*495ae853SAndroid Build Coastguard Worker for(i4_x = 0; i4_x < i4_mb_size; i4_x++)
3390*495ae853SAndroid Build Coastguard Worker {
3391*495ae853SAndroid Build Coastguard Worker ps_segments = &ps_seg_lookup_table[i4_x];
3392*495ae853SAndroid Build Coastguard Worker ps_seg_desc = ps_segments->s_segments;
3393*495ae853SAndroid Build Coastguard Worker i4_position = i4_x;
3394*495ae853SAndroid Build Coastguard Worker
3395*495ae853SAndroid Build Coastguard Worker if(i4_x >= i4_block_size)
3396*495ae853SAndroid Build Coastguard Worker {
3397*495ae853SAndroid Build Coastguard Worker /* set the fourth bit so that later it can be directly OR ed */
3398*495ae853SAndroid Build Coastguard Worker ps_segments->u4_start_pos = 8;
3399*495ae853SAndroid Build Coastguard Worker }
3400*495ae853SAndroid Build Coastguard Worker else
3401*495ae853SAndroid Build Coastguard Worker {
3402*495ae853SAndroid Build Coastguard Worker ps_segments->u4_start_pos = 0;
3403*495ae853SAndroid Build Coastguard Worker }
3404*495ae853SAndroid Build Coastguard Worker
3405*495ae853SAndroid Build Coastguard Worker u1_num_sgmts = 0;
3406*495ae853SAndroid Build Coastguard Worker u1_offset = 0;
3407*495ae853SAndroid Build Coastguard Worker
3408*495ae853SAndroid Build Coastguard Worker while(i4_position < (i4_x + i4_dimension))
3409*495ae853SAndroid Build Coastguard Worker {
3410*495ae853SAndroid Build Coastguard Worker /* check and fill the nearest mb boundry flag */
3411*495ae853SAndroid Build Coastguard Worker if((i4_position & (i4_mb_size - 1)) < i4_block_size)
3412*495ae853SAndroid Build Coastguard Worker {
3413*495ae853SAndroid Build Coastguard Worker ps_seg_desc->i1_nearst_mb_bdry = -1;
3414*495ae853SAndroid Build Coastguard Worker }
3415*495ae853SAndroid Build Coastguard Worker else
3416*495ae853SAndroid Build Coastguard Worker {
3417*495ae853SAndroid Build Coastguard Worker ps_seg_desc->i1_nearst_mb_bdry = 1;
3418*495ae853SAndroid Build Coastguard Worker }
3419*495ae853SAndroid Build Coastguard Worker
3420*495ae853SAndroid Build Coastguard Worker /* find the distance from the previous MB for start of segment*/
3421*495ae853SAndroid Build Coastguard Worker i4_dist_prev_mb = (i4_position & (i4_mb_size - 1));
3422*495ae853SAndroid Build Coastguard Worker
3423*495ae853SAndroid Build Coastguard Worker ps_seg_desc->i1_dist_idx =
3424*495ae853SAndroid Build Coastguard Worker ((i4_dist_prev_mb >= i4_mb_size >> 1) ? (i4_mb_size - i4_dist_prev_mb)
3425*495ae853SAndroid Build Coastguard Worker : -(i4_dist_prev_mb + 1));
3426*495ae853SAndroid Build Coastguard Worker
3427*495ae853SAndroid Build Coastguard Worker /* find the size of the segment */
3428*495ae853SAndroid Build Coastguard Worker u1_seg_dim = (i4_block_size - (i4_position & (i4_block_size - 1)));
3429*495ae853SAndroid Build Coastguard Worker i4_position += u1_seg_dim;
3430*495ae853SAndroid Build Coastguard Worker if(i4_position > (i4_x + i4_dimension))
3431*495ae853SAndroid Build Coastguard Worker {
3432*495ae853SAndroid Build Coastguard Worker i4_position = (i4_x + i4_dimension);
3433*495ae853SAndroid Build Coastguard Worker u1_seg_dim = (i4_position & (i4_block_size - 1));
3434*495ae853SAndroid Build Coastguard Worker }
3435*495ae853SAndroid Build Coastguard Worker
3436*495ae853SAndroid Build Coastguard Worker /* find the distance from the next MB for end of segment */
3437*495ae853SAndroid Build Coastguard Worker i4_dist_next_mb = (i4_position & (i4_mb_size - 1));
3438*495ae853SAndroid Build Coastguard Worker
3439*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_seg_dim = u1_seg_dim;
3440*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_seg_off = u1_offset;
3441*495ae853SAndroid Build Coastguard Worker
3442*495ae853SAndroid Build Coastguard Worker /* check if the segment has a adjoining MB edge */
3443*495ae853SAndroid Build Coastguard Worker if(i4_dist_prev_mb == 0)
3444*495ae853SAndroid Build Coastguard Worker {
3445*495ae853SAndroid Build Coastguard Worker if(0 == u1_num_sgmts)
3446*495ae853SAndroid Build Coastguard Worker {
3447*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_mb_adjoin = 0;
3448*495ae853SAndroid Build Coastguard Worker }
3449*495ae853SAndroid Build Coastguard Worker else
3450*495ae853SAndroid Build Coastguard Worker {
3451*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_mb_adjoin = 1 << i4_shift_val;
3452*495ae853SAndroid Build Coastguard Worker }
3453*495ae853SAndroid Build Coastguard Worker }
3454*495ae853SAndroid Build Coastguard Worker else if(i4_dist_next_mb == 0)
3455*495ae853SAndroid Build Coastguard Worker {
3456*495ae853SAndroid Build Coastguard Worker if(i4_position == (i4_x + i4_dimension))
3457*495ae853SAndroid Build Coastguard Worker {
3458*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_mb_adjoin = 0;
3459*495ae853SAndroid Build Coastguard Worker }
3460*495ae853SAndroid Build Coastguard Worker else
3461*495ae853SAndroid Build Coastguard Worker {
3462*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_mb_adjoin = 1 << i4_shift_val;
3463*495ae853SAndroid Build Coastguard Worker }
3464*495ae853SAndroid Build Coastguard Worker }
3465*495ae853SAndroid Build Coastguard Worker else
3466*495ae853SAndroid Build Coastguard Worker {
3467*495ae853SAndroid Build Coastguard Worker ps_seg_desc->u1_mb_adjoin = 0;
3468*495ae853SAndroid Build Coastguard Worker }
3469*495ae853SAndroid Build Coastguard Worker
3470*495ae853SAndroid Build Coastguard Worker /* Updations */
3471*495ae853SAndroid Build Coastguard Worker u1_offset += u1_seg_dim;
3472*495ae853SAndroid Build Coastguard Worker u1_num_sgmts++;
3473*495ae853SAndroid Build Coastguard Worker ps_seg_desc++;
3474*495ae853SAndroid Build Coastguard Worker }
3475*495ae853SAndroid Build Coastguard Worker
3476*495ae853SAndroid Build Coastguard Worker /* fill the number of segments for this position */
3477*495ae853SAndroid Build Coastguard Worker ps_segments->u1_num_segments = u1_num_sgmts;
3478*495ae853SAndroid Build Coastguard Worker }
3479*495ae853SAndroid Build Coastguard Worker }
3480*495ae853SAndroid Build Coastguard Worker
3481*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
3482*495ae853SAndroid Build Coastguard Worker /* */
3483*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_intra_samp_populate_list */
3484*495ae853SAndroid Build Coastguard Worker /* */
3485*495ae853SAndroid Build Coastguard Worker /* Description : This is a seq or frame level init function which fills */
3486*495ae853SAndroid Build Coastguard Worker /* all offsets, projected locations arrays based on */
3487*495ae853SAndroid Build Coastguard Worker /* the two resolutions and cropping parameters */
3488*495ae853SAndroid Build Coastguard Worker /* Inputs : refer ot doxygen comments below */
3489*495ae853SAndroid Build Coastguard Worker /* Globals : none */
3490*495ae853SAndroid Build Coastguard Worker /* Processing : it projects the locations and computes the values */
3491*495ae853SAndroid Build Coastguard Worker /* */
3492*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
3493*495ae853SAndroid Build Coastguard Worker /* Returns : none */
3494*495ae853SAndroid Build Coastguard Worker /* */
3495*495ae853SAndroid Build Coastguard Worker /* Issues : none */
3496*495ae853SAndroid Build Coastguard Worker /* */
3497*495ae853SAndroid Build Coastguard Worker /* Revision History: */
3498*495ae853SAndroid Build Coastguard Worker /* */
3499*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
3500*495ae853SAndroid Build Coastguard Worker /* 26 06 2009 vijayakumar creation */
3501*495ae853SAndroid Build Coastguard Worker /* */
3502*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_intra_samp_populate_list(intra_samp_map_ctxt_t * ps_map_ctxt,res_prms_t * ps_curr_res_prms,res_prms_t * ps_ref_res_prms,WORD32 i4_chroma_flag,dec_struct_t * ps_dec)3503*495ae853SAndroid Build Coastguard Worker void svcd_intra_samp_populate_list(intra_samp_map_ctxt_t *ps_map_ctxt, res_prms_t *ps_curr_res_prms,
3504*495ae853SAndroid Build Coastguard Worker res_prms_t *ps_ref_res_prms, WORD32 i4_chroma_flag,
3505*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec)
3506*495ae853SAndroid Build Coastguard Worker {
3507*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3508*495ae853SAndroid Build Coastguard Worker /* Local variables required for finding the mapping between the layers */
3509*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3510*495ae853SAndroid Build Coastguard Worker WORD32 i4_shift_x, i4_shift_y, i4_scale_x, i4_scale_y, i4_offset_x, i4_offset_y;
3511*495ae853SAndroid Build Coastguard Worker WORD32 i4_add_x, i4_add_y, i4_delta_x, i4_delta_y, i4_refphase_x, i4_refphase_y;
3512*495ae853SAndroid Build Coastguard Worker WORD32 i4_phase_x, i4_phase_y, i4_sub_wd, i4_sub_ht, i4_mb_wd, i4_mb_ht;
3513*495ae853SAndroid Build Coastguard Worker WORD32 i4_horz_dim, i4_vert_dim, i4_tmp;
3514*495ae853SAndroid Build Coastguard Worker
3515*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3516*495ae853SAndroid Build Coastguard Worker /* Local Pointer Declaration for arrays in Mapping context */
3517*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3518*495ae853SAndroid Build Coastguard Worker ref_mb_map_t *ps_x_off_len, *ps_y_off_len;
3519*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_wd, i4_ref_ht, i4_scaled_wd, i4_scaled_ht, i4_curr_lyr_width, i4_curr_lyr_height;
3520*495ae853SAndroid Build Coastguard Worker
3521*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3522*495ae853SAndroid Build Coastguard Worker /* Local Flag Declaration */
3523*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3524*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_layer_field_pic_flag, i4_field_pic_flag, i4_frame_mbs_only_flag;
3525*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_layer_frame_Mbs_only_flag, i4_field_Mb_flag, i4_bot_field_flag;
3526*495ae853SAndroid Build Coastguard Worker
3527*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3528*495ae853SAndroid Build Coastguard Worker /* Cropping Parameters Declaration */
3529*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3530*495ae853SAndroid Build Coastguard Worker WORD32 i4_scaled_ref_layer_left_offset, i4_scaled_ref_layer_top_offset;
3531*495ae853SAndroid Build Coastguard Worker WORD32 i4_scaled_ref_layer_right_offset, i4_scaled_ref_layer_bottom_offset;
3532*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps;
3533*495ae853SAndroid Build Coastguard Worker ps_sps = ps_dec->ps_cur_sps;
3534*495ae853SAndroid Build Coastguard Worker
3535*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3536*495ae853SAndroid Build Coastguard Worker /* Hardcoding flag information (assuming no field support) */
3537*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3538*495ae853SAndroid Build Coastguard Worker i4_ref_layer_field_pic_flag = SVCD_FALSE;
3539*495ae853SAndroid Build Coastguard Worker i4_field_pic_flag = SVCD_FALSE;
3540*495ae853SAndroid Build Coastguard Worker i4_frame_mbs_only_flag = SVCD_TRUE;
3541*495ae853SAndroid Build Coastguard Worker i4_field_Mb_flag = SVCD_FALSE;
3542*495ae853SAndroid Build Coastguard Worker i4_bot_field_flag = SVCD_FALSE;
3543*495ae853SAndroid Build Coastguard Worker i4_ref_layer_frame_Mbs_only_flag = SVCD_TRUE;
3544*495ae853SAndroid Build Coastguard Worker i4_horz_dim = 0;
3545*495ae853SAndroid Build Coastguard Worker i4_vert_dim = 0;
3546*495ae853SAndroid Build Coastguard Worker
3547*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3548*495ae853SAndroid Build Coastguard Worker /* Pointer and Paramater are intialized - Chroma and Luma */
3549*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3550*495ae853SAndroid Build Coastguard Worker {
3551*495ae853SAndroid Build Coastguard Worker WORD32 i4_base_width;
3552*495ae853SAndroid Build Coastguard Worker WORD32 i4_base_height;
3553*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_layer_chroma_phase_x_plus1_flag;
3554*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_layer_chroma_phase_y_plus1;
3555*495ae853SAndroid Build Coastguard Worker WORD32 i4_chroma_phase_x_plus1_flag;
3556*495ae853SAndroid Build Coastguard Worker WORD32 i4_chroma_phase_y_plus1;
3557*495ae853SAndroid Build Coastguard Worker
3558*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3559*495ae853SAndroid Build Coastguard Worker /* HARD CODED FOR 420 */
3560*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3561*495ae853SAndroid Build Coastguard Worker WORD32 i4_sub_wd_chroma = 2;
3562*495ae853SAndroid Build Coastguard Worker WORD32 i4_sub_ht_chroma = 2;
3563*495ae853SAndroid Build Coastguard Worker
3564*495ae853SAndroid Build Coastguard Worker i4_base_width = ps_ref_res_prms->i4_res_width;
3565*495ae853SAndroid Build Coastguard Worker i4_base_height = ps_ref_res_prms->i4_res_height;
3566*495ae853SAndroid Build Coastguard Worker
3567*495ae853SAndroid Build Coastguard Worker i4_ref_layer_chroma_phase_x_plus1_flag =
3568*495ae853SAndroid Build Coastguard Worker ps_curr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
3569*495ae853SAndroid Build Coastguard Worker i4_ref_layer_chroma_phase_y_plus1 = ps_curr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
3570*495ae853SAndroid Build Coastguard Worker i4_chroma_phase_x_plus1_flag = ps_sps->s_sps_svc_ext.u1_chroma_phase_x_plus1_flag;
3571*495ae853SAndroid Build Coastguard Worker i4_chroma_phase_y_plus1 = ps_sps->s_sps_svc_ext.u1_chroma_phase_y_plus1;
3572*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_bottom_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_bot;
3573*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_left_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_left;
3574*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_top_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_top;
3575*495ae853SAndroid Build Coastguard Worker i4_scaled_ref_layer_right_offset = ps_curr_res_prms->s_ref_lyr_scaled_offset.i2_rt;
3576*495ae853SAndroid Build Coastguard Worker
3577*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
3578*495ae853SAndroid Build Coastguard Worker /* Computing Effective Frame Dimensions */
3579*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------------*/
3580*495ae853SAndroid Build Coastguard Worker i4_ref_wd = (i4_base_width >> i4_chroma_flag);
3581*495ae853SAndroid Build Coastguard Worker i4_ref_ht = (i4_base_height >> i4_chroma_flag) * (1 + i4_ref_layer_field_pic_flag);
3582*495ae853SAndroid Build Coastguard Worker
3583*495ae853SAndroid Build Coastguard Worker i4_scaled_wd = ps_curr_res_prms->u2_scaled_ref_width;
3584*495ae853SAndroid Build Coastguard Worker i4_scaled_ht = ps_curr_res_prms->u2_scaled_ref_height;
3585*495ae853SAndroid Build Coastguard Worker
3586*495ae853SAndroid Build Coastguard Worker i4_scaled_wd = (i4_scaled_wd >> i4_chroma_flag);
3587*495ae853SAndroid Build Coastguard Worker i4_scaled_ht = (i4_scaled_ht >> i4_chroma_flag) * (1 + i4_field_pic_flag);
3588*495ae853SAndroid Build Coastguard Worker
3589*495ae853SAndroid Build Coastguard Worker if(1 == i4_chroma_flag)
3590*495ae853SAndroid Build Coastguard Worker {
3591*495ae853SAndroid Build Coastguard Worker i4_refphase_x = i4_ref_layer_chroma_phase_x_plus1_flag - 1;
3592*495ae853SAndroid Build Coastguard Worker i4_refphase_y = i4_ref_layer_chroma_phase_y_plus1 - 1;
3593*495ae853SAndroid Build Coastguard Worker i4_phase_x = i4_chroma_phase_x_plus1_flag - 1;
3594*495ae853SAndroid Build Coastguard Worker i4_phase_y = i4_chroma_phase_y_plus1 - 1;
3595*495ae853SAndroid Build Coastguard Worker i4_sub_wd = i4_sub_wd_chroma;
3596*495ae853SAndroid Build Coastguard Worker i4_sub_ht = i4_sub_ht_chroma;
3597*495ae853SAndroid Build Coastguard Worker i4_mb_wd = MB_WIDTH >> 1;
3598*495ae853SAndroid Build Coastguard Worker i4_mb_ht = MB_HEIGHT >> 1;
3599*495ae853SAndroid Build Coastguard Worker }
3600*495ae853SAndroid Build Coastguard Worker else
3601*495ae853SAndroid Build Coastguard Worker {
3602*495ae853SAndroid Build Coastguard Worker i4_refphase_x = 0;
3603*495ae853SAndroid Build Coastguard Worker i4_refphase_y = 0;
3604*495ae853SAndroid Build Coastguard Worker i4_phase_x = 0;
3605*495ae853SAndroid Build Coastguard Worker i4_phase_y = 0;
3606*495ae853SAndroid Build Coastguard Worker i4_sub_wd = 1;
3607*495ae853SAndroid Build Coastguard Worker i4_sub_ht = 1;
3608*495ae853SAndroid Build Coastguard Worker i4_mb_wd = MB_WIDTH;
3609*495ae853SAndroid Build Coastguard Worker i4_mb_ht = MB_HEIGHT;
3610*495ae853SAndroid Build Coastguard Worker }
3611*495ae853SAndroid Build Coastguard Worker }
3612*495ae853SAndroid Build Coastguard Worker
3613*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3614*495ae853SAndroid Build Coastguard Worker /* Derive shift x and y based on level idd */
3615*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3616*495ae853SAndroid Build Coastguard Worker if(ps_sps->u1_level_idc <= 30)
3617*495ae853SAndroid Build Coastguard Worker {
3618*495ae853SAndroid Build Coastguard Worker i4_shift_x = 16;
3619*495ae853SAndroid Build Coastguard Worker i4_shift_y = 16;
3620*495ae853SAndroid Build Coastguard Worker }
3621*495ae853SAndroid Build Coastguard Worker else
3622*495ae853SAndroid Build Coastguard Worker {
3623*495ae853SAndroid Build Coastguard Worker i4_shift_x = 31 - svcd_get_ceil_log2(i4_ref_wd);
3624*495ae853SAndroid Build Coastguard Worker i4_shift_y = 31 - svcd_get_ceil_log2(i4_ref_ht);
3625*495ae853SAndroid Build Coastguard Worker }
3626*495ae853SAndroid Build Coastguard Worker
3627*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3628*495ae853SAndroid Build Coastguard Worker /* The following condition is not true in our case for time being */
3629*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3630*495ae853SAndroid Build Coastguard Worker if((SVCD_FALSE == i4_frame_mbs_only_flag) || (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
3631*495ae853SAndroid Build Coastguard Worker {
3632*495ae853SAndroid Build Coastguard Worker i4_phase_y = i4_phase_y + 4 * i4_bot_field_flag;
3633*495ae853SAndroid Build Coastguard Worker
3634*495ae853SAndroid Build Coastguard Worker if(1 == i4_ref_layer_frame_Mbs_only_flag)
3635*495ae853SAndroid Build Coastguard Worker i4_refphase_y = (2 * i4_refphase_y) + 2;
3636*495ae853SAndroid Build Coastguard Worker else
3637*495ae853SAndroid Build Coastguard Worker i4_refphase_y = i4_refphase_y + (4 * i4_bot_field_flag);
3638*495ae853SAndroid Build Coastguard Worker }
3639*495ae853SAndroid Build Coastguard Worker
3640*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3641*495ae853SAndroid Build Coastguard Worker /* Dx and Dy Computation - Ratio of the base and enhance layer width */
3642*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3643*495ae853SAndroid Build Coastguard Worker i4_scale_x = ((i4_ref_wd << i4_shift_x) + (i4_scaled_wd >> 1)) / (i4_scaled_wd);
3644*495ae853SAndroid Build Coastguard Worker i4_scale_y = ((i4_ref_ht << i4_shift_y) + (i4_scaled_ht >> 1)) / (i4_scaled_ht);
3645*495ae853SAndroid Build Coastguard Worker
3646*495ae853SAndroid Build Coastguard Worker i4_offset_x = i4_scaled_ref_layer_left_offset / i4_sub_wd;
3647*495ae853SAndroid Build Coastguard Worker i4_add_x = (((i4_ref_wd * (2 + i4_phase_x)) << (i4_shift_x - 2)) + (i4_scaled_wd >> 1)) /
3648*495ae853SAndroid Build Coastguard Worker i4_scaled_wd +
3649*495ae853SAndroid Build Coastguard Worker (1 << (i4_shift_x - 5));
3650*495ae853SAndroid Build Coastguard Worker i4_delta_x = 4 * (2 + i4_refphase_x);
3651*495ae853SAndroid Build Coastguard Worker
3652*495ae853SAndroid Build Coastguard Worker if((SVCD_TRUE == i4_frame_mbs_only_flag) && (SVCD_TRUE == i4_ref_layer_frame_Mbs_only_flag))
3653*495ae853SAndroid Build Coastguard Worker {
3654*495ae853SAndroid Build Coastguard Worker i4_offset_y = i4_scaled_ref_layer_top_offset / i4_sub_ht;
3655*495ae853SAndroid Build Coastguard Worker i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (i4_shift_y - 2)) + (i4_scaled_ht >> 1)) /
3656*495ae853SAndroid Build Coastguard Worker i4_scaled_ht +
3657*495ae853SAndroid Build Coastguard Worker (1 << (i4_shift_y - 5));
3658*495ae853SAndroid Build Coastguard Worker i4_delta_y = 4 * (2 + i4_refphase_y);
3659*495ae853SAndroid Build Coastguard Worker }
3660*495ae853SAndroid Build Coastguard Worker else
3661*495ae853SAndroid Build Coastguard Worker {
3662*495ae853SAndroid Build Coastguard Worker i4_offset_y = i4_scaled_ref_layer_top_offset / (2 * i4_sub_ht);
3663*495ae853SAndroid Build Coastguard Worker i4_add_y = (((i4_ref_ht * (2 + i4_phase_y)) << (i4_shift_y - 3)) + (i4_scaled_ht >> 1)) /
3664*495ae853SAndroid Build Coastguard Worker i4_scaled_ht +
3665*495ae853SAndroid Build Coastguard Worker (1 << (i4_shift_y - 5));
3666*495ae853SAndroid Build Coastguard Worker i4_delta_y = 2 * (2 + i4_refphase_y);
3667*495ae853SAndroid Build Coastguard Worker }
3668*495ae853SAndroid Build Coastguard Worker
3669*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3670*495ae853SAndroid Build Coastguard Worker /* Intializing Local Pointers - Chroma and Luma */
3671*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3672*495ae853SAndroid Build Coastguard Worker
3673*495ae853SAndroid Build Coastguard Worker ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
3674*495ae853SAndroid Build Coastguard Worker ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
3675*495ae853SAndroid Build Coastguard Worker
3676*495ae853SAndroid Build Coastguard Worker i4_curr_lyr_width = ps_curr_res_prms->i4_res_width >> i4_chroma_flag;
3677*495ae853SAndroid Build Coastguard Worker i4_curr_lyr_height = ps_curr_res_prms->i4_res_height >> i4_chroma_flag;
3678*495ae853SAndroid Build Coastguard Worker
3679*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3680*495ae853SAndroid Build Coastguard Worker /* Dyadic Scaling Ratios Handling */
3681*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3682*495ae853SAndroid Build Coastguard Worker if(1 == ps_curr_res_prms->u1_dyadic_flag)
3683*495ae853SAndroid Build Coastguard Worker {
3684*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_wd, i4_x_offset;
3685*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_ht, i4_y_offset;
3686*495ae853SAndroid Build Coastguard Worker WORD32 i4_crp_wd_lt, i4_crp_ht_top;
3687*495ae853SAndroid Build Coastguard Worker WORD32 i4_crp_wd_rt, i4_crp_ht_bot;
3688*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_lyr_wd, i4_ref_lyr_ht;
3689*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_x, i4_ref_y;
3690*495ae853SAndroid Build Coastguard Worker WORD32 i4_ofst;
3691*495ae853SAndroid Build Coastguard Worker WORD32 i4_i, i4_j;
3692*495ae853SAndroid Build Coastguard Worker
3693*495ae853SAndroid Build Coastguard Worker /* Hard coded for dyadic case */
3694*495ae853SAndroid Build Coastguard Worker i4_refarray_wd = 20 >> i4_chroma_flag;
3695*495ae853SAndroid Build Coastguard Worker i4_ofst = -2 >> i4_chroma_flag;
3696*495ae853SAndroid Build Coastguard Worker i4_crp_wd_lt = i4_scaled_ref_layer_left_offset >> i4_chroma_flag;
3697*495ae853SAndroid Build Coastguard Worker i4_crp_wd_rt = i4_scaled_ref_layer_right_offset >> i4_chroma_flag;
3698*495ae853SAndroid Build Coastguard Worker i4_ref_lyr_wd = (i4_curr_lyr_width >> 1);
3699*495ae853SAndroid Build Coastguard Worker
3700*495ae853SAndroid Build Coastguard Worker i4_ref_x = 0;
3701*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < i4_curr_lyr_width; i4_i += (i4_mb_wd << 1))
3702*495ae853SAndroid Build Coastguard Worker {
3703*495ae853SAndroid Build Coastguard Worker i4_x_offset = MAX(i4_ofst, (i4_ref_x + i4_ofst));
3704*495ae853SAndroid Build Coastguard Worker i4_x_offset = MIN(i4_x_offset, (i4_ref_lyr_wd - i4_ofst));
3705*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_offset = i4_x_offset;
3706*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_length = i4_refarray_wd;
3707*495ae853SAndroid Build Coastguard Worker ps_x_off_len++;
3708*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_offset = i4_x_offset;
3709*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_length = i4_refarray_wd;
3710*495ae853SAndroid Build Coastguard Worker ps_x_off_len++;
3711*495ae853SAndroid Build Coastguard Worker if(i4_i >= i4_crp_wd_lt)
3712*495ae853SAndroid Build Coastguard Worker {
3713*495ae853SAndroid Build Coastguard Worker if(i4_i <= (i4_curr_lyr_width - i4_crp_wd_rt))
3714*495ae853SAndroid Build Coastguard Worker {
3715*495ae853SAndroid Build Coastguard Worker i4_ref_x += i4_mb_wd;
3716*495ae853SAndroid Build Coastguard Worker }
3717*495ae853SAndroid Build Coastguard Worker }
3718*495ae853SAndroid Build Coastguard Worker }
3719*495ae853SAndroid Build Coastguard Worker
3720*495ae853SAndroid Build Coastguard Worker i4_refarray_ht = 20 >> i4_chroma_flag;
3721*495ae853SAndroid Build Coastguard Worker i4_crp_ht_top = i4_scaled_ref_layer_top_offset >> i4_chroma_flag;
3722*495ae853SAndroid Build Coastguard Worker i4_crp_ht_bot = i4_scaled_ref_layer_bottom_offset >> i4_chroma_flag;
3723*495ae853SAndroid Build Coastguard Worker i4_ref_lyr_ht = (i4_curr_lyr_height >> 1);
3724*495ae853SAndroid Build Coastguard Worker
3725*495ae853SAndroid Build Coastguard Worker i4_ref_y = 0;
3726*495ae853SAndroid Build Coastguard Worker for(i4_j = 0; i4_j < i4_curr_lyr_height; i4_j += (i4_mb_ht << 1))
3727*495ae853SAndroid Build Coastguard Worker {
3728*495ae853SAndroid Build Coastguard Worker i4_y_offset = MAX(i4_ofst, (i4_ref_y + i4_ofst));
3729*495ae853SAndroid Build Coastguard Worker i4_y_offset = MIN(i4_y_offset, (i4_ref_lyr_ht - i4_ofst));
3730*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_offset = i4_y_offset;
3731*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_length = i4_refarray_ht;
3732*495ae853SAndroid Build Coastguard Worker ps_y_off_len++;
3733*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_offset = i4_y_offset;
3734*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_length = i4_refarray_ht;
3735*495ae853SAndroid Build Coastguard Worker ps_y_off_len++;
3736*495ae853SAndroid Build Coastguard Worker if(i4_j >= i4_crp_ht_top)
3737*495ae853SAndroid Build Coastguard Worker {
3738*495ae853SAndroid Build Coastguard Worker if(i4_j <= (i4_curr_lyr_height - i4_crp_ht_bot))
3739*495ae853SAndroid Build Coastguard Worker {
3740*495ae853SAndroid Build Coastguard Worker i4_ref_y += i4_mb_ht;
3741*495ae853SAndroid Build Coastguard Worker }
3742*495ae853SAndroid Build Coastguard Worker }
3743*495ae853SAndroid Build Coastguard Worker }
3744*495ae853SAndroid Build Coastguard Worker
3745*495ae853SAndroid Build Coastguard Worker /* No need to process further, return */
3746*495ae853SAndroid Build Coastguard Worker return;
3747*495ae853SAndroid Build Coastguard Worker } /* If dyadic path */
3748*495ae853SAndroid Build Coastguard Worker
3749*495ae853SAndroid Build Coastguard Worker /* Proposed Algo for Optimization */
3750*495ae853SAndroid Build Coastguard Worker {
3751*495ae853SAndroid Build Coastguard Worker WORD32 i4_max, i4_min;
3752*495ae853SAndroid Build Coastguard Worker ref_min_max_map_t *ps_x_min_max;
3753*495ae853SAndroid Build Coastguard Worker ref_min_max_map_t *ps_y_min_max;
3754*495ae853SAndroid Build Coastguard Worker WORD32 i4_i, i4_j;
3755*495ae853SAndroid Build Coastguard Worker
3756*495ae853SAndroid Build Coastguard Worker ps_x_min_max = ps_map_ctxt->ps_x_min_max;
3757*495ae853SAndroid Build Coastguard Worker ps_y_min_max = ps_map_ctxt->ps_y_min_max;
3758*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
3759*495ae853SAndroid Build Coastguard Worker /* Computation of offsetX refArrayW Xmin and Xmax Lists */
3760*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
3761*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < i4_curr_lyr_width; i4_i = i4_i + i4_mb_wd)
3762*495ae853SAndroid Build Coastguard Worker {
3763*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_wd, i4_xr_index;
3764*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_refmin16;
3765*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_refmax16;
3766*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_offset;
3767*495ae853SAndroid Build Coastguard Worker
3768*495ae853SAndroid Build Coastguard Worker i4_x_refmin16 = (WORD64) (((WORD64) (i4_i - i4_offset_x) * i4_scale_x + i4_add_x) >>
3769*495ae853SAndroid Build Coastguard Worker (i4_shift_x - 4)) -
3770*495ae853SAndroid Build Coastguard Worker i4_delta_x;
3771*495ae853SAndroid Build Coastguard Worker
3772*495ae853SAndroid Build Coastguard Worker i4_x_refmax16 =
3773*495ae853SAndroid Build Coastguard Worker (WORD64) (((WORD64) (i4_i + i4_mb_wd - 1 - i4_offset_x) * i4_scale_x + i4_add_x) >>
3774*495ae853SAndroid Build Coastguard Worker (i4_shift_x - 4)) -
3775*495ae853SAndroid Build Coastguard Worker i4_delta_x;
3776*495ae853SAndroid Build Coastguard Worker
3777*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3778*495ae853SAndroid Build Coastguard Worker /* Modified AC205 */
3779*495ae853SAndroid Build Coastguard Worker /* Minimum width required - So adding 2 pixels on each side */
3780*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3781*495ae853SAndroid Build Coastguard Worker i4_refarray_wd = ((i4_x_refmax16 + 15) >> 4) - (i4_x_refmin16 >> 4) + 1 + 4;
3782*495ae853SAndroid Build Coastguard Worker
3783*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3784*495ae853SAndroid Build Coastguard Worker /* Setting the offset 2 pixels before */
3785*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3786*495ae853SAndroid Build Coastguard Worker i4_x_offset = (i4_x_refmin16 >> 4) - 2;
3787*495ae853SAndroid Build Coastguard Worker
3788*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3789*495ae853SAndroid Build Coastguard Worker /* Modifying the values based on the location */
3790*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3791*495ae853SAndroid Build Coastguard Worker i4_min = i4_x_offset;
3792*495ae853SAndroid Build Coastguard Worker i4_xr_index = i4_min - ((i4_min / i4_mb_wd) * i4_mb_wd);
3793*495ae853SAndroid Build Coastguard Worker
3794*495ae853SAndroid Build Coastguard Worker if(i4_xr_index < (i4_mb_wd >> 1))
3795*495ae853SAndroid Build Coastguard Worker {
3796*495ae853SAndroid Build Coastguard Worker i4_refarray_wd = i4_refarray_wd + (i4_mb_wd >> 1);
3797*495ae853SAndroid Build Coastguard Worker i4_x_offset = i4_x_offset - (i4_mb_wd >> 1);
3798*495ae853SAndroid Build Coastguard Worker }
3799*495ae853SAndroid Build Coastguard Worker
3800*495ae853SAndroid Build Coastguard Worker i4_max = ((i4_x_refmax16 + 15) >> 4) + 2;
3801*495ae853SAndroid Build Coastguard Worker i4_xr_index = i4_max - ((i4_max / i4_mb_wd) * i4_mb_wd);
3802*495ae853SAndroid Build Coastguard Worker
3803*495ae853SAndroid Build Coastguard Worker if(i4_xr_index >= (i4_mb_wd >> 1)) i4_refarray_wd = i4_refarray_wd + (i4_mb_wd >> 1);
3804*495ae853SAndroid Build Coastguard Worker
3805*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3806*495ae853SAndroid Build Coastguard Worker /* Filling the arrays with offset, min, max and refArray dim */
3807*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3808*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_offset = i4_x_offset;
3809*495ae853SAndroid Build Coastguard Worker ps_x_off_len->i2_length = i4_refarray_wd;
3810*495ae853SAndroid Build Coastguard Worker
3811*495ae853SAndroid Build Coastguard Worker ps_x_min_max->i2_min_pos = (i4_x_refmin16 >> 4) - i4_x_offset;
3812*495ae853SAndroid Build Coastguard Worker ps_x_min_max->i2_max_pos = ((i4_x_refmax16 + 15) >> 4) - i4_x_offset;
3813*495ae853SAndroid Build Coastguard Worker
3814*495ae853SAndroid Build Coastguard Worker i4_tmp = (WORD32) (ps_x_min_max->i2_max_pos - ps_x_min_max->i2_min_pos) +
3815*495ae853SAndroid Build Coastguard Worker (4 >> i4_chroma_flag);
3816*495ae853SAndroid Build Coastguard Worker if(i4_tmp > i4_horz_dim)
3817*495ae853SAndroid Build Coastguard Worker {
3818*495ae853SAndroid Build Coastguard Worker i4_horz_dim = i4_tmp;
3819*495ae853SAndroid Build Coastguard Worker }
3820*495ae853SAndroid Build Coastguard Worker
3821*495ae853SAndroid Build Coastguard Worker /* increment the pointer */
3822*495ae853SAndroid Build Coastguard Worker ps_x_off_len++;
3823*495ae853SAndroid Build Coastguard Worker ps_x_min_max++;
3824*495ae853SAndroid Build Coastguard Worker
3825*495ae853SAndroid Build Coastguard Worker } /* end of loop over scaled width */
3826*495ae853SAndroid Build Coastguard Worker
3827*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
3828*495ae853SAndroid Build Coastguard Worker /* Computation of offsetY refArrayH Ymin and Ymax Lists */
3829*495ae853SAndroid Build Coastguard Worker /* ----------------------------------------------------------------- */
3830*495ae853SAndroid Build Coastguard Worker for(i4_j = 0; i4_j < i4_curr_lyr_height; i4_j = i4_j + i4_mb_ht)
3831*495ae853SAndroid Build Coastguard Worker {
3832*495ae853SAndroid Build Coastguard Worker WORD32 i4_refarray_ht, i4_yr_index;
3833*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_refmin16;
3834*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_refmax16;
3835*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_offset;
3836*495ae853SAndroid Build Coastguard Worker
3837*495ae853SAndroid Build Coastguard Worker i4_y_refmin16 = (WORD64) (((WORD64) (i4_j - i4_offset_y) * i4_scale_y + i4_add_y) >>
3838*495ae853SAndroid Build Coastguard Worker (i4_shift_y - 4)) -
3839*495ae853SAndroid Build Coastguard Worker i4_delta_y;
3840*495ae853SAndroid Build Coastguard Worker
3841*495ae853SAndroid Build Coastguard Worker i4_y_refmax16 =
3842*495ae853SAndroid Build Coastguard Worker (WORD64) (((WORD64) (i4_j + i4_mb_ht - 1 - i4_offset_y) * i4_scale_y + i4_add_y) >>
3843*495ae853SAndroid Build Coastguard Worker (i4_shift_y - 4)) -
3844*495ae853SAndroid Build Coastguard Worker i4_delta_y;
3845*495ae853SAndroid Build Coastguard Worker
3846*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3847*495ae853SAndroid Build Coastguard Worker /* Modified AC205 */
3848*495ae853SAndroid Build Coastguard Worker /* Minimum width required - So adding 2 pixels on each side */
3849*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3850*495ae853SAndroid Build Coastguard Worker i4_refarray_ht = ((i4_y_refmax16 + 15) >> 4) - (i4_y_refmin16 >> 4) + 1 + 4;
3851*495ae853SAndroid Build Coastguard Worker
3852*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3853*495ae853SAndroid Build Coastguard Worker /* Setting the offset 2 pixels before */
3854*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3855*495ae853SAndroid Build Coastguard Worker i4_y_offset = (i4_y_refmin16 >> 4) - 2;
3856*495ae853SAndroid Build Coastguard Worker
3857*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3858*495ae853SAndroid Build Coastguard Worker /* Modifying the values based on the location */
3859*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3860*495ae853SAndroid Build Coastguard Worker i4_min = i4_y_offset;
3861*495ae853SAndroid Build Coastguard Worker
3862*495ae853SAndroid Build Coastguard Worker i4_yr_index = i4_min - ((i4_min / i4_mb_ht) * i4_mb_ht);
3863*495ae853SAndroid Build Coastguard Worker
3864*495ae853SAndroid Build Coastguard Worker if(i4_yr_index < (i4_mb_ht >> 1))
3865*495ae853SAndroid Build Coastguard Worker {
3866*495ae853SAndroid Build Coastguard Worker i4_refarray_ht = i4_refarray_ht + (i4_mb_ht >> 1);
3867*495ae853SAndroid Build Coastguard Worker i4_y_offset = i4_y_offset - (i4_mb_ht >> 1);
3868*495ae853SAndroid Build Coastguard Worker }
3869*495ae853SAndroid Build Coastguard Worker
3870*495ae853SAndroid Build Coastguard Worker i4_max = ((i4_y_refmax16 + 15) >> 4) + 2;
3871*495ae853SAndroid Build Coastguard Worker i4_yr_index = i4_max - ((i4_max / i4_mb_ht) * i4_mb_ht);
3872*495ae853SAndroid Build Coastguard Worker
3873*495ae853SAndroid Build Coastguard Worker if(i4_yr_index >= (i4_mb_ht >> 1)) i4_refarray_ht = i4_refarray_ht + (i4_mb_ht >> 1);
3874*495ae853SAndroid Build Coastguard Worker
3875*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3876*495ae853SAndroid Build Coastguard Worker /* Filling the arrays with offset, min, max and refArray dim */
3877*495ae853SAndroid Build Coastguard Worker /* ------------------------------------------------------------- */
3878*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_offset = i4_y_offset;
3879*495ae853SAndroid Build Coastguard Worker ps_y_off_len->i2_length = i4_refarray_ht;
3880*495ae853SAndroid Build Coastguard Worker
3881*495ae853SAndroid Build Coastguard Worker ps_y_min_max->i2_min_pos = (i4_y_refmin16 >> 4) - i4_y_offset;
3882*495ae853SAndroid Build Coastguard Worker ps_y_min_max->i2_max_pos = ((i4_y_refmax16 + 15) >> 4) - i4_y_offset;
3883*495ae853SAndroid Build Coastguard Worker
3884*495ae853SAndroid Build Coastguard Worker i4_tmp = (WORD32) (ps_y_min_max->i2_max_pos - ps_y_min_max->i2_min_pos) +
3885*495ae853SAndroid Build Coastguard Worker (4 >> i4_chroma_flag);
3886*495ae853SAndroid Build Coastguard Worker if(i4_tmp > i4_vert_dim)
3887*495ae853SAndroid Build Coastguard Worker {
3888*495ae853SAndroid Build Coastguard Worker i4_vert_dim = i4_tmp;
3889*495ae853SAndroid Build Coastguard Worker }
3890*495ae853SAndroid Build Coastguard Worker
3891*495ae853SAndroid Build Coastguard Worker /* increment the pointer */
3892*495ae853SAndroid Build Coastguard Worker ps_y_off_len++;
3893*495ae853SAndroid Build Coastguard Worker ps_y_min_max++;
3894*495ae853SAndroid Build Coastguard Worker } /* end of loop over scaled height */
3895*495ae853SAndroid Build Coastguard Worker }
3896*495ae853SAndroid Build Coastguard Worker
3897*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3898*495ae853SAndroid Build Coastguard Worker /* Computation of Xref and Xphase List as per standard */
3899*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3900*495ae853SAndroid Build Coastguard Worker ps_x_off_len = ps_map_ctxt->ps_x_offset_length;
3901*495ae853SAndroid Build Coastguard Worker ps_y_off_len = ps_map_ctxt->ps_y_offset_length;
3902*495ae853SAndroid Build Coastguard Worker
3903*495ae853SAndroid Build Coastguard Worker {
3904*495ae853SAndroid Build Coastguard Worker ref_pixel_map_t *ps_x_pos_phase;
3905*495ae853SAndroid Build Coastguard Worker WORD32 i4_xc;
3906*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_x_index;
3907*495ae853SAndroid Build Coastguard Worker
3908*495ae853SAndroid Build Coastguard Worker ps_x_pos_phase = ps_map_ctxt->ps_x_pos_phase;
3909*495ae853SAndroid Build Coastguard Worker
3910*495ae853SAndroid Build Coastguard Worker for(i4_xc = 0; i4_xc < i4_curr_lyr_width; i4_xc++)
3911*495ae853SAndroid Build Coastguard Worker {
3912*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_offset;
3913*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_ref16;
3914*495ae853SAndroid Build Coastguard Worker
3915*495ae853SAndroid Build Coastguard Worker i4_offset_x_index = i4_xc / i4_mb_wd;
3916*495ae853SAndroid Build Coastguard Worker
3917*495ae853SAndroid Build Coastguard Worker i4_x_offset = ps_x_off_len[i4_offset_x_index].i2_offset;
3918*495ae853SAndroid Build Coastguard Worker
3919*495ae853SAndroid Build Coastguard Worker i4_x_ref16 = (WORD64) (((WORD64) (i4_xc - i4_offset_x) * i4_scale_x + i4_add_x) >>
3920*495ae853SAndroid Build Coastguard Worker (i4_shift_x - 4)) -
3921*495ae853SAndroid Build Coastguard Worker i4_delta_x;
3922*495ae853SAndroid Build Coastguard Worker
3923*495ae853SAndroid Build Coastguard Worker /* store the values */
3924*495ae853SAndroid Build Coastguard Worker ps_x_pos_phase->i2_ref_pos = (i4_x_ref16 >> 4) - i4_x_offset;
3925*495ae853SAndroid Build Coastguard Worker ps_x_pos_phase->i2_phase = i4_x_ref16 & 15;
3926*495ae853SAndroid Build Coastguard Worker
3927*495ae853SAndroid Build Coastguard Worker /* increment the pointer */
3928*495ae853SAndroid Build Coastguard Worker ps_x_pos_phase++;
3929*495ae853SAndroid Build Coastguard Worker
3930*495ae853SAndroid Build Coastguard Worker } /* end of loop over scaled width */
3931*495ae853SAndroid Build Coastguard Worker }
3932*495ae853SAndroid Build Coastguard Worker
3933*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3934*495ae853SAndroid Build Coastguard Worker /* Computation of Yref and Yphase List as per standard */
3935*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3936*495ae853SAndroid Build Coastguard Worker {
3937*495ae853SAndroid Build Coastguard Worker WORD32 i4_yc;
3938*495ae853SAndroid Build Coastguard Worker ref_pixel_map_t *ps_y_pos_phase;
3939*495ae853SAndroid Build Coastguard Worker
3940*495ae853SAndroid Build Coastguard Worker ps_y_pos_phase = ps_map_ctxt->ps_y_pos_phase;
3941*495ae853SAndroid Build Coastguard Worker
3942*495ae853SAndroid Build Coastguard Worker for(i4_yc = 0; i4_yc < i4_curr_lyr_height; i4_yc++)
3943*495ae853SAndroid Build Coastguard Worker {
3944*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_offset;
3945*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_ref16;
3946*495ae853SAndroid Build Coastguard Worker WORD32 i4_offset_y_index;
3947*495ae853SAndroid Build Coastguard Worker
3948*495ae853SAndroid Build Coastguard Worker i4_offset_y_index = i4_yc / i4_mb_ht;
3949*495ae853SAndroid Build Coastguard Worker
3950*495ae853SAndroid Build Coastguard Worker i4_y_offset = ps_y_off_len[i4_offset_y_index].i2_offset;
3951*495ae853SAndroid Build Coastguard Worker
3952*495ae853SAndroid Build Coastguard Worker if((SVCD_FALSE == i4_frame_mbs_only_flag) ||
3953*495ae853SAndroid Build Coastguard Worker (SVCD_FALSE == i4_ref_layer_frame_Mbs_only_flag))
3954*495ae853SAndroid Build Coastguard Worker {
3955*495ae853SAndroid Build Coastguard Worker i4_yc = i4_yc >> (1 - i4_field_Mb_flag);
3956*495ae853SAndroid Build Coastguard Worker }
3957*495ae853SAndroid Build Coastguard Worker
3958*495ae853SAndroid Build Coastguard Worker i4_y_ref16 = (WORD64) (((WORD64) (i4_yc - i4_offset_y) * i4_scale_y + i4_add_y) >>
3959*495ae853SAndroid Build Coastguard Worker (i4_shift_y - 4)) -
3960*495ae853SAndroid Build Coastguard Worker i4_delta_y;
3961*495ae853SAndroid Build Coastguard Worker
3962*495ae853SAndroid Build Coastguard Worker ps_y_pos_phase->i2_ref_pos = (i4_y_ref16 >> 4) - i4_y_offset;
3963*495ae853SAndroid Build Coastguard Worker ps_y_pos_phase->i2_phase = i4_y_ref16 & 15;
3964*495ae853SAndroid Build Coastguard Worker
3965*495ae853SAndroid Build Coastguard Worker /* increment the pointer */
3966*495ae853SAndroid Build Coastguard Worker ps_y_pos_phase++;
3967*495ae853SAndroid Build Coastguard Worker
3968*495ae853SAndroid Build Coastguard Worker } /* end of loop over scaled height */
3969*495ae853SAndroid Build Coastguard Worker }
3970*495ae853SAndroid Build Coastguard Worker
3971*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3972*495ae853SAndroid Build Coastguard Worker /* Computation of Corresponding Diagonal Location */
3973*495ae853SAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
3974*495ae853SAndroid Build Coastguard Worker {
3975*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_xd_index;
3976*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_yd_index;
3977*495ae853SAndroid Build Coastguard Worker WORD16 *pi2_ya_index;
3978*495ae853SAndroid Build Coastguard Worker WORD32 i4_i, i4_j;
3979*495ae853SAndroid Build Coastguard Worker
3980*495ae853SAndroid Build Coastguard Worker pi2_xd_index = ps_map_ctxt->pi2_xd_index;
3981*495ae853SAndroid Build Coastguard Worker pi2_yd_index = ps_map_ctxt->pi2_yd_index;
3982*495ae853SAndroid Build Coastguard Worker pi2_ya_index = ps_map_ctxt->pi2_ya_index;
3983*495ae853SAndroid Build Coastguard Worker
3984*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < i4_mb_wd; i4_i++)
3985*495ae853SAndroid Build Coastguard Worker {
3986*495ae853SAndroid Build Coastguard Worker *(pi2_xd_index + i4_i) = ((i4_i >= i4_mb_wd >> 1) ? (i4_i - i4_mb_wd) : (i4_i + 1));
3987*495ae853SAndroid Build Coastguard Worker
3988*495ae853SAndroid Build Coastguard Worker } /* end of loop over MB width */
3989*495ae853SAndroid Build Coastguard Worker
3990*495ae853SAndroid Build Coastguard Worker for(i4_j = 0; i4_j < i4_mb_ht; i4_j++)
3991*495ae853SAndroid Build Coastguard Worker {
3992*495ae853SAndroid Build Coastguard Worker *(pi2_yd_index + i4_j) = ((i4_j >= i4_mb_ht >> 1) ? (i4_j - i4_mb_ht) : (i4_j + 1));
3993*495ae853SAndroid Build Coastguard Worker
3994*495ae853SAndroid Build Coastguard Worker *(pi2_ya_index + i4_j) =
3995*495ae853SAndroid Build Coastguard Worker *(pi2_yd_index + i4_j) - ((i4_mb_ht >> 1 + 1) * (SIGN(*(pi2_yd_index + i4_j))));
3996*495ae853SAndroid Build Coastguard Worker
3997*495ae853SAndroid Build Coastguard Worker } /* end of loop over MB height */
3998*495ae853SAndroid Build Coastguard Worker }
3999*495ae853SAndroid Build Coastguard Worker
4000*495ae853SAndroid Build Coastguard Worker /* generate the lookup to generate horizontal segments */
4001*495ae853SAndroid Build Coastguard Worker svc_intra_resamp_generate_segment_lookup(ps_map_ctxt->ps_seg_lookup_horz, i4_horz_dim, i4_mb_wd,
4002*495ae853SAndroid Build Coastguard Worker 3);
4003*495ae853SAndroid Build Coastguard Worker
4004*495ae853SAndroid Build Coastguard Worker /* generate the lookup to generate vertical segments */
4005*495ae853SAndroid Build Coastguard Worker svc_intra_resamp_generate_segment_lookup(ps_map_ctxt->ps_seg_lookup_vert, i4_vert_dim, i4_mb_ht,
4006*495ae853SAndroid Build Coastguard Worker 4);
4007*495ae853SAndroid Build Coastguard Worker
4008*495ae853SAndroid Build Coastguard Worker return;
4009*495ae853SAndroid Build Coastguard Worker } /* end of function "svcd_intra_samp_populate_list"*/
4010*495ae853SAndroid Build Coastguard Worker
svcd_intra_samp_populate_res_prms(void * pv_dec)4011*495ae853SAndroid Build Coastguard Worker void svcd_intra_samp_populate_res_prms(void *pv_dec)
4012*495ae853SAndroid Build Coastguard Worker
4013*495ae853SAndroid Build Coastguard Worker {
4014*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *) pv_dec;
4015*495ae853SAndroid Build Coastguard Worker res_prms_t *ps_curr_lyr_res_prms;
4016*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms = &ps_dec->s_res_prms;
4017*495ae853SAndroid Build Coastguard Worker
4018*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i4_res_width = ps_dec->u2_pic_wd;
4019*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i4_res_height = ps_dec->u2_pic_ht;
4020*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left =
4021*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_left_offset << 1;
4022*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top =
4023*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_top_offset << 1;
4024*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt =
4025*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_right_offset << 1;
4026*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot =
4027*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.i4_seq_scaled_ref_layer_bottom_offset << 1;
4028*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u2_scaled_ref_width =
4029*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_frm_wd_in_mbs << 4) - (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left +
4030*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt);
4031*495ae853SAndroid Build Coastguard Worker
4032*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u2_scaled_ref_height =
4033*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_frm_ht_in_mbs << 4) - (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top +
4034*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot);
4035*495ae853SAndroid Build Coastguard Worker
4036*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_cropping_change_flag = 0;
4037*495ae853SAndroid Build Coastguard Worker if(2 == ps_dec->ps_cur_sps->s_sps_svc_ext.u1_extended_spatial_scalability_idc)
4038*495ae853SAndroid Build Coastguard Worker {
4039*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_cropping_change_flag = 1;
4040*495ae853SAndroid Build Coastguard Worker
4041*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left =
4042*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_scaled_ref_layer_left_offset << 1;
4043*495ae853SAndroid Build Coastguard Worker
4044*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top =
4045*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_scaled_ref_layer_top_offset << 1;
4046*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt =
4047*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_scaled_ref_layer_right_offset << 1;
4048*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot =
4049*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_scaled_ref_layer_bottom_offset << 1;
4050*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u2_scaled_ref_width =
4051*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_frm_wd_in_mbs << 4) -
4052*495ae853SAndroid Build Coastguard Worker (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_left +
4053*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_rt);
4054*495ae853SAndroid Build Coastguard Worker
4055*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u2_scaled_ref_height =
4056*495ae853SAndroid Build Coastguard Worker (ps_dec->u2_frm_ht_in_mbs << 4) -
4057*495ae853SAndroid Build Coastguard Worker (ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_top +
4058*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->s_ref_lyr_scaled_offset.i2_bot);
4059*495ae853SAndroid Build Coastguard Worker }
4060*495ae853SAndroid Build Coastguard Worker
4061*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_rstrct_res_change_flag = SVCD_TRUE;
4062*495ae853SAndroid Build Coastguard Worker
4063*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_disable_inter_lyr_dblk_filter_idc =
4064*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.u4_disable_inter_layer_deblk_filter_idc;
4065*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i1_inter_lyr_alpha_c0_offset =
4066*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_inter_layer_slice_alpha_c0_offset_div2;
4067*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i1_inter_lyr_beta_offset =
4068*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.i4_inter_layer_slice_beta_offset_div2;
4069*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i1_constrained_intra_rsmpl_flag =
4070*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_slice->s_svc_slice_params.u1_constrained_intra_resampling_flag;
4071*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag =
4072*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_x_plus1_flag;
4073*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1 =
4074*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->s_sps_svc_ext.u1_seq_ref_layer_chroma_phase_y_plus1;
4075*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_direct_8x8_inference_flag =
4076*495ae853SAndroid Build Coastguard Worker ps_dec->ps_cur_sps->u1_direct_8x8_inference_flag;
4077*495ae853SAndroid Build Coastguard Worker
4078*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_remap_req_flag = 1;
4079*495ae853SAndroid Build Coastguard Worker ps_curr_lyr_res_prms->u1_dyadic_flag = ps_dec->u1_dyadic_flag;
4080*495ae853SAndroid Build Coastguard Worker }
4081*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
4082*495ae853SAndroid Build Coastguard Worker /* */
4083*495ae853SAndroid Build Coastguard Worker /* Function Name : svcd_intra_samp_res_init */
4084*495ae853SAndroid Build Coastguard Worker /* */
4085*495ae853SAndroid Build Coastguard Worker /* Description : this function calculates the scale factors and initialise*/
4086*495ae853SAndroid Build Coastguard Worker /* the context structure */
4087*495ae853SAndroid Build Coastguard Worker /* */
4088*495ae853SAndroid Build Coastguard Worker /* Inputs : pv_intra_samp_ctxt: handle to private structure */
4089*495ae853SAndroid Build Coastguard Worker /* ps_curr_lyr_res_prms: pointer to current resolution */
4090*495ae853SAndroid Build Coastguard Worker /* params */
4091*495ae853SAndroid Build Coastguard Worker /* ps_ref_lyr_res_prms : pointer to ref resolution params */
4092*495ae853SAndroid Build Coastguard Worker /* Globals : none */
4093*495ae853SAndroid Build Coastguard Worker /* Processing : it stores the layer dimensions */
4094*495ae853SAndroid Build Coastguard Worker /* */
4095*495ae853SAndroid Build Coastguard Worker /* Outputs : none */
4096*495ae853SAndroid Build Coastguard Worker /* Returns : none */
4097*495ae853SAndroid Build Coastguard Worker /* */
4098*495ae853SAndroid Build Coastguard Worker /* Issues : none */
4099*495ae853SAndroid Build Coastguard Worker /* */
4100*495ae853SAndroid Build Coastguard Worker /* Revision History: */
4101*495ae853SAndroid Build Coastguard Worker /* */
4102*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
4103*495ae853SAndroid Build Coastguard Worker /* 26 06 2009 vijayakumar creation */
4104*495ae853SAndroid Build Coastguard Worker /* */
4105*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
svcd_intra_samp_res_init(void * pv_intra_samp_ctxt,res_prms_t * ps_curr_lyr_res_prms,ref_mb_map_t ** pps_luma_map_horz,ref_mb_map_t ** pps_chroma_map_horz,ref_mb_map_t ** pps_luma_map_vert,ref_mb_map_t ** pps_chroma_map_vert,void * pv_dec)4106*495ae853SAndroid Build Coastguard Worker void svcd_intra_samp_res_init(void *pv_intra_samp_ctxt, res_prms_t *ps_curr_lyr_res_prms,
4107*495ae853SAndroid Build Coastguard Worker ref_mb_map_t **pps_luma_map_horz, ref_mb_map_t **pps_chroma_map_horz,
4108*495ae853SAndroid Build Coastguard Worker ref_mb_map_t **pps_luma_map_vert, ref_mb_map_t **pps_chroma_map_vert,
4109*495ae853SAndroid Build Coastguard Worker void *pv_dec)
4110*495ae853SAndroid Build Coastguard Worker
4111*495ae853SAndroid Build Coastguard Worker {
4112*495ae853SAndroid Build Coastguard Worker intra_sampling_ctxt_t *ps_ctxt;
4113*495ae853SAndroid Build Coastguard Worker intra_samp_lyr_ctxt *ps_lyr_ctxt;
4114*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps;
4115*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec = (dec_struct_t *) pv_dec;
4116*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_dec_ref_layer;
4117*495ae853SAndroid Build Coastguard Worker dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice;
4118*495ae853SAndroid Build Coastguard Worker dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL;
4119*495ae853SAndroid Build Coastguard Worker ps_svc_slice_params = &ps_slice->s_svc_slice_params;
4120*495ae853SAndroid Build Coastguard Worker ps_sps = ps_dec->ps_cur_sps;
4121*495ae853SAndroid Build Coastguard Worker ps_dec_ref_layer = ps_dec->ps_dec_ref_layer;
4122*495ae853SAndroid Build Coastguard Worker ps_ctxt = (intra_sampling_ctxt_t *) pv_intra_samp_ctxt;
4123*495ae853SAndroid Build Coastguard Worker
4124*495ae853SAndroid Build Coastguard Worker /* if called for base resolution store default values */
4125*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_dec->u1_base_res_flag)
4126*495ae853SAndroid Build Coastguard Worker {
4127*495ae853SAndroid Build Coastguard Worker *pps_luma_map_horz = NULL;
4128*495ae853SAndroid Build Coastguard Worker *pps_chroma_map_horz = NULL;
4129*495ae853SAndroid Build Coastguard Worker *pps_luma_map_vert = NULL;
4130*495ae853SAndroid Build Coastguard Worker *pps_chroma_map_vert = NULL;
4131*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_res_lyr_id = -1;
4132*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_ref_width = ps_dec->u2_pic_wd;
4133*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_ref_height = ps_dec->u2_pic_ht;
4134*495ae853SAndroid Build Coastguard Worker
4135*495ae853SAndroid Build Coastguard Worker /* Note: The stride option is provided for bringing in data at NMB */
4136*495ae853SAndroid Build Coastguard Worker /* level. Hence to set a NMB level stride refSample array buffer */
4137*495ae853SAndroid Build Coastguard Worker /* have to be increased */
4138*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_refarray_stride = REF_ARRAY_WIDTH;
4139*495ae853SAndroid Build Coastguard Worker return;
4140*495ae853SAndroid Build Coastguard Worker }
4141*495ae853SAndroid Build Coastguard Worker
4142*495ae853SAndroid Build Coastguard Worker /* derive the current sps */
4143*495ae853SAndroid Build Coastguard Worker
4144*495ae853SAndroid Build Coastguard Worker /* store the res id appropriately */
4145*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_res_lyr_id = ps_dec->u1_layer_id - 1;
4146*495ae853SAndroid Build Coastguard Worker
4147*495ae853SAndroid Build Coastguard Worker /* store the resolution params */
4148*495ae853SAndroid Build Coastguard Worker ps_ctxt->ps_res_prms = ps_curr_lyr_res_prms;
4149*495ae853SAndroid Build Coastguard Worker
4150*495ae853SAndroid Build Coastguard Worker /* get the current layer ctxt */
4151*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt = &ps_ctxt->as_res_lyrs[ps_dec->u1_layer_id - 1];
4152*495ae853SAndroid Build Coastguard Worker
4153*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_res_lyr_id = ps_dec->u1_layer_id - 1;
4154*495ae853SAndroid Build Coastguard Worker /* get the width and heights */
4155*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_curr_width = ps_dec->u2_pic_wd;
4156*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_curr_height = ps_dec->u2_pic_ht;
4157*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_ref_width = ps_ctxt->i4_ref_width;
4158*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_ref_height = ps_ctxt->i4_ref_height;
4159*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i1_constrained_intra_rsmpl_flag =
4160*495ae853SAndroid Build Coastguard Worker ps_svc_slice_params->u1_constrained_intra_resampling_flag;
4161*495ae853SAndroid Build Coastguard Worker
4162*495ae853SAndroid Build Coastguard Worker /* store the structure pointer containing projected locations */
4163*495ae853SAndroid Build Coastguard Worker *pps_luma_map_horz = ps_lyr_ctxt->s_luma_map_ctxt.ps_x_offset_length;
4164*495ae853SAndroid Build Coastguard Worker *pps_chroma_map_horz = ps_lyr_ctxt->s_chroma_map_ctxt.ps_x_offset_length;
4165*495ae853SAndroid Build Coastguard Worker *pps_luma_map_vert = ps_lyr_ctxt->s_luma_map_ctxt.ps_y_offset_length;
4166*495ae853SAndroid Build Coastguard Worker *pps_chroma_map_vert = ps_lyr_ctxt->s_chroma_map_ctxt.ps_y_offset_length;
4167*495ae853SAndroid Build Coastguard Worker
4168*495ae853SAndroid Build Coastguard Worker /* check for recomputation of mapping required */
4169*495ae853SAndroid Build Coastguard Worker if(SVCD_TRUE == ps_curr_lyr_res_prms->u1_remap_req_flag)
4170*495ae853SAndroid Build Coastguard Worker {
4171*495ae853SAndroid Build Coastguard Worker res_prms_t s_ref_res_prms = {0};
4172*495ae853SAndroid Build Coastguard Worker WORD32 i4_chroma_x_phase, i4_chroma_y_phase;
4173*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_chroma_x_phase, i4_ref_chroma_y_phase;
4174*495ae853SAndroid Build Coastguard Worker WORD32 i4_x_phase_0, i4_x_phase_1;
4175*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_phase_0, i4_y_phase_1;
4176*495ae853SAndroid Build Coastguard Worker WORD32 i4_vert_flag;
4177*495ae853SAndroid Build Coastguard Worker
4178*495ae853SAndroid Build Coastguard Worker /* store the reference layer resolution width and height */
4179*495ae853SAndroid Build Coastguard Worker s_ref_res_prms.i4_res_width = ps_ctxt->i4_ref_width;
4180*495ae853SAndroid Build Coastguard Worker s_ref_res_prms.i4_res_height = ps_ctxt->i4_ref_height;
4181*495ae853SAndroid Build Coastguard Worker
4182*495ae853SAndroid Build Coastguard Worker /* call the frame level projections calculation function */
4183*495ae853SAndroid Build Coastguard Worker svcd_intra_samp_populate_list(&ps_lyr_ctxt->s_luma_map_ctxt, ps_curr_lyr_res_prms,
4184*495ae853SAndroid Build Coastguard Worker &s_ref_res_prms, 0, ps_dec);
4185*495ae853SAndroid Build Coastguard Worker
4186*495ae853SAndroid Build Coastguard Worker svcd_intra_samp_populate_list(&ps_lyr_ctxt->s_chroma_map_ctxt, ps_curr_lyr_res_prms,
4187*495ae853SAndroid Build Coastguard Worker &s_ref_res_prms, 1, ps_dec);
4188*495ae853SAndroid Build Coastguard Worker
4189*495ae853SAndroid Build Coastguard Worker /* Compute the chroma xPhase and yPhase values */
4190*495ae853SAndroid Build Coastguard Worker if(1 == ps_curr_lyr_res_prms->u1_dyadic_flag)
4191*495ae853SAndroid Build Coastguard Worker {
4192*495ae853SAndroid Build Coastguard Worker i4_ref_chroma_x_phase = ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_x_plus1_flag;
4193*495ae853SAndroid Build Coastguard Worker i4_ref_chroma_y_phase = ps_curr_lyr_res_prms->i1_ref_lyr_chroma_phase_y_plus1;
4194*495ae853SAndroid Build Coastguard Worker i4_chroma_x_phase = ps_sps->s_sps_svc_ext.u1_chroma_phase_x_plus1_flag;
4195*495ae853SAndroid Build Coastguard Worker i4_chroma_y_phase = ps_sps->s_sps_svc_ext.u1_chroma_phase_y_plus1;
4196*495ae853SAndroid Build Coastguard Worker
4197*495ae853SAndroid Build Coastguard Worker i4_x_phase_0 = i4_chroma_x_phase - (i4_ref_chroma_x_phase << 1);
4198*495ae853SAndroid Build Coastguard Worker i4_x_phase_1 = (3 + i4_x_phase_0) & 0x7;
4199*495ae853SAndroid Build Coastguard Worker i4_x_phase_0 += 7;
4200*495ae853SAndroid Build Coastguard Worker i4_x_phase_0 &= 0x7;
4201*495ae853SAndroid Build Coastguard Worker i4_y_phase_0 = i4_chroma_y_phase - (i4_ref_chroma_y_phase << 1);
4202*495ae853SAndroid Build Coastguard Worker i4_y_phase_1 = (3 + i4_y_phase_0) & 0x7;
4203*495ae853SAndroid Build Coastguard Worker i4_y_phase_0 += 7;
4204*495ae853SAndroid Build Coastguard Worker i4_y_phase_0 &= 0x7;
4205*495ae853SAndroid Build Coastguard Worker
4206*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_x_phase_0 = i4_x_phase_0;
4207*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_x_phase_1 = i4_x_phase_1;
4208*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_y_phase_0 = i4_y_phase_0;
4209*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->i4_y_phase_1 = i4_y_phase_1;
4210*495ae853SAndroid Build Coastguard Worker
4211*495ae853SAndroid Build Coastguard Worker /* Choose the appropriate chroma interpolation functions */
4212*495ae853SAndroid Build Coastguard Worker if((0 == i4_ref_chroma_x_phase) && (1 == i4_chroma_x_phase))
4213*495ae853SAndroid Build Coastguard Worker {
4214*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_horz_chroma_interpol = (&svcd_horz_interpol_chroma_dyadic_2);
4215*495ae853SAndroid Build Coastguard Worker }
4216*495ae853SAndroid Build Coastguard Worker else
4217*495ae853SAndroid Build Coastguard Worker {
4218*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_horz_chroma_interpol = (&svcd_horz_interpol_chroma_dyadic_1);
4219*495ae853SAndroid Build Coastguard Worker }
4220*495ae853SAndroid Build Coastguard Worker
4221*495ae853SAndroid Build Coastguard Worker i4_vert_flag = 0;
4222*495ae853SAndroid Build Coastguard Worker if(0 == i4_ref_chroma_y_phase)
4223*495ae853SAndroid Build Coastguard Worker {
4224*495ae853SAndroid Build Coastguard Worker if((1 == i4_chroma_y_phase) || (2 == i4_chroma_y_phase))
4225*495ae853SAndroid Build Coastguard Worker {
4226*495ae853SAndroid Build Coastguard Worker i4_vert_flag = 1;
4227*495ae853SAndroid Build Coastguard Worker }
4228*495ae853SAndroid Build Coastguard Worker }
4229*495ae853SAndroid Build Coastguard Worker else if((2 == i4_ref_chroma_y_phase) && (0 == i4_chroma_y_phase))
4230*495ae853SAndroid Build Coastguard Worker {
4231*495ae853SAndroid Build Coastguard Worker i4_vert_flag = 2;
4232*495ae853SAndroid Build Coastguard Worker }
4233*495ae853SAndroid Build Coastguard Worker
4234*495ae853SAndroid Build Coastguard Worker if(1 == i4_vert_flag)
4235*495ae853SAndroid Build Coastguard Worker {
4236*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_vert_chroma_interpol = (&svcd_vert_interpol_chroma_dyadic_2);
4237*495ae853SAndroid Build Coastguard Worker }
4238*495ae853SAndroid Build Coastguard Worker else if(2 == i4_vert_flag)
4239*495ae853SAndroid Build Coastguard Worker {
4240*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_vert_chroma_interpol = (&svcd_vert_interpol_chroma_dyadic_3);
4241*495ae853SAndroid Build Coastguard Worker }
4242*495ae853SAndroid Build Coastguard Worker else
4243*495ae853SAndroid Build Coastguard Worker {
4244*495ae853SAndroid Build Coastguard Worker ps_lyr_ctxt->pf_vert_chroma_interpol = (&svcd_vert_interpol_chroma_dyadic_1);
4245*495ae853SAndroid Build Coastguard Worker }
4246*495ae853SAndroid Build Coastguard Worker }
4247*495ae853SAndroid Build Coastguard Worker }
4248*495ae853SAndroid Build Coastguard Worker else
4249*495ae853SAndroid Build Coastguard Worker {
4250*495ae853SAndroid Build Coastguard Worker /* should take false value */
4251*495ae853SAndroid Build Coastguard Worker ASSERT(SVCD_FALSE == ps_curr_lyr_res_prms->u1_remap_req_flag);
4252*495ae853SAndroid Build Coastguard Worker }
4253*495ae853SAndroid Build Coastguard Worker
4254*495ae853SAndroid Build Coastguard Worker /* Set the border values of ref_mb_modes to 0xFF */
4255*495ae853SAndroid Build Coastguard Worker {
4256*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_tmp_prms, *ps_tmp_prms_2;
4257*495ae853SAndroid Build Coastguard Worker inter_lyr_mb_prms_t *ps_ref_mb_prms;
4258*495ae853SAndroid Build Coastguard Worker WORD32 i4_stride;
4259*495ae853SAndroid Build Coastguard Worker WORD32 i4_ref_ht_in_mbs, i4_ref_wd_in_mbs;
4260*495ae853SAndroid Build Coastguard Worker WORD32 i4_i;
4261*495ae853SAndroid Build Coastguard Worker
4262*495ae853SAndroid Build Coastguard Worker /* Derive the reference mb mode map */
4263*495ae853SAndroid Build Coastguard Worker
4264*495ae853SAndroid Build Coastguard Worker ps_ref_mb_prms = ps_dec_ref_layer->ps_inter_lyr_mb_prms_frm_start;
4265*495ae853SAndroid Build Coastguard Worker i4_stride =
4266*495ae853SAndroid Build Coastguard Worker ps_dec_ref_layer->u2_inter_lyr_mb_prms_stride; // SVC_DEC_REVIEW_INTRA_RESAMPLE;
4267*495ae853SAndroid Build Coastguard Worker
4268*495ae853SAndroid Build Coastguard Worker i4_ref_ht_in_mbs = (ps_lyr_ctxt->i4_ref_height >> 4);
4269*495ae853SAndroid Build Coastguard Worker i4_ref_wd_in_mbs = (ps_lyr_ctxt->i4_ref_width >> 4);
4270*495ae853SAndroid Build Coastguard Worker
4271*495ae853SAndroid Build Coastguard Worker /* Set the first border row to 0xFF */
4272*495ae853SAndroid Build Coastguard Worker ps_tmp_prms = (ps_ref_mb_prms - 1 - i4_stride);
4273*495ae853SAndroid Build Coastguard Worker
4274*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < (i4_ref_wd_in_mbs + 2); i4_i++)
4275*495ae853SAndroid Build Coastguard Worker {
4276*495ae853SAndroid Build Coastguard Worker ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4277*495ae853SAndroid Build Coastguard Worker ps_tmp_prms += 1;
4278*495ae853SAndroid Build Coastguard Worker }
4279*495ae853SAndroid Build Coastguard Worker
4280*495ae853SAndroid Build Coastguard Worker /* Set the left and right border pixels of each row to 0 */
4281*495ae853SAndroid Build Coastguard Worker ps_tmp_prms = ps_ref_mb_prms - 1;
4282*495ae853SAndroid Build Coastguard Worker
4283*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < i4_ref_ht_in_mbs; i4_i++)
4284*495ae853SAndroid Build Coastguard Worker {
4285*495ae853SAndroid Build Coastguard Worker ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4286*495ae853SAndroid Build Coastguard Worker ps_tmp_prms_2 = ps_tmp_prms + (i4_ref_wd_in_mbs + 1);
4287*495ae853SAndroid Build Coastguard Worker ps_tmp_prms_2->i1_mb_mode = (WORD8) 0xFF;
4288*495ae853SAndroid Build Coastguard Worker ps_tmp_prms += i4_stride;
4289*495ae853SAndroid Build Coastguard Worker }
4290*495ae853SAndroid Build Coastguard Worker
4291*495ae853SAndroid Build Coastguard Worker /* Set the last border row to 0xFF */
4292*495ae853SAndroid Build Coastguard Worker for(i4_i = 0; i4_i < (i4_ref_wd_in_mbs + 2); i4_i++)
4293*495ae853SAndroid Build Coastguard Worker {
4294*495ae853SAndroid Build Coastguard Worker ps_tmp_prms->i1_mb_mode = (WORD8) 0xFF;
4295*495ae853SAndroid Build Coastguard Worker ps_tmp_prms += 1;
4296*495ae853SAndroid Build Coastguard Worker }
4297*495ae853SAndroid Build Coastguard Worker }
4298*495ae853SAndroid Build Coastguard Worker
4299*495ae853SAndroid Build Coastguard Worker /* store the current layer width and height to context */
4300*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_ref_width = ps_curr_lyr_res_prms->i4_res_width;
4301*495ae853SAndroid Build Coastguard Worker ps_ctxt->i4_ref_height = ps_curr_lyr_res_prms->i4_res_height;
4302*495ae853SAndroid Build Coastguard Worker
4303*495ae853SAndroid Build Coastguard Worker return;
4304*495ae853SAndroid Build Coastguard Worker }
4305