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 * ih264e_fmt_conv.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Contains functions for format conversion or frame copy of output buffer
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 * - ih264e_fmt_conv_420sp_to_rgb565
34*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_420sp_to_rgba8888
35*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_420sp_to_420sp
36*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_420sp_to_420sp_swap_uv
37*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_420sp_to_420p
38*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_420p_to_420sp
39*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv_422i_to_420sp
40*495ae853SAndroid Build Coastguard Worker * - ih264e_fmt_conv
41*495ae853SAndroid Build Coastguard Worker *
42*495ae853SAndroid Build Coastguard Worker * @remarks
43*495ae853SAndroid Build Coastguard Worker * none
44*495ae853SAndroid Build Coastguard Worker *
45*495ae853SAndroid Build Coastguard Worker *******************************************************************************
46*495ae853SAndroid Build Coastguard Worker */
47*495ae853SAndroid Build Coastguard Worker
48*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
49*495ae853SAndroid Build Coastguard Worker /* File Includes */
50*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker /* System Include Files */
53*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
54*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
55*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
56*495ae853SAndroid Build Coastguard Worker #include <string.h>
57*495ae853SAndroid Build Coastguard Worker #include <assert.h>
58*495ae853SAndroid Build Coastguard Worker
59*495ae853SAndroid Build Coastguard Worker /* User Include Files */
60*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
61*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
62*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
63*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
64*495ae853SAndroid Build Coastguard Worker
65*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264_mem_fns.h"
70*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264_intra_pred_filters.h"
75*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
78*495ae853SAndroid Build Coastguard Worker
79*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
80*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
81*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
82*495ae853SAndroid Build Coastguard Worker
83*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
84*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
85*495ae853SAndroid Build Coastguard Worker
86*495ae853SAndroid Build Coastguard Worker #include "ih264e.h"
87*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
88*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
89*495ae853SAndroid Build Coastguard Worker #include "ih264e_rate_control.h"
90*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
91*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
93*495ae853SAndroid Build Coastguard Worker #include "ih264e_fmt_conv.h"
94*495ae853SAndroid Build Coastguard Worker
95*495ae853SAndroid Build Coastguard Worker
96*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
97*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
98*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
99*495ae853SAndroid Build Coastguard Worker
100*495ae853SAndroid Build Coastguard Worker /**
101*495ae853SAndroid Build Coastguard Worker *******************************************************************************
102*495ae853SAndroid Build Coastguard Worker *
103*495ae853SAndroid Build Coastguard Worker * @brief Function used to perform color space conversion from 420SP to RGB565
104*495ae853SAndroid Build Coastguard Worker *
105*495ae853SAndroid Build Coastguard Worker * @par Description
106*495ae853SAndroid Build Coastguard Worker * Function used to perform color space conversion from 420SP to RGB565
107*495ae853SAndroid Build Coastguard Worker *
108*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
109*495ae853SAndroid Build Coastguard Worker * Input Y pointer
110*495ae853SAndroid Build Coastguard Worker *
111*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
112*495ae853SAndroid Build Coastguard Worker * Input UV pointer
113*495ae853SAndroid Build Coastguard Worker *
114*495ae853SAndroid Build Coastguard Worker * @param[in] pu2_rgb_dst
115*495ae853SAndroid Build Coastguard Worker * Output RGB pointer
116*495ae853SAndroid Build Coastguard Worker *
117*495ae853SAndroid Build Coastguard Worker * @param[in] wd
118*495ae853SAndroid Build Coastguard Worker * Width
119*495ae853SAndroid Build Coastguard Worker *
120*495ae853SAndroid Build Coastguard Worker * @param[in] ht
121*495ae853SAndroid Build Coastguard Worker * Height
122*495ae853SAndroid Build Coastguard Worker *
123*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
124*495ae853SAndroid Build Coastguard Worker * Input Y Stride
125*495ae853SAndroid Build Coastguard Worker *
126*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
127*495ae853SAndroid Build Coastguard Worker * Input UV stride
128*495ae853SAndroid Build Coastguard Worker *
129*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
130*495ae853SAndroid Build Coastguard Worker * Output stride
131*495ae853SAndroid Build Coastguard Worker *
132*495ae853SAndroid Build Coastguard Worker * @param[in] is_u_first
133*495ae853SAndroid Build Coastguard Worker * Flag to indicate chroma ordering
134*495ae853SAndroid Build Coastguard Worker *
135*495ae853SAndroid Build Coastguard Worker * @returns none
136*495ae853SAndroid Build Coastguard Worker *
137*495ae853SAndroid Build Coastguard Worker *******************************************************************************
138*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420sp_to_rgb565(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD16 * pu2_rgb_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_strd,WORD32 is_u_first)139*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420sp_to_rgb565(UWORD8 *pu1_y_src,
140*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
141*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst,
142*495ae853SAndroid Build Coastguard Worker WORD32 wd,
143*495ae853SAndroid Build Coastguard Worker WORD32 ht,
144*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
145*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
146*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
147*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first)
148*495ae853SAndroid Build Coastguard Worker {
149*495ae853SAndroid Build Coastguard Worker WORD16 i2_r, i2_g, i2_b;
150*495ae853SAndroid Build Coastguard Worker UWORD32 u4_r, u4_g, u4_b;
151*495ae853SAndroid Build Coastguard Worker WORD16 i2_i, i2_j;
152*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src_nxt;
153*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst_NextRow;
154*495ae853SAndroid Build Coastguard Worker
155*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
156*495ae853SAndroid Build Coastguard Worker
157*495ae853SAndroid Build Coastguard Worker if (is_u_first)
158*495ae853SAndroid Build Coastguard Worker {
159*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src;
160*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src + 1;
161*495ae853SAndroid Build Coastguard Worker }
162*495ae853SAndroid Build Coastguard Worker else
163*495ae853SAndroid Build Coastguard Worker {
164*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src + 1;
165*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src;
166*495ae853SAndroid Build Coastguard Worker }
167*495ae853SAndroid Build Coastguard Worker
168*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src + src_y_strd;
169*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_NextRow = pu2_rgb_dst + dst_strd;
170*495ae853SAndroid Build Coastguard Worker
171*495ae853SAndroid Build Coastguard Worker for (i2_i = 0; i2_i < (ht >> 1); i2_i++)
172*495ae853SAndroid Build Coastguard Worker {
173*495ae853SAndroid Build Coastguard Worker for (i2_j = (wd >> 1); i2_j > 0; i2_j--)
174*495ae853SAndroid Build Coastguard Worker {
175*495ae853SAndroid Build Coastguard Worker i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
176*495ae853SAndroid Build Coastguard Worker i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
177*495ae853SAndroid Build Coastguard Worker >> 13;
178*495ae853SAndroid Build Coastguard Worker i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
179*495ae853SAndroid Build Coastguard Worker
180*495ae853SAndroid Build Coastguard Worker pu1_u_src += 2;
181*495ae853SAndroid Build Coastguard Worker pu1_v_src += 2;
182*495ae853SAndroid Build Coastguard Worker /* pixel 0 */
183*495ae853SAndroid Build Coastguard Worker /* B */
184*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
185*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
186*495ae853SAndroid Build Coastguard Worker /* G */
187*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
188*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
189*495ae853SAndroid Build Coastguard Worker /* R */
190*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
191*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
194*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
195*495ae853SAndroid Build Coastguard Worker
196*495ae853SAndroid Build Coastguard Worker /* pixel 1 */
197*495ae853SAndroid Build Coastguard Worker /* B */
198*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
199*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
200*495ae853SAndroid Build Coastguard Worker /* G */
201*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
202*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
203*495ae853SAndroid Build Coastguard Worker /* R */
204*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
205*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
206*495ae853SAndroid Build Coastguard Worker
207*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
208*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker /* pixel 2 */
211*495ae853SAndroid Build Coastguard Worker /* B */
212*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
213*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
214*495ae853SAndroid Build Coastguard Worker /* G */
215*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
216*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
217*495ae853SAndroid Build Coastguard Worker /* R */
218*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
219*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
222*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst_NextRow++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
223*495ae853SAndroid Build Coastguard Worker
224*495ae853SAndroid Build Coastguard Worker /* pixel 3 */
225*495ae853SAndroid Build Coastguard Worker /* B */
226*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
227*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
228*495ae853SAndroid Build Coastguard Worker /* G */
229*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
230*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
231*495ae853SAndroid Build Coastguard Worker /* R */
232*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
233*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
234*495ae853SAndroid Build Coastguard Worker
235*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
236*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst_NextRow++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
237*495ae853SAndroid Build Coastguard Worker
238*495ae853SAndroid Build Coastguard Worker }
239*495ae853SAndroid Build Coastguard Worker
240*495ae853SAndroid Build Coastguard Worker pu1_u_src = pu1_u_src + src_uv_strd - wd;
241*495ae853SAndroid Build Coastguard Worker pu1_v_src = pu1_v_src + src_uv_strd - wd;
242*495ae853SAndroid Build Coastguard Worker
243*495ae853SAndroid Build Coastguard Worker pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
244*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
245*495ae853SAndroid Build Coastguard Worker
246*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst = pu2_rgb_dst_NextRow - wd + dst_strd;
247*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_NextRow = pu2_rgb_dst_NextRow + (dst_strd << 1) - wd;
248*495ae853SAndroid Build Coastguard Worker }
249*495ae853SAndroid Build Coastguard Worker
250*495ae853SAndroid Build Coastguard Worker }
251*495ae853SAndroid Build Coastguard Worker
252*495ae853SAndroid Build Coastguard Worker /**
253*495ae853SAndroid Build Coastguard Worker *******************************************************************************
254*495ae853SAndroid Build Coastguard Worker *
255*495ae853SAndroid Build Coastguard Worker * @brief Function used to perform color space conversion from 420SP to RGBA888
256*495ae853SAndroid Build Coastguard Worker *
257*495ae853SAndroid Build Coastguard Worker * @par Description
258*495ae853SAndroid Build Coastguard Worker * Function used to perform color space conversion from 420SP to RGBA888
259*495ae853SAndroid Build Coastguard Worker *
260*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
261*495ae853SAndroid Build Coastguard Worker * Input Y pointer
262*495ae853SAndroid Build Coastguard Worker *
263*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
264*495ae853SAndroid Build Coastguard Worker * Input UV pointer
265*495ae853SAndroid Build Coastguard Worker *
266*495ae853SAndroid Build Coastguard Worker * @param[in] pu4_rgba_dst
267*495ae853SAndroid Build Coastguard Worker * Output RGB pointer
268*495ae853SAndroid Build Coastguard Worker *
269*495ae853SAndroid Build Coastguard Worker * @param[in] wd
270*495ae853SAndroid Build Coastguard Worker * Width
271*495ae853SAndroid Build Coastguard Worker *
272*495ae853SAndroid Build Coastguard Worker * @param[in] ht
273*495ae853SAndroid Build Coastguard Worker * Height
274*495ae853SAndroid Build Coastguard Worker *
275*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
276*495ae853SAndroid Build Coastguard Worker * Input Y Stride
277*495ae853SAndroid Build Coastguard Worker *
278*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
279*495ae853SAndroid Build Coastguard Worker * Input UV stride
280*495ae853SAndroid Build Coastguard Worker *
281*495ae853SAndroid Build Coastguard Worker * @param[in] dst_strd
282*495ae853SAndroid Build Coastguard Worker * Output stride
283*495ae853SAndroid Build Coastguard Worker *
284*495ae853SAndroid Build Coastguard Worker * @param[in] is_u_first
285*495ae853SAndroid Build Coastguard Worker * Flag to indicate chroma ordering
286*495ae853SAndroid Build Coastguard Worker *
287*495ae853SAndroid Build Coastguard Worker * @returns none
288*495ae853SAndroid Build Coastguard Worker *
289*495ae853SAndroid Build Coastguard Worker *******************************************************************************
290*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420sp_to_rgba8888(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD32 * pu4_rgba_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_strd,WORD32 is_u_first)291*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420sp_to_rgba8888(UWORD8 *pu1_y_src,
292*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
293*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_rgba_dst,
294*495ae853SAndroid Build Coastguard Worker WORD32 wd,
295*495ae853SAndroid Build Coastguard Worker WORD32 ht,
296*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
297*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
298*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
299*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first)
300*495ae853SAndroid Build Coastguard Worker {
301*495ae853SAndroid Build Coastguard Worker WORD16 i2_r, i2_g, i2_b;
302*495ae853SAndroid Build Coastguard Worker UWORD32 u4_r, u4_g, u4_b;
303*495ae853SAndroid Build Coastguard Worker WORD16 i2_i, i2_j;
304*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src_nxt;
305*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_rgba_dst_NextRow;
306*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
307*495ae853SAndroid Build Coastguard Worker
308*495ae853SAndroid Build Coastguard Worker if (is_u_first)
309*495ae853SAndroid Build Coastguard Worker {
310*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src;
311*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src + 1;
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker else
314*495ae853SAndroid Build Coastguard Worker {
315*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src + 1;
316*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src;
317*495ae853SAndroid Build Coastguard Worker }
318*495ae853SAndroid Build Coastguard Worker
319*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src + src_y_strd;
320*495ae853SAndroid Build Coastguard Worker
321*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst_NextRow = pu4_rgba_dst + dst_strd;
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker for (i2_i = 0; i2_i < (ht >> 1); i2_i++)
324*495ae853SAndroid Build Coastguard Worker {
325*495ae853SAndroid Build Coastguard Worker for (i2_j = (wd >> 1); i2_j > 0; i2_j--)
326*495ae853SAndroid Build Coastguard Worker {
327*495ae853SAndroid Build Coastguard Worker i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
328*495ae853SAndroid Build Coastguard Worker i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
329*495ae853SAndroid Build Coastguard Worker >> 13;
330*495ae853SAndroid Build Coastguard Worker i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
331*495ae853SAndroid Build Coastguard Worker
332*495ae853SAndroid Build Coastguard Worker pu1_u_src += 2;
333*495ae853SAndroid Build Coastguard Worker pu1_v_src += 2;
334*495ae853SAndroid Build Coastguard Worker /* pixel 0 */
335*495ae853SAndroid Build Coastguard Worker /* B */
336*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
337*495ae853SAndroid Build Coastguard Worker /* G */
338*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
339*495ae853SAndroid Build Coastguard Worker /* R */
340*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
341*495ae853SAndroid Build Coastguard Worker
342*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
343*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
344*495ae853SAndroid Build Coastguard Worker
345*495ae853SAndroid Build Coastguard Worker /* pixel 1 */
346*495ae853SAndroid Build Coastguard Worker /* B */
347*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
348*495ae853SAndroid Build Coastguard Worker /* G */
349*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
350*495ae853SAndroid Build Coastguard Worker /* R */
351*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
354*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
355*495ae853SAndroid Build Coastguard Worker
356*495ae853SAndroid Build Coastguard Worker /* pixel 2 */
357*495ae853SAndroid Build Coastguard Worker /* B */
358*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
359*495ae853SAndroid Build Coastguard Worker /* G */
360*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
361*495ae853SAndroid Build Coastguard Worker /* R */
362*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
363*495ae853SAndroid Build Coastguard Worker
364*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
365*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst_NextRow++ =
366*495ae853SAndroid Build Coastguard Worker ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
367*495ae853SAndroid Build Coastguard Worker
368*495ae853SAndroid Build Coastguard Worker /* pixel 3 */
369*495ae853SAndroid Build Coastguard Worker /* B */
370*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
371*495ae853SAndroid Build Coastguard Worker /* G */
372*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
373*495ae853SAndroid Build Coastguard Worker /* R */
374*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
375*495ae853SAndroid Build Coastguard Worker
376*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
377*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst_NextRow++ =
378*495ae853SAndroid Build Coastguard Worker ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
379*495ae853SAndroid Build Coastguard Worker
380*495ae853SAndroid Build Coastguard Worker }
381*495ae853SAndroid Build Coastguard Worker
382*495ae853SAndroid Build Coastguard Worker pu1_u_src = pu1_u_src + src_uv_strd - wd;
383*495ae853SAndroid Build Coastguard Worker pu1_v_src = pu1_v_src + src_uv_strd - wd;
384*495ae853SAndroid Build Coastguard Worker
385*495ae853SAndroid Build Coastguard Worker pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
386*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
387*495ae853SAndroid Build Coastguard Worker
388*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst = pu4_rgba_dst_NextRow - wd + dst_strd;
389*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst_NextRow = pu4_rgba_dst_NextRow + (dst_strd << 1) - wd;
390*495ae853SAndroid Build Coastguard Worker }
391*495ae853SAndroid Build Coastguard Worker
392*495ae853SAndroid Build Coastguard Worker }
393*495ae853SAndroid Build Coastguard Worker
394*495ae853SAndroid Build Coastguard Worker /**
395*495ae853SAndroid Build Coastguard Worker *******************************************************************************
396*495ae853SAndroid Build Coastguard Worker *
397*495ae853SAndroid Build Coastguard Worker * @brief Function used for copying a 420SP buffer
398*495ae853SAndroid Build Coastguard Worker *
399*495ae853SAndroid Build Coastguard Worker * @par Description
400*495ae853SAndroid Build Coastguard Worker * Function used for copying a 420SP buffer
401*495ae853SAndroid Build Coastguard Worker *
402*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
403*495ae853SAndroid Build Coastguard Worker * Input Y pointer
404*495ae853SAndroid Build Coastguard Worker *
405*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
406*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
407*495ae853SAndroid Build Coastguard Worker *
408*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
409*495ae853SAndroid Build Coastguard Worker * Output Y pointer
410*495ae853SAndroid Build Coastguard Worker *
411*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
412*495ae853SAndroid Build Coastguard Worker * Output UV pointer (UV is interleaved in the same format as that of input)
413*495ae853SAndroid Build Coastguard Worker *
414*495ae853SAndroid Build Coastguard Worker * @param[in] wd
415*495ae853SAndroid Build Coastguard Worker * Width
416*495ae853SAndroid Build Coastguard Worker *
417*495ae853SAndroid Build Coastguard Worker * @param[in] ht
418*495ae853SAndroid Build Coastguard Worker * Height
419*495ae853SAndroid Build Coastguard Worker *
420*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
421*495ae853SAndroid Build Coastguard Worker * Input Y Stride
422*495ae853SAndroid Build Coastguard Worker *
423*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
424*495ae853SAndroid Build Coastguard Worker * Input UV stride
425*495ae853SAndroid Build Coastguard Worker *
426*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
427*495ae853SAndroid Build Coastguard Worker * Output Y stride
428*495ae853SAndroid Build Coastguard Worker *
429*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
430*495ae853SAndroid Build Coastguard Worker * Output UV stride
431*495ae853SAndroid Build Coastguard Worker *
432*495ae853SAndroid Build Coastguard Worker * @returns None
433*495ae853SAndroid Build Coastguard Worker *
434*495ae853SAndroid Build Coastguard Worker *******************************************************************************
435*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420sp_to_420sp(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_uv_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd)436*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420sp_to_420sp(UWORD8 *pu1_y_src,
437*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
438*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
439*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_dst,
440*495ae853SAndroid Build Coastguard Worker WORD32 wd,
441*495ae853SAndroid Build Coastguard Worker WORD32 ht,
442*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
443*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
444*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
445*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd)
446*495ae853SAndroid Build Coastguard Worker {
447*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
448*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
449*495ae853SAndroid Build Coastguard Worker WORD32 i;
450*495ae853SAndroid Build Coastguard Worker
451*495ae853SAndroid Build Coastguard Worker /* copy luma */
452*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_y_src;
453*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_y_dst;
454*495ae853SAndroid Build Coastguard Worker
455*495ae853SAndroid Build Coastguard Worker num_rows = ht;
456*495ae853SAndroid Build Coastguard Worker num_cols = wd;
457*495ae853SAndroid Build Coastguard Worker
458*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
459*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
460*495ae853SAndroid Build Coastguard Worker
461*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
462*495ae853SAndroid Build Coastguard Worker {
463*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
464*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
465*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker
468*495ae853SAndroid Build Coastguard Worker /* copy U and V */
469*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_uv_src;
470*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_uv_dst;
471*495ae853SAndroid Build Coastguard Worker
472*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
473*495ae853SAndroid Build Coastguard Worker num_cols = wd;
474*495ae853SAndroid Build Coastguard Worker
475*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
476*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
477*495ae853SAndroid Build Coastguard Worker
478*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
479*495ae853SAndroid Build Coastguard Worker {
480*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
481*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
482*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
483*495ae853SAndroid Build Coastguard Worker }
484*495ae853SAndroid Build Coastguard Worker return;
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 * @brief Function used for copying a 420SP buffer and interchange chroma planes
491*495ae853SAndroid Build Coastguard Worker *
492*495ae853SAndroid Build Coastguard Worker * @par Description
493*495ae853SAndroid Build Coastguard Worker * Function used for copying a 420SP buffer and interchange chroma planes
494*495ae853SAndroid Build Coastguard Worker *
495*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
496*495ae853SAndroid Build Coastguard Worker * Input Y pointer
497*495ae853SAndroid Build Coastguard Worker *
498*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
499*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
500*495ae853SAndroid Build Coastguard Worker *
501*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
502*495ae853SAndroid Build Coastguard Worker * Output Y pointer
503*495ae853SAndroid Build Coastguard Worker *
504*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
505*495ae853SAndroid Build Coastguard Worker * Output UV pointer (UV is interleaved in the opp. format as that of input)
506*495ae853SAndroid Build Coastguard Worker *
507*495ae853SAndroid Build Coastguard Worker * @param[in] wd
508*495ae853SAndroid Build Coastguard Worker * Width
509*495ae853SAndroid Build Coastguard Worker *
510*495ae853SAndroid Build Coastguard Worker * @param[in] ht
511*495ae853SAndroid Build Coastguard Worker * Height
512*495ae853SAndroid Build Coastguard Worker *
513*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
514*495ae853SAndroid Build Coastguard Worker * Input Y Stride
515*495ae853SAndroid Build Coastguard Worker *
516*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
517*495ae853SAndroid Build Coastguard Worker * Input UV stride
518*495ae853SAndroid Build Coastguard Worker *
519*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
520*495ae853SAndroid Build Coastguard Worker * Output Y stride
521*495ae853SAndroid Build Coastguard Worker *
522*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
523*495ae853SAndroid Build Coastguard Worker * Output UV stride
524*495ae853SAndroid Build Coastguard Worker *
525*495ae853SAndroid Build Coastguard Worker * @returns None
526*495ae853SAndroid Build Coastguard Worker *
527*495ae853SAndroid Build Coastguard Worker *******************************************************************************
528*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_uv_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd)529*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 *pu1_y_src,
530*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
531*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
532*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_dst,
533*495ae853SAndroid Build Coastguard Worker WORD32 wd,
534*495ae853SAndroid Build Coastguard Worker WORD32 ht,
535*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
536*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
537*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
538*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd)
539*495ae853SAndroid Build Coastguard Worker {
540*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
541*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
542*495ae853SAndroid Build Coastguard Worker WORD32 i;
543*495ae853SAndroid Build Coastguard Worker
544*495ae853SAndroid Build Coastguard Worker /* copy luma */
545*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_y_src;
546*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_y_dst;
547*495ae853SAndroid Build Coastguard Worker
548*495ae853SAndroid Build Coastguard Worker num_rows = ht;
549*495ae853SAndroid Build Coastguard Worker num_cols = wd;
550*495ae853SAndroid Build Coastguard Worker
551*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
552*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
553*495ae853SAndroid Build Coastguard Worker
554*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
555*495ae853SAndroid Build Coastguard Worker {
556*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
557*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
558*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
559*495ae853SAndroid Build Coastguard Worker }
560*495ae853SAndroid Build Coastguard Worker
561*495ae853SAndroid Build Coastguard Worker /* copy U and V */
562*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_uv_src;
563*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_uv_dst;
564*495ae853SAndroid Build Coastguard Worker
565*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
566*495ae853SAndroid Build Coastguard Worker num_cols = wd;
567*495ae853SAndroid Build Coastguard Worker
568*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
569*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
570*495ae853SAndroid Build Coastguard Worker
571*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker WORD32 j;
574*495ae853SAndroid Build Coastguard Worker for (j = 0; j < num_cols; j += 2)
575*495ae853SAndroid Build Coastguard Worker {
576*495ae853SAndroid Build Coastguard Worker pu1_dst[j + 0] = pu1_src[j + 1];
577*495ae853SAndroid Build Coastguard Worker pu1_dst[j + 1] = pu1_src[j + 0];
578*495ae853SAndroid Build Coastguard Worker }
579*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
580*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
581*495ae853SAndroid Build Coastguard Worker }
582*495ae853SAndroid Build Coastguard Worker return;
583*495ae853SAndroid Build Coastguard Worker }
584*495ae853SAndroid Build Coastguard Worker
585*495ae853SAndroid Build Coastguard Worker /**
586*495ae853SAndroid Build Coastguard Worker *******************************************************************************
587*495ae853SAndroid Build Coastguard Worker *
588*495ae853SAndroid Build Coastguard Worker * @brief Function used to perform color space conversion from 420SP to 420P
589*495ae853SAndroid Build Coastguard Worker *
590*495ae853SAndroid Build Coastguard Worker * @par Description
591*495ae853SAndroid Build Coastguard Worker * Function used to perform color space conversion from 420SP to 420P
592*495ae853SAndroid Build Coastguard Worker *
593*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
594*495ae853SAndroid Build Coastguard Worker * Input Y pointer
595*495ae853SAndroid Build Coastguard Worker *
596*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
597*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
598*495ae853SAndroid Build Coastguard Worker *
599*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
600*495ae853SAndroid Build Coastguard Worker * Output Y pointer
601*495ae853SAndroid Build Coastguard Worker *
602*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_u_dst
603*495ae853SAndroid Build Coastguard Worker * Output U pointer
604*495ae853SAndroid Build Coastguard Worker *
605*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_v_dst
606*495ae853SAndroid Build Coastguard Worker * Output V pointer
607*495ae853SAndroid Build Coastguard Worker *
608*495ae853SAndroid Build Coastguard Worker * @param[in] wd
609*495ae853SAndroid Build Coastguard Worker * Width
610*495ae853SAndroid Build Coastguard Worker *
611*495ae853SAndroid Build Coastguard Worker * @param[in] ht
612*495ae853SAndroid Build Coastguard Worker * Height
613*495ae853SAndroid Build Coastguard Worker *
614*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
615*495ae853SAndroid Build Coastguard Worker * Input Y Stride
616*495ae853SAndroid Build Coastguard Worker *
617*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
618*495ae853SAndroid Build Coastguard Worker * Input UV stride
619*495ae853SAndroid Build Coastguard Worker *
620*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
621*495ae853SAndroid Build Coastguard Worker * Output Y stride
622*495ae853SAndroid Build Coastguard Worker *
623*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
624*495ae853SAndroid Build Coastguard Worker * Output UV stride
625*495ae853SAndroid Build Coastguard Worker *
626*495ae853SAndroid Build Coastguard Worker * @param[in] is_u_first
627*495ae853SAndroid Build Coastguard Worker * Flag to indicate chroma ordering
628*495ae853SAndroid Build Coastguard Worker *
629*495ae853SAndroid Build Coastguard Worker * @param[in] disable_luma_copy
630*495ae853SAndroid Build Coastguard Worker * Flag to indicate if only UV copy needs to be done
631*495ae853SAndroid Build Coastguard Worker *
632*495ae853SAndroid Build Coastguard Worker * @returns none
633*495ae853SAndroid Build Coastguard Worker *
634*495ae853SAndroid Build Coastguard Worker * @remarks none
635*495ae853SAndroid Build Coastguard Worker *
636*495ae853SAndroid Build Coastguard Worker *******************************************************************************
637*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420sp_to_420p(UWORD8 * pu1_y_src,UWORD8 * pu1_uv_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_u_dst,UWORD8 * pu1_v_dst,WORD32 wd,WORD32 ht,WORD32 src_y_strd,WORD32 src_uv_strd,WORD32 dst_y_strd,WORD32 dst_uv_strd,WORD32 is_u_first,WORD32 disable_luma_copy)638*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420sp_to_420p(UWORD8 *pu1_y_src,
639*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
640*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
641*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_dst,
642*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_v_dst,
643*495ae853SAndroid Build Coastguard Worker WORD32 wd,
644*495ae853SAndroid Build Coastguard Worker WORD32 ht,
645*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
646*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
647*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
648*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd,
649*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first,
650*495ae853SAndroid Build Coastguard Worker WORD32 disable_luma_copy)
651*495ae853SAndroid Build Coastguard Worker {
652*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
653*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
654*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
655*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
656*495ae853SAndroid Build Coastguard Worker
657*495ae853SAndroid Build Coastguard Worker if (0 == disable_luma_copy)
658*495ae853SAndroid Build Coastguard Worker {
659*495ae853SAndroid Build Coastguard Worker /* copy luma */
660*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_y_src;
661*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_y_dst;
662*495ae853SAndroid Build Coastguard Worker
663*495ae853SAndroid Build Coastguard Worker num_rows = ht;
664*495ae853SAndroid Build Coastguard Worker num_cols = wd;
665*495ae853SAndroid Build Coastguard Worker
666*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
667*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
668*495ae853SAndroid Build Coastguard Worker
669*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
670*495ae853SAndroid Build Coastguard Worker {
671*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
672*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
673*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
674*495ae853SAndroid Build Coastguard Worker }
675*495ae853SAndroid Build Coastguard Worker }
676*495ae853SAndroid Build Coastguard Worker /* de-interleave U and V and copy to destination */
677*495ae853SAndroid Build Coastguard Worker if (is_u_first)
678*495ae853SAndroid Build Coastguard Worker {
679*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src;
680*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src + 1;
681*495ae853SAndroid Build Coastguard Worker }
682*495ae853SAndroid Build Coastguard Worker else
683*495ae853SAndroid Build Coastguard Worker {
684*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *) pu1_uv_src + 1;
685*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *) pu1_uv_src;
686*495ae853SAndroid Build Coastguard Worker }
687*495ae853SAndroid Build Coastguard Worker
688*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
689*495ae853SAndroid Build Coastguard Worker num_cols = wd >> 1;
690*495ae853SAndroid Build Coastguard Worker
691*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
692*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
693*495ae853SAndroid Build Coastguard Worker
694*495ae853SAndroid Build Coastguard Worker for (i = 0; i < num_rows; i++)
695*495ae853SAndroid Build Coastguard Worker {
696*495ae853SAndroid Build Coastguard Worker for (j = 0; j < num_cols; j++)
697*495ae853SAndroid Build Coastguard Worker {
698*495ae853SAndroid Build Coastguard Worker pu1_u_dst[j] = pu1_u_src[j * 2];
699*495ae853SAndroid Build Coastguard Worker pu1_v_dst[j] = pu1_v_src[j * 2];
700*495ae853SAndroid Build Coastguard Worker }
701*495ae853SAndroid Build Coastguard Worker
702*495ae853SAndroid Build Coastguard Worker pu1_u_dst += dst_strd;
703*495ae853SAndroid Build Coastguard Worker pu1_v_dst += dst_strd;
704*495ae853SAndroid Build Coastguard Worker pu1_u_src += src_strd;
705*495ae853SAndroid Build Coastguard Worker pu1_v_src += src_strd;
706*495ae853SAndroid Build Coastguard Worker }
707*495ae853SAndroid Build Coastguard Worker return;
708*495ae853SAndroid Build Coastguard Worker }
709*495ae853SAndroid Build Coastguard Worker
710*495ae853SAndroid Build Coastguard Worker /**
711*495ae853SAndroid Build Coastguard Worker *******************************************************************************
712*495ae853SAndroid Build Coastguard Worker *
713*495ae853SAndroid Build Coastguard Worker * @brief Function used to perform color space conversion from 420P to 420SP
714*495ae853SAndroid Build Coastguard Worker *
715*495ae853SAndroid Build Coastguard Worker * @par Description
716*495ae853SAndroid Build Coastguard Worker * Function used to perform color space conversion from 420P to 420SP
717*495ae853SAndroid Build Coastguard Worker *
718*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
719*495ae853SAndroid Build Coastguard Worker * Input Y pointer
720*495ae853SAndroid Build Coastguard Worker *
721*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_u_src
722*495ae853SAndroid Build Coastguard Worker * Input U pointer
723*495ae853SAndroid Build Coastguard Worker *
724*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_v_dst
725*495ae853SAndroid Build Coastguard Worker * Input V pointer
726*495ae853SAndroid Build Coastguard Worker *
727*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
728*495ae853SAndroid Build Coastguard Worker * Output Y pointer
729*495ae853SAndroid Build Coastguard Worker *
730*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
731*495ae853SAndroid Build Coastguard Worker * Output UV pointer
732*495ae853SAndroid Build Coastguard Worker *
733*495ae853SAndroid Build Coastguard Worker * @param[in] u4_width
734*495ae853SAndroid Build Coastguard Worker * Width
735*495ae853SAndroid Build Coastguard Worker *
736*495ae853SAndroid Build Coastguard Worker * @param[in] u4_height
737*495ae853SAndroid Build Coastguard Worker * Height
738*495ae853SAndroid Build Coastguard Worker *
739*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
740*495ae853SAndroid Build Coastguard Worker * Input Y Stride
741*495ae853SAndroid Build Coastguard Worker *
742*495ae853SAndroid Build Coastguard Worker * @param[in] src_u_strd
743*495ae853SAndroid Build Coastguard Worker * Input U stride
744*495ae853SAndroid Build Coastguard Worker *
745*495ae853SAndroid Build Coastguard Worker * @param[in] src_v_strd
746*495ae853SAndroid Build Coastguard Worker * Input V stride
747*495ae853SAndroid Build Coastguard Worker *
748*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
749*495ae853SAndroid Build Coastguard Worker * Output Y stride
750*495ae853SAndroid Build Coastguard Worker *
751*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
752*495ae853SAndroid Build Coastguard Worker * Output UV stride
753*495ae853SAndroid Build Coastguard Worker *
754*495ae853SAndroid Build Coastguard Worker * @param[in] convert_uv_only
755*495ae853SAndroid Build Coastguard Worker * Flag to indicate if only UV copy needs to be done
756*495ae853SAndroid Build Coastguard Worker *
757*495ae853SAndroid Build Coastguard Worker * @returns none
758*495ae853SAndroid Build Coastguard Worker *
759*495ae853SAndroid Build Coastguard Worker * @remarks none
760*495ae853SAndroid Build Coastguard Worker *
761*495ae853SAndroid Build Coastguard Worker *******************************************************************************
762*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_420p_to_420sp(UWORD8 * pu1_y_src,UWORD8 * pu1_u_src,UWORD8 * pu1_v_src,UWORD8 * pu1_y_dst,UWORD8 * pu1_uv_dst,UWORD16 u2_height,UWORD16 u2_width,UWORD16 src_y_strd,UWORD16 src_u_strd,UWORD16 src_v_strd,UWORD16 dst_y_strd,UWORD16 dst_uv_strd,UWORD32 convert_uv_only)763*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_420p_to_420sp(UWORD8 *pu1_y_src,
764*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src,
765*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_v_src,
766*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
767*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_dst,
768*495ae853SAndroid Build Coastguard Worker UWORD16 u2_height,
769*495ae853SAndroid Build Coastguard Worker UWORD16 u2_width,
770*495ae853SAndroid Build Coastguard Worker UWORD16 src_y_strd,
771*495ae853SAndroid Build Coastguard Worker UWORD16 src_u_strd,
772*495ae853SAndroid Build Coastguard Worker UWORD16 src_v_strd,
773*495ae853SAndroid Build Coastguard Worker UWORD16 dst_y_strd,
774*495ae853SAndroid Build Coastguard Worker UWORD16 dst_uv_strd,
775*495ae853SAndroid Build Coastguard Worker UWORD32 convert_uv_only)
776*495ae853SAndroid Build Coastguard Worker {
777*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
778*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src_u, *pu1_src_v;
779*495ae853SAndroid Build Coastguard Worker UWORD16 i;
780*495ae853SAndroid Build Coastguard Worker UWORD32 u2_width_uv;
781*495ae853SAndroid Build Coastguard Worker UWORD32 dest_inc_Y = 0, dest_inc_UV = 0;
782*495ae853SAndroid Build Coastguard Worker
783*495ae853SAndroid Build Coastguard Worker dest_inc_UV = dst_uv_strd;
784*495ae853SAndroid Build Coastguard Worker
785*495ae853SAndroid Build Coastguard Worker if (0 == convert_uv_only)
786*495ae853SAndroid Build Coastguard Worker {
787*495ae853SAndroid Build Coastguard Worker /* Copy Y buffer */
788*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *) pu1_y_dst;
789*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *) pu1_y_src;
790*495ae853SAndroid Build Coastguard Worker
791*495ae853SAndroid Build Coastguard Worker dest_inc_Y = dst_y_strd;
792*495ae853SAndroid Build Coastguard Worker
793*495ae853SAndroid Build Coastguard Worker for (i = 0; i < u2_height; i++)
794*495ae853SAndroid Build Coastguard Worker {
795*495ae853SAndroid Build Coastguard Worker memcpy((void *) pu1_dst, (void *) pu1_src, u2_width);
796*495ae853SAndroid Build Coastguard Worker pu1_dst += dest_inc_Y;
797*495ae853SAndroid Build Coastguard Worker pu1_src += src_y_strd;
798*495ae853SAndroid Build Coastguard Worker }
799*495ae853SAndroid Build Coastguard Worker }
800*495ae853SAndroid Build Coastguard Worker
801*495ae853SAndroid Build Coastguard Worker /* Interleave Cb and Cr buffers */
802*495ae853SAndroid Build Coastguard Worker pu1_src_u = pu1_u_src;
803*495ae853SAndroid Build Coastguard Worker pu1_src_v = pu1_v_src;
804*495ae853SAndroid Build Coastguard Worker pu1_dst = pu1_uv_dst;
805*495ae853SAndroid Build Coastguard Worker
806*495ae853SAndroid Build Coastguard Worker u2_height = (u2_height + 1) >> 1;
807*495ae853SAndroid Build Coastguard Worker u2_width_uv = (u2_width + 1) >> 1;
808*495ae853SAndroid Build Coastguard Worker for (i = 0; i < u2_height; i++)
809*495ae853SAndroid Build Coastguard Worker {
810*495ae853SAndroid Build Coastguard Worker UWORD32 j;
811*495ae853SAndroid Build Coastguard Worker for (j = 0; j < u2_width_uv; j++)
812*495ae853SAndroid Build Coastguard Worker {
813*495ae853SAndroid Build Coastguard Worker *pu1_dst++ = *pu1_src_u++;
814*495ae853SAndroid Build Coastguard Worker *pu1_dst++ = *pu1_src_v++;
815*495ae853SAndroid Build Coastguard Worker }
816*495ae853SAndroid Build Coastguard Worker
817*495ae853SAndroid Build Coastguard Worker pu1_dst += dest_inc_UV - u2_width;
818*495ae853SAndroid Build Coastguard Worker pu1_src_u += src_u_strd - u2_width_uv;
819*495ae853SAndroid Build Coastguard Worker pu1_src_v += src_v_strd - u2_width_uv;
820*495ae853SAndroid Build Coastguard Worker }
821*495ae853SAndroid Build Coastguard Worker }
822*495ae853SAndroid Build Coastguard Worker
823*495ae853SAndroid Build Coastguard Worker /**
824*495ae853SAndroid Build Coastguard Worker *******************************************************************************
825*495ae853SAndroid Build Coastguard Worker *
826*495ae853SAndroid Build Coastguard Worker * @brief Function used to convert 422 interleaved to 420sp
827*495ae853SAndroid Build Coastguard Worker *
828*495ae853SAndroid Build Coastguard Worker * @par Description
829*495ae853SAndroid Build Coastguard Worker * Function used to convert 422 interleaved to 420sp
830*495ae853SAndroid Build Coastguard Worker *
831*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_buf
832*495ae853SAndroid Build Coastguard Worker * Output Y pointer
833*495ae853SAndroid Build Coastguard Worker *
834*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_u_buf
835*495ae853SAndroid Build Coastguard Worker * Output u pointer
836*495ae853SAndroid Build Coastguard Worker *
837*495ae853SAndroid Build Coastguard Worker * @param[in[ pu1_v_buf
838*495ae853SAndroid Build Coastguard Worker * Output V pointer
839*495ae853SAndroid Build Coastguard Worker *
840*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_422i_buf
841*495ae853SAndroid Build Coastguard Worker * Input 422i pointer
842*495ae853SAndroid Build Coastguard Worker *
843*495ae853SAndroid Build Coastguard Worker * @param[in] u4_y_width
844*495ae853SAndroid Build Coastguard Worker * Width of Y component
845*495ae853SAndroid Build Coastguard Worker *
846*495ae853SAndroid Build Coastguard Worker * @param[in] u4_y_height
847*495ae853SAndroid Build Coastguard Worker * Height of Y component
848*495ae853SAndroid Build Coastguard Worker *
849*495ae853SAndroid Build Coastguard Worker * @param[in] u4_y_stride
850*495ae853SAndroid Build Coastguard Worker * Stride of pu1_y_buf
851*495ae853SAndroid Build Coastguard Worker *
852*495ae853SAndroid Build Coastguard Worker * @param[in] u4_u_stride
853*495ae853SAndroid Build Coastguard Worker * Stride of pu1_u_buf
854*495ae853SAndroid Build Coastguard Worker *
855*495ae853SAndroid Build Coastguard Worker * @param[in] u4_v_stride
856*495ae853SAndroid Build Coastguard Worker * Stride of pu1_v_buf
857*495ae853SAndroid Build Coastguard Worker *
858*495ae853SAndroid Build Coastguard Worker * @param[in] u4_422i_stride
859*495ae853SAndroid Build Coastguard Worker * Stride of pu1_422i_buf
860*495ae853SAndroid Build Coastguard Worker *
861*495ae853SAndroid Build Coastguard Worker * @returns None
862*495ae853SAndroid Build Coastguard Worker *
863*495ae853SAndroid Build Coastguard Worker * @remarks For conversion
864*495ae853SAndroid Build Coastguard Worker * pu1_v_buf = pu1_u_buf+1
865*495ae853SAndroid Build Coastguard Worker * u4_u_stride = u4_v_stride
866*495ae853SAndroid Build Coastguard Worker *
867*495ae853SAndroid Build Coastguard Worker * The extra parameters are for maintaining API with assembly function
868*495ae853SAndroid Build Coastguard Worker *
869*495ae853SAndroid Build Coastguard Worker *******************************************************************************
870*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv_422i_to_420sp(UWORD8 * pu1_y_buf,UWORD8 * pu1_u_buf,UWORD8 * pu1_v_buf,UWORD8 * pu1_422i_buf,WORD32 u4_y_width,WORD32 u4_y_height,WORD32 u4_y_stride,WORD32 u4_u_stride,WORD32 u4_v_stride,WORD32 u4_422i_stride)871*495ae853SAndroid Build Coastguard Worker void ih264e_fmt_conv_422i_to_420sp(UWORD8 *pu1_y_buf,
872*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_buf,
873*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_v_buf,
874*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_422i_buf,
875*495ae853SAndroid Build Coastguard Worker WORD32 u4_y_width,
876*495ae853SAndroid Build Coastguard Worker WORD32 u4_y_height,
877*495ae853SAndroid Build Coastguard Worker WORD32 u4_y_stride,
878*495ae853SAndroid Build Coastguard Worker WORD32 u4_u_stride,
879*495ae853SAndroid Build Coastguard Worker WORD32 u4_v_stride,
880*495ae853SAndroid Build Coastguard Worker WORD32 u4_422i_stride)
881*495ae853SAndroid Build Coastguard Worker {
882*495ae853SAndroid Build Coastguard Worker WORD32 row, col;
883*495ae853SAndroid Build Coastguard Worker UWORD8 *row_even_422 = pu1_422i_buf;
884*495ae853SAndroid Build Coastguard Worker UWORD8 *row_odd_422 = row_even_422 + (u4_422i_stride << 1);
885*495ae853SAndroid Build Coastguard Worker UWORD8 *row_even_luma = pu1_y_buf;
886*495ae853SAndroid Build Coastguard Worker /* Since at the end of loop, we have row_even_luma += (luma_width << 1),
887*495ae853SAndroid Build Coastguard Worker * it should be same here right? */
888*495ae853SAndroid Build Coastguard Worker UWORD8 *row_odd_luma = row_even_luma + u4_y_stride;
889*495ae853SAndroid Build Coastguard Worker UWORD8 *row_cb = pu1_u_buf;
890*495ae853SAndroid Build Coastguard Worker UWORD8 *row_cr = pu1_v_buf;
891*495ae853SAndroid Build Coastguard Worker
892*495ae853SAndroid Build Coastguard Worker for (row = 0; row < u4_y_height; row = row + 2)
893*495ae853SAndroid Build Coastguard Worker {
894*495ae853SAndroid Build Coastguard Worker for (col = 0; col < (u4_y_width << 1); col = col + 4)
895*495ae853SAndroid Build Coastguard Worker {
896*495ae853SAndroid Build Coastguard Worker UWORD8 cb_even = row_even_422[col];
897*495ae853SAndroid Build Coastguard Worker UWORD8 cr_even = row_even_422[col + 2];
898*495ae853SAndroid Build Coastguard Worker
899*495ae853SAndroid Build Coastguard Worker row_cb[col >> 1] = cb_even;
900*495ae853SAndroid Build Coastguard Worker row_cr[col >> 1] = cr_even;
901*495ae853SAndroid Build Coastguard Worker
902*495ae853SAndroid Build Coastguard Worker row_even_luma[col >> 1] = row_even_422[col + 1];
903*495ae853SAndroid Build Coastguard Worker row_even_luma[(col >> 1) + 1] = row_even_422[col + 3];
904*495ae853SAndroid Build Coastguard Worker
905*495ae853SAndroid Build Coastguard Worker row_odd_luma[col >> 1] = row_odd_422[col + 1];
906*495ae853SAndroid Build Coastguard Worker row_odd_luma[(col >> 1) + 1] = row_odd_422[col + 3];
907*495ae853SAndroid Build Coastguard Worker }
908*495ae853SAndroid Build Coastguard Worker
909*495ae853SAndroid Build Coastguard Worker row_even_422 += (u4_422i_stride << 2);
910*495ae853SAndroid Build Coastguard Worker row_odd_422 += (u4_422i_stride << 2);
911*495ae853SAndroid Build Coastguard Worker
912*495ae853SAndroid Build Coastguard Worker row_even_luma += (u4_y_stride << 1);
913*495ae853SAndroid Build Coastguard Worker row_odd_luma += (u4_y_stride << 1);
914*495ae853SAndroid Build Coastguard Worker
915*495ae853SAndroid Build Coastguard Worker row_cb += u4_u_stride;
916*495ae853SAndroid Build Coastguard Worker row_cr += u4_v_stride;
917*495ae853SAndroid Build Coastguard Worker }
918*495ae853SAndroid Build Coastguard Worker }
919*495ae853SAndroid Build Coastguard Worker
920*495ae853SAndroid Build Coastguard Worker /**
921*495ae853SAndroid Build Coastguard Worker *******************************************************************************
922*495ae853SAndroid Build Coastguard Worker *
923*495ae853SAndroid Build Coastguard Worker * @brief Function used for format conversion or frame copy
924*495ae853SAndroid Build Coastguard Worker *
925*495ae853SAndroid Build Coastguard Worker * @par Description
926*495ae853SAndroid Build Coastguard Worker * Function used from copying or converting a reference frame to display buffer
927*495ae853SAndroid Build Coastguard Worker * in non shared mode
928*495ae853SAndroid Build Coastguard Worker *
929*495ae853SAndroid Build Coastguard Worker * @param[in] ps_codec
930*495ae853SAndroid Build Coastguard Worker * Codec ctxt
931*495ae853SAndroid Build Coastguard Worker *
932*495ae853SAndroid Build Coastguard Worker * @param[in] ps_pic
933*495ae853SAndroid Build Coastguard Worker * Reference pic ctxt
934*495ae853SAndroid Build Coastguard Worker *
935*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
936*495ae853SAndroid Build Coastguard Worker * Output Y pointer
937*495ae853SAndroid Build Coastguard Worker *
938*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_u_dst
939*495ae853SAndroid Build Coastguard Worker * Output U/UV pointer ( UV is interleaved in the same format as that of input)
940*495ae853SAndroid Build Coastguard Worker *
941*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_v_dst
942*495ae853SAndroid Build Coastguard Worker * Output V pointer ( used in 420P output case)
943*495ae853SAndroid Build Coastguard Worker *
944*495ae853SAndroid Build Coastguard Worker * @param[in] u4_dst_y_strd
945*495ae853SAndroid Build Coastguard Worker * Stride of destination Y buffer
946*495ae853SAndroid Build Coastguard Worker *
947*495ae853SAndroid Build Coastguard Worker * @param[in] u4_dst_u_strd
948*495ae853SAndroid Build Coastguard Worker * Stride of destination U/V buffer
949*495ae853SAndroid Build Coastguard Worker *
950*495ae853SAndroid Build Coastguard Worker * @param[in] cur_row
951*495ae853SAndroid Build Coastguard Worker * Start row of fmt conversion
952*495ae853SAndroid Build Coastguard Worker *
953*495ae853SAndroid Build Coastguard Worker * @param[in] num_rows
954*495ae853SAndroid Build Coastguard Worker * number of rows to process
955*495ae853SAndroid Build Coastguard Worker *
956*495ae853SAndroid Build Coastguard Worker * @returns error status
957*495ae853SAndroid Build Coastguard Worker *
958*495ae853SAndroid Build Coastguard Worker * @remarks Assumes that the stride of U and V buffers are same.
959*495ae853SAndroid Build Coastguard Worker *
960*495ae853SAndroid Build Coastguard Worker *******************************************************************************
961*495ae853SAndroid Build Coastguard Worker */
ih264e_fmt_conv(codec_t * ps_codec,pic_buf_t * ps_pic,UWORD8 * pu1_y_dst,UWORD8 * pu1_u_dst,UWORD8 * pu1_v_dst,UWORD32 u4_dst_y_strd,UWORD32 u4_dst_uv_strd,WORD32 cur_row,WORD32 num_rows)962*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_fmt_conv(codec_t *ps_codec,
963*495ae853SAndroid Build Coastguard Worker pic_buf_t *ps_pic,
964*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
965*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_dst,
966*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_v_dst,
967*495ae853SAndroid Build Coastguard Worker UWORD32 u4_dst_y_strd,
968*495ae853SAndroid Build Coastguard Worker UWORD32 u4_dst_uv_strd,
969*495ae853SAndroid Build Coastguard Worker WORD32 cur_row,
970*495ae853SAndroid Build Coastguard Worker WORD32 num_rows)
971*495ae853SAndroid Build Coastguard Worker {
972*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ret = IH264E_SUCCESS;
973*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src, *pu1_uv_src;
974*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst_tmp, *pu1_uv_dst_tmp;
975*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_dst_tmp, *pu1_v_dst_tmp;
976*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst_tmp;
977*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_rgb_dst_tmp;
978*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first;
979*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_luma;
980*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_chroma;
981*495ae853SAndroid Build Coastguard Worker WORD32 dst_stride, wd;
982*495ae853SAndroid Build Coastguard Worker
983*495ae853SAndroid Build Coastguard Worker if (0 == num_rows)
984*495ae853SAndroid Build Coastguard Worker return ret;
985*495ae853SAndroid Build Coastguard Worker
986*495ae853SAndroid Build Coastguard Worker pu1_luma = ps_pic->pu1_luma;
987*495ae853SAndroid Build Coastguard Worker pu1_chroma = ps_pic->pu1_chroma;
988*495ae853SAndroid Build Coastguard Worker
989*495ae853SAndroid Build Coastguard Worker dst_stride = ps_codec->s_cfg.u4_wd;
990*495ae853SAndroid Build Coastguard Worker wd = ps_codec->s_cfg.u4_disp_wd;
991*495ae853SAndroid Build Coastguard Worker is_u_first = (IV_YUV_420SP_UV == ps_codec->e_codec_color_format) ? 1 : 0;
992*495ae853SAndroid Build Coastguard Worker
993*495ae853SAndroid Build Coastguard Worker /* In case of 420P output luma copy is disabled for shared mode */
994*495ae853SAndroid Build Coastguard Worker {
995*495ae853SAndroid Build Coastguard Worker pu1_y_src = pu1_luma + cur_row * ps_codec->i4_rec_strd;
996*495ae853SAndroid Build Coastguard Worker pu1_uv_src = pu1_chroma + (cur_row / 2) * ps_codec->i4_rec_strd;
997*495ae853SAndroid Build Coastguard Worker
998*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_tmp = (UWORD16 *) pu1_y_dst;
999*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_tmp += cur_row * dst_stride;
1000*495ae853SAndroid Build Coastguard Worker pu4_rgb_dst_tmp = (UWORD32 *) pu1_y_dst;
1001*495ae853SAndroid Build Coastguard Worker pu4_rgb_dst_tmp += cur_row * dst_stride;
1002*495ae853SAndroid Build Coastguard Worker
1003*495ae853SAndroid Build Coastguard Worker pu1_y_dst_tmp = pu1_y_dst + cur_row * u4_dst_y_strd;
1004*495ae853SAndroid Build Coastguard Worker pu1_uv_dst_tmp = pu1_u_dst + (cur_row / 2) * u4_dst_uv_strd;
1005*495ae853SAndroid Build Coastguard Worker pu1_u_dst_tmp = pu1_u_dst + (cur_row / 2) * u4_dst_uv_strd;
1006*495ae853SAndroid Build Coastguard Worker pu1_v_dst_tmp = pu1_v_dst + (cur_row / 2) * u4_dst_uv_strd;
1007*495ae853SAndroid Build Coastguard Worker
1008*495ae853SAndroid Build Coastguard Worker /* If the call is non-blocking and there are no rows to be copied then return */
1009*495ae853SAndroid Build Coastguard Worker /* In non-shared mode, reference buffers are in 420SP UV format,
1010*495ae853SAndroid Build Coastguard Worker * if output also is in 420SP_UV, then just copy
1011*495ae853SAndroid Build Coastguard Worker * if output is in 420SP_VU then swap UV values
1012*495ae853SAndroid Build Coastguard Worker */
1013*495ae853SAndroid Build Coastguard Worker if ((IV_YUV_420SP_UV == ps_codec->s_cfg.e_recon_color_fmt) ||
1014*495ae853SAndroid Build Coastguard Worker (IV_YUV_420SP_VU == ps_codec->s_cfg.e_recon_color_fmt))
1015*495ae853SAndroid Build Coastguard Worker {
1016*495ae853SAndroid Build Coastguard Worker ih264e_fmt_conv_420sp_to_420sp(pu1_y_src, pu1_uv_src, pu1_y_dst_tmp,
1017*495ae853SAndroid Build Coastguard Worker pu1_uv_dst_tmp, wd, num_rows,
1018*495ae853SAndroid Build Coastguard Worker ps_codec->i4_rec_strd,
1019*495ae853SAndroid Build Coastguard Worker ps_codec->i4_rec_strd, u4_dst_y_strd,
1020*495ae853SAndroid Build Coastguard Worker u4_dst_uv_strd);
1021*495ae853SAndroid Build Coastguard Worker }
1022*495ae853SAndroid Build Coastguard Worker else if (IV_YUV_420P == ps_codec->s_cfg.e_recon_color_fmt)
1023*495ae853SAndroid Build Coastguard Worker {
1024*495ae853SAndroid Build Coastguard Worker ih264e_fmt_conv_420sp_to_420p(pu1_y_src, pu1_uv_src, pu1_y_dst_tmp,
1025*495ae853SAndroid Build Coastguard Worker pu1_u_dst_tmp, pu1_v_dst_tmp, wd,
1026*495ae853SAndroid Build Coastguard Worker num_rows, ps_codec->i4_rec_strd,
1027*495ae853SAndroid Build Coastguard Worker ps_codec->i4_rec_strd, u4_dst_y_strd,
1028*495ae853SAndroid Build Coastguard Worker u4_dst_uv_strd, is_u_first, 0);
1029*495ae853SAndroid Build Coastguard Worker }
1030*495ae853SAndroid Build Coastguard Worker }
1031*495ae853SAndroid Build Coastguard Worker return(ret);
1032*495ae853SAndroid Build Coastguard Worker }
1033*495ae853SAndroid Build Coastguard Worker
1034