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 /* File Name : ih264d_format_conv.c */
23*495ae853SAndroid Build Coastguard Worker /* */
24*495ae853SAndroid Build Coastguard Worker /* Description : Contains functions needed to convert the images in */
25*495ae853SAndroid Build Coastguard Worker /* different color spaces to yuv 422i color space */
26*495ae853SAndroid Build Coastguard Worker /* */
27*495ae853SAndroid Build Coastguard Worker /* */
28*495ae853SAndroid Build Coastguard Worker /* Issues / Problems : None */
29*495ae853SAndroid Build Coastguard Worker /* */
30*495ae853SAndroid Build Coastguard Worker /* Revision History : */
31*495ae853SAndroid Build Coastguard Worker /* */
32*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
33*495ae853SAndroid Build Coastguard Worker /* 28 08 2007 Naveen Kumar T Draft */
34*495ae853SAndroid Build Coastguard Worker /* */
35*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
36*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
37*495ae853SAndroid Build Coastguard Worker /* File Includes */
38*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
39*495ae853SAndroid Build Coastguard Worker
40*495ae853SAndroid Build Coastguard Worker /* System include files */
41*495ae853SAndroid Build Coastguard Worker #include <string.h>
42*495ae853SAndroid Build Coastguard Worker /* User include files */
43*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
44*495ae853SAndroid Build Coastguard Worker #include "iv.h"
45*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
46*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264d_structs.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264d_defs.h"
50*495ae853SAndroid Build Coastguard Worker
51*495ae853SAndroid Build Coastguard Worker
52*495ae853SAndroid Build Coastguard Worker
53*495ae853SAndroid Build Coastguard Worker #ifdef LOGO_EN
54*495ae853SAndroid Build Coastguard Worker #include "ih264d_ittiam_logo.h"
55*495ae853SAndroid Build Coastguard Worker #define INSERT_LOGO(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride, u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht) \
56*495ae853SAndroid Build Coastguard Worker ih264d_insert_logo(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride,\
57*495ae853SAndroid Build Coastguard Worker u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht)
58*495ae853SAndroid Build Coastguard Worker #else
59*495ae853SAndroid Build Coastguard Worker #define INSERT_LOGO(pu1_buf_y,pu1_buf_u,pu1_buf_v, u4_stride, u4_x_pos, u4_y_pos, u4_yuv_fmt, u4_disp_wd, u4_disp_ht)
60*495ae853SAndroid Build Coastguard Worker #endif
61*495ae853SAndroid Build Coastguard Worker
62*495ae853SAndroid Build Coastguard Worker /**
63*495ae853SAndroid Build Coastguard Worker *******************************************************************************
64*495ae853SAndroid Build Coastguard Worker *
65*495ae853SAndroid Build Coastguard Worker * @brief Function used from copying a 420SP buffer
66*495ae853SAndroid Build Coastguard Worker *
67*495ae853SAndroid Build Coastguard Worker * @par Description
68*495ae853SAndroid Build Coastguard Worker * Function used from copying a 420SP buffer
69*495ae853SAndroid Build Coastguard Worker *
70*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
71*495ae853SAndroid Build Coastguard Worker * Input Y pointer
72*495ae853SAndroid Build Coastguard Worker *
73*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
74*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
75*495ae853SAndroid Build Coastguard Worker *
76*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
77*495ae853SAndroid Build Coastguard Worker * Output Y pointer
78*495ae853SAndroid Build Coastguard Worker *
79*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
80*495ae853SAndroid Build Coastguard Worker * Output UV pointer (UV is interleaved in the same format as that of input)
81*495ae853SAndroid Build Coastguard Worker *
82*495ae853SAndroid Build Coastguard Worker * @param[in] wd
83*495ae853SAndroid Build Coastguard Worker * Width
84*495ae853SAndroid Build Coastguard Worker *
85*495ae853SAndroid Build Coastguard Worker * @param[in] ht
86*495ae853SAndroid Build Coastguard Worker * Height
87*495ae853SAndroid Build Coastguard Worker *
88*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
89*495ae853SAndroid Build Coastguard Worker * Input Y Stride
90*495ae853SAndroid Build Coastguard Worker *
91*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
92*495ae853SAndroid Build Coastguard Worker * Input UV stride
93*495ae853SAndroid Build Coastguard Worker *
94*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
95*495ae853SAndroid Build Coastguard Worker * Output Y stride
96*495ae853SAndroid Build Coastguard Worker *
97*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
98*495ae853SAndroid Build Coastguard Worker * Output UV stride
99*495ae853SAndroid Build Coastguard Worker *
100*495ae853SAndroid Build Coastguard Worker * @returns None
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @remarks In case there is a need to perform partial frame copy then
103*495ae853SAndroid Build Coastguard Worker * by passion appropriate source and destination pointers and appropriate
104*495ae853SAndroid Build Coastguard Worker * values for wd and ht it can be done
105*495ae853SAndroid Build Coastguard Worker *
106*495ae853SAndroid Build Coastguard Worker *******************************************************************************
107*495ae853SAndroid Build Coastguard Worker */
ih264d_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)108*495ae853SAndroid Build Coastguard Worker void ih264d_fmt_conv_420sp_to_rgb565(UWORD8 *pu1_y_src,
109*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
110*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst,
111*495ae853SAndroid Build Coastguard Worker WORD32 wd,
112*495ae853SAndroid Build Coastguard Worker WORD32 ht,
113*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
114*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
115*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
116*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first)
117*495ae853SAndroid Build Coastguard Worker {
118*495ae853SAndroid Build Coastguard Worker
119*495ae853SAndroid Build Coastguard Worker WORD16 i2_r, i2_g, i2_b;
120*495ae853SAndroid Build Coastguard Worker UWORD32 u4_r, u4_g, u4_b;
121*495ae853SAndroid Build Coastguard Worker WORD16 i2_i, i2_j;
122*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src_nxt;
123*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst_next_row;
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
126*495ae853SAndroid Build Coastguard Worker
127*495ae853SAndroid Build Coastguard Worker if(is_u_first)
128*495ae853SAndroid Build Coastguard Worker {
129*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src;
130*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
131*495ae853SAndroid Build Coastguard Worker }
132*495ae853SAndroid Build Coastguard Worker else
133*495ae853SAndroid Build Coastguard Worker {
134*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
135*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src;
136*495ae853SAndroid Build Coastguard Worker }
137*495ae853SAndroid Build Coastguard Worker
138*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src + src_y_strd;
139*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_next_row = pu2_rgb_dst + dst_strd;
140*495ae853SAndroid Build Coastguard Worker
141*495ae853SAndroid Build Coastguard Worker for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
142*495ae853SAndroid Build Coastguard Worker {
143*495ae853SAndroid Build Coastguard Worker for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
144*495ae853SAndroid Build Coastguard Worker {
145*495ae853SAndroid Build Coastguard Worker i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
146*495ae853SAndroid Build Coastguard Worker i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
147*495ae853SAndroid Build Coastguard Worker >> 13;
148*495ae853SAndroid Build Coastguard Worker i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker pu1_u_src += 2;
151*495ae853SAndroid Build Coastguard Worker pu1_v_src += 2;
152*495ae853SAndroid Build Coastguard Worker /* pixel 0 */
153*495ae853SAndroid Build Coastguard Worker /* B */
154*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
155*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
156*495ae853SAndroid Build Coastguard Worker /* G */
157*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
158*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
159*495ae853SAndroid Build Coastguard Worker /* R */
160*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
161*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
162*495ae853SAndroid Build Coastguard Worker
163*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
164*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
165*495ae853SAndroid Build Coastguard Worker
166*495ae853SAndroid Build Coastguard Worker /* pixel 1 */
167*495ae853SAndroid Build Coastguard Worker /* B */
168*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
169*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
170*495ae853SAndroid Build Coastguard Worker /* G */
171*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
172*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
173*495ae853SAndroid Build Coastguard Worker /* R */
174*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
175*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
176*495ae853SAndroid Build Coastguard Worker
177*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
178*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
179*495ae853SAndroid Build Coastguard Worker
180*495ae853SAndroid Build Coastguard Worker /* pixel 2 */
181*495ae853SAndroid Build Coastguard Worker /* B */
182*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
183*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
184*495ae853SAndroid Build Coastguard Worker /* G */
185*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
186*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
187*495ae853SAndroid Build Coastguard Worker /* R */
188*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
189*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
190*495ae853SAndroid Build Coastguard Worker
191*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
192*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst_next_row++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
193*495ae853SAndroid Build Coastguard Worker
194*495ae853SAndroid Build Coastguard Worker /* pixel 3 */
195*495ae853SAndroid Build Coastguard Worker /* B */
196*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
197*495ae853SAndroid Build Coastguard Worker u4_b >>= 3;
198*495ae853SAndroid Build Coastguard Worker /* G */
199*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
200*495ae853SAndroid Build Coastguard Worker u4_g >>= 2;
201*495ae853SAndroid Build Coastguard Worker /* R */
202*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
203*495ae853SAndroid Build Coastguard Worker u4_r >>= 3;
204*495ae853SAndroid Build Coastguard Worker
205*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
206*495ae853SAndroid Build Coastguard Worker *pu2_rgb_dst_next_row++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
207*495ae853SAndroid Build Coastguard Worker
208*495ae853SAndroid Build Coastguard Worker }
209*495ae853SAndroid Build Coastguard Worker
210*495ae853SAndroid Build Coastguard Worker pu1_u_src = pu1_u_src + src_uv_strd - wd;
211*495ae853SAndroid Build Coastguard Worker pu1_v_src = pu1_v_src + src_uv_strd - wd;
212*495ae853SAndroid Build Coastguard Worker
213*495ae853SAndroid Build Coastguard Worker pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
214*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
215*495ae853SAndroid Build Coastguard Worker
216*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst = pu2_rgb_dst_next_row - wd + dst_strd;
217*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst_next_row = pu2_rgb_dst_next_row + (dst_strd << 1) - wd;
218*495ae853SAndroid Build Coastguard Worker }
219*495ae853SAndroid Build Coastguard Worker
220*495ae853SAndroid Build Coastguard Worker }
221*495ae853SAndroid Build Coastguard Worker
ih264d_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)222*495ae853SAndroid Build Coastguard Worker void ih264d_fmt_conv_420sp_to_rgba8888(UWORD8 *pu1_y_src,
223*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
224*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_rgba_dst,
225*495ae853SAndroid Build Coastguard Worker WORD32 wd,
226*495ae853SAndroid Build Coastguard Worker WORD32 ht,
227*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
228*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
229*495ae853SAndroid Build Coastguard Worker WORD32 dst_strd,
230*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first)
231*495ae853SAndroid Build Coastguard Worker {
232*495ae853SAndroid Build Coastguard Worker
233*495ae853SAndroid Build Coastguard Worker WORD16 i2_r, i2_g, i2_b;
234*495ae853SAndroid Build Coastguard Worker UWORD32 u4_r, u4_g, u4_b;
235*495ae853SAndroid Build Coastguard Worker WORD16 i2_i, i2_j;
236*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src_nxt;
237*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_rgba_dst_next_row;
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
240*495ae853SAndroid Build Coastguard Worker
241*495ae853SAndroid Build Coastguard Worker if(is_u_first)
242*495ae853SAndroid Build Coastguard Worker {
243*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src;
244*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
245*495ae853SAndroid Build Coastguard Worker }
246*495ae853SAndroid Build Coastguard Worker else
247*495ae853SAndroid Build Coastguard Worker {
248*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
249*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src;
250*495ae853SAndroid Build Coastguard Worker }
251*495ae853SAndroid Build Coastguard Worker
252*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src + src_y_strd;
253*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst_next_row = pu4_rgba_dst + dst_strd;
254*495ae853SAndroid Build Coastguard Worker
255*495ae853SAndroid Build Coastguard Worker for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
256*495ae853SAndroid Build Coastguard Worker {
257*495ae853SAndroid Build Coastguard Worker for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
258*495ae853SAndroid Build Coastguard Worker {
259*495ae853SAndroid Build Coastguard Worker i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
260*495ae853SAndroid Build Coastguard Worker i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3)
261*495ae853SAndroid Build Coastguard Worker >> 13;
262*495ae853SAndroid Build Coastguard Worker i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
263*495ae853SAndroid Build Coastguard Worker
264*495ae853SAndroid Build Coastguard Worker pu1_u_src += 2;
265*495ae853SAndroid Build Coastguard Worker pu1_v_src += 2;
266*495ae853SAndroid Build Coastguard Worker /* pixel 0 */
267*495ae853SAndroid Build Coastguard Worker /* B */
268*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
269*495ae853SAndroid Build Coastguard Worker /* G */
270*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
271*495ae853SAndroid Build Coastguard Worker /* R */
272*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
273*495ae853SAndroid Build Coastguard Worker
274*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
275*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
276*495ae853SAndroid Build Coastguard Worker
277*495ae853SAndroid Build Coastguard Worker /* pixel 1 */
278*495ae853SAndroid Build Coastguard Worker /* B */
279*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src + i2_b);
280*495ae853SAndroid Build Coastguard Worker /* G */
281*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src + i2_g);
282*495ae853SAndroid Build Coastguard Worker /* R */
283*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src + i2_r);
284*495ae853SAndroid Build Coastguard Worker
285*495ae853SAndroid Build Coastguard Worker pu1_y_src++;
286*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
287*495ae853SAndroid Build Coastguard Worker
288*495ae853SAndroid Build Coastguard Worker /* pixel 2 */
289*495ae853SAndroid Build Coastguard Worker /* B */
290*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
291*495ae853SAndroid Build Coastguard Worker /* G */
292*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
293*495ae853SAndroid Build Coastguard Worker /* R */
294*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
297*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst_next_row++ =
298*495ae853SAndroid Build Coastguard Worker ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
299*495ae853SAndroid Build Coastguard Worker
300*495ae853SAndroid Build Coastguard Worker /* pixel 3 */
301*495ae853SAndroid Build Coastguard Worker /* B */
302*495ae853SAndroid Build Coastguard Worker u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
303*495ae853SAndroid Build Coastguard Worker /* G */
304*495ae853SAndroid Build Coastguard Worker u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
305*495ae853SAndroid Build Coastguard Worker /* R */
306*495ae853SAndroid Build Coastguard Worker u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
307*495ae853SAndroid Build Coastguard Worker
308*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt++;
309*495ae853SAndroid Build Coastguard Worker *pu4_rgba_dst_next_row++ =
310*495ae853SAndroid Build Coastguard Worker ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
311*495ae853SAndroid Build Coastguard Worker
312*495ae853SAndroid Build Coastguard Worker }
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker pu1_u_src = pu1_u_src + src_uv_strd - wd;
315*495ae853SAndroid Build Coastguard Worker pu1_v_src = pu1_v_src + src_uv_strd - wd;
316*495ae853SAndroid Build Coastguard Worker
317*495ae853SAndroid Build Coastguard Worker pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
318*495ae853SAndroid Build Coastguard Worker pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
319*495ae853SAndroid Build Coastguard Worker
320*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst = pu4_rgba_dst_next_row - wd + dst_strd;
321*495ae853SAndroid Build Coastguard Worker pu4_rgba_dst_next_row = pu4_rgba_dst_next_row + (dst_strd << 1) - wd;
322*495ae853SAndroid Build Coastguard Worker }
323*495ae853SAndroid Build Coastguard Worker
324*495ae853SAndroid Build Coastguard Worker }
325*495ae853SAndroid Build Coastguard Worker
326*495ae853SAndroid Build Coastguard Worker /**
327*495ae853SAndroid Build Coastguard Worker *******************************************************************************
328*495ae853SAndroid Build Coastguard Worker *
329*495ae853SAndroid Build Coastguard Worker * @brief Function used from copying a 420SP buffer
330*495ae853SAndroid Build Coastguard Worker *
331*495ae853SAndroid Build Coastguard Worker * @par Description
332*495ae853SAndroid Build Coastguard Worker * Function used from copying a 420SP buffer
333*495ae853SAndroid Build Coastguard Worker *
334*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
335*495ae853SAndroid Build Coastguard Worker * Input Y pointer
336*495ae853SAndroid Build Coastguard Worker *
337*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
338*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
339*495ae853SAndroid Build Coastguard Worker *
340*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
341*495ae853SAndroid Build Coastguard Worker * Output Y pointer
342*495ae853SAndroid Build Coastguard Worker *
343*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
344*495ae853SAndroid Build Coastguard Worker * Output UV pointer (UV is interleaved in the same format as that of input)
345*495ae853SAndroid Build Coastguard Worker *
346*495ae853SAndroid Build Coastguard Worker * @param[in] wd
347*495ae853SAndroid Build Coastguard Worker * Width
348*495ae853SAndroid Build Coastguard Worker *
349*495ae853SAndroid Build Coastguard Worker * @param[in] ht
350*495ae853SAndroid Build Coastguard Worker * Height
351*495ae853SAndroid Build Coastguard Worker *
352*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
353*495ae853SAndroid Build Coastguard Worker * Input Y Stride
354*495ae853SAndroid Build Coastguard Worker *
355*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
356*495ae853SAndroid Build Coastguard Worker * Input UV stride
357*495ae853SAndroid Build Coastguard Worker *
358*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
359*495ae853SAndroid Build Coastguard Worker * Output Y stride
360*495ae853SAndroid Build Coastguard Worker *
361*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
362*495ae853SAndroid Build Coastguard Worker * Output UV stride
363*495ae853SAndroid Build Coastguard Worker *
364*495ae853SAndroid Build Coastguard Worker * @returns None
365*495ae853SAndroid Build Coastguard Worker *
366*495ae853SAndroid Build Coastguard Worker * @remarks In case there is a need to perform partial frame copy then
367*495ae853SAndroid Build Coastguard Worker * by passion appropriate source and destination pointers and appropriate
368*495ae853SAndroid Build Coastguard Worker * values for wd and ht it can be done
369*495ae853SAndroid Build Coastguard Worker *
370*495ae853SAndroid Build Coastguard Worker *******************************************************************************
371*495ae853SAndroid Build Coastguard Worker */
372*495ae853SAndroid Build Coastguard Worker
ih264d_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)373*495ae853SAndroid Build Coastguard Worker void ih264d_fmt_conv_420sp_to_420sp(UWORD8 *pu1_y_src,
374*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
375*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
376*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_dst,
377*495ae853SAndroid Build Coastguard Worker WORD32 wd,
378*495ae853SAndroid Build Coastguard Worker WORD32 ht,
379*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
380*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
381*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
382*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd)
383*495ae853SAndroid Build Coastguard Worker {
384*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
385*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
386*495ae853SAndroid Build Coastguard Worker WORD32 i;
387*495ae853SAndroid Build Coastguard Worker
388*495ae853SAndroid Build Coastguard Worker /* copy luma */
389*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *)pu1_y_src;
390*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *)pu1_y_dst;
391*495ae853SAndroid Build Coastguard Worker
392*495ae853SAndroid Build Coastguard Worker num_rows = ht;
393*495ae853SAndroid Build Coastguard Worker num_cols = wd;
394*495ae853SAndroid Build Coastguard Worker
395*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
396*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
397*495ae853SAndroid Build Coastguard Worker
398*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
399*495ae853SAndroid Build Coastguard Worker {
400*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
401*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
402*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
403*495ae853SAndroid Build Coastguard Worker }
404*495ae853SAndroid Build Coastguard Worker
405*495ae853SAndroid Build Coastguard Worker /* copy U and V */
406*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *)pu1_uv_src;
407*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *)pu1_uv_dst;
408*495ae853SAndroid Build Coastguard Worker
409*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
410*495ae853SAndroid Build Coastguard Worker num_cols = wd;
411*495ae853SAndroid Build Coastguard Worker
412*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
413*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
414*495ae853SAndroid Build Coastguard Worker
415*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
416*495ae853SAndroid Build Coastguard Worker {
417*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
418*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
419*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
420*495ae853SAndroid Build Coastguard Worker }
421*495ae853SAndroid Build Coastguard Worker return;
422*495ae853SAndroid Build Coastguard Worker }
423*495ae853SAndroid Build Coastguard Worker
424*495ae853SAndroid Build Coastguard Worker /**
425*495ae853SAndroid Build Coastguard Worker *******************************************************************************
426*495ae853SAndroid Build Coastguard Worker *
427*495ae853SAndroid Build Coastguard Worker * @brief Function used from copying a 420SP buffer
428*495ae853SAndroid Build Coastguard Worker *
429*495ae853SAndroid Build Coastguard Worker * @par Description
430*495ae853SAndroid Build Coastguard Worker * Function used from copying a 420SP buffer
431*495ae853SAndroid Build Coastguard Worker *
432*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
433*495ae853SAndroid Build Coastguard Worker * Input Y pointer
434*495ae853SAndroid Build Coastguard Worker *
435*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
436*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
437*495ae853SAndroid Build Coastguard Worker *
438*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
439*495ae853SAndroid Build Coastguard Worker * Output Y pointer
440*495ae853SAndroid Build Coastguard Worker *
441*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_dst
442*495ae853SAndroid Build Coastguard Worker * Output UV pointer (UV is interleaved in the same format as that of input)
443*495ae853SAndroid Build Coastguard Worker *
444*495ae853SAndroid Build Coastguard Worker * @param[in] wd
445*495ae853SAndroid Build Coastguard Worker * Width
446*495ae853SAndroid Build Coastguard Worker *
447*495ae853SAndroid Build Coastguard Worker * @param[in] ht
448*495ae853SAndroid Build Coastguard Worker * Height
449*495ae853SAndroid Build Coastguard Worker *
450*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
451*495ae853SAndroid Build Coastguard Worker * Input Y Stride
452*495ae853SAndroid Build Coastguard Worker *
453*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
454*495ae853SAndroid Build Coastguard Worker * Input UV stride
455*495ae853SAndroid Build Coastguard Worker *
456*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
457*495ae853SAndroid Build Coastguard Worker * Output Y stride
458*495ae853SAndroid Build Coastguard Worker *
459*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
460*495ae853SAndroid Build Coastguard Worker * Output UV stride
461*495ae853SAndroid Build Coastguard Worker *
462*495ae853SAndroid Build Coastguard Worker * @returns None
463*495ae853SAndroid Build Coastguard Worker *
464*495ae853SAndroid Build Coastguard Worker * @remarks In case there is a need to perform partial frame copy then
465*495ae853SAndroid Build Coastguard Worker * by passion appropriate source and destination pointers and appropriate
466*495ae853SAndroid Build Coastguard Worker * values for wd and ht it can be done
467*495ae853SAndroid Build Coastguard Worker *
468*495ae853SAndroid Build Coastguard Worker *******************************************************************************
469*495ae853SAndroid Build Coastguard Worker */
ih264d_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)470*495ae853SAndroid Build Coastguard Worker void ih264d_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 *pu1_y_src,
471*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
472*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
473*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_dst,
474*495ae853SAndroid Build Coastguard Worker WORD32 wd,
475*495ae853SAndroid Build Coastguard Worker WORD32 ht,
476*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
477*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
478*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
479*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd)
480*495ae853SAndroid Build Coastguard Worker {
481*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
482*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
483*495ae853SAndroid Build Coastguard Worker WORD32 i;
484*495ae853SAndroid Build Coastguard Worker
485*495ae853SAndroid Build Coastguard Worker /* copy luma */
486*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *)pu1_y_src;
487*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *)pu1_y_dst;
488*495ae853SAndroid Build Coastguard Worker
489*495ae853SAndroid Build Coastguard Worker num_rows = ht;
490*495ae853SAndroid Build Coastguard Worker num_cols = wd;
491*495ae853SAndroid Build Coastguard Worker
492*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
493*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
494*495ae853SAndroid Build Coastguard Worker
495*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
496*495ae853SAndroid Build Coastguard Worker {
497*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
498*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
499*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
500*495ae853SAndroid Build Coastguard Worker }
501*495ae853SAndroid Build Coastguard Worker
502*495ae853SAndroid Build Coastguard Worker /* copy U and V */
503*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *)pu1_uv_src;
504*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *)pu1_uv_dst;
505*495ae853SAndroid Build Coastguard Worker
506*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
507*495ae853SAndroid Build Coastguard Worker num_cols = wd;
508*495ae853SAndroid Build Coastguard Worker
509*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
510*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
511*495ae853SAndroid Build Coastguard Worker
512*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
513*495ae853SAndroid Build Coastguard Worker {
514*495ae853SAndroid Build Coastguard Worker WORD32 j;
515*495ae853SAndroid Build Coastguard Worker for(j = 0; j < num_cols; j += 2)
516*495ae853SAndroid Build Coastguard Worker {
517*495ae853SAndroid Build Coastguard Worker pu1_dst[j + 0] = pu1_src[j + 1];
518*495ae853SAndroid Build Coastguard Worker pu1_dst[j + 1] = pu1_src[j + 0];
519*495ae853SAndroid Build Coastguard Worker }
520*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
521*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
522*495ae853SAndroid Build Coastguard Worker }
523*495ae853SAndroid Build Coastguard Worker return;
524*495ae853SAndroid Build Coastguard Worker }
525*495ae853SAndroid Build Coastguard Worker /**
526*495ae853SAndroid Build Coastguard Worker *******************************************************************************
527*495ae853SAndroid Build Coastguard Worker *
528*495ae853SAndroid Build Coastguard Worker * @brief Function used from copying a 420SP buffer
529*495ae853SAndroid Build Coastguard Worker *
530*495ae853SAndroid Build Coastguard Worker * @par Description
531*495ae853SAndroid Build Coastguard Worker * Function used from copying a 420SP buffer
532*495ae853SAndroid Build Coastguard Worker *
533*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_src
534*495ae853SAndroid Build Coastguard Worker * Input Y pointer
535*495ae853SAndroid Build Coastguard Worker *
536*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_uv_src
537*495ae853SAndroid Build Coastguard Worker * Input UV pointer (UV is interleaved either in UV or VU format)
538*495ae853SAndroid Build Coastguard Worker *
539*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_y_dst
540*495ae853SAndroid Build Coastguard Worker * Output Y pointer
541*495ae853SAndroid Build Coastguard Worker *
542*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_u_dst
543*495ae853SAndroid Build Coastguard Worker * Output U pointer
544*495ae853SAndroid Build Coastguard Worker *
545*495ae853SAndroid Build Coastguard Worker * @param[in] pu1_v_dst
546*495ae853SAndroid Build Coastguard Worker * Output V pointer
547*495ae853SAndroid Build Coastguard Worker *
548*495ae853SAndroid Build Coastguard Worker * @param[in] wd
549*495ae853SAndroid Build Coastguard Worker * Width
550*495ae853SAndroid Build Coastguard Worker *
551*495ae853SAndroid Build Coastguard Worker * @param[in] ht
552*495ae853SAndroid Build Coastguard Worker * Height
553*495ae853SAndroid Build Coastguard Worker *
554*495ae853SAndroid Build Coastguard Worker * @param[in] src_y_strd
555*495ae853SAndroid Build Coastguard Worker * Input Y Stride
556*495ae853SAndroid Build Coastguard Worker *
557*495ae853SAndroid Build Coastguard Worker * @param[in] src_uv_strd
558*495ae853SAndroid Build Coastguard Worker * Input UV stride
559*495ae853SAndroid Build Coastguard Worker *
560*495ae853SAndroid Build Coastguard Worker * @param[in] dst_y_strd
561*495ae853SAndroid Build Coastguard Worker * Output Y stride
562*495ae853SAndroid Build Coastguard Worker *
563*495ae853SAndroid Build Coastguard Worker * @param[in] dst_uv_strd
564*495ae853SAndroid Build Coastguard Worker * Output UV stride
565*495ae853SAndroid Build Coastguard Worker *
566*495ae853SAndroid Build Coastguard Worker * @param[in] is_u_first
567*495ae853SAndroid Build Coastguard Worker * Flag to indicate if U is the first byte in input chroma part
568*495ae853SAndroid Build Coastguard Worker *
569*495ae853SAndroid Build Coastguard Worker * @returns none
570*495ae853SAndroid Build Coastguard Worker *
571*495ae853SAndroid Build Coastguard Worker * @remarks In case there is a need to perform partial frame copy then
572*495ae853SAndroid Build Coastguard Worker * by passion appropriate source and destination pointers and appropriate
573*495ae853SAndroid Build Coastguard Worker * values for wd and ht it can be done
574*495ae853SAndroid Build Coastguard Worker *
575*495ae853SAndroid Build Coastguard Worker *******************************************************************************
576*495ae853SAndroid Build Coastguard Worker */
577*495ae853SAndroid Build Coastguard Worker
ih264d_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)578*495ae853SAndroid Build Coastguard Worker void ih264d_fmt_conv_420sp_to_420p(UWORD8 *pu1_y_src,
579*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src,
580*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst,
581*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_dst,
582*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_v_dst,
583*495ae853SAndroid Build Coastguard Worker WORD32 wd,
584*495ae853SAndroid Build Coastguard Worker WORD32 ht,
585*495ae853SAndroid Build Coastguard Worker WORD32 src_y_strd,
586*495ae853SAndroid Build Coastguard Worker WORD32 src_uv_strd,
587*495ae853SAndroid Build Coastguard Worker WORD32 dst_y_strd,
588*495ae853SAndroid Build Coastguard Worker WORD32 dst_uv_strd,
589*495ae853SAndroid Build Coastguard Worker WORD32 is_u_first,
590*495ae853SAndroid Build Coastguard Worker WORD32 disable_luma_copy)
591*495ae853SAndroid Build Coastguard Worker {
592*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src, *pu1_dst;
593*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_u_src, *pu1_v_src;
594*495ae853SAndroid Build Coastguard Worker WORD32 num_rows, num_cols, src_strd, dst_strd;
595*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker if(0 == disable_luma_copy)
598*495ae853SAndroid Build Coastguard Worker {
599*495ae853SAndroid Build Coastguard Worker /* copy luma */
600*495ae853SAndroid Build Coastguard Worker pu1_src = (UWORD8 *)pu1_y_src;
601*495ae853SAndroid Build Coastguard Worker pu1_dst = (UWORD8 *)pu1_y_dst;
602*495ae853SAndroid Build Coastguard Worker
603*495ae853SAndroid Build Coastguard Worker num_rows = ht;
604*495ae853SAndroid Build Coastguard Worker num_cols = wd;
605*495ae853SAndroid Build Coastguard Worker
606*495ae853SAndroid Build Coastguard Worker src_strd = src_y_strd;
607*495ae853SAndroid Build Coastguard Worker dst_strd = dst_y_strd;
608*495ae853SAndroid Build Coastguard Worker
609*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
610*495ae853SAndroid Build Coastguard Worker {
611*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, num_cols);
612*495ae853SAndroid Build Coastguard Worker pu1_dst += dst_strd;
613*495ae853SAndroid Build Coastguard Worker pu1_src += src_strd;
614*495ae853SAndroid Build Coastguard Worker }
615*495ae853SAndroid Build Coastguard Worker }
616*495ae853SAndroid Build Coastguard Worker /* de-interleave U and V and copy to destination */
617*495ae853SAndroid Build Coastguard Worker if(is_u_first)
618*495ae853SAndroid Build Coastguard Worker {
619*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src;
620*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
621*495ae853SAndroid Build Coastguard Worker }
622*495ae853SAndroid Build Coastguard Worker else
623*495ae853SAndroid Build Coastguard Worker {
624*495ae853SAndroid Build Coastguard Worker pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
625*495ae853SAndroid Build Coastguard Worker pu1_v_src = (UWORD8 *)pu1_uv_src;
626*495ae853SAndroid Build Coastguard Worker }
627*495ae853SAndroid Build Coastguard Worker
628*495ae853SAndroid Build Coastguard Worker num_rows = ht >> 1;
629*495ae853SAndroid Build Coastguard Worker num_cols = wd >> 1;
630*495ae853SAndroid Build Coastguard Worker
631*495ae853SAndroid Build Coastguard Worker src_strd = src_uv_strd;
632*495ae853SAndroid Build Coastguard Worker dst_strd = dst_uv_strd;
633*495ae853SAndroid Build Coastguard Worker
634*495ae853SAndroid Build Coastguard Worker for(i = 0; i < num_rows; i++)
635*495ae853SAndroid Build Coastguard Worker {
636*495ae853SAndroid Build Coastguard Worker for(j = 0; j < num_cols; j++)
637*495ae853SAndroid Build Coastguard Worker {
638*495ae853SAndroid Build Coastguard Worker pu1_u_dst[j] = pu1_u_src[j * 2];
639*495ae853SAndroid Build Coastguard Worker pu1_v_dst[j] = pu1_v_src[j * 2];
640*495ae853SAndroid Build Coastguard Worker }
641*495ae853SAndroid Build Coastguard Worker
642*495ae853SAndroid Build Coastguard Worker pu1_u_dst += dst_strd;
643*495ae853SAndroid Build Coastguard Worker pu1_v_dst += dst_strd;
644*495ae853SAndroid Build Coastguard Worker pu1_u_src += src_strd;
645*495ae853SAndroid Build Coastguard Worker pu1_v_src += src_strd;
646*495ae853SAndroid Build Coastguard Worker }
647*495ae853SAndroid Build Coastguard Worker return;
648*495ae853SAndroid Build Coastguard Worker }
649*495ae853SAndroid Build Coastguard Worker
650*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
651*495ae853SAndroid Build Coastguard Worker /* Function Name : ih264d_format_convert */
652*495ae853SAndroid Build Coastguard Worker /* */
653*495ae853SAndroid Build Coastguard Worker /* Description : Implements format conversion/frame copy */
654*495ae853SAndroid Build Coastguard Worker /* Inputs : ps_dec - Decoder parameters */
655*495ae853SAndroid Build Coastguard Worker /* Globals : None */
656*495ae853SAndroid Build Coastguard Worker /* Processing : Refer bumping process in the standard */
657*495ae853SAndroid Build Coastguard Worker /* Outputs : Assigns display sequence number. */
658*495ae853SAndroid Build Coastguard Worker /* Returns : None */
659*495ae853SAndroid Build Coastguard Worker /* */
660*495ae853SAndroid Build Coastguard Worker /* Issues : None */
661*495ae853SAndroid Build Coastguard Worker /* */
662*495ae853SAndroid Build Coastguard Worker /* Revision History: */
663*495ae853SAndroid Build Coastguard Worker /* */
664*495ae853SAndroid Build Coastguard Worker /* DD MM YYYY Author(s) Changes (Describe the changes made) */
665*495ae853SAndroid Build Coastguard Worker /* 27 04 2005 NS Draft */
666*495ae853SAndroid Build Coastguard Worker /* */
667*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
ih264d_format_convert(dec_struct_t * ps_dec,ivd_get_display_frame_op_t * pv_disp_op,UWORD32 u4_start_y,UWORD32 u4_num_rows_y)668*495ae853SAndroid Build Coastguard Worker void ih264d_format_convert(dec_struct_t *ps_dec,
669*495ae853SAndroid Build Coastguard Worker ivd_get_display_frame_op_t *pv_disp_op,
670*495ae853SAndroid Build Coastguard Worker UWORD32 u4_start_y,
671*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_rows_y)
672*495ae853SAndroid Build Coastguard Worker {
673*495ae853SAndroid Build Coastguard Worker UWORD32 convert_uv_only = 0;
674*495ae853SAndroid Build Coastguard Worker iv_yuv_buf_t *ps_op_frm;
675*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src, *pu1_uv_src;
676*495ae853SAndroid Build Coastguard Worker UWORD32 start_uv = u4_start_y >> 1;
677*495ae853SAndroid Build Coastguard Worker
678*495ae853SAndroid Build Coastguard Worker if(1 == pv_disp_op->u4_error_code)
679*495ae853SAndroid Build Coastguard Worker return;
680*495ae853SAndroid Build Coastguard Worker
681*495ae853SAndroid Build Coastguard Worker ps_op_frm = &(ps_dec->s_disp_frame_info);
682*495ae853SAndroid Build Coastguard Worker
683*495ae853SAndroid Build Coastguard Worker /* Requires u4_start_y and u4_num_rows_y to be even */
684*495ae853SAndroid Build Coastguard Worker if(u4_start_y & 1)
685*495ae853SAndroid Build Coastguard Worker {
686*495ae853SAndroid Build Coastguard Worker return;
687*495ae853SAndroid Build Coastguard Worker }
688*495ae853SAndroid Build Coastguard Worker
689*495ae853SAndroid Build Coastguard Worker if((1 == ps_dec->u4_share_disp_buf) &&
690*495ae853SAndroid Build Coastguard Worker (pv_disp_op->e_output_format == IV_YUV_420SP_UV))
691*495ae853SAndroid Build Coastguard Worker {
692*495ae853SAndroid Build Coastguard Worker return;
693*495ae853SAndroid Build Coastguard Worker }
694*495ae853SAndroid Build Coastguard Worker
695*495ae853SAndroid Build Coastguard Worker pu1_y_src = (UWORD8 *)ps_op_frm->pv_y_buf;
696*495ae853SAndroid Build Coastguard Worker pu1_y_src += u4_start_y * ps_op_frm->u4_y_strd,
697*495ae853SAndroid Build Coastguard Worker
698*495ae853SAndroid Build Coastguard Worker pu1_uv_src = (UWORD8 *)ps_op_frm->pv_u_buf;
699*495ae853SAndroid Build Coastguard Worker pu1_uv_src += start_uv * ps_op_frm->u4_u_strd;
700*495ae853SAndroid Build Coastguard Worker
701*495ae853SAndroid Build Coastguard Worker if(pv_disp_op->e_output_format == IV_YUV_420P)
702*495ae853SAndroid Build Coastguard Worker {
703*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_dst, *pu1_u_dst, *pu1_v_dst;
704*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T e_output_format = pv_disp_op->e_output_format;
705*495ae853SAndroid Build Coastguard Worker
706*495ae853SAndroid Build Coastguard Worker if(0 == ps_dec->u4_share_disp_buf)
707*495ae853SAndroid Build Coastguard Worker {
708*495ae853SAndroid Build Coastguard Worker convert_uv_only = 0;
709*495ae853SAndroid Build Coastguard Worker }
710*495ae853SAndroid Build Coastguard Worker else
711*495ae853SAndroid Build Coastguard Worker {
712*495ae853SAndroid Build Coastguard Worker convert_uv_only = 1;
713*495ae853SAndroid Build Coastguard Worker }
714*495ae853SAndroid Build Coastguard Worker
715*495ae853SAndroid Build Coastguard Worker pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
716*495ae853SAndroid Build Coastguard Worker pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
717*495ae853SAndroid Build Coastguard Worker
718*495ae853SAndroid Build Coastguard Worker pu1_u_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
719*495ae853SAndroid Build Coastguard Worker pu1_u_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
720*495ae853SAndroid Build Coastguard Worker
721*495ae853SAndroid Build Coastguard Worker pu1_v_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_v_buf;
722*495ae853SAndroid Build Coastguard Worker pu1_v_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_v_strd;
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker ih264d_fmt_conv_420sp_to_420p(pu1_y_src,
725*495ae853SAndroid Build Coastguard Worker pu1_uv_src,
726*495ae853SAndroid Build Coastguard Worker pu1_y_dst,
727*495ae853SAndroid Build Coastguard Worker pu1_u_dst,
728*495ae853SAndroid Build Coastguard Worker pu1_v_dst,
729*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd,
730*495ae853SAndroid Build Coastguard Worker u4_num_rows_y,
731*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd,
732*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_strd,
733*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd,
734*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd,
735*495ae853SAndroid Build Coastguard Worker 1,
736*495ae853SAndroid Build Coastguard Worker convert_uv_only);
737*495ae853SAndroid Build Coastguard Worker
738*495ae853SAndroid Build Coastguard Worker }
739*495ae853SAndroid Build Coastguard Worker else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV) ||
740*495ae853SAndroid Build Coastguard Worker (pv_disp_op->e_output_format == IV_YUV_420SP_VU))
741*495ae853SAndroid Build Coastguard Worker {
742*495ae853SAndroid Build Coastguard Worker UWORD8* pu1_y_dst, *pu1_uv_dst;
743*495ae853SAndroid Build Coastguard Worker
744*495ae853SAndroid Build Coastguard Worker pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
745*495ae853SAndroid Build Coastguard Worker pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker pu1_uv_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
748*495ae853SAndroid Build Coastguard Worker pu1_uv_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
749*495ae853SAndroid Build Coastguard Worker
750*495ae853SAndroid Build Coastguard Worker if(pv_disp_op->e_output_format == IV_YUV_420SP_UV)
751*495ae853SAndroid Build Coastguard Worker {
752*495ae853SAndroid Build Coastguard Worker ih264d_fmt_conv_420sp_to_420sp(pu1_y_src,
753*495ae853SAndroid Build Coastguard Worker pu1_uv_src,
754*495ae853SAndroid Build Coastguard Worker pu1_y_dst,
755*495ae853SAndroid Build Coastguard Worker pu1_uv_dst,
756*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd,
757*495ae853SAndroid Build Coastguard Worker u4_num_rows_y,
758*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd,
759*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_strd,
760*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd,
761*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd);
762*495ae853SAndroid Build Coastguard Worker }
763*495ae853SAndroid Build Coastguard Worker else
764*495ae853SAndroid Build Coastguard Worker {
765*495ae853SAndroid Build Coastguard Worker ih264d_fmt_conv_420sp_to_420sp_swap_uv(pu1_y_src,
766*495ae853SAndroid Build Coastguard Worker pu1_uv_src,
767*495ae853SAndroid Build Coastguard Worker pu1_y_dst,
768*495ae853SAndroid Build Coastguard Worker pu1_uv_dst,
769*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd,
770*495ae853SAndroid Build Coastguard Worker u4_num_rows_y,
771*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd,
772*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_strd,
773*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd,
774*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_u_strd);
775*495ae853SAndroid Build Coastguard Worker }
776*495ae853SAndroid Build Coastguard Worker }
777*495ae853SAndroid Build Coastguard Worker else if(pv_disp_op->e_output_format == IV_RGB_565)
778*495ae853SAndroid Build Coastguard Worker {
779*495ae853SAndroid Build Coastguard Worker UWORD16 *pu2_rgb_dst;
780*495ae853SAndroid Build Coastguard Worker
781*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst = (UWORD16 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
782*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
783*495ae853SAndroid Build Coastguard Worker
784*495ae853SAndroid Build Coastguard Worker ih264d_fmt_conv_420sp_to_rgb565(pu1_y_src,
785*495ae853SAndroid Build Coastguard Worker pu1_uv_src,
786*495ae853SAndroid Build Coastguard Worker pu2_rgb_dst,
787*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd,
788*495ae853SAndroid Build Coastguard Worker u4_num_rows_y,
789*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_strd,
790*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_u_strd,
791*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd,
792*495ae853SAndroid Build Coastguard Worker 1);
793*495ae853SAndroid Build Coastguard Worker }
794*495ae853SAndroid Build Coastguard Worker
795*495ae853SAndroid Build Coastguard Worker if((u4_start_y + u4_num_rows_y) >= ps_dec->s_disp_frame_info.u4_y_ht)
796*495ae853SAndroid Build Coastguard Worker {
797*495ae853SAndroid Build Coastguard Worker
798*495ae853SAndroid Build Coastguard Worker INSERT_LOGO(pv_disp_op->s_disp_frm_buf.pv_y_buf,
799*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_u_buf,
800*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.pv_v_buf,
801*495ae853SAndroid Build Coastguard Worker pv_disp_op->s_disp_frm_buf.u4_y_strd,
802*495ae853SAndroid Build Coastguard Worker ps_dec->u2_disp_width,
803*495ae853SAndroid Build Coastguard Worker ps_dec->u2_disp_height,
804*495ae853SAndroid Build Coastguard Worker pv_disp_op->e_output_format,
805*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_wd,
806*495ae853SAndroid Build Coastguard Worker ps_op_frm->u4_y_ht);
807*495ae853SAndroid Build Coastguard Worker }
808*495ae853SAndroid Build Coastguard Worker
809*495ae853SAndroid Build Coastguard Worker return;
810*495ae853SAndroid Build Coastguard Worker }
811