xref: /aosp_15_r20/external/libavc/encoder/ih264e_fmt_conv.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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