@ -447,159 +447,7 @@ static int altivec_##name (SwsContext *c, \
# define out_bgr24(a,b,c,ptr) vec_mstbgr24(a,b,c,ptr)
DEFCSP420_CVT ( yuv2_abgr , out_abgr )
# if 1
DEFCSP420_CVT ( yuv2_bgra , out_bgra )
# else
static int altivec_yuv2_bgra32 ( SwsContext * c ,
unsigned char * * in , int * instrides ,
int srcSliceY , int srcSliceH ,
unsigned char * * oplanes , int * outstrides )
{
int w = c - > srcW ;
int h = srcSliceH ;
int i , j ;
int instrides_scl [ 3 ] ;
vector unsigned char y0 , y1 ;
vector signed char u , v ;
vector signed short Y0 , Y1 , Y2 , Y3 ;
vector signed short U , V ;
vector signed short vx , ux , uvx ;
vector signed short vx0 , ux0 , uvx0 ;
vector signed short vx1 , ux1 , uvx1 ;
vector signed short R0 , G0 , B0 ;
vector signed short R1 , G1 , B1 ;
vector unsigned char R , G , B ;
vector unsigned char * uivP , * vivP ;
vector unsigned char align_perm ;
vector signed short
lCY = c - > CY ,
lOY = c - > OY ,
lCRV = c - > CRV ,
lCBU = c - > CBU ,
lCGU = c - > CGU ,
lCGV = c - > CGV ;
vector unsigned short lCSHIFT = c - > CSHIFT ;
ubyte * y1i = in [ 0 ] ;
ubyte * y2i = in [ 0 ] + w ;
ubyte * ui = in [ 1 ] ;
ubyte * vi = in [ 2 ] ;
vector unsigned char * oute
= ( vector unsigned char * )
( oplanes [ 0 ] + srcSliceY * outstrides [ 0 ] ) ;
vector unsigned char * outo
= ( vector unsigned char * )
( oplanes [ 0 ] + srcSliceY * outstrides [ 0 ] + outstrides [ 0 ] ) ;
instrides_scl [ 0 ] = instrides [ 0 ] ;
instrides_scl [ 1 ] = instrides [ 1 ] - w / 2 ; /* the loop moves ui by w/2 */
instrides_scl [ 2 ] = instrides [ 2 ] - w / 2 ; /* the loop moves vi by w/2 */
for ( i = 0 ; i < h / 2 ; i + + ) {
vec_dstst ( outo , ( 0x02000002 | ( ( ( w * 3 + 32 ) / 32 ) < < 16 ) ) , 0 ) ;
vec_dstst ( oute , ( 0x02000002 | ( ( ( w * 3 + 32 ) / 32 ) < < 16 ) ) , 1 ) ;
for ( j = 0 ; j < w / 16 ; j + + ) {
y0 = vec_ldl ( 0 , y1i ) ;
y1 = vec_ldl ( 0 , y2i ) ;
uivP = ( vector unsigned char * ) ui ;
vivP = ( vector unsigned char * ) vi ;
align_perm = vec_lvsl ( 0 , ui ) ;
u = ( vector signed char ) vec_perm ( uivP [ 0 ] , uivP [ 1 ] , align_perm ) ;
align_perm = vec_lvsl ( 0 , vi ) ;
v = ( vector signed char ) vec_perm ( vivP [ 0 ] , vivP [ 1 ] , align_perm ) ;
u = ( vector signed char )
vec_sub ( u , ( vector signed char )
vec_splat ( ( vector signed char ) { 128 } , 0 ) ) ;
v = ( vector signed char )
vec_sub ( v , ( vector signed char )
vec_splat ( ( vector signed char ) { 128 } , 0 ) ) ;
U = vec_unpackh ( u ) ;
V = vec_unpackh ( v ) ;
Y0 = vec_unh ( y0 ) ;
Y1 = vec_unl ( y0 ) ;
Y2 = vec_unh ( y1 ) ;
Y3 = vec_unl ( y1 ) ;
Y0 = vec_mradds ( Y0 , lCY , lOY ) ;
Y1 = vec_mradds ( Y1 , lCY , lOY ) ;
Y2 = vec_mradds ( Y2 , lCY , lOY ) ;
Y3 = vec_mradds ( Y3 , lCY , lOY ) ;
/* ux = (CBU*(u<<CSHIFT)+0x4000)>>15 */
ux = vec_sl ( U , lCSHIFT ) ;
ux = vec_mradds ( ux , lCBU , ( vector signed short ) { 0 } ) ;
ux0 = vec_mergeh ( ux , ux ) ;
ux1 = vec_mergel ( ux , ux ) ;
/* vx = (CRV*(v<<CSHIFT)+0x4000)>>15; */
vx = vec_sl ( V , lCSHIFT ) ;
vx = vec_mradds ( vx , lCRV , ( vector signed short ) { 0 } ) ;
vx0 = vec_mergeh ( vx , vx ) ;
vx1 = vec_mergel ( vx , vx ) ;
/* uvx = ((CGU*u) + (CGV*v))>>15 */
uvx = vec_mradds ( U , lCGU , ( vector signed short ) { 0 } ) ;
uvx = vec_mradds ( V , lCGV , uvx ) ;
uvx0 = vec_mergeh ( uvx , uvx ) ;
uvx1 = vec_mergel ( uvx , uvx ) ;
R0 = vec_add ( Y0 , vx0 ) ;
G0 = vec_add ( Y0 , uvx0 ) ;
B0 = vec_add ( Y0 , ux0 ) ;
R1 = vec_add ( Y1 , vx1 ) ;
G1 = vec_add ( Y1 , uvx1 ) ;
B1 = vec_add ( Y1 , ux1 ) ;
R = vec_packclp ( R0 , R1 ) ;
G = vec_packclp ( G0 , G1 ) ;
B = vec_packclp ( B0 , B1 ) ;
out_argb ( R , G , B , oute ) ;
R0 = vec_add ( Y2 , vx0 ) ;
G0 = vec_add ( Y2 , uvx0 ) ;
B0 = vec_add ( Y2 , ux0 ) ;
R1 = vec_add ( Y3 , vx1 ) ;
G1 = vec_add ( Y3 , uvx1 ) ;
B1 = vec_add ( Y3 , ux1 ) ;
R = vec_packclp ( R0 , R1 ) ;
G = vec_packclp ( G0 , G1 ) ;
B = vec_packclp ( B0 , B1 ) ;
out_argb ( R , G , B , outo ) ;
y1i + = 16 ;
y2i + = 16 ;
ui + = 8 ;
vi + = 8 ;
}
outo + = ( outstrides [ 0 ] ) > > 4 ;
oute + = ( outstrides [ 0 ] ) > > 4 ;
ui + = instrides_scl [ 1 ] ;
vi + = instrides_scl [ 2 ] ;
y1i + = instrides_scl [ 0 ] ;
y2i + = instrides_scl [ 0 ] ;
}
return srcSliceH ;
}
# endif
DEFCSP420_CVT ( yuv2_rgba , out_rgba )
DEFCSP420_CVT ( yuv2_argb , out_argb )
DEFCSP420_CVT ( yuv2_rgb24 , out_rgb24 )