xref: /aosp_15_r20/external/libavc/decoder/ih264d_format_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 /*  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