xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_fmt_conv.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar *******************************************************************************
20*c83a76b0SSuyog Pawar * @file
21*c83a76b0SSuyog Pawar *  ihevcd_fmt_conv.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar *  Contains functions for format conversion or frame copy of output buffer
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar *  Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar *  None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* File Includes                                                             */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar #include <stdio.h>
40*c83a76b0SSuyog Pawar #include <stddef.h>
41*c83a76b0SSuyog Pawar #include <stdlib.h>
42*c83a76b0SSuyog Pawar #include <string.h>
43*c83a76b0SSuyog Pawar #include <assert.h>
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
46*c83a76b0SSuyog Pawar #include "iv.h"
47*c83a76b0SSuyog Pawar #include "ivd.h"
48*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
49*c83a76b0SSuyog Pawar #include "ithread.h"
50*c83a76b0SSuyog Pawar 
51*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
53*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
54*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
55*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
56*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
57*c83a76b0SSuyog Pawar #include "ihevc_disp_mgr.h"
58*c83a76b0SSuyog Pawar 
59*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
60*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
61*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
62*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
63*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_fmt_conv.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_profile.h"
67*c83a76b0SSuyog Pawar 
68*c83a76b0SSuyog Pawar /* SIMD variants of format conversion modules do not support width less than 32 */
69*c83a76b0SSuyog Pawar #define MIN_FMT_CONV_SIMD_WIDTH 32
70*c83a76b0SSuyog Pawar /**
71*c83a76b0SSuyog Pawar *******************************************************************************
72*c83a76b0SSuyog Pawar *
73*c83a76b0SSuyog Pawar * @brief Function used from copying a 420SP buffer
74*c83a76b0SSuyog Pawar *
75*c83a76b0SSuyog Pawar * @par   Description
76*c83a76b0SSuyog Pawar * Function used from copying a 420SP buffer
77*c83a76b0SSuyog Pawar *
78*c83a76b0SSuyog Pawar * @param[in] pu1_y_src
79*c83a76b0SSuyog Pawar *   Input Y pointer
80*c83a76b0SSuyog Pawar *
81*c83a76b0SSuyog Pawar * @param[in] pu1_uv_src
82*c83a76b0SSuyog Pawar *   Input UV pointer (UV is interleaved either in UV or VU format)
83*c83a76b0SSuyog Pawar *
84*c83a76b0SSuyog Pawar * @param[in] pu1_y_dst
85*c83a76b0SSuyog Pawar *   Output Y pointer
86*c83a76b0SSuyog Pawar *
87*c83a76b0SSuyog Pawar * @param[in] pu1_uv_dst
88*c83a76b0SSuyog Pawar *   Output UV pointer (UV is interleaved in the same format as that of input)
89*c83a76b0SSuyog Pawar *
90*c83a76b0SSuyog Pawar * @param[in] wd
91*c83a76b0SSuyog Pawar *   Width
92*c83a76b0SSuyog Pawar *
93*c83a76b0SSuyog Pawar * @param[in] ht
94*c83a76b0SSuyog Pawar *   Height
95*c83a76b0SSuyog Pawar *
96*c83a76b0SSuyog Pawar * @param[in] src_y_strd
97*c83a76b0SSuyog Pawar *   Input Y Stride
98*c83a76b0SSuyog Pawar *
99*c83a76b0SSuyog Pawar * @param[in] src_uv_strd
100*c83a76b0SSuyog Pawar *   Input UV stride
101*c83a76b0SSuyog Pawar *
102*c83a76b0SSuyog Pawar * @param[in] dst_y_strd
103*c83a76b0SSuyog Pawar *   Output Y stride
104*c83a76b0SSuyog Pawar *
105*c83a76b0SSuyog Pawar * @param[in] dst_uv_strd
106*c83a76b0SSuyog Pawar *   Output UV stride
107*c83a76b0SSuyog Pawar *
108*c83a76b0SSuyog Pawar * @returns None
109*c83a76b0SSuyog Pawar *
110*c83a76b0SSuyog Pawar * @remarks In case there is a need to perform partial frame copy then
111*c83a76b0SSuyog Pawar * by passion appropriate source and destination pointers and appropriate
112*c83a76b0SSuyog Pawar * values for wd and ht it can be done
113*c83a76b0SSuyog Pawar *
114*c83a76b0SSuyog Pawar *******************************************************************************
115*c83a76b0SSuyog Pawar */
ihevcd_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)116*c83a76b0SSuyog Pawar void ihevcd_fmt_conv_420sp_to_rgb565(UWORD8 *pu1_y_src,
117*c83a76b0SSuyog Pawar                                      UWORD8 *pu1_uv_src,
118*c83a76b0SSuyog Pawar                                      UWORD16 *pu2_rgb_dst,
119*c83a76b0SSuyog Pawar                                      WORD32 wd,
120*c83a76b0SSuyog Pawar                                      WORD32 ht,
121*c83a76b0SSuyog Pawar                                      WORD32 src_y_strd,
122*c83a76b0SSuyog Pawar                                      WORD32 src_uv_strd,
123*c83a76b0SSuyog Pawar                                      WORD32 dst_strd,
124*c83a76b0SSuyog Pawar                                      WORD32 is_u_first)
125*c83a76b0SSuyog Pawar {
126*c83a76b0SSuyog Pawar 
127*c83a76b0SSuyog Pawar 
128*c83a76b0SSuyog Pawar     WORD16  i2_r, i2_g, i2_b;
129*c83a76b0SSuyog Pawar     UWORD32  u4_r, u4_g, u4_b;
130*c83a76b0SSuyog Pawar     WORD16  i2_i, i2_j;
131*c83a76b0SSuyog Pawar     UWORD8  *pu1_y_src_nxt;
132*c83a76b0SSuyog Pawar     UWORD16 *pu2_rgb_dst_NextRow;
133*c83a76b0SSuyog Pawar 
134*c83a76b0SSuyog Pawar     UWORD8 *pu1_u_src, *pu1_v_src;
135*c83a76b0SSuyog Pawar 
136*c83a76b0SSuyog Pawar     if(is_u_first)
137*c83a76b0SSuyog Pawar     {
138*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src;
139*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
140*c83a76b0SSuyog Pawar     }
141*c83a76b0SSuyog Pawar     else
142*c83a76b0SSuyog Pawar     {
143*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
144*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src;
145*c83a76b0SSuyog Pawar     }
146*c83a76b0SSuyog Pawar 
147*c83a76b0SSuyog Pawar     pu1_y_src_nxt   = pu1_y_src + src_y_strd;
148*c83a76b0SSuyog Pawar     pu2_rgb_dst_NextRow = pu2_rgb_dst + dst_strd;
149*c83a76b0SSuyog Pawar 
150*c83a76b0SSuyog Pawar     for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
151*c83a76b0SSuyog Pawar     {
152*c83a76b0SSuyog Pawar         for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
153*c83a76b0SSuyog Pawar         {
154*c83a76b0SSuyog Pawar             i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
155*c83a76b0SSuyog Pawar             i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3) >> 13;
156*c83a76b0SSuyog Pawar             i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar             pu1_u_src += 2;
159*c83a76b0SSuyog Pawar             pu1_v_src += 2;
160*c83a76b0SSuyog Pawar             /* pixel 0 */
161*c83a76b0SSuyog Pawar             /* B */
162*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src + i2_b);
163*c83a76b0SSuyog Pawar             u4_b >>= 3;
164*c83a76b0SSuyog Pawar             /* G */
165*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src + i2_g);
166*c83a76b0SSuyog Pawar             u4_g >>= 2;
167*c83a76b0SSuyog Pawar             /* R */
168*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src + i2_r);
169*c83a76b0SSuyog Pawar             u4_r >>= 3;
170*c83a76b0SSuyog Pawar 
171*c83a76b0SSuyog Pawar             pu1_y_src++;
172*c83a76b0SSuyog Pawar             *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
173*c83a76b0SSuyog Pawar 
174*c83a76b0SSuyog Pawar             /* pixel 1 */
175*c83a76b0SSuyog Pawar             /* B */
176*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src + i2_b);
177*c83a76b0SSuyog Pawar             u4_b >>= 3;
178*c83a76b0SSuyog Pawar             /* G */
179*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src + i2_g);
180*c83a76b0SSuyog Pawar             u4_g >>= 2;
181*c83a76b0SSuyog Pawar             /* R */
182*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src + i2_r);
183*c83a76b0SSuyog Pawar             u4_r >>= 3;
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar             pu1_y_src++;
186*c83a76b0SSuyog Pawar             *pu2_rgb_dst++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
187*c83a76b0SSuyog Pawar 
188*c83a76b0SSuyog Pawar             /* pixel 2 */
189*c83a76b0SSuyog Pawar             /* B */
190*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
191*c83a76b0SSuyog Pawar             u4_b >>= 3;
192*c83a76b0SSuyog Pawar             /* G */
193*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
194*c83a76b0SSuyog Pawar             u4_g >>= 2;
195*c83a76b0SSuyog Pawar             /* R */
196*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
197*c83a76b0SSuyog Pawar             u4_r >>= 3;
198*c83a76b0SSuyog Pawar 
199*c83a76b0SSuyog Pawar             pu1_y_src_nxt++;
200*c83a76b0SSuyog Pawar             *pu2_rgb_dst_NextRow++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
201*c83a76b0SSuyog Pawar 
202*c83a76b0SSuyog Pawar             /* pixel 3 */
203*c83a76b0SSuyog Pawar             /* B */
204*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
205*c83a76b0SSuyog Pawar             u4_b >>= 3;
206*c83a76b0SSuyog Pawar             /* G */
207*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
208*c83a76b0SSuyog Pawar             u4_g >>= 2;
209*c83a76b0SSuyog Pawar             /* R */
210*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
211*c83a76b0SSuyog Pawar             u4_r >>= 3;
212*c83a76b0SSuyog Pawar 
213*c83a76b0SSuyog Pawar             pu1_y_src_nxt++;
214*c83a76b0SSuyog Pawar             *pu2_rgb_dst_NextRow++ = ((u4_r << 11) | (u4_g << 5) | u4_b);
215*c83a76b0SSuyog Pawar 
216*c83a76b0SSuyog Pawar         }
217*c83a76b0SSuyog Pawar 
218*c83a76b0SSuyog Pawar         pu1_u_src = pu1_u_src + src_uv_strd - wd;
219*c83a76b0SSuyog Pawar         pu1_v_src = pu1_v_src + src_uv_strd - wd;
220*c83a76b0SSuyog Pawar 
221*c83a76b0SSuyog Pawar         pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
222*c83a76b0SSuyog Pawar         pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
223*c83a76b0SSuyog Pawar 
224*c83a76b0SSuyog Pawar         pu2_rgb_dst = pu2_rgb_dst_NextRow - wd + dst_strd;
225*c83a76b0SSuyog Pawar         pu2_rgb_dst_NextRow = pu2_rgb_dst_NextRow + (dst_strd << 1) - wd;
226*c83a76b0SSuyog Pawar     }
227*c83a76b0SSuyog Pawar 
228*c83a76b0SSuyog Pawar 
229*c83a76b0SSuyog Pawar }
230*c83a76b0SSuyog Pawar 
ihevcd_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)231*c83a76b0SSuyog Pawar void ihevcd_fmt_conv_420sp_to_rgba8888(UWORD8 *pu1_y_src,
232*c83a76b0SSuyog Pawar                                        UWORD8 *pu1_uv_src,
233*c83a76b0SSuyog Pawar                                        UWORD32 *pu4_rgba_dst,
234*c83a76b0SSuyog Pawar                                        WORD32 wd,
235*c83a76b0SSuyog Pawar                                        WORD32 ht,
236*c83a76b0SSuyog Pawar                                        WORD32 src_y_strd,
237*c83a76b0SSuyog Pawar                                        WORD32 src_uv_strd,
238*c83a76b0SSuyog Pawar                                        WORD32 dst_strd,
239*c83a76b0SSuyog Pawar                                        WORD32 is_u_first)
240*c83a76b0SSuyog Pawar {
241*c83a76b0SSuyog Pawar 
242*c83a76b0SSuyog Pawar 
243*c83a76b0SSuyog Pawar     WORD16  i2_r, i2_g, i2_b;
244*c83a76b0SSuyog Pawar     UWORD32  u4_r, u4_g, u4_b;
245*c83a76b0SSuyog Pawar     WORD16  i2_i, i2_j;
246*c83a76b0SSuyog Pawar     UWORD8  *pu1_y_src_nxt;
247*c83a76b0SSuyog Pawar     UWORD32 *pu4_rgba_dst_NextRow;
248*c83a76b0SSuyog Pawar 
249*c83a76b0SSuyog Pawar     UWORD8 *pu1_u_src, *pu1_v_src;
250*c83a76b0SSuyog Pawar 
251*c83a76b0SSuyog Pawar     if(is_u_first)
252*c83a76b0SSuyog Pawar     {
253*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src;
254*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
255*c83a76b0SSuyog Pawar     }
256*c83a76b0SSuyog Pawar     else
257*c83a76b0SSuyog Pawar     {
258*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
259*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src;
260*c83a76b0SSuyog Pawar     }
261*c83a76b0SSuyog Pawar 
262*c83a76b0SSuyog Pawar     pu1_y_src_nxt   = pu1_y_src + src_y_strd;
263*c83a76b0SSuyog Pawar     pu4_rgba_dst_NextRow = pu4_rgba_dst + dst_strd;
264*c83a76b0SSuyog Pawar 
265*c83a76b0SSuyog Pawar     for(i2_i = 0; i2_i < (ht >> 1); i2_i++)
266*c83a76b0SSuyog Pawar     {
267*c83a76b0SSuyog Pawar         for(i2_j = (wd >> 1); i2_j > 0; i2_j--)
268*c83a76b0SSuyog Pawar         {
269*c83a76b0SSuyog Pawar             i2_b = ((*pu1_u_src - 128) * COEFF4 >> 13);
270*c83a76b0SSuyog Pawar             i2_g = ((*pu1_u_src - 128) * COEFF2 + (*pu1_v_src - 128) * COEFF3) >> 13;
271*c83a76b0SSuyog Pawar             i2_r = ((*pu1_v_src - 128) * COEFF1) >> 13;
272*c83a76b0SSuyog Pawar 
273*c83a76b0SSuyog Pawar             pu1_u_src += 2;
274*c83a76b0SSuyog Pawar             pu1_v_src += 2;
275*c83a76b0SSuyog Pawar             /* pixel 0 */
276*c83a76b0SSuyog Pawar             /* B */
277*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src + i2_b);
278*c83a76b0SSuyog Pawar             /* G */
279*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src + i2_g);
280*c83a76b0SSuyog Pawar             /* R */
281*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src + i2_r);
282*c83a76b0SSuyog Pawar 
283*c83a76b0SSuyog Pawar             pu1_y_src++;
284*c83a76b0SSuyog Pawar             *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
285*c83a76b0SSuyog Pawar 
286*c83a76b0SSuyog Pawar             /* pixel 1 */
287*c83a76b0SSuyog Pawar             /* B */
288*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src + i2_b);
289*c83a76b0SSuyog Pawar             /* G */
290*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src + i2_g);
291*c83a76b0SSuyog Pawar             /* R */
292*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src + i2_r);
293*c83a76b0SSuyog Pawar 
294*c83a76b0SSuyog Pawar             pu1_y_src++;
295*c83a76b0SSuyog Pawar             *pu4_rgba_dst++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
296*c83a76b0SSuyog Pawar 
297*c83a76b0SSuyog Pawar             /* pixel 2 */
298*c83a76b0SSuyog Pawar             /* B */
299*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
300*c83a76b0SSuyog Pawar             /* G */
301*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
302*c83a76b0SSuyog Pawar             /* R */
303*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
304*c83a76b0SSuyog Pawar 
305*c83a76b0SSuyog Pawar             pu1_y_src_nxt++;
306*c83a76b0SSuyog Pawar             *pu4_rgba_dst_NextRow++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
307*c83a76b0SSuyog Pawar 
308*c83a76b0SSuyog Pawar             /* pixel 3 */
309*c83a76b0SSuyog Pawar             /* B */
310*c83a76b0SSuyog Pawar             u4_b = CLIP_U8(*pu1_y_src_nxt + i2_b);
311*c83a76b0SSuyog Pawar             /* G */
312*c83a76b0SSuyog Pawar             u4_g = CLIP_U8(*pu1_y_src_nxt + i2_g);
313*c83a76b0SSuyog Pawar             /* R */
314*c83a76b0SSuyog Pawar             u4_r = CLIP_U8(*pu1_y_src_nxt + i2_r);
315*c83a76b0SSuyog Pawar 
316*c83a76b0SSuyog Pawar             pu1_y_src_nxt++;
317*c83a76b0SSuyog Pawar             *pu4_rgba_dst_NextRow++ = ((u4_r << 16) | (u4_g << 8) | (u4_b << 0));
318*c83a76b0SSuyog Pawar 
319*c83a76b0SSuyog Pawar         }
320*c83a76b0SSuyog Pawar 
321*c83a76b0SSuyog Pawar         pu1_u_src = pu1_u_src + src_uv_strd - wd;
322*c83a76b0SSuyog Pawar         pu1_v_src = pu1_v_src + src_uv_strd - wd;
323*c83a76b0SSuyog Pawar 
324*c83a76b0SSuyog Pawar         pu1_y_src = pu1_y_src + (src_y_strd << 1) - wd;
325*c83a76b0SSuyog Pawar         pu1_y_src_nxt = pu1_y_src_nxt + (src_y_strd << 1) - wd;
326*c83a76b0SSuyog Pawar 
327*c83a76b0SSuyog Pawar         pu4_rgba_dst = pu4_rgba_dst_NextRow - wd + dst_strd;
328*c83a76b0SSuyog Pawar         pu4_rgba_dst_NextRow = pu4_rgba_dst_NextRow + (dst_strd << 1) - wd;
329*c83a76b0SSuyog Pawar     }
330*c83a76b0SSuyog Pawar 
331*c83a76b0SSuyog Pawar 
332*c83a76b0SSuyog Pawar }
333*c83a76b0SSuyog Pawar 
334*c83a76b0SSuyog Pawar /**
335*c83a76b0SSuyog Pawar *******************************************************************************
336*c83a76b0SSuyog Pawar *
337*c83a76b0SSuyog Pawar * @brief Function used from copying a 420SP buffer
338*c83a76b0SSuyog Pawar *
339*c83a76b0SSuyog Pawar * @par   Description
340*c83a76b0SSuyog Pawar * Function used from copying a 420SP buffer
341*c83a76b0SSuyog Pawar *
342*c83a76b0SSuyog Pawar * @param[in] pu1_y_src
343*c83a76b0SSuyog Pawar *   Input Y pointer
344*c83a76b0SSuyog Pawar *
345*c83a76b0SSuyog Pawar * @param[in] pu1_uv_src
346*c83a76b0SSuyog Pawar *   Input UV pointer (UV is interleaved either in UV or VU format)
347*c83a76b0SSuyog Pawar *
348*c83a76b0SSuyog Pawar * @param[in] pu1_y_dst
349*c83a76b0SSuyog Pawar *   Output Y pointer
350*c83a76b0SSuyog Pawar *
351*c83a76b0SSuyog Pawar * @param[in] pu1_uv_dst
352*c83a76b0SSuyog Pawar *   Output UV pointer (UV is interleaved in the same format as that of input)
353*c83a76b0SSuyog Pawar *
354*c83a76b0SSuyog Pawar * @param[in] wd
355*c83a76b0SSuyog Pawar *   Width
356*c83a76b0SSuyog Pawar *
357*c83a76b0SSuyog Pawar * @param[in] ht
358*c83a76b0SSuyog Pawar *   Height
359*c83a76b0SSuyog Pawar *
360*c83a76b0SSuyog Pawar * @param[in] src_y_strd
361*c83a76b0SSuyog Pawar *   Input Y Stride
362*c83a76b0SSuyog Pawar *
363*c83a76b0SSuyog Pawar * @param[in] src_uv_strd
364*c83a76b0SSuyog Pawar *   Input UV stride
365*c83a76b0SSuyog Pawar *
366*c83a76b0SSuyog Pawar * @param[in] dst_y_strd
367*c83a76b0SSuyog Pawar *   Output Y stride
368*c83a76b0SSuyog Pawar *
369*c83a76b0SSuyog Pawar * @param[in] dst_uv_strd
370*c83a76b0SSuyog Pawar *   Output UV stride
371*c83a76b0SSuyog Pawar *
372*c83a76b0SSuyog Pawar * @returns None
373*c83a76b0SSuyog Pawar *
374*c83a76b0SSuyog Pawar * @remarks In case there is a need to perform partial frame copy then
375*c83a76b0SSuyog Pawar * by passion appropriate source and destination pointers and appropriate
376*c83a76b0SSuyog Pawar * values for wd and ht it can be done
377*c83a76b0SSuyog Pawar *
378*c83a76b0SSuyog Pawar *******************************************************************************
379*c83a76b0SSuyog Pawar */
380*c83a76b0SSuyog Pawar 
ihevcd_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)381*c83a76b0SSuyog Pawar void ihevcd_fmt_conv_420sp_to_420sp(UWORD8 *pu1_y_src,
382*c83a76b0SSuyog Pawar                                     UWORD8 *pu1_uv_src,
383*c83a76b0SSuyog Pawar                                     UWORD8 *pu1_y_dst,
384*c83a76b0SSuyog Pawar                                     UWORD8 *pu1_uv_dst,
385*c83a76b0SSuyog Pawar                                     WORD32 wd,
386*c83a76b0SSuyog Pawar                                     WORD32 ht,
387*c83a76b0SSuyog Pawar                                     WORD32 src_y_strd,
388*c83a76b0SSuyog Pawar                                     WORD32 src_uv_strd,
389*c83a76b0SSuyog Pawar                                     WORD32 dst_y_strd,
390*c83a76b0SSuyog Pawar                                     WORD32 dst_uv_strd)
391*c83a76b0SSuyog Pawar {
392*c83a76b0SSuyog Pawar     UWORD8 *pu1_src, *pu1_dst;
393*c83a76b0SSuyog Pawar     WORD32 num_rows, num_cols, src_strd, dst_strd;
394*c83a76b0SSuyog Pawar     WORD32 i;
395*c83a76b0SSuyog Pawar 
396*c83a76b0SSuyog Pawar     /* copy luma */
397*c83a76b0SSuyog Pawar     pu1_src = (UWORD8 *)pu1_y_src;
398*c83a76b0SSuyog Pawar     pu1_dst = (UWORD8 *)pu1_y_dst;
399*c83a76b0SSuyog Pawar 
400*c83a76b0SSuyog Pawar     num_rows = ht;
401*c83a76b0SSuyog Pawar     num_cols = wd;
402*c83a76b0SSuyog Pawar 
403*c83a76b0SSuyog Pawar     src_strd = src_y_strd;
404*c83a76b0SSuyog Pawar     dst_strd = dst_y_strd;
405*c83a76b0SSuyog Pawar 
406*c83a76b0SSuyog Pawar     for(i = 0; i < num_rows; i++)
407*c83a76b0SSuyog Pawar     {
408*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, num_cols);
409*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
410*c83a76b0SSuyog Pawar         pu1_src += src_strd;
411*c83a76b0SSuyog Pawar     }
412*c83a76b0SSuyog Pawar 
413*c83a76b0SSuyog Pawar     /* copy U and V */
414*c83a76b0SSuyog Pawar     pu1_src = (UWORD8 *)pu1_uv_src;
415*c83a76b0SSuyog Pawar     pu1_dst = (UWORD8 *)pu1_uv_dst;
416*c83a76b0SSuyog Pawar 
417*c83a76b0SSuyog Pawar     num_rows = ht >> 1;
418*c83a76b0SSuyog Pawar     num_cols = wd;
419*c83a76b0SSuyog Pawar 
420*c83a76b0SSuyog Pawar     src_strd = src_uv_strd;
421*c83a76b0SSuyog Pawar     dst_strd = dst_uv_strd;
422*c83a76b0SSuyog Pawar 
423*c83a76b0SSuyog Pawar     for(i = 0; i < num_rows; i++)
424*c83a76b0SSuyog Pawar     {
425*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, num_cols);
426*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
427*c83a76b0SSuyog Pawar         pu1_src += src_strd;
428*c83a76b0SSuyog Pawar     }
429*c83a76b0SSuyog Pawar     return;
430*c83a76b0SSuyog Pawar }
431*c83a76b0SSuyog Pawar 
432*c83a76b0SSuyog Pawar 
433*c83a76b0SSuyog Pawar 
434*c83a76b0SSuyog Pawar /**
435*c83a76b0SSuyog Pawar *******************************************************************************
436*c83a76b0SSuyog Pawar *
437*c83a76b0SSuyog Pawar * @brief Function used from copying a 420SP buffer
438*c83a76b0SSuyog Pawar *
439*c83a76b0SSuyog Pawar * @par   Description
440*c83a76b0SSuyog Pawar * Function used from copying a 420SP buffer
441*c83a76b0SSuyog Pawar *
442*c83a76b0SSuyog Pawar * @param[in] pu1_y_src
443*c83a76b0SSuyog Pawar *   Input Y pointer
444*c83a76b0SSuyog Pawar *
445*c83a76b0SSuyog Pawar * @param[in] pu1_uv_src
446*c83a76b0SSuyog Pawar *   Input UV pointer (UV is interleaved either in UV or VU format)
447*c83a76b0SSuyog Pawar *
448*c83a76b0SSuyog Pawar * @param[in] pu1_y_dst
449*c83a76b0SSuyog Pawar *   Output Y pointer
450*c83a76b0SSuyog Pawar *
451*c83a76b0SSuyog Pawar * @param[in] pu1_uv_dst
452*c83a76b0SSuyog Pawar *   Output UV pointer (UV is interleaved in the same format as that of input)
453*c83a76b0SSuyog Pawar *
454*c83a76b0SSuyog Pawar * @param[in] wd
455*c83a76b0SSuyog Pawar *   Width
456*c83a76b0SSuyog Pawar *
457*c83a76b0SSuyog Pawar * @param[in] ht
458*c83a76b0SSuyog Pawar *   Height
459*c83a76b0SSuyog Pawar *
460*c83a76b0SSuyog Pawar * @param[in] src_y_strd
461*c83a76b0SSuyog Pawar *   Input Y Stride
462*c83a76b0SSuyog Pawar *
463*c83a76b0SSuyog Pawar * @param[in] src_uv_strd
464*c83a76b0SSuyog Pawar *   Input UV stride
465*c83a76b0SSuyog Pawar *
466*c83a76b0SSuyog Pawar * @param[in] dst_y_strd
467*c83a76b0SSuyog Pawar *   Output Y stride
468*c83a76b0SSuyog Pawar *
469*c83a76b0SSuyog Pawar * @param[in] dst_uv_strd
470*c83a76b0SSuyog Pawar *   Output UV stride
471*c83a76b0SSuyog Pawar *
472*c83a76b0SSuyog Pawar * @returns None
473*c83a76b0SSuyog Pawar *
474*c83a76b0SSuyog Pawar * @remarks In case there is a need to perform partial frame copy then
475*c83a76b0SSuyog Pawar * by passion appropriate source and destination pointers and appropriate
476*c83a76b0SSuyog Pawar * values for wd and ht it can be done
477*c83a76b0SSuyog Pawar *
478*c83a76b0SSuyog Pawar *******************************************************************************
479*c83a76b0SSuyog Pawar */
ihevcd_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)480*c83a76b0SSuyog Pawar void ihevcd_fmt_conv_420sp_to_420sp_swap_uv(UWORD8 *pu1_y_src,
481*c83a76b0SSuyog Pawar                                             UWORD8 *pu1_uv_src,
482*c83a76b0SSuyog Pawar                                             UWORD8 *pu1_y_dst,
483*c83a76b0SSuyog Pawar                                             UWORD8 *pu1_uv_dst,
484*c83a76b0SSuyog Pawar                                             WORD32 wd,
485*c83a76b0SSuyog Pawar                                             WORD32 ht,
486*c83a76b0SSuyog Pawar                                             WORD32 src_y_strd,
487*c83a76b0SSuyog Pawar                                             WORD32 src_uv_strd,
488*c83a76b0SSuyog Pawar                                             WORD32 dst_y_strd,
489*c83a76b0SSuyog Pawar                                             WORD32 dst_uv_strd)
490*c83a76b0SSuyog Pawar {
491*c83a76b0SSuyog Pawar     UWORD8 *pu1_src, *pu1_dst;
492*c83a76b0SSuyog Pawar     WORD32 num_rows, num_cols, src_strd, dst_strd;
493*c83a76b0SSuyog Pawar     WORD32 i;
494*c83a76b0SSuyog Pawar 
495*c83a76b0SSuyog Pawar     /* copy luma */
496*c83a76b0SSuyog Pawar     pu1_src = (UWORD8 *)pu1_y_src;
497*c83a76b0SSuyog Pawar     pu1_dst = (UWORD8 *)pu1_y_dst;
498*c83a76b0SSuyog Pawar 
499*c83a76b0SSuyog Pawar     num_rows = ht;
500*c83a76b0SSuyog Pawar     num_cols = wd;
501*c83a76b0SSuyog Pawar 
502*c83a76b0SSuyog Pawar     src_strd = src_y_strd;
503*c83a76b0SSuyog Pawar     dst_strd = dst_y_strd;
504*c83a76b0SSuyog Pawar 
505*c83a76b0SSuyog Pawar     for(i = 0; i < num_rows; i++)
506*c83a76b0SSuyog Pawar     {
507*c83a76b0SSuyog Pawar         memcpy(pu1_dst, pu1_src, num_cols);
508*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
509*c83a76b0SSuyog Pawar         pu1_src += src_strd;
510*c83a76b0SSuyog Pawar     }
511*c83a76b0SSuyog Pawar 
512*c83a76b0SSuyog Pawar     /* copy U and V */
513*c83a76b0SSuyog Pawar     pu1_src = (UWORD8 *)pu1_uv_src;
514*c83a76b0SSuyog Pawar     pu1_dst = (UWORD8 *)pu1_uv_dst;
515*c83a76b0SSuyog Pawar 
516*c83a76b0SSuyog Pawar     num_rows = ht >> 1;
517*c83a76b0SSuyog Pawar     num_cols = wd;
518*c83a76b0SSuyog Pawar 
519*c83a76b0SSuyog Pawar     src_strd = src_uv_strd;
520*c83a76b0SSuyog Pawar     dst_strd = dst_uv_strd;
521*c83a76b0SSuyog Pawar 
522*c83a76b0SSuyog Pawar     for(i = 0; i < num_rows; i++)
523*c83a76b0SSuyog Pawar     {
524*c83a76b0SSuyog Pawar         WORD32 j;
525*c83a76b0SSuyog Pawar         for(j = 0; j < num_cols; j += 2)
526*c83a76b0SSuyog Pawar         {
527*c83a76b0SSuyog Pawar             pu1_dst[j + 0] = pu1_src[j + 1];
528*c83a76b0SSuyog Pawar             pu1_dst[j + 1] = pu1_src[j + 0];
529*c83a76b0SSuyog Pawar         }
530*c83a76b0SSuyog Pawar         pu1_dst += dst_strd;
531*c83a76b0SSuyog Pawar         pu1_src += src_strd;
532*c83a76b0SSuyog Pawar     }
533*c83a76b0SSuyog Pawar     return;
534*c83a76b0SSuyog Pawar }
535*c83a76b0SSuyog Pawar /**
536*c83a76b0SSuyog Pawar *******************************************************************************
537*c83a76b0SSuyog Pawar *
538*c83a76b0SSuyog Pawar * @brief Function used from copying a 420SP buffer
539*c83a76b0SSuyog Pawar *
540*c83a76b0SSuyog Pawar * @par   Description
541*c83a76b0SSuyog Pawar * Function used from copying a 420SP buffer
542*c83a76b0SSuyog Pawar *
543*c83a76b0SSuyog Pawar * @param[in] pu1_y_src
544*c83a76b0SSuyog Pawar *   Input Y pointer
545*c83a76b0SSuyog Pawar *
546*c83a76b0SSuyog Pawar * @param[in] pu1_uv_src
547*c83a76b0SSuyog Pawar *   Input UV pointer (UV is interleaved either in UV or VU format)
548*c83a76b0SSuyog Pawar *
549*c83a76b0SSuyog Pawar * @param[in] pu1_y_dst
550*c83a76b0SSuyog Pawar *   Output Y pointer
551*c83a76b0SSuyog Pawar *
552*c83a76b0SSuyog Pawar * @param[in] pu1_u_dst
553*c83a76b0SSuyog Pawar *   Output U pointer
554*c83a76b0SSuyog Pawar *
555*c83a76b0SSuyog Pawar * @param[in] pu1_v_dst
556*c83a76b0SSuyog Pawar *   Output V pointer
557*c83a76b0SSuyog Pawar *
558*c83a76b0SSuyog Pawar * @param[in] wd
559*c83a76b0SSuyog Pawar *   Width
560*c83a76b0SSuyog Pawar *
561*c83a76b0SSuyog Pawar * @param[in] ht
562*c83a76b0SSuyog Pawar *   Height
563*c83a76b0SSuyog Pawar *
564*c83a76b0SSuyog Pawar * @param[in] src_y_strd
565*c83a76b0SSuyog Pawar *   Input Y Stride
566*c83a76b0SSuyog Pawar *
567*c83a76b0SSuyog Pawar * @param[in] src_uv_strd
568*c83a76b0SSuyog Pawar *   Input UV stride
569*c83a76b0SSuyog Pawar *
570*c83a76b0SSuyog Pawar * @param[in] dst_y_strd
571*c83a76b0SSuyog Pawar *   Output Y stride
572*c83a76b0SSuyog Pawar *
573*c83a76b0SSuyog Pawar * @param[in] dst_uv_strd
574*c83a76b0SSuyog Pawar *   Output UV stride
575*c83a76b0SSuyog Pawar *
576*c83a76b0SSuyog Pawar * @param[in] is_u_first
577*c83a76b0SSuyog Pawar *   Flag to indicate if U is the first byte in input chroma part
578*c83a76b0SSuyog Pawar *
579*c83a76b0SSuyog Pawar * @returns none
580*c83a76b0SSuyog Pawar *
581*c83a76b0SSuyog Pawar * @remarks In case there is a need to perform partial frame copy then
582*c83a76b0SSuyog Pawar * by passion appropriate source and destination pointers and appropriate
583*c83a76b0SSuyog Pawar * values for wd and ht it can be done
584*c83a76b0SSuyog Pawar *
585*c83a76b0SSuyog Pawar *******************************************************************************
586*c83a76b0SSuyog Pawar */
587*c83a76b0SSuyog Pawar 
588*c83a76b0SSuyog Pawar 
ihevcd_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)589*c83a76b0SSuyog Pawar void ihevcd_fmt_conv_420sp_to_420p(UWORD8 *pu1_y_src,
590*c83a76b0SSuyog Pawar                                    UWORD8 *pu1_uv_src,
591*c83a76b0SSuyog Pawar                                    UWORD8 *pu1_y_dst,
592*c83a76b0SSuyog Pawar                                    UWORD8 *pu1_u_dst,
593*c83a76b0SSuyog Pawar                                    UWORD8 *pu1_v_dst,
594*c83a76b0SSuyog Pawar                                    WORD32 wd,
595*c83a76b0SSuyog Pawar                                    WORD32 ht,
596*c83a76b0SSuyog Pawar                                    WORD32 src_y_strd,
597*c83a76b0SSuyog Pawar                                    WORD32 src_uv_strd,
598*c83a76b0SSuyog Pawar                                    WORD32 dst_y_strd,
599*c83a76b0SSuyog Pawar                                    WORD32 dst_uv_strd,
600*c83a76b0SSuyog Pawar                                    WORD32 is_u_first,
601*c83a76b0SSuyog Pawar                                    WORD32 disable_luma_copy)
602*c83a76b0SSuyog Pawar {
603*c83a76b0SSuyog Pawar     UWORD8 *pu1_src, *pu1_dst;
604*c83a76b0SSuyog Pawar     UWORD8 *pu1_u_src, *pu1_v_src;
605*c83a76b0SSuyog Pawar     WORD32 num_rows, num_cols, src_strd, dst_strd;
606*c83a76b0SSuyog Pawar     WORD32 i, j;
607*c83a76b0SSuyog Pawar 
608*c83a76b0SSuyog Pawar     if(0 == disable_luma_copy)
609*c83a76b0SSuyog Pawar     {
610*c83a76b0SSuyog Pawar         /* copy luma */
611*c83a76b0SSuyog Pawar         pu1_src = (UWORD8 *)pu1_y_src;
612*c83a76b0SSuyog Pawar         pu1_dst = (UWORD8 *)pu1_y_dst;
613*c83a76b0SSuyog Pawar 
614*c83a76b0SSuyog Pawar         num_rows = ht;
615*c83a76b0SSuyog Pawar         num_cols = wd;
616*c83a76b0SSuyog Pawar 
617*c83a76b0SSuyog Pawar         src_strd = src_y_strd;
618*c83a76b0SSuyog Pawar         dst_strd = dst_y_strd;
619*c83a76b0SSuyog Pawar 
620*c83a76b0SSuyog Pawar         for(i = 0; i < num_rows; i++)
621*c83a76b0SSuyog Pawar         {
622*c83a76b0SSuyog Pawar             memcpy(pu1_dst, pu1_src, num_cols);
623*c83a76b0SSuyog Pawar             pu1_dst += dst_strd;
624*c83a76b0SSuyog Pawar             pu1_src += src_strd;
625*c83a76b0SSuyog Pawar         }
626*c83a76b0SSuyog Pawar     }
627*c83a76b0SSuyog Pawar     /* de-interleave U and V and copy to destination */
628*c83a76b0SSuyog Pawar     if(is_u_first)
629*c83a76b0SSuyog Pawar     {
630*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src;
631*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src + 1;
632*c83a76b0SSuyog Pawar     }
633*c83a76b0SSuyog Pawar     else
634*c83a76b0SSuyog Pawar     {
635*c83a76b0SSuyog Pawar         pu1_u_src = (UWORD8 *)pu1_uv_src + 1;
636*c83a76b0SSuyog Pawar         pu1_v_src = (UWORD8 *)pu1_uv_src;
637*c83a76b0SSuyog Pawar     }
638*c83a76b0SSuyog Pawar 
639*c83a76b0SSuyog Pawar 
640*c83a76b0SSuyog Pawar     num_rows = ht >> 1;
641*c83a76b0SSuyog Pawar     num_cols = wd >> 1;
642*c83a76b0SSuyog Pawar 
643*c83a76b0SSuyog Pawar     src_strd = src_uv_strd;
644*c83a76b0SSuyog Pawar     dst_strd = dst_uv_strd;
645*c83a76b0SSuyog Pawar 
646*c83a76b0SSuyog Pawar     for(i = 0; i < num_rows; i++)
647*c83a76b0SSuyog Pawar     {
648*c83a76b0SSuyog Pawar         for(j = 0; j < num_cols; j++)
649*c83a76b0SSuyog Pawar         {
650*c83a76b0SSuyog Pawar             pu1_u_dst[j] = pu1_u_src[j * 2];
651*c83a76b0SSuyog Pawar             pu1_v_dst[j] = pu1_v_src[j * 2];
652*c83a76b0SSuyog Pawar         }
653*c83a76b0SSuyog Pawar 
654*c83a76b0SSuyog Pawar         pu1_u_dst += dst_strd;
655*c83a76b0SSuyog Pawar         pu1_v_dst += dst_strd;
656*c83a76b0SSuyog Pawar         pu1_u_src += src_strd;
657*c83a76b0SSuyog Pawar         pu1_v_src += src_strd;
658*c83a76b0SSuyog Pawar     }
659*c83a76b0SSuyog Pawar     return;
660*c83a76b0SSuyog Pawar }
661*c83a76b0SSuyog Pawar 
662*c83a76b0SSuyog Pawar 
663*c83a76b0SSuyog Pawar 
664*c83a76b0SSuyog Pawar /**
665*c83a76b0SSuyog Pawar *******************************************************************************
666*c83a76b0SSuyog Pawar *
667*c83a76b0SSuyog Pawar * @brief Function used from format conversion or frame copy
668*c83a76b0SSuyog Pawar *
669*c83a76b0SSuyog Pawar * @par   Description
670*c83a76b0SSuyog Pawar * Function used from copying or converting a reference frame to display buffer
671*c83a76b0SSuyog Pawar * in non shared mode
672*c83a76b0SSuyog Pawar *
673*c83a76b0SSuyog Pawar * @param[in] pu1_y_dst
674*c83a76b0SSuyog Pawar *   Output Y pointer
675*c83a76b0SSuyog Pawar *
676*c83a76b0SSuyog Pawar * @param[in] pu1_u_dst
677*c83a76b0SSuyog Pawar *   Output U/UV pointer ( UV is interleaved in the same format as that of input)
678*c83a76b0SSuyog Pawar *
679*c83a76b0SSuyog Pawar * @param[in] pu1_v_dst
680*c83a76b0SSuyog Pawar *   Output V pointer ( used in 420P output case)
681*c83a76b0SSuyog Pawar *
682*c83a76b0SSuyog Pawar * @param[in] blocking
683*c83a76b0SSuyog Pawar *   To indicate whether format conversion should wait till frame is reconstructed
684*c83a76b0SSuyog Pawar *   and then return after complete copy is done. To be set to 1 when called at the
685*c83a76b0SSuyog Pawar *   end of frame processing and set to 0 when called between frame processing modules
686*c83a76b0SSuyog Pawar *   in order to utilize available MCPS
687*c83a76b0SSuyog Pawar *
688*c83a76b0SSuyog Pawar * @returns Error from IHEVCD_ERROR_T
689*c83a76b0SSuyog Pawar *
690*c83a76b0SSuyog Pawar *******************************************************************************
691*c83a76b0SSuyog Pawar */
ihevcd_fmt_conv(codec_t * ps_codec,process_ctxt_t * ps_proc,UWORD8 * pu1_y_dst,UWORD8 * pu1_u_dst,UWORD8 * pu1_v_dst,WORD32 cur_row,WORD32 num_rows)692*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_fmt_conv(codec_t *ps_codec,
693*c83a76b0SSuyog Pawar                                process_ctxt_t *ps_proc,
694*c83a76b0SSuyog Pawar                                UWORD8 *pu1_y_dst,
695*c83a76b0SSuyog Pawar                                UWORD8 *pu1_u_dst,
696*c83a76b0SSuyog Pawar                                UWORD8 *pu1_v_dst,
697*c83a76b0SSuyog Pawar                                WORD32 cur_row,
698*c83a76b0SSuyog Pawar                                WORD32 num_rows)
699*c83a76b0SSuyog Pawar {
700*c83a76b0SSuyog Pawar     IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
701*c83a76b0SSuyog Pawar     pic_buf_t *ps_disp_pic;
702*c83a76b0SSuyog Pawar     UWORD8 *pu1_y_src, *pu1_uv_src;
703*c83a76b0SSuyog Pawar     UWORD8 *pu1_y_dst_tmp, *pu1_uv_dst_tmp;
704*c83a76b0SSuyog Pawar     UWORD8 *pu1_u_dst_tmp, *pu1_v_dst_tmp;
705*c83a76b0SSuyog Pawar     UWORD16 *pu2_rgb_dst_tmp;
706*c83a76b0SSuyog Pawar     UWORD32 *pu4_rgb_dst_tmp;
707*c83a76b0SSuyog Pawar     WORD32 is_u_first;
708*c83a76b0SSuyog Pawar     UWORD8 *pu1_luma;
709*c83a76b0SSuyog Pawar     UWORD8 *pu1_chroma;
710*c83a76b0SSuyog Pawar     sps_t *ps_sps;
711*c83a76b0SSuyog Pawar     WORD32 disable_luma_copy;
712*c83a76b0SSuyog Pawar     WORD32 crop_unit_x, crop_unit_y;
713*c83a76b0SSuyog Pawar 
714*c83a76b0SSuyog Pawar     if(0 == num_rows)
715*c83a76b0SSuyog Pawar         return ret;
716*c83a76b0SSuyog Pawar 
717*c83a76b0SSuyog Pawar     /* In case processing is disabled, then no need to format convert/copy */
718*c83a76b0SSuyog Pawar     PROFILE_DISABLE_FMT_CONV();
719*c83a76b0SSuyog Pawar     ps_sps = ps_proc->ps_sps;
720*c83a76b0SSuyog Pawar 
721*c83a76b0SSuyog Pawar     crop_unit_x = 1;
722*c83a76b0SSuyog Pawar     crop_unit_y = 1;
723*c83a76b0SSuyog Pawar 
724*c83a76b0SSuyog Pawar     if(CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc)
725*c83a76b0SSuyog Pawar     {
726*c83a76b0SSuyog Pawar         crop_unit_x = 2;
727*c83a76b0SSuyog Pawar         crop_unit_y = 2;
728*c83a76b0SSuyog Pawar     }
729*c83a76b0SSuyog Pawar 
730*c83a76b0SSuyog Pawar     ps_disp_pic = ps_codec->ps_disp_buf;
731*c83a76b0SSuyog Pawar     pu1_luma = ps_disp_pic->pu1_luma;
732*c83a76b0SSuyog Pawar     pu1_chroma = ps_disp_pic->pu1_chroma;
733*c83a76b0SSuyog Pawar 
734*c83a76b0SSuyog Pawar 
735*c83a76b0SSuyog Pawar     /* Take care of cropping */
736*c83a76b0SSuyog Pawar     pu1_luma    += ps_codec->i4_strd * ps_sps->i2_pic_crop_top_offset * crop_unit_y + ps_sps->i2_pic_crop_left_offset * crop_unit_x;
737*c83a76b0SSuyog Pawar 
738*c83a76b0SSuyog Pawar     /* Left offset is multiplied by 2 because buffer is UV interleaved */
739*c83a76b0SSuyog Pawar     pu1_chroma  += ps_codec->i4_strd * ps_sps->i2_pic_crop_top_offset + ps_sps->i2_pic_crop_left_offset * 2;
740*c83a76b0SSuyog Pawar 
741*c83a76b0SSuyog Pawar 
742*c83a76b0SSuyog Pawar     is_u_first = (IV_YUV_420SP_UV == ps_codec->e_ref_chroma_fmt) ? 1 : 0;
743*c83a76b0SSuyog Pawar 
744*c83a76b0SSuyog Pawar     /* In case of 420P output luma copy is disabled for shared mode */
745*c83a76b0SSuyog Pawar     disable_luma_copy = 0;
746*c83a76b0SSuyog Pawar     if(1 == ps_codec->i4_share_disp_buf)
747*c83a76b0SSuyog Pawar     {
748*c83a76b0SSuyog Pawar         disable_luma_copy = 1;
749*c83a76b0SSuyog Pawar     }
750*c83a76b0SSuyog Pawar 
751*c83a76b0SSuyog Pawar 
752*c83a76b0SSuyog Pawar 
753*c83a76b0SSuyog Pawar     {
754*c83a76b0SSuyog Pawar         pu1_y_src   = pu1_luma + cur_row * ps_codec->i4_strd;
755*c83a76b0SSuyog Pawar         pu1_uv_src  = pu1_chroma + (cur_row / 2) * ps_codec->i4_strd;
756*c83a76b0SSuyog Pawar 
757*c83a76b0SSuyog Pawar         /* In case of shared mode, with 420P output, get chroma destination */
758*c83a76b0SSuyog Pawar         if((1 == ps_codec->i4_share_disp_buf) && (IV_YUV_420P == ps_codec->e_chroma_fmt))
759*c83a76b0SSuyog Pawar         {
760*c83a76b0SSuyog Pawar             WORD32 i;
761*c83a76b0SSuyog Pawar             for(i = 0; i < ps_codec->i4_share_disp_buf_cnt; i++)
762*c83a76b0SSuyog Pawar             {
763*c83a76b0SSuyog Pawar                 WORD32 diff = ps_disp_pic->pu1_luma - ps_codec->s_disp_buffer[i].pu1_bufs[0];
764*c83a76b0SSuyog Pawar                 if(diff == (ps_codec->i4_strd * PAD_TOP + PAD_LEFT))
765*c83a76b0SSuyog Pawar                 {
766*c83a76b0SSuyog Pawar                     pu1_u_dst = ps_codec->s_disp_buffer[i].pu1_bufs[1];
767*c83a76b0SSuyog Pawar                     pu1_u_dst += (ps_codec->i4_strd * PAD_TOP) / 4 + (PAD_LEFT / 2);
768*c83a76b0SSuyog Pawar 
769*c83a76b0SSuyog Pawar                     pu1_v_dst = ps_codec->s_disp_buffer[i].pu1_bufs[2];
770*c83a76b0SSuyog Pawar                     pu1_v_dst += (ps_codec->i4_strd * PAD_TOP) / 4 + (PAD_LEFT / 2);
771*c83a76b0SSuyog Pawar                     break;
772*c83a76b0SSuyog Pawar                 }
773*c83a76b0SSuyog Pawar             }
774*c83a76b0SSuyog Pawar         }
775*c83a76b0SSuyog Pawar         pu2_rgb_dst_tmp  = (UWORD16 *)pu1_y_dst;
776*c83a76b0SSuyog Pawar         pu2_rgb_dst_tmp  += cur_row * ps_codec->i4_disp_strd;
777*c83a76b0SSuyog Pawar         pu4_rgb_dst_tmp  = (UWORD32 *)pu1_y_dst;
778*c83a76b0SSuyog Pawar         pu4_rgb_dst_tmp  += cur_row * ps_codec->i4_disp_strd;
779*c83a76b0SSuyog Pawar         pu1_y_dst_tmp  = pu1_y_dst  + cur_row * ps_codec->i4_disp_strd;
780*c83a76b0SSuyog Pawar         pu1_uv_dst_tmp = pu1_u_dst  + (cur_row / 2) * ps_codec->i4_disp_strd;
781*c83a76b0SSuyog Pawar         pu1_u_dst_tmp = pu1_u_dst  + (cur_row / 2) * ps_codec->i4_disp_strd / 2;
782*c83a76b0SSuyog Pawar         pu1_v_dst_tmp = pu1_v_dst  + (cur_row / 2) * ps_codec->i4_disp_strd / 2;
783*c83a76b0SSuyog Pawar 
784*c83a76b0SSuyog Pawar         /* In case of multi threaded implementation, format conversion might be called
785*c83a76b0SSuyog Pawar          * before reconstruction is completed. If the frame being converted/copied
786*c83a76b0SSuyog Pawar          * is same as the frame being reconstructed,
787*c83a76b0SSuyog Pawar          * Check how many rows can be format converted
788*c83a76b0SSuyog Pawar          * Convert those many rows and then check for remaining rows and so on
789*c83a76b0SSuyog Pawar          */
790*c83a76b0SSuyog Pawar 
791*c83a76b0SSuyog Pawar         if((0 == ps_codec->i4_flush_mode) && (ps_codec->i4_disp_buf_id == ps_proc->i4_cur_pic_buf_id) && (1 < ps_codec->i4_num_cores))
792*c83a76b0SSuyog Pawar         {
793*c83a76b0SSuyog Pawar             WORD32 idx;
794*c83a76b0SSuyog Pawar             UWORD8 *pu1_buf;
795*c83a76b0SSuyog Pawar             WORD32 status;
796*c83a76b0SSuyog Pawar             WORD32 last_row = cur_row + num_rows;
797*c83a76b0SSuyog Pawar             WORD32 last_ctb_y;
798*c83a76b0SSuyog Pawar             UWORD32 ctb_in_row;
799*c83a76b0SSuyog Pawar 
800*c83a76b0SSuyog Pawar             while(1)
801*c83a76b0SSuyog Pawar             {
802*c83a76b0SSuyog Pawar                 last_row = cur_row + MAX(num_rows, (1 << ps_sps->i1_log2_ctb_size)) +
803*c83a76b0SSuyog Pawar                                 ps_sps->i2_pic_crop_top_offset * crop_unit_y;
804*c83a76b0SSuyog Pawar                 last_ctb_y = (last_row >> ps_sps->i1_log2_ctb_size) - 1;
805*c83a76b0SSuyog Pawar                 /* Since deblocking works with a shift of -4, -4 ,wait till next CTB row is processed */
806*c83a76b0SSuyog Pawar                 last_ctb_y++;
807*c83a76b0SSuyog Pawar                 /* In case of a  conformance window, an extra wait of one row might be needed */
808*c83a76b0SSuyog Pawar                 last_ctb_y++;
809*c83a76b0SSuyog Pawar                 last_ctb_y = MIN(last_ctb_y, (ps_sps->i2_pic_ht_in_ctb - 1));
810*c83a76b0SSuyog Pawar 
811*c83a76b0SSuyog Pawar                 idx = (last_ctb_y * ps_sps->i2_pic_wd_in_ctb);
812*c83a76b0SSuyog Pawar 
813*c83a76b0SSuyog Pawar                 /*Check if the row below is completely processed before proceeding with format conversion*/
814*c83a76b0SSuyog Pawar                 status = 1;
815*c83a76b0SSuyog Pawar                 for(ctb_in_row = 0; (WORD32)ctb_in_row < ps_sps->i2_pic_wd_in_ctb; ctb_in_row++)
816*c83a76b0SSuyog Pawar                 {
817*c83a76b0SSuyog Pawar                     pu1_buf = (ps_codec->pu1_proc_map + idx + ctb_in_row);
818*c83a76b0SSuyog Pawar                     status &= *pu1_buf;
819*c83a76b0SSuyog Pawar                 }
820*c83a76b0SSuyog Pawar 
821*c83a76b0SSuyog Pawar                 if(status)
822*c83a76b0SSuyog Pawar                 {
823*c83a76b0SSuyog Pawar                     break;
824*c83a76b0SSuyog Pawar                 }
825*c83a76b0SSuyog Pawar                 else
826*c83a76b0SSuyog Pawar                 {
827*c83a76b0SSuyog Pawar                     ithread_yield();
828*c83a76b0SSuyog Pawar                 }
829*c83a76b0SSuyog Pawar             }
830*c83a76b0SSuyog Pawar         }
831*c83a76b0SSuyog Pawar 
832*c83a76b0SSuyog Pawar 
833*c83a76b0SSuyog Pawar         if((IV_YUV_420SP_UV == ps_codec->e_chroma_fmt) || (IV_YUV_420SP_VU == ps_codec->e_chroma_fmt))
834*c83a76b0SSuyog Pawar         {
835*c83a76b0SSuyog Pawar             ihevcd_fmt_conv_420sp_to_420sp_ft *fmt_conv_fptr;
836*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_wd >= MIN_FMT_CONV_SIMD_WIDTH)
837*c83a76b0SSuyog Pawar             {
838*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ps_codec->s_func_selector.ihevcd_fmt_conv_420sp_to_420sp_fptr;
839*c83a76b0SSuyog Pawar             }
840*c83a76b0SSuyog Pawar             else
841*c83a76b0SSuyog Pawar             {
842*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ihevcd_fmt_conv_420sp_to_420sp;
843*c83a76b0SSuyog Pawar             }
844*c83a76b0SSuyog Pawar             fmt_conv_fptr(pu1_y_src, pu1_uv_src,
845*c83a76b0SSuyog Pawar                           pu1_y_dst_tmp, pu1_uv_dst_tmp,
846*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_wd,
847*c83a76b0SSuyog Pawar                           num_rows,
848*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
849*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
850*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_strd,
851*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_strd);
852*c83a76b0SSuyog Pawar         }
853*c83a76b0SSuyog Pawar         else if(IV_YUV_420P == ps_codec->e_chroma_fmt)
854*c83a76b0SSuyog Pawar         {
855*c83a76b0SSuyog Pawar             ihevcd_fmt_conv_420sp_to_420p_ft *fmt_conv_fptr;
856*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_wd >= MIN_FMT_CONV_SIMD_WIDTH)
857*c83a76b0SSuyog Pawar             {
858*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ps_codec->s_func_selector.ihevcd_fmt_conv_420sp_to_420p_fptr;
859*c83a76b0SSuyog Pawar             }
860*c83a76b0SSuyog Pawar             else
861*c83a76b0SSuyog Pawar             {
862*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ihevcd_fmt_conv_420sp_to_420p;
863*c83a76b0SSuyog Pawar             }
864*c83a76b0SSuyog Pawar 
865*c83a76b0SSuyog Pawar             if(0 == disable_luma_copy)
866*c83a76b0SSuyog Pawar             {
867*c83a76b0SSuyog Pawar                 // copy luma
868*c83a76b0SSuyog Pawar                 WORD32 i;
869*c83a76b0SSuyog Pawar                 WORD32 num_cols = ps_codec->i4_disp_wd;
870*c83a76b0SSuyog Pawar 
871*c83a76b0SSuyog Pawar                 for(i = 0; i < num_rows; i++)
872*c83a76b0SSuyog Pawar                 {
873*c83a76b0SSuyog Pawar                     memcpy(pu1_y_dst_tmp, pu1_y_src, num_cols);
874*c83a76b0SSuyog Pawar                     pu1_y_dst_tmp += ps_codec->i4_disp_strd;
875*c83a76b0SSuyog Pawar                     pu1_y_src += ps_codec->i4_strd;
876*c83a76b0SSuyog Pawar                 }
877*c83a76b0SSuyog Pawar 
878*c83a76b0SSuyog Pawar                 disable_luma_copy = 1;
879*c83a76b0SSuyog Pawar             }
880*c83a76b0SSuyog Pawar             fmt_conv_fptr(pu1_y_src, pu1_uv_src,
881*c83a76b0SSuyog Pawar                           pu1_y_dst_tmp, pu1_u_dst_tmp, pu1_v_dst_tmp,
882*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_wd,
883*c83a76b0SSuyog Pawar                           num_rows,
884*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
885*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
886*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_strd,
887*c83a76b0SSuyog Pawar                           (ps_codec->i4_disp_strd / 2),
888*c83a76b0SSuyog Pawar                           is_u_first,
889*c83a76b0SSuyog Pawar                           disable_luma_copy);
890*c83a76b0SSuyog Pawar         }
891*c83a76b0SSuyog Pawar         else if(IV_RGB_565 == ps_codec->e_chroma_fmt)
892*c83a76b0SSuyog Pawar         {
893*c83a76b0SSuyog Pawar             ihevcd_fmt_conv_420sp_to_rgb565_ft *fmt_conv_fptr;
894*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_wd >= MIN_FMT_CONV_SIMD_WIDTH)
895*c83a76b0SSuyog Pawar             {
896*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ps_codec->s_func_selector.ihevcd_fmt_conv_420sp_to_rgb565_fptr;
897*c83a76b0SSuyog Pawar             }
898*c83a76b0SSuyog Pawar             else
899*c83a76b0SSuyog Pawar             {
900*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ihevcd_fmt_conv_420sp_to_rgb565;
901*c83a76b0SSuyog Pawar             }
902*c83a76b0SSuyog Pawar 
903*c83a76b0SSuyog Pawar             fmt_conv_fptr(pu1_y_src, pu1_uv_src,
904*c83a76b0SSuyog Pawar                           pu2_rgb_dst_tmp,
905*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_wd,
906*c83a76b0SSuyog Pawar                           num_rows,
907*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
908*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
909*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_strd,
910*c83a76b0SSuyog Pawar                           is_u_first);
911*c83a76b0SSuyog Pawar         }
912*c83a76b0SSuyog Pawar         else if(IV_RGBA_8888 == ps_codec->e_chroma_fmt)
913*c83a76b0SSuyog Pawar         {
914*c83a76b0SSuyog Pawar             ihevcd_fmt_conv_420sp_to_rgba8888_ft *fmt_conv_fptr;
915*c83a76b0SSuyog Pawar             if(ps_codec->i4_disp_wd >= MIN_FMT_CONV_SIMD_WIDTH)
916*c83a76b0SSuyog Pawar             {
917*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ps_codec->s_func_selector.ihevcd_fmt_conv_420sp_to_rgba8888_fptr;
918*c83a76b0SSuyog Pawar             }
919*c83a76b0SSuyog Pawar             else
920*c83a76b0SSuyog Pawar             {
921*c83a76b0SSuyog Pawar                 fmt_conv_fptr = ihevcd_fmt_conv_420sp_to_rgba8888;
922*c83a76b0SSuyog Pawar             }
923*c83a76b0SSuyog Pawar 
924*c83a76b0SSuyog Pawar             ASSERT(is_u_first == 1);
925*c83a76b0SSuyog Pawar             fmt_conv_fptr(pu1_y_src,
926*c83a76b0SSuyog Pawar                           pu1_uv_src,
927*c83a76b0SSuyog Pawar                           pu4_rgb_dst_tmp,
928*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_wd,
929*c83a76b0SSuyog Pawar                           num_rows,
930*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
931*c83a76b0SSuyog Pawar                           ps_codec->i4_strd,
932*c83a76b0SSuyog Pawar                           ps_codec->i4_disp_strd,
933*c83a76b0SSuyog Pawar                           is_u_first);
934*c83a76b0SSuyog Pawar         }
935*c83a76b0SSuyog Pawar 
936*c83a76b0SSuyog Pawar 
937*c83a76b0SSuyog Pawar 
938*c83a76b0SSuyog Pawar     }
939*c83a76b0SSuyog Pawar     return (ret);
940*c83a76b0SSuyog Pawar }
941*c83a76b0SSuyog Pawar 
942