Commit 07b5e4c8 authored by michael's avatar michael

swscaler cleanup

green line at bottom bugfix
green lines in yuv2yuv scaler bugfix


git-svn-id: file:///var/local/repositories/mplayer/trunk/postproc@3210 b3059339-0415-0410-9bf9-f77b7e298cf2
parent e3511d1a
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <inttypes.h> #include <inttypes.h>
#include <string.h> #include <string.h>
//#include <stdio.h> //FOR DEBUG ONLY
#include "../config.h" #include "../config.h"
#include "swscale.h" #include "swscale.h"
#include "../cpudetect.h" #include "../cpudetect.h"
...@@ -222,39 +223,34 @@ void in_asm_used_var_warning_killer() ...@@ -222,39 +223,34 @@ void in_asm_used_var_warning_killer()
// *** bilinear scaling and yuv->rgb or yuv->yuv conversion of yv12 slices: // *** bilinear scaling and yuv->rgb or yuv->yuv conversion of yv12 slices:
// *** Note: it's called multiple times while decoding a frame, first time y==0 // *** Note: it's called multiple times while decoding a frame, first time y==0
// *** Designed to upscale, but may work for downscale too. // *** Designed to upscale, but may work for downscale too.
// s_xinc = (src_width << 16) / dst_width
// s_yinc = (src_height << 16) / dst_height
// switching the cpu type during a sliced drawing can have bad effects, like sig11 // switching the cpu type during a sliced drawing can have bad effects, like sig11
void SwScale_YV12slice(unsigned char* srcptr[],int stride[], int y, int h, void SwScale_YV12slice(unsigned char* srcptr[],int stride[], int srcSliceY ,
uint8_t* dstptr[], int dststride, int dstw, int dstbpp, int srcSliceH, uint8_t* dstptr[], int dststride, int dstbpp,
unsigned int s_xinc,unsigned int s_yinc){ 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;
#ifdef RUNTIME_CPUDETECT #ifdef RUNTIME_CPUDETECT
#ifdef CAN_COMPILE_X86_ASM #ifdef CAN_COMPILE_X86_ASM
// ordered per speed fasterst first // ordered per speed fasterst first
if(gCpuCaps.hasMMX2) if(gCpuCaps.hasMMX2)
SwScale_YV12slice_MMX2(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_MMX2(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
else if(gCpuCaps.has3DNow) else if(gCpuCaps.has3DNow)
SwScale_YV12slice_3DNow(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_3DNow(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
else if(gCpuCaps.hasMMX) else if(gCpuCaps.hasMMX)
SwScale_YV12slice_MMX(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_MMX(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
else else
SwScale_YV12slice_C(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_C(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#else #else
SwScale_YV12slice_C(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_C(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#endif #endif
#else //RUNTIME_CPUDETECT #else //RUNTIME_CPUDETECT
#ifdef HAVE_MMX2 #ifdef HAVE_MMX2
SwScale_YV12slice_MMX2(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_MMX2(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#elif defined (HAVE_3DNOW) #elif defined (HAVE_3DNOW)
SwScale_YV12slice_3DNow(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_3DNow(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#elif defined (HAVE_MMX) #elif defined (HAVE_MMX)
SwScale_YV12slice_MMX(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_MMX(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#else #else
SwScale_YV12slice_C(srcptr, stride, y, h, dstptr, dststride, dstw, dstbpp, s_xinc, s_yinc); SwScale_YV12slice_C(srcptr, stride, srcSliceY, srcSliceH, dstptr, dststride, dstbpp, srcW, srcH, dstW, dstH);
#endif #endif
#endif //!RUNTIME_CPUDETECT #endif //!RUNTIME_CPUDETECT
......
...@@ -2,12 +2,9 @@ ...@@ -2,12 +2,9 @@
// *** bilinear scaling and yuv->rgb & yuv->yuv conversion of yv12 slices: // *** bilinear scaling and yuv->rgb & yuv->yuv conversion of yv12 slices:
// *** Note: it's called multiple times while decoding a frame, first time y==0 // *** Note: it's called multiple times while decoding a frame, first time y==0
// *** Designed to upscale, but may work for downscale too. // *** Designed to upscale, but may work for downscale too.
// s_xinc = (src_width << 8) / dst_width
// s_yinc = (src_height << 16) / dst_height
// dstbpp == 12 -> yv12 output // dstbpp == 12 -> yv12 output
void SwScale_YV12slice(unsigned char* srcptr[],int stride[], int y, int h, void SwScale_YV12slice(unsigned char* srcptr[],int stride[], int srcSliceY,
uint8_t* dstptr[], int dststride, int dstw, int dstbpp, int srcSliceH, uint8_t* dstptr[], int dststride, int dstbpp,
unsigned int s_xinc,unsigned int s_yinc); int srcW, int srcH, int dstW, int dstH);
// generating tables // generating tables
void SwScale_Init(); void SwScale_Init();
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment