xref: /aosp_15_r20/external/libhevc/common/ihevc_weighted_pred.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar *  ihevc_weighted_pred.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains function definitions for weighted prediction used in inter
25*c83a76b0SSuyog Pawar * prediction
26*c83a76b0SSuyog Pawar *
27*c83a76b0SSuyog Pawar * @author
28*c83a76b0SSuyog Pawar *  Srinivas T
29*c83a76b0SSuyog Pawar *
30*c83a76b0SSuyog Pawar * @par List of Functions:
31*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_uni()
32*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_bi()
33*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_bi_default()
34*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_chroma_uni()
35*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_chroma_bi()
36*c83a76b0SSuyog Pawar *   - ihevc_weighted_pred_chroma_bi_default()
37*c83a76b0SSuyog Pawar *
38*c83a76b0SSuyog Pawar * @remarks
39*c83a76b0SSuyog Pawar *  None
40*c83a76b0SSuyog Pawar *
41*c83a76b0SSuyog Pawar *******************************************************************************
42*c83a76b0SSuyog Pawar */
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar /* File Includes                                                             */
45*c83a76b0SSuyog Pawar /*****************************************************************************/
46*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
47*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
48*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
49*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
50*c83a76b0SSuyog Pawar #include "ihevc_func_selector.h"
51*c83a76b0SSuyog Pawar 
52*c83a76b0SSuyog Pawar #include "ihevc_inter_pred.h"
53*c83a76b0SSuyog Pawar 
54*c83a76b0SSuyog Pawar /**
55*c83a76b0SSuyog Pawar *******************************************************************************
56*c83a76b0SSuyog Pawar *
57*c83a76b0SSuyog Pawar * @brief
58*c83a76b0SSuyog Pawar *  Does uni-weighted prediction on the array pointed by  pi2_src and stores
59*c83a76b0SSuyog Pawar * it at the location pointed by pi2_dst
60*c83a76b0SSuyog Pawar *
61*c83a76b0SSuyog Pawar * @par Description:
62*c83a76b0SSuyog Pawar *  dst = ( (src + lvl_shift) * wgt0 + (1 << (shift - 1)) )  >> shift +
63*c83a76b0SSuyog Pawar * offset
64*c83a76b0SSuyog Pawar *
65*c83a76b0SSuyog Pawar * @param[in] pi2_src
66*c83a76b0SSuyog Pawar *  Pointer to the source
67*c83a76b0SSuyog Pawar *
68*c83a76b0SSuyog Pawar * @param[out] pu1_dst
69*c83a76b0SSuyog Pawar *  Pointer to the destination
70*c83a76b0SSuyog Pawar *
71*c83a76b0SSuyog Pawar * @param[in] src_strd
72*c83a76b0SSuyog Pawar *  Source stride
73*c83a76b0SSuyog Pawar *
74*c83a76b0SSuyog Pawar * @param[in] dst_strd
75*c83a76b0SSuyog Pawar *  Destination stride
76*c83a76b0SSuyog Pawar *
77*c83a76b0SSuyog Pawar * @param[in] wgt0
78*c83a76b0SSuyog Pawar *  weight to be multiplied to the source
79*c83a76b0SSuyog Pawar *
80*c83a76b0SSuyog Pawar * @param[in] off0
81*c83a76b0SSuyog Pawar *  offset to be added after rounding and
82*c83a76b0SSuyog Pawar *
83*c83a76b0SSuyog Pawar * @param[in] shifting
84*c83a76b0SSuyog Pawar *
85*c83a76b0SSuyog Pawar *
86*c83a76b0SSuyog Pawar * @param[in] shift
87*c83a76b0SSuyog Pawar *  (14 Bit depth) + log2_weight_denominator
88*c83a76b0SSuyog Pawar *
89*c83a76b0SSuyog Pawar * @param[in] lvl_shift
90*c83a76b0SSuyog Pawar *  added before shift and offset
91*c83a76b0SSuyog Pawar *
92*c83a76b0SSuyog Pawar * @param[in] ht
93*c83a76b0SSuyog Pawar *  height of the source
94*c83a76b0SSuyog Pawar *
95*c83a76b0SSuyog Pawar * @param[in] wd
96*c83a76b0SSuyog Pawar *  width of the source
97*c83a76b0SSuyog Pawar *
98*c83a76b0SSuyog Pawar * @returns
99*c83a76b0SSuyog Pawar *
100*c83a76b0SSuyog Pawar * @remarks
101*c83a76b0SSuyog Pawar *  None
102*c83a76b0SSuyog Pawar *
103*c83a76b0SSuyog Pawar *******************************************************************************
104*c83a76b0SSuyog Pawar */
105*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_uni(WORD16 * pi2_src,UWORD8 * pu1_dst,WORD32 src_strd,WORD32 dst_strd,WORD32 wgt0,WORD32 off0,WORD32 shift,WORD32 lvl_shift,WORD32 ht,WORD32 wd)106*c83a76b0SSuyog Pawar void ihevc_weighted_pred_uni(WORD16 *pi2_src,
107*c83a76b0SSuyog Pawar                              UWORD8 *pu1_dst,
108*c83a76b0SSuyog Pawar                              WORD32 src_strd,
109*c83a76b0SSuyog Pawar                              WORD32 dst_strd,
110*c83a76b0SSuyog Pawar                              WORD32 wgt0,
111*c83a76b0SSuyog Pawar                              WORD32 off0,
112*c83a76b0SSuyog Pawar                              WORD32 shift,
113*c83a76b0SSuyog Pawar                              WORD32 lvl_shift,
114*c83a76b0SSuyog Pawar                              WORD32 ht,
115*c83a76b0SSuyog Pawar                              WORD32 wd)
116*c83a76b0SSuyog Pawar {
117*c83a76b0SSuyog Pawar     WORD32 row, col;
118*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
121*c83a76b0SSuyog Pawar     {
122*c83a76b0SSuyog Pawar         for(col = 0; col < wd; col++)
123*c83a76b0SSuyog Pawar         {
124*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src[col] + lvl_shift) * wgt0;
125*c83a76b0SSuyog Pawar             i4_tmp += 1 << (shift - 1);
126*c83a76b0SSuyog Pawar             i4_tmp = (i4_tmp >> shift) + off0;
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp);
129*c83a76b0SSuyog Pawar         }
130*c83a76b0SSuyog Pawar 
131*c83a76b0SSuyog Pawar         pi2_src += src_strd;
132*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
133*c83a76b0SSuyog Pawar     }
134*c83a76b0SSuyog Pawar }
135*c83a76b0SSuyog Pawar //WEIGHTED_PRED_UNI
136*c83a76b0SSuyog Pawar 
137*c83a76b0SSuyog Pawar /**
138*c83a76b0SSuyog Pawar *******************************************************************************
139*c83a76b0SSuyog Pawar *
140*c83a76b0SSuyog Pawar * @brief
141*c83a76b0SSuyog Pawar * Does chroma uni-weighted prediction on array pointed by pi2_src and stores
142*c83a76b0SSuyog Pawar * it at the location pointed by pi2_dst
143*c83a76b0SSuyog Pawar *
144*c83a76b0SSuyog Pawar * @par Description:
145*c83a76b0SSuyog Pawar *  dst = ( (src + lvl_shift) * wgt0 + (1 << (shift - 1)) )  >> shift +
146*c83a76b0SSuyog Pawar * offset
147*c83a76b0SSuyog Pawar *
148*c83a76b0SSuyog Pawar * @param[in] pi2_src
149*c83a76b0SSuyog Pawar *  Pointer to the source
150*c83a76b0SSuyog Pawar *
151*c83a76b0SSuyog Pawar * @param[out] pu1_dst
152*c83a76b0SSuyog Pawar *  Pointer to the destination
153*c83a76b0SSuyog Pawar *
154*c83a76b0SSuyog Pawar * @param[in] src_strd
155*c83a76b0SSuyog Pawar *  Source stride
156*c83a76b0SSuyog Pawar *
157*c83a76b0SSuyog Pawar * @param[in] dst_strd
158*c83a76b0SSuyog Pawar *  Destination stride
159*c83a76b0SSuyog Pawar *
160*c83a76b0SSuyog Pawar * @param[in] wgt0
161*c83a76b0SSuyog Pawar *  weight to be multiplied to the source
162*c83a76b0SSuyog Pawar *
163*c83a76b0SSuyog Pawar * @param[in] off0
164*c83a76b0SSuyog Pawar *  offset to be added after rounding and
165*c83a76b0SSuyog Pawar *
166*c83a76b0SSuyog Pawar * @param[in] shifting
167*c83a76b0SSuyog Pawar *
168*c83a76b0SSuyog Pawar *
169*c83a76b0SSuyog Pawar * @param[in] shift
170*c83a76b0SSuyog Pawar *  (14 Bit depth) + log2_weight_denominator
171*c83a76b0SSuyog Pawar *
172*c83a76b0SSuyog Pawar * @param[in] lvl_shift
173*c83a76b0SSuyog Pawar *  added before shift and offset
174*c83a76b0SSuyog Pawar *
175*c83a76b0SSuyog Pawar * @param[in] ht
176*c83a76b0SSuyog Pawar *  height of the source
177*c83a76b0SSuyog Pawar *
178*c83a76b0SSuyog Pawar * @param[in] wd
179*c83a76b0SSuyog Pawar *  width of the source (each colour component)
180*c83a76b0SSuyog Pawar *
181*c83a76b0SSuyog Pawar * @returns
182*c83a76b0SSuyog Pawar *
183*c83a76b0SSuyog Pawar * @remarks
184*c83a76b0SSuyog Pawar *  None
185*c83a76b0SSuyog Pawar *
186*c83a76b0SSuyog Pawar *******************************************************************************
187*c83a76b0SSuyog Pawar */
188*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_chroma_uni(WORD16 * pi2_src,UWORD8 * pu1_dst,WORD32 src_strd,WORD32 dst_strd,WORD32 wgt0_cb,WORD32 wgt0_cr,WORD32 off0_cb,WORD32 off0_cr,WORD32 shift,WORD32 lvl_shift,WORD32 ht,WORD32 wd)189*c83a76b0SSuyog Pawar void ihevc_weighted_pred_chroma_uni(WORD16 *pi2_src,
190*c83a76b0SSuyog Pawar                                     UWORD8 *pu1_dst,
191*c83a76b0SSuyog Pawar                                     WORD32 src_strd,
192*c83a76b0SSuyog Pawar                                     WORD32 dst_strd,
193*c83a76b0SSuyog Pawar                                     WORD32 wgt0_cb,
194*c83a76b0SSuyog Pawar                                     WORD32 wgt0_cr,
195*c83a76b0SSuyog Pawar                                     WORD32 off0_cb,
196*c83a76b0SSuyog Pawar                                     WORD32 off0_cr,
197*c83a76b0SSuyog Pawar                                     WORD32 shift,
198*c83a76b0SSuyog Pawar                                     WORD32 lvl_shift,
199*c83a76b0SSuyog Pawar                                     WORD32 ht,
200*c83a76b0SSuyog Pawar                                     WORD32 wd)
201*c83a76b0SSuyog Pawar {
202*c83a76b0SSuyog Pawar     WORD32 row, col;
203*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
204*c83a76b0SSuyog Pawar 
205*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
206*c83a76b0SSuyog Pawar     {
207*c83a76b0SSuyog Pawar         for(col = 0; col < 2 * wd; col += 2)
208*c83a76b0SSuyog Pawar         {
209*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src[col] + lvl_shift) * wgt0_cb;
210*c83a76b0SSuyog Pawar             i4_tmp += 1 << (shift - 1);
211*c83a76b0SSuyog Pawar             i4_tmp = (i4_tmp >> shift) + off0_cb;
212*c83a76b0SSuyog Pawar 
213*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp);
214*c83a76b0SSuyog Pawar 
215*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src[col + 1] + lvl_shift) * wgt0_cr;
216*c83a76b0SSuyog Pawar             i4_tmp += 1 << (shift - 1);
217*c83a76b0SSuyog Pawar             i4_tmp = (i4_tmp >> shift) + off0_cr;
218*c83a76b0SSuyog Pawar 
219*c83a76b0SSuyog Pawar             pu1_dst[col + 1] = CLIP_U8(i4_tmp);
220*c83a76b0SSuyog Pawar         }
221*c83a76b0SSuyog Pawar 
222*c83a76b0SSuyog Pawar         pi2_src += src_strd;
223*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
224*c83a76b0SSuyog Pawar     }
225*c83a76b0SSuyog Pawar }
226*c83a76b0SSuyog Pawar //WEIGHTED_PRED_CHROMA_UNI
227*c83a76b0SSuyog Pawar 
228*c83a76b0SSuyog Pawar /**
229*c83a76b0SSuyog Pawar *******************************************************************************
230*c83a76b0SSuyog Pawar *
231*c83a76b0SSuyog Pawar * @brief
232*c83a76b0SSuyog Pawar *  Does bi-weighted prediction on the arrays pointed by  pi2_src1 and
233*c83a76b0SSuyog Pawar * pi2_src2 and stores it at location pointed  by pi2_dst
234*c83a76b0SSuyog Pawar *
235*c83a76b0SSuyog Pawar * @par Description:
236*c83a76b0SSuyog Pawar *  dst = ( (src1 + lvl_shift1)*wgt0 +  (src2 + lvl_shift2)*wgt1 +  (off0 +
237*c83a76b0SSuyog Pawar * off1 + 1) << (shift - 1) ) >> shift
238*c83a76b0SSuyog Pawar *
239*c83a76b0SSuyog Pawar * @param[in] pi2_src1
240*c83a76b0SSuyog Pawar *  Pointer to source 1
241*c83a76b0SSuyog Pawar *
242*c83a76b0SSuyog Pawar * @param[in] pi2_src2
243*c83a76b0SSuyog Pawar *  Pointer to source 2
244*c83a76b0SSuyog Pawar *
245*c83a76b0SSuyog Pawar * @param[out] pu1_dst
246*c83a76b0SSuyog Pawar *  Pointer to destination
247*c83a76b0SSuyog Pawar *
248*c83a76b0SSuyog Pawar * @param[in] src_strd1
249*c83a76b0SSuyog Pawar *  Source stride 1
250*c83a76b0SSuyog Pawar *
251*c83a76b0SSuyog Pawar * @param[in] src_strd2
252*c83a76b0SSuyog Pawar *  Source stride 2
253*c83a76b0SSuyog Pawar *
254*c83a76b0SSuyog Pawar * @param[in] dst_strd
255*c83a76b0SSuyog Pawar *  Destination stride
256*c83a76b0SSuyog Pawar *
257*c83a76b0SSuyog Pawar * @param[in] wgt0
258*c83a76b0SSuyog Pawar *  weight to be multiplied to source 1
259*c83a76b0SSuyog Pawar *
260*c83a76b0SSuyog Pawar * @param[in] off0
261*c83a76b0SSuyog Pawar *  offset 0
262*c83a76b0SSuyog Pawar *
263*c83a76b0SSuyog Pawar * @param[in] wgt1
264*c83a76b0SSuyog Pawar *  weight to be multiplied to source 2
265*c83a76b0SSuyog Pawar *
266*c83a76b0SSuyog Pawar * @param[in] off1
267*c83a76b0SSuyog Pawar *  offset 1
268*c83a76b0SSuyog Pawar *
269*c83a76b0SSuyog Pawar * @param[in] shift
270*c83a76b0SSuyog Pawar *  (14 Bit depth) + log2_weight_denominator
271*c83a76b0SSuyog Pawar *
272*c83a76b0SSuyog Pawar * @param[in] lvl_shift1
273*c83a76b0SSuyog Pawar *  added before shift and offset
274*c83a76b0SSuyog Pawar *
275*c83a76b0SSuyog Pawar * @param[in] lvl_shift2
276*c83a76b0SSuyog Pawar *  added before shift and offset
277*c83a76b0SSuyog Pawar *
278*c83a76b0SSuyog Pawar * @param[in] ht
279*c83a76b0SSuyog Pawar *  height of the source
280*c83a76b0SSuyog Pawar *
281*c83a76b0SSuyog Pawar * @param[in] wd
282*c83a76b0SSuyog Pawar *  width of the source
283*c83a76b0SSuyog Pawar *
284*c83a76b0SSuyog Pawar * @returns
285*c83a76b0SSuyog Pawar *
286*c83a76b0SSuyog Pawar * @remarks
287*c83a76b0SSuyog Pawar *  None
288*c83a76b0SSuyog Pawar *
289*c83a76b0SSuyog Pawar *******************************************************************************
290*c83a76b0SSuyog Pawar */
291*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_bi(WORD16 * pi2_src1,WORD16 * pi2_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 wgt0,WORD32 off0,WORD32 wgt1,WORD32 off1,WORD32 shift,WORD32 lvl_shift1,WORD32 lvl_shift2,WORD32 ht,WORD32 wd)292*c83a76b0SSuyog Pawar void ihevc_weighted_pred_bi(WORD16 *pi2_src1,
293*c83a76b0SSuyog Pawar                             WORD16 *pi2_src2,
294*c83a76b0SSuyog Pawar                             UWORD8 *pu1_dst,
295*c83a76b0SSuyog Pawar                             WORD32 src_strd1,
296*c83a76b0SSuyog Pawar                             WORD32 src_strd2,
297*c83a76b0SSuyog Pawar                             WORD32 dst_strd,
298*c83a76b0SSuyog Pawar                             WORD32 wgt0,
299*c83a76b0SSuyog Pawar                             WORD32 off0,
300*c83a76b0SSuyog Pawar                             WORD32 wgt1,
301*c83a76b0SSuyog Pawar                             WORD32 off1,
302*c83a76b0SSuyog Pawar                             WORD32 shift,
303*c83a76b0SSuyog Pawar                             WORD32 lvl_shift1,
304*c83a76b0SSuyog Pawar                             WORD32 lvl_shift2,
305*c83a76b0SSuyog Pawar                             WORD32 ht,
306*c83a76b0SSuyog Pawar                             WORD32 wd)
307*c83a76b0SSuyog Pawar {
308*c83a76b0SSuyog Pawar     WORD32 row, col;
309*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
310*c83a76b0SSuyog Pawar 
311*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
312*c83a76b0SSuyog Pawar     {
313*c83a76b0SSuyog Pawar         for(col = 0; col < wd; col++)
314*c83a76b0SSuyog Pawar         {
315*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src1[col] + lvl_shift1) * wgt0;
316*c83a76b0SSuyog Pawar             i4_tmp += (pi2_src2[col] + lvl_shift2) * wgt1;
317*c83a76b0SSuyog Pawar             i4_tmp += (off0 + off1 + 1) << (shift - 1);
318*c83a76b0SSuyog Pawar 
319*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp >> shift);
320*c83a76b0SSuyog Pawar         }
321*c83a76b0SSuyog Pawar 
322*c83a76b0SSuyog Pawar         pi2_src1 += src_strd1;
323*c83a76b0SSuyog Pawar         pi2_src2 += src_strd2;
324*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
325*c83a76b0SSuyog Pawar     }
326*c83a76b0SSuyog Pawar }
327*c83a76b0SSuyog Pawar //WEIGHTED_PRED_BI
328*c83a76b0SSuyog Pawar 
329*c83a76b0SSuyog Pawar /**
330*c83a76b0SSuyog Pawar *******************************************************************************
331*c83a76b0SSuyog Pawar *
332*c83a76b0SSuyog Pawar * @brief
333*c83a76b0SSuyog Pawar * Does chroma bi-weighted prediction on the arrays pointed by  pi2_src1 and
334*c83a76b0SSuyog Pawar * pi2_src2 and stores it at location pointed  by pi2_dst
335*c83a76b0SSuyog Pawar *
336*c83a76b0SSuyog Pawar * @par Description:
337*c83a76b0SSuyog Pawar *  dst = ( (src1 + lvl_shift1)*wgt0 +  (src2 + lvl_shift2)*wgt1 +  (off0 +
338*c83a76b0SSuyog Pawar * off1 + 1) << (shift - 1) ) >> shift
339*c83a76b0SSuyog Pawar *
340*c83a76b0SSuyog Pawar * @param[in] pi2_src1
341*c83a76b0SSuyog Pawar *  Pointer to source 1
342*c83a76b0SSuyog Pawar *
343*c83a76b0SSuyog Pawar * @param[in] pi2_src2
344*c83a76b0SSuyog Pawar *  Pointer to source 2
345*c83a76b0SSuyog Pawar *
346*c83a76b0SSuyog Pawar * @param[out] pu1_dst
347*c83a76b0SSuyog Pawar *  Pointer to destination
348*c83a76b0SSuyog Pawar *
349*c83a76b0SSuyog Pawar * @param[in] src_strd1
350*c83a76b0SSuyog Pawar *  Source stride 1
351*c83a76b0SSuyog Pawar *
352*c83a76b0SSuyog Pawar * @param[in] src_strd2
353*c83a76b0SSuyog Pawar *  Source stride 2
354*c83a76b0SSuyog Pawar *
355*c83a76b0SSuyog Pawar * @param[in] dst_strd
356*c83a76b0SSuyog Pawar *  Destination stride
357*c83a76b0SSuyog Pawar *
358*c83a76b0SSuyog Pawar * @param[in] wgt0
359*c83a76b0SSuyog Pawar *  weight to be multiplied to source 1
360*c83a76b0SSuyog Pawar *
361*c83a76b0SSuyog Pawar * @param[in] off0
362*c83a76b0SSuyog Pawar *  offset 0
363*c83a76b0SSuyog Pawar *
364*c83a76b0SSuyog Pawar * @param[in] wgt1
365*c83a76b0SSuyog Pawar *  weight to be multiplied to source 2
366*c83a76b0SSuyog Pawar *
367*c83a76b0SSuyog Pawar * @param[in] off1
368*c83a76b0SSuyog Pawar *  offset 1
369*c83a76b0SSuyog Pawar *
370*c83a76b0SSuyog Pawar * @param[in] shift
371*c83a76b0SSuyog Pawar *  (14 Bit depth) + log2_weight_denominator
372*c83a76b0SSuyog Pawar *
373*c83a76b0SSuyog Pawar * @param[in] lvl_shift1
374*c83a76b0SSuyog Pawar *  added before shift and offset
375*c83a76b0SSuyog Pawar *
376*c83a76b0SSuyog Pawar * @param[in] lvl_shift2
377*c83a76b0SSuyog Pawar *  added before shift and offset
378*c83a76b0SSuyog Pawar *
379*c83a76b0SSuyog Pawar * @param[in] ht
380*c83a76b0SSuyog Pawar *  height of the source
381*c83a76b0SSuyog Pawar *
382*c83a76b0SSuyog Pawar * @param[in] wd
383*c83a76b0SSuyog Pawar *  width of the source (each colour component)
384*c83a76b0SSuyog Pawar *
385*c83a76b0SSuyog Pawar * @returns
386*c83a76b0SSuyog Pawar *
387*c83a76b0SSuyog Pawar * @remarks
388*c83a76b0SSuyog Pawar *  None
389*c83a76b0SSuyog Pawar *
390*c83a76b0SSuyog Pawar *******************************************************************************
391*c83a76b0SSuyog Pawar */
392*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_chroma_bi(WORD16 * pi2_src1,WORD16 * pi2_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 wgt0_cb,WORD32 wgt0_cr,WORD32 off0_cb,WORD32 off0_cr,WORD32 wgt1_cb,WORD32 wgt1_cr,WORD32 off1_cb,WORD32 off1_cr,WORD32 shift,WORD32 lvl_shift1,WORD32 lvl_shift2,WORD32 ht,WORD32 wd)393*c83a76b0SSuyog Pawar void ihevc_weighted_pred_chroma_bi(WORD16 *pi2_src1,
394*c83a76b0SSuyog Pawar                                    WORD16 *pi2_src2,
395*c83a76b0SSuyog Pawar                                    UWORD8 *pu1_dst,
396*c83a76b0SSuyog Pawar                                    WORD32 src_strd1,
397*c83a76b0SSuyog Pawar                                    WORD32 src_strd2,
398*c83a76b0SSuyog Pawar                                    WORD32 dst_strd,
399*c83a76b0SSuyog Pawar                                    WORD32 wgt0_cb,
400*c83a76b0SSuyog Pawar                                    WORD32 wgt0_cr,
401*c83a76b0SSuyog Pawar                                    WORD32 off0_cb,
402*c83a76b0SSuyog Pawar                                    WORD32 off0_cr,
403*c83a76b0SSuyog Pawar                                    WORD32 wgt1_cb,
404*c83a76b0SSuyog Pawar                                    WORD32 wgt1_cr,
405*c83a76b0SSuyog Pawar                                    WORD32 off1_cb,
406*c83a76b0SSuyog Pawar                                    WORD32 off1_cr,
407*c83a76b0SSuyog Pawar                                    WORD32 shift,
408*c83a76b0SSuyog Pawar                                    WORD32 lvl_shift1,
409*c83a76b0SSuyog Pawar                                    WORD32 lvl_shift2,
410*c83a76b0SSuyog Pawar                                    WORD32 ht,
411*c83a76b0SSuyog Pawar                                    WORD32 wd)
412*c83a76b0SSuyog Pawar {
413*c83a76b0SSuyog Pawar     WORD32 row, col;
414*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
415*c83a76b0SSuyog Pawar 
416*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
417*c83a76b0SSuyog Pawar     {
418*c83a76b0SSuyog Pawar         for(col = 0; col < 2 * wd; col += 2)
419*c83a76b0SSuyog Pawar         {
420*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src1[col] + lvl_shift1) * wgt0_cb;
421*c83a76b0SSuyog Pawar             i4_tmp += (pi2_src2[col] + lvl_shift2) * wgt1_cb;
422*c83a76b0SSuyog Pawar             i4_tmp += (off0_cb + off1_cb + 1) << (shift - 1);
423*c83a76b0SSuyog Pawar 
424*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp >> shift);
425*c83a76b0SSuyog Pawar 
426*c83a76b0SSuyog Pawar             i4_tmp = (pi2_src1[col + 1] + lvl_shift1) * wgt0_cr;
427*c83a76b0SSuyog Pawar             i4_tmp += (pi2_src2[col + 1] + lvl_shift2) * wgt1_cr;
428*c83a76b0SSuyog Pawar             i4_tmp += (off0_cr + off1_cr + 1) << (shift - 1);
429*c83a76b0SSuyog Pawar 
430*c83a76b0SSuyog Pawar             pu1_dst[col + 1] = CLIP_U8(i4_tmp >> shift);
431*c83a76b0SSuyog Pawar         }
432*c83a76b0SSuyog Pawar 
433*c83a76b0SSuyog Pawar         pi2_src1 += src_strd1;
434*c83a76b0SSuyog Pawar         pi2_src2 += src_strd2;
435*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
436*c83a76b0SSuyog Pawar     }
437*c83a76b0SSuyog Pawar }
438*c83a76b0SSuyog Pawar //WEIGHTED_PRED_CHROMA_BI
439*c83a76b0SSuyog Pawar 
440*c83a76b0SSuyog Pawar /**
441*c83a76b0SSuyog Pawar *******************************************************************************
442*c83a76b0SSuyog Pawar *
443*c83a76b0SSuyog Pawar * @brief
444*c83a76b0SSuyog Pawar *  Does default bi-weighted prediction on the arrays pointed by pi2_src1 and
445*c83a76b0SSuyog Pawar * pi2_src2 and stores it at location  pointed by pi2_dst
446*c83a76b0SSuyog Pawar *
447*c83a76b0SSuyog Pawar * @par Description:
448*c83a76b0SSuyog Pawar *  dst = ( (src1 + lvl_shift1) +  (src2 + lvl_shift2) +  1 << (shift - 1) )
449*c83a76b0SSuyog Pawar * >> shift  where shift = 15 - BitDepth
450*c83a76b0SSuyog Pawar *
451*c83a76b0SSuyog Pawar * @param[in] pi2_src1
452*c83a76b0SSuyog Pawar *  Pointer to source 1
453*c83a76b0SSuyog Pawar *
454*c83a76b0SSuyog Pawar * @param[in] pi2_src2
455*c83a76b0SSuyog Pawar *  Pointer to source 2
456*c83a76b0SSuyog Pawar *
457*c83a76b0SSuyog Pawar * @param[out] pu1_dst
458*c83a76b0SSuyog Pawar *  Pointer to destination
459*c83a76b0SSuyog Pawar *
460*c83a76b0SSuyog Pawar * @param[in] src_strd1
461*c83a76b0SSuyog Pawar *  Source stride 1
462*c83a76b0SSuyog Pawar *
463*c83a76b0SSuyog Pawar * @param[in] src_strd2
464*c83a76b0SSuyog Pawar *  Source stride 2
465*c83a76b0SSuyog Pawar *
466*c83a76b0SSuyog Pawar * @param[in] dst_strd
467*c83a76b0SSuyog Pawar *  Destination stride
468*c83a76b0SSuyog Pawar *
469*c83a76b0SSuyog Pawar * @param[in] lvl_shift1
470*c83a76b0SSuyog Pawar *  added before shift and offset
471*c83a76b0SSuyog Pawar *
472*c83a76b0SSuyog Pawar * @param[in] lvl_shift2
473*c83a76b0SSuyog Pawar *  added before shift and offset
474*c83a76b0SSuyog Pawar *
475*c83a76b0SSuyog Pawar * @param[in] ht
476*c83a76b0SSuyog Pawar *  height of the source
477*c83a76b0SSuyog Pawar *
478*c83a76b0SSuyog Pawar * @param[in] wd
479*c83a76b0SSuyog Pawar *  width of the source
480*c83a76b0SSuyog Pawar *
481*c83a76b0SSuyog Pawar * @returns
482*c83a76b0SSuyog Pawar *
483*c83a76b0SSuyog Pawar * @remarks
484*c83a76b0SSuyog Pawar *  None
485*c83a76b0SSuyog Pawar *
486*c83a76b0SSuyog Pawar *******************************************************************************
487*c83a76b0SSuyog Pawar */
488*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_bi_default(WORD16 * pi2_src1,WORD16 * pi2_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 lvl_shift1,WORD32 lvl_shift2,WORD32 ht,WORD32 wd)489*c83a76b0SSuyog Pawar void ihevc_weighted_pred_bi_default(WORD16 *pi2_src1,
490*c83a76b0SSuyog Pawar                                     WORD16 *pi2_src2,
491*c83a76b0SSuyog Pawar                                     UWORD8 *pu1_dst,
492*c83a76b0SSuyog Pawar                                     WORD32 src_strd1,
493*c83a76b0SSuyog Pawar                                     WORD32 src_strd2,
494*c83a76b0SSuyog Pawar                                     WORD32 dst_strd,
495*c83a76b0SSuyog Pawar                                     WORD32 lvl_shift1,
496*c83a76b0SSuyog Pawar                                     WORD32 lvl_shift2,
497*c83a76b0SSuyog Pawar                                     WORD32 ht,
498*c83a76b0SSuyog Pawar                                     WORD32 wd)
499*c83a76b0SSuyog Pawar {
500*c83a76b0SSuyog Pawar     WORD32 row, col;
501*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
502*c83a76b0SSuyog Pawar     WORD32 shift;
503*c83a76b0SSuyog Pawar 
504*c83a76b0SSuyog Pawar     shift = SHIFT_14_MINUS_BIT_DEPTH + 1;
505*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
506*c83a76b0SSuyog Pawar     {
507*c83a76b0SSuyog Pawar         for(col = 0; col < wd; col++)
508*c83a76b0SSuyog Pawar         {
509*c83a76b0SSuyog Pawar             i4_tmp = pi2_src1[col] + lvl_shift1;
510*c83a76b0SSuyog Pawar             i4_tmp += pi2_src2[col] + lvl_shift2;
511*c83a76b0SSuyog Pawar             i4_tmp += 1 << (shift - 1);
512*c83a76b0SSuyog Pawar 
513*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp >> shift);
514*c83a76b0SSuyog Pawar         }
515*c83a76b0SSuyog Pawar 
516*c83a76b0SSuyog Pawar         pi2_src1 += src_strd1;
517*c83a76b0SSuyog Pawar         pi2_src2 += src_strd2;
518*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
519*c83a76b0SSuyog Pawar     }
520*c83a76b0SSuyog Pawar }
521*c83a76b0SSuyog Pawar //WEIGHTED_PRED_BI_DEFAULT
522*c83a76b0SSuyog Pawar 
523*c83a76b0SSuyog Pawar /**
524*c83a76b0SSuyog Pawar *******************************************************************************
525*c83a76b0SSuyog Pawar *
526*c83a76b0SSuyog Pawar * @brief
527*c83a76b0SSuyog Pawar *  Does chroma default bi-weighted prediction on arrays pointed by pi2_src1 and
528*c83a76b0SSuyog Pawar * pi2_src2 and stores it at location  pointed by pi2_dst
529*c83a76b0SSuyog Pawar *
530*c83a76b0SSuyog Pawar * @par Description:
531*c83a76b0SSuyog Pawar *  dst = ( (src1 + lvl_shift1) +  (src2 + lvl_shift2) +  1 << (shift - 1) )
532*c83a76b0SSuyog Pawar * >> shift  where shift = 15 - BitDepth
533*c83a76b0SSuyog Pawar *
534*c83a76b0SSuyog Pawar * @param[in] pi2_src1
535*c83a76b0SSuyog Pawar *  Pointer to source 1
536*c83a76b0SSuyog Pawar *
537*c83a76b0SSuyog Pawar * @param[in] pi2_src2
538*c83a76b0SSuyog Pawar *  Pointer to source 2
539*c83a76b0SSuyog Pawar *
540*c83a76b0SSuyog Pawar * @param[out] pu1_dst
541*c83a76b0SSuyog Pawar *  Pointer to destination
542*c83a76b0SSuyog Pawar *
543*c83a76b0SSuyog Pawar * @param[in] src_strd1
544*c83a76b0SSuyog Pawar *  Source stride 1
545*c83a76b0SSuyog Pawar *
546*c83a76b0SSuyog Pawar * @param[in] src_strd2
547*c83a76b0SSuyog Pawar *  Source stride 2
548*c83a76b0SSuyog Pawar *
549*c83a76b0SSuyog Pawar * @param[in] dst_strd
550*c83a76b0SSuyog Pawar *  Destination stride
551*c83a76b0SSuyog Pawar *
552*c83a76b0SSuyog Pawar * @param[in] lvl_shift1
553*c83a76b0SSuyog Pawar *  added before shift and offset
554*c83a76b0SSuyog Pawar *
555*c83a76b0SSuyog Pawar * @param[in] lvl_shift2
556*c83a76b0SSuyog Pawar *  added before shift and offset
557*c83a76b0SSuyog Pawar *
558*c83a76b0SSuyog Pawar * @param[in] ht
559*c83a76b0SSuyog Pawar *  height of the source
560*c83a76b0SSuyog Pawar *
561*c83a76b0SSuyog Pawar * @param[in] wd
562*c83a76b0SSuyog Pawar *  width of the source (each colour component)
563*c83a76b0SSuyog Pawar *
564*c83a76b0SSuyog Pawar * @returns
565*c83a76b0SSuyog Pawar *
566*c83a76b0SSuyog Pawar * @remarks
567*c83a76b0SSuyog Pawar *  None
568*c83a76b0SSuyog Pawar *
569*c83a76b0SSuyog Pawar *******************************************************************************
570*c83a76b0SSuyog Pawar */
571*c83a76b0SSuyog Pawar 
ihevc_weighted_pred_chroma_bi_default(WORD16 * pi2_src1,WORD16 * pi2_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 lvl_shift1,WORD32 lvl_shift2,WORD32 ht,WORD32 wd)572*c83a76b0SSuyog Pawar void ihevc_weighted_pred_chroma_bi_default(WORD16 *pi2_src1,
573*c83a76b0SSuyog Pawar                                            WORD16 *pi2_src2,
574*c83a76b0SSuyog Pawar                                            UWORD8 *pu1_dst,
575*c83a76b0SSuyog Pawar                                            WORD32 src_strd1,
576*c83a76b0SSuyog Pawar                                            WORD32 src_strd2,
577*c83a76b0SSuyog Pawar                                            WORD32 dst_strd,
578*c83a76b0SSuyog Pawar                                            WORD32 lvl_shift1,
579*c83a76b0SSuyog Pawar                                            WORD32 lvl_shift2,
580*c83a76b0SSuyog Pawar                                            WORD32 ht,
581*c83a76b0SSuyog Pawar                                            WORD32 wd)
582*c83a76b0SSuyog Pawar {
583*c83a76b0SSuyog Pawar     WORD32 row, col;
584*c83a76b0SSuyog Pawar     WORD32 i4_tmp;
585*c83a76b0SSuyog Pawar     WORD32 shift;
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar     shift = SHIFT_14_MINUS_BIT_DEPTH + 1;
588*c83a76b0SSuyog Pawar     for(row = 0; row < ht; row++)
589*c83a76b0SSuyog Pawar     {
590*c83a76b0SSuyog Pawar         for(col = 0; col < 2 * wd; col++)
591*c83a76b0SSuyog Pawar         {
592*c83a76b0SSuyog Pawar             i4_tmp = pi2_src1[col] + lvl_shift1;
593*c83a76b0SSuyog Pawar             i4_tmp += pi2_src2[col] + lvl_shift2;
594*c83a76b0SSuyog Pawar             i4_tmp += 1 << (shift - 1);
595*c83a76b0SSuyog Pawar 
596*c83a76b0SSuyog Pawar             pu1_dst[col] = CLIP_U8(i4_tmp >> shift);
597*c83a76b0SSuyog Pawar         }
598*c83a76b0SSuyog Pawar 
599*c83a76b0SSuyog Pawar         pi2_src1 += src_strd1;
600*c83a76b0SSuyog Pawar         pi2_src2 += src_strd2;
601*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
602*c83a76b0SSuyog Pawar     }
603*c83a76b0SSuyog Pawar }
604*c83a76b0SSuyog Pawar //WEIGHTED_PRED_CHROMA_BI_DEFAULT
605