@ -520,7 +520,7 @@
# endif
static inline void RENAME ( yuv2yuv ) ( uint16_t * buf0 , uint16_t * buf1 , uint16_t * uvbuf0 , uint16_t * uvbuf1 ,
uint8_t * dest , uint8_t * uDest , uint8_t * vDest , int dstw , int yalpha , int uvalpha )
uint8_t * dest , uint8_t * uDest , uint8_t * vDest , int dstW , int yalpha , int uvalpha )
{
int yalpha1 = yalpha ^ 4095 ;
int uvalpha1 = uvalpha ^ 4095 ;
@ -530,14 +530,14 @@ static inline void RENAME(yuv2yuv)(uint16_t *buf0, uint16_t *buf1, uint16_t *uvb
asm volatile ( " \n \t " : : : " memory " ) ;
# endif
for ( i = 0 ; i < dstw ; i + + )
for ( i = 0 ; i < dstW ; i + + )
{
( ( uint8_t * ) dest ) [ i ] = ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ;
}
if ( uvalpha ! = - 1 )
{
for ( i = 0 ; i < ( dstw > > 1 ) ; i + + )
for ( i = 0 ; i < ( dstW > > 1 ) ; i + + )
{
( ( uint8_t * ) uDest ) [ i ] = ( uvbuf0 [ i ] * uvalpha1 + uvbuf1 [ i ] * uvalpha ) > > 19 ;
( ( uint8_t * ) vDest ) [ i ] = ( uvbuf0 [ i + 2048 ] * uvalpha1 + uvbuf1 [ i + 2048 ] * uvalpha ) > > 19 ;
@ -549,7 +549,7 @@ static inline void RENAME(yuv2yuv)(uint16_t *buf0, uint16_t *buf1, uint16_t *uvb
* vertical scale YV12 to RGB
*/
static inline void RENAME ( yuv2rgbX ) ( uint16_t * buf0 , uint16_t * buf1 , uint16_t * uvbuf0 , uint16_t * uvbuf1 ,
uint8_t * dest , int dstw , int yalpha , int uvalpha , int dstbpp )
uint8_t * dest , int dstW , int yalpha , int uvalpha , int dstbpp )
{
int yalpha1 = yalpha ^ 4095 ;
int uvalpha1 = uvalpha ^ 4095 ;
@ -579,7 +579,7 @@ FULL_YSCALEYUV2RGB
" jb 1b \n \t "
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -629,7 +629,7 @@ FULL_YSCALEYUV2RGB
" cmpl %5, %%eax \n \t "
" jb 1b \n \t "
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax " , " %ebx "
) ;
@ -663,7 +663,7 @@ FULL_YSCALEYUV2RGB
" cmpl %5, %%eax \n \t "
" jb 1b \n \t "
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -697,7 +697,7 @@ FULL_YSCALEYUV2RGB
" cmpl %5, %%eax \n \t "
" jb 1b \n \t "
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -708,7 +708,7 @@ FULL_YSCALEYUV2RGB
if ( dstbpp = = 32 | | dstbpp = = 24 )
{
int i ;
for ( i = 0 ; i < dstw ; i + + ) {
for ( i = 0 ; i < dstW ; i + + ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int U = ( ( uvbuf0 [ i ] * uvalpha1 + uvbuf1 [ i ] * uvalpha ) > > 19 ) ;
@ -722,7 +722,7 @@ FULL_YSCALEYUV2RGB
else if ( dstbpp = = 16 )
{
int i ;
for ( i = 0 ; i < dstw ; i + + ) {
for ( i = 0 ; i < dstW ; i + + ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int U = ( ( uvbuf0 [ i ] * uvalpha1 + uvbuf1 [ i ] * uvalpha ) > > 19 ) ;
@ -737,7 +737,7 @@ FULL_YSCALEYUV2RGB
else if ( dstbpp = = 15 )
{
int i ;
for ( i = 0 ; i < dstw ; i + + ) {
for ( i = 0 ; i < dstW ; i + + ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int U = ( ( uvbuf0 [ i ] * uvalpha1 + uvbuf1 [ i ] * uvalpha ) > > 19 ) ;
@ -760,7 +760,7 @@ FULL_YSCALEYUV2RGB
YSCALEYUV2RGB
WRITEBGR32
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -772,7 +772,7 @@ FULL_YSCALEYUV2RGB
YSCALEYUV2RGB
WRITEBGR24
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax " , " %ebx "
) ;
@ -790,7 +790,7 @@ FULL_YSCALEYUV2RGB
WRITEBGR15
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -808,7 +808,7 @@ FULL_YSCALEYUV2RGB
WRITEBGR16
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -819,7 +819,7 @@ FULL_YSCALEYUV2RGB
if ( dstbpp = = 32 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int Y2 = yuvtab_2568 [ ( ( buf0 [ i + 1 ] * yalpha1 + buf1 [ i + 1 ] * yalpha ) > > 19 ) ] ;
@ -842,7 +842,7 @@ FULL_YSCALEYUV2RGB
if ( dstbpp = = 24 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int Y2 = yuvtab_2568 [ ( ( buf0 [ i + 1 ] * yalpha1 + buf1 [ i + 1 ] * yalpha ) > > 19 ) ] ;
@ -866,7 +866,7 @@ FULL_YSCALEYUV2RGB
else if ( dstbpp = = 16 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int Y2 = yuvtab_2568 [ ( ( buf0 [ i + 1 ] * yalpha1 + buf1 [ i + 1 ] * yalpha ) > > 19 ) ] ;
@ -891,7 +891,7 @@ FULL_YSCALEYUV2RGB
else if ( dstbpp = = 15 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ ( ( buf0 [ i ] * yalpha1 + buf1 [ i ] * yalpha ) > > 19 ) ] ;
int Y2 = yuvtab_2568 [ ( ( buf0 [ i + 1 ] * yalpha1 + buf1 [ i + 1 ] * yalpha ) > > 19 ) ] ;
@ -921,7 +921,7 @@ FULL_YSCALEYUV2RGB
* YV12 to RGB without scaling or interpolating
*/
static inline void RENAME ( yuv2rgb1 ) ( uint16_t * buf0 , uint16_t * buf1 , uint16_t * uvbuf0 , uint16_t * uvbuf1 ,
uint8_t * dest , int dstw , int yalpha , int uvalpha , int dstbpp )
uint8_t * dest , int dstW , int yalpha , int uvalpha , int dstbpp )
{
int uvalpha1 = uvalpha ^ 4095 ;
# ifdef HAVE_MMX
@ -930,7 +930,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
if ( fullUVIpol | | allwaysIpol )
{
RENAME ( yuv2rgbX ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstw , yalpha , uvalpha , dstbpp ) ;
RENAME ( yuv2rgbX ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstW , yalpha , uvalpha , dstbpp ) ;
return ;
}
if ( yalpha > 2048 ) buf0 = buf1 ;
@ -943,7 +943,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
asm volatile (
YSCALEYUV2RGB1
WRITEBGR32
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -954,7 +954,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
" movl %4, %%ebx \n \t "
YSCALEYUV2RGB1
WRITEBGR24
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax " , " %ebx "
) ;
@ -970,7 +970,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
" paddusb r5Dither, %%mm5 \n \t "
# endif
WRITEBGR15
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -987,7 +987,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
# endif
WRITEBGR16
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -1000,7 +1000,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
asm volatile (
YSCALEYUV2RGB1b
WRITEBGR32
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -1011,7 +1011,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
" movl %4, %%ebx \n \t "
YSCALEYUV2RGB1b
WRITEBGR24
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " m " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax " , " %ebx "
) ;
@ -1027,7 +1027,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
" paddusb r5Dither, %%mm5 \n \t "
# endif
WRITEBGR15
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -1044,7 +1044,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
# endif
WRITEBGR16
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstw ) ,
: : " r " ( buf0 ) , " r " ( buf1 ) , " r " ( uvbuf0 ) , " r " ( uvbuf1 ) , " r " ( dest ) , " m " ( dstW ) ,
" m " ( yalpha1 ) , " m " ( uvalpha1 )
: " %eax "
) ;
@ -1057,7 +1057,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
if ( dstbpp = = 32 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ buf0 [ i ] > > 7 ] ;
int Y2 = yuvtab_2568 [ buf0 [ i + 1 ] > > 7 ] ;
@ -1080,7 +1080,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
if ( dstbpp = = 24 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ buf0 [ i ] > > 7 ] ;
int Y2 = yuvtab_2568 [ buf0 [ i + 1 ] > > 7 ] ;
@ -1104,7 +1104,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
else if ( dstbpp = = 16 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ buf0 [ i ] > > 7 ] ;
int Y2 = yuvtab_2568 [ buf0 [ i + 1 ] > > 7 ] ;
@ -1129,7 +1129,7 @@ static inline void RENAME(yuv2rgb1)(uint16_t *buf0, uint16_t *buf1, uint16_t *uv
else if ( dstbpp = = 15 )
{
int i ;
for ( i = 0 ; i < dstw - 1 ; i + = 2 ) {
for ( i = 0 ; i < dstW - 1 ; i + = 2 ) {
// vertical linear interpolation && yuv2rgb in a single step:
int Y1 = yuvtab_2568 [ buf0 [ i ] > > 7 ] ;
int Y2 = yuvtab_2568 [ buf0 [ i + 1 ] > > 7 ] ;
@ -1404,26 +1404,26 @@ FUNNYUVCODE
# endif
}
static void RENAME ( SwScale_YV12slice ) ( unsigned char * srcptr [ ] , int stride [ ] , int y , int h ,
uint8_t * dstptr [ ] , int dststride , int dstw , int dstbpp ,
unsigned int s_xinc , unsigned int s_yinc ) {
static void RENAME ( SwScale_YV12slice ) ( unsigned char * srcptr [ ] , int stride [ ] , int srcSliceY ,
int srcSliceH , uint8_t * dstptr [ ] , int dststride , int dstbpp ,
int srcW , int srcH , int dstW , int dstH ) {
// scaling factors:
//static int s_yinc=(vo_dga_src_height<<16)/vo_dga_vp_height;
//static int s_xinc=(vo_dga_src_width<<8)/vo_dga_vp_width;
unsigned int s_xinc2 ;
//FIXME do we need th +-2 stuff?
unsigned int s_xinc = ( srcW < < 16 ) / dstW - 2 ;
unsigned int s_yinc = ( srcH < < 16 ) / dstH + 2 ;
static int s_srcypos ; // points to the dst Pixels center in the source (0 is the center of pixel 0,0 in src)
static int s_ypos ;
static int lumDstYInSrc ; // points to the dst Pixels center in the source (0 is the center of pixel 0,0 in src)
static int dstY ;
// last horzontally interpolated lines, used to avoid unnecessary calculations
static int s_last_ypos ;
static int s_last_y1pos ;
static int lastLumSrcY ;
static int lastChrSrcY ;
# ifdef HAVE_MMX2
// used to detect a horizontal size change
static int old_dstw = - 1 ;
static int old_dstW = - 1 ;
static int old_s_xinc = - 1 ;
# endif
@ -1431,13 +1431,13 @@ int srcWidth;
int dstUVw ;
int i ;
if ( ( ( dstw + 7 ) & ( ~ 7 ) ) > = dststride ) dstw & = ~ 7 ;
if ( ( ( dstW + 7 ) & ( ~ 7 ) ) > = dststride ) dstW & = ~ 7 ;
srcWidth = ( dstw * s_xinc + 0x8000 ) > > 16 ;
dstUVw = fullUVIpol ? dstw : dstw / 2 ;
srcWidth = ( dstW * s_xinc + 0x8000 ) > > 16 ;
dstUVw = fullUVIpol ? dstW : dstW / 2 ;
# ifdef HAVE_MMX2
canMMX2BeUsed = ( s_xinc < = 0x10000 & & ( dstw & 31 ) = = 0 & & ( srcWidth & 15 ) = = 0 ) ? 1 : 0 ;
canMMX2BeUsed = ( s_xinc < = 0x10000 & & ( dstW & 31 ) = = 0 & & ( srcWidth & 15 ) = = 0 ) ? 1 : 0 ;
# endif
// match pixel 0 of the src to pixel 0 of dst and match pixel n-2 of src to pixel n-2 of dst
@ -1446,21 +1446,21 @@ canMMX2BeUsed= (s_xinc <= 0x10000 && (dstw&31)==0 && (srcWidth&15)==0) ? 1 : 0;
// would be like the vertical one, but that would require some special code for the
// first and last pixel
if ( canMMX2BeUsed ) s_xinc + = 20 ;
else s_xinc = ( ( srcWidth - 2 ) < < 16 ) / ( dstw - 2 ) - 20 ;
else s_xinc = ( ( srcWidth - 2 ) < < 16 ) / ( dstW - 2 ) - 20 ;
if ( fullUVIpol & & ! ( dstbpp = = 12 ) ) s_xinc2 = s_xinc > > 1 ;
else s_xinc2 = s_xinc ;
// force calculation of the horizontal interpolation of the first line
if ( y = = 0 ) {
// printf("dstw %d, srcw %d, mmx2 %d\n", dstw , srcWidth, canMMX2BeUsed);
s_last_ypos = - 99 ;
s_last_y1pos = - 99 ;
s_srcypos = s_yinc / 2 - 0x8000 ;
s_ypos = 0 ;
if ( srcSliceY = = 0 ) {
// printf("dstW %d, srcw %d, mmx2 %d\n", dstW , srcWidth, canMMX2BeUsed);
lastLumSrcY = - 99 ;
lastChrSrcY = - 99 ;
lumDstYInSrc = s_yinc / 2 - 0x8000 ;
dstY = 0 ;
// clean the buffers so that no green stuff is drawen if the width is not sane (%8=0)
for ( i = dstw - 2 ; i < dstw + 20 ; i + + )
for ( i = dstW - 2 ; i < dstW + 20 ; i + + )
{
pix_buf_uv [ 0 ] [ i ] = pix_buf_uv [ 1 ] [ i ]
= pix_buf_uv [ 0 ] [ 2048 + i ] = pix_buf_uv [ 1 ] [ 2048 + i ] = 128 * 128 ;
@ -1471,7 +1471,7 @@ else s_xinc2= s_xinc;
# ifdef HAVE_MMX2
// cant downscale !!!
if ( ( old_s_xinc ! = s_xinc | | old_dstw ! = dstw ) & & canMMX2BeUsed )
if ( ( old_s_xinc ! = s_xinc | | old_dstW ! = dstW ) & & canMMX2BeUsed )
{
uint8_t * fragment ;
int imm8OfPShufW1 ;
@ -1481,7 +1481,7 @@ else s_xinc2= s_xinc;
int xpos , i ;
old_s_xinc = s_xinc ;
old_dstw = dstw ;
old_dstW = dstW ;
// create an optimized horizontal scaling routine
@ -1533,10 +1533,10 @@ else s_xinc2= s_xinc;
/* choose xinc so that all 8 parts fit exactly
Note : we cannot use just 1 part because it would not fit in the code cache */
// s_xinc2_diff= -((((s_xinc2*(dstw/8))&0xFFFF))/(dstw /8))-10;
// s_xinc_diff= -((((s_xinc*(dstw/8))&0xFFFF))/(dstw /8));
// s_xinc2_diff= -((((s_xinc2*(dstW/8))&0xFFFF))/(dstW /8))-10;
// s_xinc_diff= -((((s_xinc*(dstW/8))&0xFFFF))/(dstW /8));
# ifdef ALT_ERROR
// s_xinc2_diff+= ((0x10000/(dstw /8)));
// s_xinc2_diff+= ((0x10000/(dstW /8)));
# endif
// s_xinc_diff= s_xinc2_diff*2;
@ -1545,7 +1545,7 @@ else s_xinc2= s_xinc;
// old_s_xinc= s_xinc;
for ( i = 0 ; i < dstw / 8 ; i + + )
for ( i = 0 ; i < dstW / 8 ; i + + )
{
int xx = xpos > > 16 ;
@ -1604,96 +1604,99 @@ else s_xinc2= s_xinc;
} // reset counters
while ( 1 ) {
unsigned char * dest = dstptr [ 0 ] + dststride * s_ypos ;
unsigned char * uDest = dstptr [ 1 ] + ( dststride > > 1 ) * ( s_ypos > > 1 ) ;
unsigned char * vDest = dstptr [ 2 ] + ( dststride > > 1 ) * ( s_ypos > > 1 ) ;
unsigned char * dest = dstptr [ 0 ] + dststride * dstY ;
unsigned char * uDest = dstptr [ 1 ] + ( dststride > > 1 ) * ( dstY > > 1 ) ;
unsigned char * vDest = dstptr [ 2 ] + ( dststride > > 1 ) * ( dstY > > 1 ) ;
int y0 = ( s_srcypos + 0xFFFF ) > > 16 ; // first luminance source line number below the dst line
int lumSrcY = ( lumDstYInSrc + 0xFFFF ) > > 16 ; // first luminance source line number below the dst line
// points to the dst Pixels center in the source (0 is the center of pixel 0,0 in src)
int srcuvpos = dstbpp = = 12 ? s_srcypos + s_yinc / 2 - 0x8000 :
s_srcypos - 0x8000 ;
int y1 = ( srcuvpos + 0x1FFFF ) > > 17 ; // first chrominance source line number below the dst line
int yalpha = ( ( s_srcypos - 1 ) & 0xFFFF ) > > 4 ;
int uvalpha = ( ( srcuvpos - 1 ) & 0x1FFFF ) > > 5 ;
uint16_t * buf0 = pix_buf_y [ y0 & 1 ] ; // top line of the interpolated slice
uint16_t * buf1 = pix_buf_y [ ( ( y0 + 1 ) & 1 ) ] ; // bottom line of the interpolated slice
uint16_t * uvbuf0 = pix_buf_uv [ y1 & 1 ] ; // top line of the interpolated slice
uint16_t * uvbuf1 = pix_buf_uv [ ( y1 + 1 ) & 1 ] ; // bottom line of the interpolated slice
int chrD stYInS rc= dstbpp = = 12 ? lumDstYInSrc + s_yinc / 2 - 0x8000 :
lumDstYInSrc - 0x8000 ;
int chrSrcY = ( chrD stYInS rc + 0x1FFFF ) > > 17 ; // first chrominance source line number below the dst line
int yalpha = ( ( lumDstYInSrc - 1 ) & 0xFFFF ) > > 4 ;
int uvalpha = ( ( chrD stYInS rc- 1 ) & 0x1FFFF ) > > 5 ;
uint16_t * buf0 = pix_buf_y [ lumSrcY & 1 ] ; // top line of the interpolated slice
uint16_t * buf1 = pix_buf_y [ ( lumSrcY + 1 ) & 1 ] ; // bottom line of the interpolated slice
uint16_t * uvbuf0 = pix_buf_uv [ chrSrcY & 1 ] ; // top line of the interpolated slice
uint16_t * uvbuf1 = pix_buf_uv [ ( chrSrcY + 1 ) & 1 ] ; // bottom line of the interpolated slice
if ( y0 > = y + h ) break ; // FIXME wrong, skips last lines, but they are dupliactes anyway
// if(lumSrcY>=srcSliceY + srcSliceH) break; // wrong, skips last lines, but they are dupliactes anyway
if ( dstY > = dstH ) break ;
if ( ( y0 & 1 ) & & dstbpp = = 12 ) uvalpha = - 1 ; // there is no alpha if there is no line
// printf("lumSrcY:%d, dstY:%d, yalpha:%d\n", lumSrcY, dstY, yalpha*100/0x1000);
s_ypos + + ; s_srcypos + = s_yinc ;
if ( ( dstY & 1 ) & & dstbpp = = 12 ) uvalpha = - 1 ;
dstY + + ; lumDstYInSrc + = s_yinc ;
//only interpolate the src line horizontally if we didnt do it allready
if ( s_last_ypos ! = y0 )
if ( lastLumSrcY ! = lumSrcY )
{
unsigned char * src ;
// skip if first line has been horiz scaled alleady
if ( s_last_ypos ! = y0 - 1 )
if ( lastLumSrcY ! = lumSrcY - 1 )
{
// check if first line is before any available src lines
if ( y0 - 1 < y ) src = srcptr [ 0 ] + ( 0 ) * stride [ 0 ] ;
else src = srcptr [ 0 ] + ( y0 - y - 1 ) * stride [ 0 ] ;
if ( lumSrcY - 1 < srcSliceY ) src = srcptr [ 0 ] + ( 0 ) * stride [ 0 ] ;
else src = srcptr [ 0 ] + ( lumSrcY - srcSliceY - 1 ) * stride [ 0 ] ;
RENAME ( hyscale ) ( buf0 , dstw , src , srcWidth , s_xinc ) ;
RENAME ( hyscale ) ( buf0 , dstW , src , srcWidth , s_xinc ) ;
}
// check if second line is after any available src lines
if ( y0 - y > = h ) src = srcptr [ 0 ] + ( h - 1 ) * stride [ 0 ] ;
else src = srcptr [ 0 ] + ( y0 - y ) * stride [ 0 ] ;
if ( lumSrcY - srcSliceY > = srcSliceH ) src = srcptr [ 0 ] + ( srcSliceH - 1 ) * stride [ 0 ] ;
else src = srcptr [ 0 ] + ( lumSrcY - srcSliceY ) * stride [ 0 ] ;
// the min() is required to avoid reuseing lines which where not available
s_last_ypos = MIN ( y0 , y + h - 1 ) ;
RENAME ( hyscale ) ( buf1 , dstw , src , srcWidth , s_xinc ) ;
lastLumSrcY = MIN ( lumSrcY , srcSliceY + srcSliceH - 1 ) ;
RENAME ( hyscale ) ( buf1 , dstW , src , srcWidth , s_xinc ) ;
}
// printf("%d %d %d %d\n", y, y1, s_last_y1pos , h);
// printf("%d %d %d %d\n", y, chrSrcY, lastChrSrcY , h);
// *** horizontal scale U and V lines to temp buffer
if ( s_last_y1pos ! = y1 )
if ( lastChrSrcY ! = chrSrcY )
{
uint8_t * src1 , * src2 ;
// skip if first line has been horiz scaled alleady
if ( s_last_y1pos ! = y1 - 1 )
if ( lastChrSrcY ! = chrSrcY - 1 )
{
// check if first line is before any available src lines
if ( y1 - y / 2 - 1 < 0 )
if ( chrSrcY - srcSliceY / 2 - 1 < 0 )
{
src1 = srcptr [ 1 ] + ( 0 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( 0 ) * stride [ 2 ] ;
} else {
src1 = srcptr [ 1 ] + ( y1 - y / 2 - 1 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( y1 - y / 2 - 1 ) * stride [ 2 ] ;
src1 = srcptr [ 1 ] + ( chrSrcY - srcSliceY / 2 - 1 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( chrSrcY - srcSliceY / 2 - 1 ) * stride [ 2 ] ;
}
RENAME ( hcscale ) ( uvbuf0 , dstUVw , src1 , src2 , srcWidth , s_xinc2 ) ;
}
// check if second line is after any available src lines
if ( y1 - y / 2 > = h / 2 )
if ( chrSrcY - srcSliceY / 2 > = srcSliceH / 2 )
{
src1 = srcptr [ 1 ] + ( h / 2 - 1 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( h / 2 - 1 ) * stride [ 2 ] ;
src1 = srcptr [ 1 ] + ( srcSliceH / 2 - 1 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( srcSliceH / 2 - 1 ) * stride [ 2 ] ;
} else {
src1 = srcptr [ 1 ] + ( y1 - y / 2 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( y1 - y / 2 ) * stride [ 2 ] ;
src1 = srcptr [ 1 ] + ( chrSrcY - srcSliceY / 2 ) * stride [ 1 ] ;
src2 = srcptr [ 2 ] + ( chrSrcY - srcSliceY / 2 ) * stride [ 2 ] ;
}
RENAME ( hcscale ) ( uvbuf1 , dstUVw , src1 , src2 , srcWidth , s_xinc2 ) ;
// the min() is required to avoid reuseing lines which where not available
s_last_y1pos = MIN ( y1 , y / 2 + h / 2 - 1 ) ;
lastChrSrcY = MIN ( chrSrcY , srcSliceY / 2 + srcSliceH / 2 - 1 ) ;
}
# ifdef HAVE_MMX
b5Dither = dither8 [ s_ypos & 1 ] ;
g6Dither = dither4 [ s_ypos & 1 ] ;
g5Dither = dither8 [ s_ypos & 1 ] ;
r5Dither = dither8 [ ( s_ypos + 1 ) & 1 ] ;
b5Dither = dither8 [ dstY & 1 ] ;
g6Dither = dither4 [ dstY & 1 ] ;
g5Dither = dither8 [ dstY & 1 ] ;
r5Dither = dither8 [ ( dstY + 1 ) & 1 ] ;
# endif
if ( dstbpp = = 12 ) //YV12
RENAME ( yuv2yuv ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , uDest , vDest , dstw , yalpha , uvalpha ) ;
RENAME ( yuv2yuv ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , uDest , vDest , dstW , yalpha , uvalpha ) ;
else if ( ABS ( s_yinc - 0x10000 ) < 10 )
RENAME ( yuv2rgb1 ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstw , yalpha , uvalpha , dstbpp ) ;
RENAME ( yuv2rgb1 ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstW , yalpha , uvalpha , dstbpp ) ;
else
RENAME ( yuv2rgbX ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstw , yalpha , uvalpha , dstbpp ) ;
RENAME ( yuv2rgbX ) ( buf0 , buf1 , uvbuf0 , uvbuf1 , dest , dstW , yalpha , uvalpha , dstbpp ) ;
}
# ifdef HAVE_MMX