1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 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 *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264_weighted_pred.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains function definitions for weighted prediction functions
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker * ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker * - ih264_default_weighted_pred_luma
34*495ae853SAndroid Build Coastguard Worker * - ih264_default_weighted_pred_chroma
35*495ae853SAndroid Build Coastguard Worker * - ih264_weighted_pred_luma
36*495ae853SAndroid Build Coastguard Worker * - ih264_weighted_pred_chroma
37*495ae853SAndroid Build Coastguard Worker * - ih264_weighted_bipred_luma
38*495ae853SAndroid Build Coastguard Worker * - ih264_weighted_bipred_chroma
39*495ae853SAndroid Build Coastguard Worker *
40*495ae853SAndroid Build Coastguard Worker * @remarks
41*495ae853SAndroid Build Coastguard Worker *
42*495ae853SAndroid Build Coastguard Worker *******************************************************************************
43*495ae853SAndroid Build Coastguard Worker */
44*495ae853SAndroid Build Coastguard Worker
45*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
46*495ae853SAndroid Build Coastguard Worker /* File Includes */
47*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
48*495ae853SAndroid Build Coastguard Worker
49*495ae853SAndroid Build Coastguard Worker /* User Include Files */
50*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264_weighted_pred.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
54*495ae853SAndroid Build Coastguard Worker
55*495ae853SAndroid Build Coastguard Worker
56*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
57*495ae853SAndroid Build Coastguard Worker /* Function definitions */
58*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
59*495ae853SAndroid Build Coastguard Worker
60*495ae853SAndroid Build Coastguard Worker /**
61*495ae853SAndroid Build Coastguard Worker *******************************************************************************
62*495ae853SAndroid Build Coastguard Worker *
63*495ae853SAndroid Build Coastguard Worker * @brief default weighted prediction luma.
64*495ae853SAndroid Build Coastguard Worker *
65*495ae853SAndroid Build Coastguard Worker * @par Description
66*495ae853SAndroid Build Coastguard Worker * This function performs the default weighted prediction as described in
67*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.1 titled "Default weighted sample prediction process" for luma.
68*495ae853SAndroid Build Coastguard Worker * The function gets two ht x wd blocks, calculates their rounded-average and
69*495ae853SAndroid Build Coastguard Worker * stores it in the destination block. (ht,wd) can be (4,4), (8,4), (4,8),
70*495ae853SAndroid Build Coastguard Worker * (8,8), (16,8), (8,16) or (16,16)
71*495ae853SAndroid Build Coastguard Worker *
72*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src1
73*495ae853SAndroid Build Coastguard Worker * Pointer to source 1
74*495ae853SAndroid Build Coastguard Worker *
75*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src2
76*495ae853SAndroid Build Coastguard Worker * Pointer to source 2
77*495ae853SAndroid Build Coastguard Worker *
78*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
79*495ae853SAndroid Build Coastguard Worker * Pointer to destination
80*495ae853SAndroid Build Coastguard Worker *
81*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd1
82*495ae853SAndroid Build Coastguard Worker * stride for source 1
83*495ae853SAndroid Build Coastguard Worker *
84*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd2
85*495ae853SAndroid Build Coastguard Worker * stride for source 2
86*495ae853SAndroid Build Coastguard Worker *
87*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
88*495ae853SAndroid Build Coastguard Worker * stride for destination
89*495ae853SAndroid Build Coastguard Worker *
90*495ae853SAndroid Build Coastguard Worker * @param[in] ht
91*495ae853SAndroid Build Coastguard Worker * height of the block
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker * @param[in] wd
94*495ae853SAndroid Build Coastguard Worker * width of the block
95*495ae853SAndroid Build Coastguard Worker *
96*495ae853SAndroid Build Coastguard Worker * @returns none
97*495ae853SAndroid Build Coastguard Worker *
98*495ae853SAndroid Build Coastguard Worker * @remarks none
99*495ae853SAndroid Build Coastguard Worker *
100*495ae853SAndroid Build Coastguard Worker *******************************************************************************
101*495ae853SAndroid Build Coastguard Worker */
ih264_default_weighted_pred_luma(UWORD8 * pu1_src1,UWORD8 * pu1_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 ht,WORD32 wd)102*495ae853SAndroid Build Coastguard Worker void ih264_default_weighted_pred_luma(UWORD8 *pu1_src1,
103*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src2,
104*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
105*495ae853SAndroid Build Coastguard Worker WORD32 src_strd1,
106*495ae853SAndroid Build Coastguard Worker WORD32 src_strd2,
107*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
108*495ae853SAndroid Build Coastguard Worker WORD32 ht,
109*495ae853SAndroid Build Coastguard Worker WORD32 wd)
110*495ae853SAndroid Build Coastguard Worker {
111*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
112*495ae853SAndroid Build Coastguard Worker
113*495ae853SAndroid Build Coastguard Worker src_strd1 -= wd;
114*495ae853SAndroid Build Coastguard Worker src_strd2 -= wd;
115*495ae853SAndroid Build Coastguard Worker dst_strd -= wd;
116*495ae853SAndroid Build Coastguard Worker
117*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
118*495ae853SAndroid Build Coastguard Worker {
119*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
120*495ae853SAndroid Build Coastguard Worker *pu1_dst = (*pu1_src1 + *pu1_src2 + 1) >> 1;
121*495ae853SAndroid Build Coastguard Worker
122*495ae853SAndroid Build Coastguard Worker pu1_src1 += src_strd1;
123*495ae853SAndroid Build Coastguard Worker pu1_src2 += src_strd2;
124*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
125*495ae853SAndroid Build Coastguard Worker }
126*495ae853SAndroid Build Coastguard Worker }
127*495ae853SAndroid Build Coastguard Worker
128*495ae853SAndroid Build Coastguard Worker /**
129*495ae853SAndroid Build Coastguard Worker *******************************************************************************
130*495ae853SAndroid Build Coastguard Worker *
131*495ae853SAndroid Build Coastguard Worker * @brief default weighted prediction chroma.
132*495ae853SAndroid Build Coastguard Worker *
133*495ae853SAndroid Build Coastguard Worker * @par Description
134*495ae853SAndroid Build Coastguard Worker * This function performs the default weighted prediction as described in
135*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.1 titled "Default weighted sample prediction process" for chroma.
136*495ae853SAndroid Build Coastguard Worker * The function gets two ht x wd blocks, calculates their rounded-average and
137*495ae853SAndroid Build Coastguard Worker * stores it in the destination block. (ht,wd) can be (2,2), (4,2), (2,4),
138*495ae853SAndroid Build Coastguard Worker * (4,4), (8,4), (4,8) or (8,8).
139*495ae853SAndroid Build Coastguard Worker *
140*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src1
141*495ae853SAndroid Build Coastguard Worker * Pointer to source 1
142*495ae853SAndroid Build Coastguard Worker *
143*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src2
144*495ae853SAndroid Build Coastguard Worker * Pointer to source 2
145*495ae853SAndroid Build Coastguard Worker *
146*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
147*495ae853SAndroid Build Coastguard Worker * Pointer to destination
148*495ae853SAndroid Build Coastguard Worker *
149*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd1
150*495ae853SAndroid Build Coastguard Worker * stride for source 1
151*495ae853SAndroid Build Coastguard Worker *
152*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd2
153*495ae853SAndroid Build Coastguard Worker * stride for source 2
154*495ae853SAndroid Build Coastguard Worker *
155*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
156*495ae853SAndroid Build Coastguard Worker * stride for destination
157*495ae853SAndroid Build Coastguard Worker *
158*495ae853SAndroid Build Coastguard Worker * @param[in] ht
159*495ae853SAndroid Build Coastguard Worker * height of the block
160*495ae853SAndroid Build Coastguard Worker *
161*495ae853SAndroid Build Coastguard Worker * @param[in] wd
162*495ae853SAndroid Build Coastguard Worker * width of the block
163*495ae853SAndroid Build Coastguard Worker *
164*495ae853SAndroid Build Coastguard Worker * @returns none
165*495ae853SAndroid Build Coastguard Worker *
166*495ae853SAndroid Build Coastguard Worker * @remarks none
167*495ae853SAndroid Build Coastguard Worker *
168*495ae853SAndroid Build Coastguard Worker *******************************************************************************
169*495ae853SAndroid Build Coastguard Worker */
ih264_default_weighted_pred_chroma(UWORD8 * pu1_src1,UWORD8 * pu1_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 ht,WORD32 wd)170*495ae853SAndroid Build Coastguard Worker void ih264_default_weighted_pred_chroma(UWORD8 *pu1_src1,
171*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src2,
172*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
173*495ae853SAndroid Build Coastguard Worker WORD32 src_strd1,
174*495ae853SAndroid Build Coastguard Worker WORD32 src_strd2,
175*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
176*495ae853SAndroid Build Coastguard Worker WORD32 ht,
177*495ae853SAndroid Build Coastguard Worker WORD32 wd)
178*495ae853SAndroid Build Coastguard Worker {
179*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker wd = wd << 1;
182*495ae853SAndroid Build Coastguard Worker
183*495ae853SAndroid Build Coastguard Worker src_strd1 -= wd;
184*495ae853SAndroid Build Coastguard Worker src_strd2 -= wd;
185*495ae853SAndroid Build Coastguard Worker dst_strd -= wd;
186*495ae853SAndroid Build Coastguard Worker
187*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
188*495ae853SAndroid Build Coastguard Worker {
189*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
190*495ae853SAndroid Build Coastguard Worker *pu1_dst = (*pu1_src1 + *pu1_src2 + 1) >> 1;
191*495ae853SAndroid Build Coastguard Worker
192*495ae853SAndroid Build Coastguard Worker pu1_src1 += src_strd1;
193*495ae853SAndroid Build Coastguard Worker pu1_src2 += src_strd2;
194*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
195*495ae853SAndroid Build Coastguard Worker }
196*495ae853SAndroid Build Coastguard Worker }
197*495ae853SAndroid Build Coastguard Worker
198*495ae853SAndroid Build Coastguard Worker /**
199*495ae853SAndroid Build Coastguard Worker *******************************************************************************
200*495ae853SAndroid Build Coastguard Worker *
201*495ae853SAndroid Build Coastguard Worker * @brief weighted prediction luma.
202*495ae853SAndroid Build Coastguard Worker *
203*495ae853SAndroid Build Coastguard Worker * @par Description
204*495ae853SAndroid Build Coastguard Worker * This function performs the weighted prediction as described in
205*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.2 titled "weighted sample prediction process" for luma.
206*495ae853SAndroid Build Coastguard Worker * The function gets one ht x wd block, weights it, rounds it off, offsets it,
207*495ae853SAndroid Build Coastguard Worker * saturates it to unsigned 8-bit and stores it in the destination block.
208*495ae853SAndroid Build Coastguard Worker * (ht,wd) can be (4,4), (8,4), (4,8), (8,8), (16,8), (8,16) or (16,16)
209*495ae853SAndroid Build Coastguard Worker *
210*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
211*495ae853SAndroid Build Coastguard Worker * Pointer to source
212*495ae853SAndroid Build Coastguard Worker *
213*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
214*495ae853SAndroid Build Coastguard Worker * Pointer to destination
215*495ae853SAndroid Build Coastguard Worker *
216*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
217*495ae853SAndroid Build Coastguard Worker * stride for source
218*495ae853SAndroid Build Coastguard Worker *
219*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
220*495ae853SAndroid Build Coastguard Worker * stride for destination
221*495ae853SAndroid Build Coastguard Worker *
222*495ae853SAndroid Build Coastguard Worker * @param[in] log_wd
223*495ae853SAndroid Build Coastguard Worker * number of bits to be rounded off
224*495ae853SAndroid Build Coastguard Worker *
225*495ae853SAndroid Build Coastguard Worker * @param[in] wt
226*495ae853SAndroid Build Coastguard Worker * weight value
227*495ae853SAndroid Build Coastguard Worker *
228*495ae853SAndroid Build Coastguard Worker * @param[in] ofst
229*495ae853SAndroid Build Coastguard Worker * offset value
230*495ae853SAndroid Build Coastguard Worker *
231*495ae853SAndroid Build Coastguard Worker * @param[in] ht
232*495ae853SAndroid Build Coastguard Worker * height of the block
233*495ae853SAndroid Build Coastguard Worker *
234*495ae853SAndroid Build Coastguard Worker * @param[in] wd
235*495ae853SAndroid Build Coastguard Worker * width of the block
236*495ae853SAndroid Build Coastguard Worker *
237*495ae853SAndroid Build Coastguard Worker * @returns none
238*495ae853SAndroid Build Coastguard Worker *
239*495ae853SAndroid Build Coastguard Worker * @remarks none
240*495ae853SAndroid Build Coastguard Worker *
241*495ae853SAndroid Build Coastguard Worker *******************************************************************************
242*495ae853SAndroid Build Coastguard Worker */
ih264_weighted_pred_luma(UWORD8 * pu1_src,UWORD8 * pu1_dst,WORD32 src_strd,WORD32 dst_strd,WORD32 log_wd,WORD32 wt,WORD32 ofst,WORD32 ht,WORD32 wd)243*495ae853SAndroid Build Coastguard Worker void ih264_weighted_pred_luma(UWORD8 *pu1_src,
244*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
245*495ae853SAndroid Build Coastguard Worker WORD32 src_strd,
246*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
247*495ae853SAndroid Build Coastguard Worker WORD32 log_wd,
248*495ae853SAndroid Build Coastguard Worker WORD32 wt,
249*495ae853SAndroid Build Coastguard Worker WORD32 ofst,
250*495ae853SAndroid Build Coastguard Worker WORD32 ht,
251*495ae853SAndroid Build Coastguard Worker WORD32 wd)
252*495ae853SAndroid Build Coastguard Worker {
253*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker wt = (WORD16)(wt & 0xffff);
256*495ae853SAndroid Build Coastguard Worker ofst = (WORD8)(ofst & 0xff);
257*495ae853SAndroid Build Coastguard Worker
258*495ae853SAndroid Build Coastguard Worker src_strd -= wd;
259*495ae853SAndroid Build Coastguard Worker dst_strd -= wd;
260*495ae853SAndroid Build Coastguard Worker
261*495ae853SAndroid Build Coastguard Worker if(log_wd >= 1)
262*495ae853SAndroid Build Coastguard Worker {
263*495ae853SAndroid Build Coastguard Worker WORD32 i_ofst = (1 << (log_wd - 1)) + (ofst << log_wd);
264*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
265*495ae853SAndroid Build Coastguard Worker {
266*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
267*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt * (*pu1_src) + i_ofst) >> log_wd);
268*495ae853SAndroid Build Coastguard Worker
269*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
270*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
271*495ae853SAndroid Build Coastguard Worker }
272*495ae853SAndroid Build Coastguard Worker }
273*495ae853SAndroid Build Coastguard Worker else
274*495ae853SAndroid Build Coastguard Worker {
275*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
276*495ae853SAndroid Build Coastguard Worker {
277*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
278*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8(wt * (*pu1_src) + ofst);
279*495ae853SAndroid Build Coastguard Worker
280*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
281*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
282*495ae853SAndroid Build Coastguard Worker }
283*495ae853SAndroid Build Coastguard Worker }
284*495ae853SAndroid Build Coastguard Worker }
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker /**
287*495ae853SAndroid Build Coastguard Worker *******************************************************************************
288*495ae853SAndroid Build Coastguard Worker *
289*495ae853SAndroid Build Coastguard Worker * @brief weighted prediction chroma.
290*495ae853SAndroid Build Coastguard Worker *
291*495ae853SAndroid Build Coastguard Worker * @par Description
292*495ae853SAndroid Build Coastguard Worker * This function performs the weighted prediction as described in
293*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.2 titled "weighted sample prediction process" for chroma.
294*495ae853SAndroid Build Coastguard Worker * The function gets one ht x wd block, weights it, rounds it off, offsets it,
295*495ae853SAndroid Build Coastguard Worker * saturates it to unsigned 8-bit and stores it in the destination block.
296*495ae853SAndroid Build Coastguard Worker * (ht,wd) can be (2,2), (4,2), (2,4), (4,4), (8,4), (4,8) or (8,8).
297*495ae853SAndroid Build Coastguard Worker *
298*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src
299*495ae853SAndroid Build Coastguard Worker * Pointer to source
300*495ae853SAndroid Build Coastguard Worker *
301*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
302*495ae853SAndroid Build Coastguard Worker * Pointer to destination
303*495ae853SAndroid Build Coastguard Worker *
304*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd
305*495ae853SAndroid Build Coastguard Worker * stride for source
306*495ae853SAndroid Build Coastguard Worker *
307*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
308*495ae853SAndroid Build Coastguard Worker * stride for destination
309*495ae853SAndroid Build Coastguard Worker *
310*495ae853SAndroid Build Coastguard Worker * @param[in] log_wd
311*495ae853SAndroid Build Coastguard Worker * number of bits to be rounded off
312*495ae853SAndroid Build Coastguard Worker *
313*495ae853SAndroid Build Coastguard Worker * @param[in] wt
314*495ae853SAndroid Build Coastguard Worker * weight values for u and v
315*495ae853SAndroid Build Coastguard Worker *
316*495ae853SAndroid Build Coastguard Worker * @param[in] ofst
317*495ae853SAndroid Build Coastguard Worker * offset values for u and v
318*495ae853SAndroid Build Coastguard Worker *
319*495ae853SAndroid Build Coastguard Worker * @param[in] ht
320*495ae853SAndroid Build Coastguard Worker * height of the block
321*495ae853SAndroid Build Coastguard Worker *
322*495ae853SAndroid Build Coastguard Worker * @param[in] wd
323*495ae853SAndroid Build Coastguard Worker * width of the block
324*495ae853SAndroid Build Coastguard Worker *
325*495ae853SAndroid Build Coastguard Worker * @returns none
326*495ae853SAndroid Build Coastguard Worker *
327*495ae853SAndroid Build Coastguard Worker * @remarks none
328*495ae853SAndroid Build Coastguard Worker *
329*495ae853SAndroid Build Coastguard Worker *******************************************************************************
330*495ae853SAndroid Build Coastguard Worker */
ih264_weighted_pred_chroma(UWORD8 * pu1_src,UWORD8 * pu1_dst,WORD32 src_strd,WORD32 dst_strd,WORD32 log_wd,WORD32 wt,WORD32 ofst,WORD32 ht,WORD32 wd)331*495ae853SAndroid Build Coastguard Worker void ih264_weighted_pred_chroma(UWORD8 *pu1_src,
332*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
333*495ae853SAndroid Build Coastguard Worker WORD32 src_strd,
334*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
335*495ae853SAndroid Build Coastguard Worker WORD32 log_wd,
336*495ae853SAndroid Build Coastguard Worker WORD32 wt,
337*495ae853SAndroid Build Coastguard Worker WORD32 ofst,
338*495ae853SAndroid Build Coastguard Worker WORD32 ht,
339*495ae853SAndroid Build Coastguard Worker WORD32 wd)
340*495ae853SAndroid Build Coastguard Worker {
341*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
342*495ae853SAndroid Build Coastguard Worker WORD32 wt_u, wt_v;
343*495ae853SAndroid Build Coastguard Worker WORD32 ofst_u, ofst_v;
344*495ae853SAndroid Build Coastguard Worker
345*495ae853SAndroid Build Coastguard Worker wt_u = (WORD16)(wt & 0xffff);
346*495ae853SAndroid Build Coastguard Worker wt_v = (WORD16)(wt >> 16);
347*495ae853SAndroid Build Coastguard Worker
348*495ae853SAndroid Build Coastguard Worker ofst_u = (WORD8)(ofst & 0xff);
349*495ae853SAndroid Build Coastguard Worker ofst_v = (WORD8)(ofst >> 8);
350*495ae853SAndroid Build Coastguard Worker
351*495ae853SAndroid Build Coastguard Worker src_strd -= wd << 1;
352*495ae853SAndroid Build Coastguard Worker dst_strd -= wd << 1;
353*495ae853SAndroid Build Coastguard Worker
354*495ae853SAndroid Build Coastguard Worker if(log_wd >= 1)
355*495ae853SAndroid Build Coastguard Worker {
356*495ae853SAndroid Build Coastguard Worker ofst_u = (1 << (log_wd - 1)) + (ofst_u << log_wd);
357*495ae853SAndroid Build Coastguard Worker ofst_v = (1 << (log_wd - 1)) + (ofst_v << log_wd);
358*495ae853SAndroid Build Coastguard Worker
359*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
360*495ae853SAndroid Build Coastguard Worker {
361*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
362*495ae853SAndroid Build Coastguard Worker {
363*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt_u * (*pu1_src) + ofst_u) >> log_wd);
364*495ae853SAndroid Build Coastguard Worker pu1_src++;
365*495ae853SAndroid Build Coastguard Worker pu1_dst++;
366*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt_v * (*pu1_src) + ofst_v) >> log_wd);
367*495ae853SAndroid Build Coastguard Worker }
368*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
369*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
370*495ae853SAndroid Build Coastguard Worker }
371*495ae853SAndroid Build Coastguard Worker }
372*495ae853SAndroid Build Coastguard Worker else
373*495ae853SAndroid Build Coastguard Worker {
374*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
375*495ae853SAndroid Build Coastguard Worker {
376*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src++, pu1_dst++)
377*495ae853SAndroid Build Coastguard Worker {
378*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8(wt_u * (*pu1_src) + ofst_u);
379*495ae853SAndroid Build Coastguard Worker pu1_src++;
380*495ae853SAndroid Build Coastguard Worker pu1_dst++;
381*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8(wt_v * (*pu1_src) + ofst_v);
382*495ae853SAndroid Build Coastguard Worker }
383*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
384*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
385*495ae853SAndroid Build Coastguard Worker }
386*495ae853SAndroid Build Coastguard Worker }
387*495ae853SAndroid Build Coastguard Worker }
388*495ae853SAndroid Build Coastguard Worker
389*495ae853SAndroid Build Coastguard Worker /**
390*495ae853SAndroid Build Coastguard Worker *******************************************************************************
391*495ae853SAndroid Build Coastguard Worker *
392*495ae853SAndroid Build Coastguard Worker * @brief weighted bi-prediction luma.
393*495ae853SAndroid Build Coastguard Worker *
394*495ae853SAndroid Build Coastguard Worker * @par Description
395*495ae853SAndroid Build Coastguard Worker * This function performs the weighted biprediction as described in
396*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.2 titled "weighted sample prediction process" for luma.
397*495ae853SAndroid Build Coastguard Worker * The function gets two ht x wd blocks, weights them, adds them, rounds off
398*495ae853SAndroid Build Coastguard Worker * the sum, offsets it, saturates it to unsigned 8-bit and stores it in the
399*495ae853SAndroid Build Coastguard Worker * destination block. (ht,wd) can be (4,4), (8,4), (4,8), (8,8), (16,8), (8,16)
400*495ae853SAndroid Build Coastguard Worker * or (16,16)
401*495ae853SAndroid Build Coastguard Worker *
402*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src1
403*495ae853SAndroid Build Coastguard Worker * Pointer to source 1
404*495ae853SAndroid Build Coastguard Worker *
405*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src2
406*495ae853SAndroid Build Coastguard Worker * Pointer to source 2
407*495ae853SAndroid Build Coastguard Worker *
408*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
409*495ae853SAndroid Build Coastguard Worker * Pointer to destination
410*495ae853SAndroid Build Coastguard Worker *
411*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd1
412*495ae853SAndroid Build Coastguard Worker * stride for source 1
413*495ae853SAndroid Build Coastguard Worker *
414*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd2
415*495ae853SAndroid Build Coastguard Worker * stride for source 2
416*495ae853SAndroid Build Coastguard Worker *
417*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
418*495ae853SAndroid Build Coastguard Worker * stride for destination
419*495ae853SAndroid Build Coastguard Worker *
420*495ae853SAndroid Build Coastguard Worker * @param[in] log_wd
421*495ae853SAndroid Build Coastguard Worker * number of bits to be rounded off
422*495ae853SAndroid Build Coastguard Worker *
423*495ae853SAndroid Build Coastguard Worker * @param[in] wt1
424*495ae853SAndroid Build Coastguard Worker * weight value for source 1
425*495ae853SAndroid Build Coastguard Worker *
426*495ae853SAndroid Build Coastguard Worker * @param[in] wt2
427*495ae853SAndroid Build Coastguard Worker * weight value for source 2
428*495ae853SAndroid Build Coastguard Worker *
429*495ae853SAndroid Build Coastguard Worker * @param[in] ofst1
430*495ae853SAndroid Build Coastguard Worker * offset value for source 1
431*495ae853SAndroid Build Coastguard Worker *
432*495ae853SAndroid Build Coastguard Worker * @param[in] ofst2
433*495ae853SAndroid Build Coastguard Worker * offset value for source 2
434*495ae853SAndroid Build Coastguard Worker *
435*495ae853SAndroid Build Coastguard Worker * @param[in] ht
436*495ae853SAndroid Build Coastguard Worker * height of the block
437*495ae853SAndroid Build Coastguard Worker *
438*495ae853SAndroid Build Coastguard Worker * @param[in] wd
439*495ae853SAndroid Build Coastguard Worker * width of the block
440*495ae853SAndroid Build Coastguard Worker *
441*495ae853SAndroid Build Coastguard Worker * @returns none
442*495ae853SAndroid Build Coastguard Worker *
443*495ae853SAndroid Build Coastguard Worker * @remarks none
444*495ae853SAndroid Build Coastguard Worker *
445*495ae853SAndroid Build Coastguard Worker *******************************************************************************
446*495ae853SAndroid Build Coastguard Worker */
ih264_weighted_bi_pred_luma(UWORD8 * pu1_src1,UWORD8 * pu1_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 log_wd,WORD32 wt1,WORD32 wt2,WORD32 ofst1,WORD32 ofst2,WORD32 ht,WORD32 wd)447*495ae853SAndroid Build Coastguard Worker void ih264_weighted_bi_pred_luma(UWORD8 *pu1_src1,
448*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src2,
449*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
450*495ae853SAndroid Build Coastguard Worker WORD32 src_strd1,
451*495ae853SAndroid Build Coastguard Worker WORD32 src_strd2,
452*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
453*495ae853SAndroid Build Coastguard Worker WORD32 log_wd,
454*495ae853SAndroid Build Coastguard Worker WORD32 wt1,
455*495ae853SAndroid Build Coastguard Worker WORD32 wt2,
456*495ae853SAndroid Build Coastguard Worker WORD32 ofst1,
457*495ae853SAndroid Build Coastguard Worker WORD32 ofst2,
458*495ae853SAndroid Build Coastguard Worker WORD32 ht,
459*495ae853SAndroid Build Coastguard Worker WORD32 wd)
460*495ae853SAndroid Build Coastguard Worker {
461*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
462*495ae853SAndroid Build Coastguard Worker WORD32 shft, ofst;
463*495ae853SAndroid Build Coastguard Worker
464*495ae853SAndroid Build Coastguard Worker ofst1 = (WORD8)(ofst1 & 0xff);
465*495ae853SAndroid Build Coastguard Worker ofst2 = (WORD8)(ofst2 & 0xff);
466*495ae853SAndroid Build Coastguard Worker wt1 = (WORD16)(wt1 & 0xffff);
467*495ae853SAndroid Build Coastguard Worker wt2 = (WORD16)(wt2 & 0xffff);
468*495ae853SAndroid Build Coastguard Worker ofst = (ofst1 + ofst2 + 1) >> 1;
469*495ae853SAndroid Build Coastguard Worker
470*495ae853SAndroid Build Coastguard Worker shft = log_wd + 1;
471*495ae853SAndroid Build Coastguard Worker ofst = (1 << log_wd) + (ofst << shft);
472*495ae853SAndroid Build Coastguard Worker
473*495ae853SAndroid Build Coastguard Worker src_strd1 -= wd;
474*495ae853SAndroid Build Coastguard Worker src_strd2 -= wd;
475*495ae853SAndroid Build Coastguard Worker dst_strd -= wd;
476*495ae853SAndroid Build Coastguard Worker
477*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
480*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt1 * (*pu1_src1) + wt2 * (*pu1_src2) + ofst) >> shft);
481*495ae853SAndroid Build Coastguard Worker
482*495ae853SAndroid Build Coastguard Worker pu1_src1 += src_strd1;
483*495ae853SAndroid Build Coastguard Worker pu1_src2 += src_strd2;
484*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
485*495ae853SAndroid Build Coastguard Worker }
486*495ae853SAndroid Build Coastguard Worker }
487*495ae853SAndroid Build Coastguard Worker
488*495ae853SAndroid Build Coastguard Worker /**
489*495ae853SAndroid Build Coastguard Worker *******************************************************************************
490*495ae853SAndroid Build Coastguard Worker *
491*495ae853SAndroid Build Coastguard Worker * @brief weighted bi-prediction chroma.
492*495ae853SAndroid Build Coastguard Worker *
493*495ae853SAndroid Build Coastguard Worker * @par Description
494*495ae853SAndroid Build Coastguard Worker * This function performs the weighted biprediction as described in
495*495ae853SAndroid Build Coastguard Worker * sec 8.4.2.3.2 titled "weighted sample prediction process" for chroma.
496*495ae853SAndroid Build Coastguard Worker * The function gets two ht x wd blocks, weights them, adds them, rounds off
497*495ae853SAndroid Build Coastguard Worker * the sum, offsets it, saturates it to unsigned 8-bit and stores it in the
498*495ae853SAndroid Build Coastguard Worker * destination block. (ht,wd) can be (2,2), (4,2), (2,4), (4,4), (8,4), (4,8)
499*495ae853SAndroid Build Coastguard Worker * or (8,8)
500*495ae853SAndroid Build Coastguard Worker *
501*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src1
502*495ae853SAndroid Build Coastguard Worker * Pointer to source 1
503*495ae853SAndroid Build Coastguard Worker *
504*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_src2
505*495ae853SAndroid Build Coastguard Worker * Pointer to source 2
506*495ae853SAndroid Build Coastguard Worker *
507*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_dst
508*495ae853SAndroid Build Coastguard Worker * Pointer to destination
509*495ae853SAndroid Build Coastguard Worker *
510*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd1
511*495ae853SAndroid Build Coastguard Worker * stride for source 1
512*495ae853SAndroid Build Coastguard Worker *
513*495ae853SAndroid Build Coastguard Worker * @param[in] src_strd2
514*495ae853SAndroid Build Coastguard Worker * stride for source 2
515*495ae853SAndroid Build Coastguard Worker *
516*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
517*495ae853SAndroid Build Coastguard Worker * stride for destination
518*495ae853SAndroid Build Coastguard Worker *
519*495ae853SAndroid Build Coastguard Worker * @param[in] log_wd
520*495ae853SAndroid Build Coastguard Worker * number of bits to be rounded off
521*495ae853SAndroid Build Coastguard Worker *
522*495ae853SAndroid Build Coastguard Worker * @param[in] wt1
523*495ae853SAndroid Build Coastguard Worker * weight value for source 1
524*495ae853SAndroid Build Coastguard Worker *
525*495ae853SAndroid Build Coastguard Worker * @param[in] wt2
526*495ae853SAndroid Build Coastguard Worker * weight value for source 2
527*495ae853SAndroid Build Coastguard Worker *
528*495ae853SAndroid Build Coastguard Worker * @param[in] ofst1
529*495ae853SAndroid Build Coastguard Worker * offset value for source 1
530*495ae853SAndroid Build Coastguard Worker *
531*495ae853SAndroid Build Coastguard Worker * @param[in] ofst2
532*495ae853SAndroid Build Coastguard Worker * offset value for source 2
533*495ae853SAndroid Build Coastguard Worker *
534*495ae853SAndroid Build Coastguard Worker * @param[in] ht
535*495ae853SAndroid Build Coastguard Worker * height of the block
536*495ae853SAndroid Build Coastguard Worker *
537*495ae853SAndroid Build Coastguard Worker * @param[in] wd
538*495ae853SAndroid Build Coastguard Worker * width of the block
539*495ae853SAndroid Build Coastguard Worker *
540*495ae853SAndroid Build Coastguard Worker * @returns none
541*495ae853SAndroid Build Coastguard Worker *
542*495ae853SAndroid Build Coastguard Worker * @remarks none
543*495ae853SAndroid Build Coastguard Worker *
544*495ae853SAndroid Build Coastguard Worker *******************************************************************************
545*495ae853SAndroid Build Coastguard Worker */
ih264_weighted_bi_pred_chroma(UWORD8 * pu1_src1,UWORD8 * pu1_src2,UWORD8 * pu1_dst,WORD32 src_strd1,WORD32 src_strd2,WORD32 dst_strd,WORD32 log_wd,WORD32 wt1,WORD32 wt2,WORD32 ofst1,WORD32 ofst2,WORD32 ht,WORD32 wd)546*495ae853SAndroid Build Coastguard Worker void ih264_weighted_bi_pred_chroma(UWORD8 *pu1_src1,
547*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src2,
548*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst,
549*495ae853SAndroid Build Coastguard Worker WORD32 src_strd1,
550*495ae853SAndroid Build Coastguard Worker WORD32 src_strd2,
551*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
552*495ae853SAndroid Build Coastguard Worker WORD32 log_wd,
553*495ae853SAndroid Build Coastguard Worker WORD32 wt1,
554*495ae853SAndroid Build Coastguard Worker WORD32 wt2,
555*495ae853SAndroid Build Coastguard Worker WORD32 ofst1,
556*495ae853SAndroid Build Coastguard Worker WORD32 ofst2,
557*495ae853SAndroid Build Coastguard Worker WORD32 ht,
558*495ae853SAndroid Build Coastguard Worker WORD32 wd)
559*495ae853SAndroid Build Coastguard Worker {
560*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
561*495ae853SAndroid Build Coastguard Worker WORD32 wt1_u, wt1_v, wt2_u, wt2_v;
562*495ae853SAndroid Build Coastguard Worker WORD32 ofst1_u, ofst1_v, ofst2_u, ofst2_v;
563*495ae853SAndroid Build Coastguard Worker WORD32 ofst_u, ofst_v;
564*495ae853SAndroid Build Coastguard Worker WORD32 shft;
565*495ae853SAndroid Build Coastguard Worker
566*495ae853SAndroid Build Coastguard Worker ofst1_u = (WORD8)(ofst1 & 0xff);
567*495ae853SAndroid Build Coastguard Worker ofst1_v = (WORD8)(ofst1 >> 8);
568*495ae853SAndroid Build Coastguard Worker ofst2_u = (WORD8)(ofst2 & 0xff);
569*495ae853SAndroid Build Coastguard Worker ofst2_v = (WORD8)(ofst2 >> 8);
570*495ae853SAndroid Build Coastguard Worker wt1_u = (WORD16)(wt1 & 0xffff);
571*495ae853SAndroid Build Coastguard Worker wt1_v = (WORD16)(wt1 >> 16);
572*495ae853SAndroid Build Coastguard Worker wt2_u = (WORD16)(wt2 & 0xffff);
573*495ae853SAndroid Build Coastguard Worker wt2_v = (WORD16)(wt2 >> 16);
574*495ae853SAndroid Build Coastguard Worker ofst_u = (ofst1_u + ofst2_u + 1) >> 1;
575*495ae853SAndroid Build Coastguard Worker ofst_v = (ofst1_v + ofst2_v + 1) >> 1;
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker src_strd1 -= wd << 1;
578*495ae853SAndroid Build Coastguard Worker src_strd2 -= wd << 1;
579*495ae853SAndroid Build Coastguard Worker dst_strd -= wd << 1;
580*495ae853SAndroid Build Coastguard Worker
581*495ae853SAndroid Build Coastguard Worker shft = log_wd + 1;
582*495ae853SAndroid Build Coastguard Worker ofst_u = (1 << log_wd) + (ofst_u << shft);
583*495ae853SAndroid Build Coastguard Worker ofst_v = (1 << log_wd) + (ofst_v << shft);
584*495ae853SAndroid Build Coastguard Worker
585*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ht; i++)
586*495ae853SAndroid Build Coastguard Worker {
587*495ae853SAndroid Build Coastguard Worker for(j = 0; j < wd; j++, pu1_src1++, pu1_src2++, pu1_dst++)
588*495ae853SAndroid Build Coastguard Worker {
589*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt1_u * (*pu1_src1) + wt2_u * (*pu1_src2) + ofst_u) >> shft);
590*495ae853SAndroid Build Coastguard Worker pu1_src1++;
591*495ae853SAndroid Build Coastguard Worker pu1_src2++;
592*495ae853SAndroid Build Coastguard Worker pu1_dst++;
593*495ae853SAndroid Build Coastguard Worker *pu1_dst = CLIP_U8((wt1_v * (*pu1_src1) + wt2_v * (*pu1_src2) + ofst_v) >> shft);
594*495ae853SAndroid Build Coastguard Worker }
595*495ae853SAndroid Build Coastguard Worker pu1_src1 += src_strd1;
596*495ae853SAndroid Build Coastguard Worker pu1_src2 += src_strd2;
597*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
598*495ae853SAndroid Build Coastguard Worker }
599*495ae853SAndroid Build Coastguard Worker }
600