Mercurial > mplayer.hg
changeset 9975:3914afe5c0a7
removing sws - global verbose var dependancy
removing sws - cpudetect dependancy (note rgb2rgb still needs it)
moving mplayer specific stuff from swscale.c -> vf_scale.c
author | michael |
---|---|
date | Thu, 24 Apr 2003 17:04:20 +0000 |
parents | a19da4c57b67 |
children | 5843993013a8 |
files | libmpcodecs/vf_sab.c libmpcodecs/vf_scale.c libmpcodecs/vf_smartblur.c postproc/swscale-example.c postproc/swscale.c postproc/swscale.h |
diffstat | 6 files changed, 213 insertions(+), 221 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vf_sab.c Thu Apr 24 08:20:10 2003 +0000 +++ b/libmpcodecs/vf_sab.c Thu Apr 24 17:04:20 2003 +0000 @@ -99,7 +99,7 @@ swsF.lumH= swsF.lumV= vec; swsF.chrH= swsF.chrV= NULL; f->preFilterContext= sws_getContext( - width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, 0, &swsF, NULL); + width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, get_sws_cpuflags(), &swsF, NULL); sws_freeVec(vec); vec = sws_getGaussianVec(f->strength, 5.0);
--- a/libmpcodecs/vf_scale.c Thu Apr 24 08:20:10 2003 +0000 +++ b/libmpcodecs/vf_scale.c Thu Apr 24 17:04:20 2003 +0000 @@ -5,6 +5,7 @@ #include "../config.h" #include "../mp_msg.h" +#include "../cpudetect.h" #include "img_format.h" #include "mp_image.h" @@ -169,7 +170,7 @@ outfmt, vf->priv->w,vf->priv->h, best, - int_sws_flags, srcFilter, dstFilter); + int_sws_flags | get_sws_cpuflags(), srcFilter, dstFilter); if(!vf->priv->ctx){ // error... mp_msg(MSGT_VFILTER,MSGL_WARN,"Couldn't init SwScaler for this setup\n"); @@ -379,6 +380,155 @@ return 1; } +//global sws_flags from the command line +int sws_flags=2; + +//global srcFilter +SwsFilter src_filter= {NULL, NULL, NULL, NULL}; + +float sws_lum_gblur= 0.0; +float sws_chr_gblur= 0.0; +int sws_chr_vshift= 0; +int sws_chr_hshift= 0; +float sws_chr_sharpen= 0.0; +float sws_lum_sharpen= 0.0; + +int get_sws_cpuflags(){ + return + (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) + | (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) + | (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0); +} + +// old global scaler, dont use for new code +// will use sws_flags from the command line +void SwScale_YV12slice(unsigned char* src[], int srcStride[], int srcSliceY , + int srcSliceH, uint8_t* dst[], int dstStride, int dstbpp, + int srcW, int srcH, int dstW, int dstH){ + + static struct SwsContext *context=NULL; + int dstFormat; + int dstStride3[3]= {dstStride, dstStride>>1, dstStride>>1}; + + switch(dstbpp) + { + case 8 : dstFormat= IMGFMT_Y8; break; + case 12: dstFormat= IMGFMT_YV12; break; + case 15: dstFormat= IMGFMT_BGR15; break; + case 16: dstFormat= IMGFMT_BGR16; break; + case 24: dstFormat= IMGFMT_BGR24; break; + case 32: dstFormat= IMGFMT_BGR32; break; + default: return; + } + + if(!context) context=sws_getContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat); + + sws_scale(context, src, srcStride, srcSliceY, srcSliceH, dst, dstStride3); +} + +void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) +{ + static int firstTime=1; + *flags=0; + +#ifdef ARCH_X86 + if(gCpuCaps.hasMMX) + asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions) +#endif + if(firstTime) + { + firstTime=0; + *flags= SWS_PRINT_INFO; + } + else if(verbose>1) *flags= SWS_PRINT_INFO; + + if(src_filter.lumH) sws_freeVec(src_filter.lumH); + if(src_filter.lumV) sws_freeVec(src_filter.lumV); + if(src_filter.chrH) sws_freeVec(src_filter.chrH); + if(src_filter.chrV) sws_freeVec(src_filter.chrV); + + if(sws_lum_gblur!=0.0){ + src_filter.lumH= sws_getGaussianVec(sws_lum_gblur, 3.0); + src_filter.lumV= sws_getGaussianVec(sws_lum_gblur, 3.0); + }else{ + src_filter.lumH= sws_getIdentityVec(); + src_filter.lumV= sws_getIdentityVec(); + } + + if(sws_chr_gblur!=0.0){ + src_filter.chrH= sws_getGaussianVec(sws_chr_gblur, 3.0); + src_filter.chrV= sws_getGaussianVec(sws_chr_gblur, 3.0); + }else{ + src_filter.chrH= sws_getIdentityVec(); + src_filter.chrV= sws_getIdentityVec(); + } + + if(sws_chr_sharpen!=0.0){ + SwsVector *g= sws_getConstVec(-1.0, 3); + SwsVector *id= sws_getConstVec(10.0/sws_chr_sharpen, 1); + g->coeff[1]=2.0; + sws_addVec(id, g); + sws_convVec(src_filter.chrH, id); + sws_convVec(src_filter.chrV, id); + sws_freeVec(g); + sws_freeVec(id); + } + + if(sws_lum_sharpen!=0.0){ + SwsVector *g= sws_getConstVec(-1.0, 3); + SwsVector *id= sws_getConstVec(10.0/sws_lum_sharpen, 1); + g->coeff[1]=2.0; + sws_addVec(id, g); + sws_convVec(src_filter.lumH, id); + sws_convVec(src_filter.lumV, id); + sws_freeVec(g); + sws_freeVec(id); + } + + if(sws_chr_hshift) + sws_shiftVec(src_filter.chrH, sws_chr_hshift); + + if(sws_chr_vshift) + sws_shiftVec(src_filter.chrV, sws_chr_vshift); + + sws_normalizeVec(src_filter.chrH, 1.0); + sws_normalizeVec(src_filter.chrV, 1.0); + sws_normalizeVec(src_filter.lumH, 1.0); + sws_normalizeVec(src_filter.lumV, 1.0); + + if(verbose > 1) sws_printVec(src_filter.chrH); + if(verbose > 1) sws_printVec(src_filter.lumH); + + switch(sws_flags) + { + case 0: *flags|= SWS_FAST_BILINEAR; break; + case 1: *flags|= SWS_BILINEAR; break; + case 2: *flags|= SWS_BICUBIC; break; + case 3: *flags|= SWS_X; break; + case 4: *flags|= SWS_POINT; break; + case 5: *flags|= SWS_AREA; break; + case 6: *flags|= SWS_BICUBLIN; break; + case 7: *flags|= SWS_GAUSS; break; + case 8: *flags|= SWS_SINC; break; + case 9: *flags|= SWS_LANCZOS; break; + case 10:*flags|= SWS_SPLINE; break; + default:*flags|= SWS_BILINEAR; break; + } + + *srcFilterParam= &src_filter; + *dstFilterParam= NULL; +} + +// will use sws_flags & src_filter (from cmd line) +struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) +{ + int flags; + SwsFilter *dstFilterParam, *srcFilterParam; + sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); + + return sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam); +} + /// An example of presets usage static struct size_preset { char* name;
--- a/libmpcodecs/vf_smartblur.c Thu Apr 24 08:20:10 2003 +0000 +++ b/libmpcodecs/vf_smartblur.c Thu Apr 24 17:04:20 2003 +0000 @@ -94,7 +94,7 @@ swsF.lumH= swsF.lumV= vec; swsF.chrH= swsF.chrV= NULL; f->filterContext= sws_getContext( - width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, 0, &swsF, NULL); + width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, get_sws_cpuflags(), &swsF, NULL); sws_freeVec(vec);
--- a/postproc/swscale-example.c Thu Apr 24 08:20:10 2003 +0000 +++ b/postproc/swscale-example.c Thu Apr 24 17:04:20 2003 +0000 @@ -24,7 +24,6 @@ #include "swscale.h" #include "../libvo/img_format.h" -#include "../cpudetect.h" static int testFormat[]={ IMGFMT_YVU9, @@ -142,7 +141,6 @@ va_end(va); } -int verbose=0; //FIXME void fast_memcpy(void *a, void *b, int s){ //FIXME memcpy(a, b, s); } @@ -188,7 +186,6 @@ int stride[3]={W, W, W}; int x, y; struct SwsContext *sws; - GetCpuCaps(&gCpuCaps); sws= sws_getContext(W/12, H/12, IMGFMT_BGR32, W, H, IMGFMT_YV12, 2, NULL, NULL); @@ -201,4 +198,6 @@ sws_scale(sws, rgb_src, rgb_stride, 0, H , src, stride); asm volatile ("emms\n\t"); selfTest(src, stride, W, H); + + return 123; }
--- a/postproc/swscale.c Thu Apr 24 08:20:10 2003 +0000 +++ b/postproc/swscale.c Thu Apr 24 17:04:20 2003 +0000 @@ -132,7 +132,6 @@ #define RV ((int)( 0.439*(1<<RGB2YUV_SHIFT)+0.5)) #define RU ((int)(-0.148*(1<<RGB2YUV_SHIFT)+0.5)) -extern int verbose; // defined in mplayer.c extern const int32_t Inverse_Table_6_9[8][4]; /* @@ -155,10 +154,6 @@ #define MAX(a,b) ((a) < (b) ? (b) : (a)) #ifdef ARCH_X86 -#define CAN_COMPILE_X86_ASM -#endif - -#ifdef CAN_COMPILE_X86_ASM static uint64_t __attribute__((aligned(8))) bF8= 0xF8F8F8F8F8F8F8F8LL; static uint64_t __attribute__((aligned(8))) bFC= 0xFCFCFCFCFCFCFCFCLL; static uint64_t __attribute__((aligned(8))) w10= 0x0010001000100010LL; @@ -209,26 +204,6 @@ // clipping helper table for C implementations: static unsigned char clip_table[768]; -//global sws_flags from the command line -int sws_flags=2; - -//global srcFilter -SwsFilter src_filter= {NULL, NULL, NULL, NULL}; - -float sws_lum_gblur= 0.0; -float sws_chr_gblur= 0.0; -int sws_chr_vshift= 0; -int sws_chr_hshift= 0; -float sws_chr_sharpen= 0.0; -float sws_lum_sharpen= 0.0; - -/* cpuCaps combined from cpudetect and whats actually compiled in - (if there is no support for something compiled in it wont appear here) */ -static CpuCaps cpuCaps; - -int (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, - int srcSliceH, uint8_t* dst[], int dstStride[])=NULL; - static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b); extern const uint8_t dither_2x2_4[2][8]; @@ -237,7 +212,7 @@ extern const uint8_t dither_8x8_73[8][8]; extern const uint8_t dither_8x8_220[8][8]; -#ifdef CAN_COMPILE_X86_ASM +#ifdef ARCH_X86 void in_asm_used_var_warning_killer() { volatile int i= bF8+bFC+w10+ @@ -690,7 +665,7 @@ #define COMPILE_C #endif -#ifdef CAN_COMPILE_X86_ASM +#ifdef ARCH_X86 #if (defined (HAVE_MMX) && !defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT) #define COMPILE_MMX @@ -703,7 +678,7 @@ #if (defined (HAVE_3DNOW) && !defined (HAVE_MMX2)) || defined (RUNTIME_CPUDETECT) #define COMPILE_3DNOW #endif -#endif //CAN_COMPILE_X86_ASM +#endif //ARCH_X86 #undef HAVE_MMX #undef HAVE_MMX2 @@ -717,7 +692,7 @@ #include "swscale_template.c" #endif -#ifdef CAN_COMPILE_X86_ASM +#ifdef ARCH_X86 //X86 versions /* @@ -759,140 +734,10 @@ #include "swscale_template.c" #endif -#endif //CAN_COMPILE_X86_ASM +#endif //ARCH_X86 // minor note: the HAVE_xyz is messed up after that line so dont use it - -// old global scaler, dont use for new code -// will use sws_flags from the command line -void SwScale_YV12slice(unsigned char* src[], int srcStride[], int srcSliceY , - int srcSliceH, uint8_t* dst[], int dstStride, int dstbpp, - int srcW, int srcH, int dstW, int dstH){ - - static SwsContext *context=NULL; - int dstFormat; - int dstStride3[3]= {dstStride, dstStride>>1, dstStride>>1}; - - switch(dstbpp) - { - case 8 : dstFormat= IMGFMT_Y8; break; - case 12: dstFormat= IMGFMT_YV12; break; - case 15: dstFormat= IMGFMT_BGR15; break; - case 16: dstFormat= IMGFMT_BGR16; break; - case 24: dstFormat= IMGFMT_BGR24; break; - case 32: dstFormat= IMGFMT_BGR32; break; - default: return; - } - - if(!context) context=sws_getContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat); - - context->swScale(context, src, srcStride, srcSliceY, srcSliceH, dst, dstStride3); -} - -void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) -{ - static int firstTime=1; - *flags=0; - -#ifdef ARCH_X86 - if(gCpuCaps.hasMMX) - asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions) -#endif - if(firstTime) - { - firstTime=0; - *flags= SWS_PRINT_INFO; - } - else if(verbose>1) *flags= SWS_PRINT_INFO; - - if(src_filter.lumH) sws_freeVec(src_filter.lumH); - if(src_filter.lumV) sws_freeVec(src_filter.lumV); - if(src_filter.chrH) sws_freeVec(src_filter.chrH); - if(src_filter.chrV) sws_freeVec(src_filter.chrV); - - if(sws_lum_gblur!=0.0){ - src_filter.lumH= sws_getGaussianVec(sws_lum_gblur, 3.0); - src_filter.lumV= sws_getGaussianVec(sws_lum_gblur, 3.0); - }else{ - src_filter.lumH= sws_getIdentityVec(); - src_filter.lumV= sws_getIdentityVec(); - } - - if(sws_chr_gblur!=0.0){ - src_filter.chrH= sws_getGaussianVec(sws_chr_gblur, 3.0); - src_filter.chrV= sws_getGaussianVec(sws_chr_gblur, 3.0); - }else{ - src_filter.chrH= sws_getIdentityVec(); - src_filter.chrV= sws_getIdentityVec(); - } - - if(sws_chr_sharpen!=0.0){ - SwsVector *g= sws_getConstVec(-1.0, 3); - SwsVector *id= sws_getConstVec(10.0/sws_chr_sharpen, 1); - g->coeff[1]=2.0; - sws_addVec(id, g); - sws_convVec(src_filter.chrH, id); - sws_convVec(src_filter.chrV, id); - sws_freeVec(g); - sws_freeVec(id); - } - - if(sws_lum_sharpen!=0.0){ - SwsVector *g= sws_getConstVec(-1.0, 3); - SwsVector *id= sws_getConstVec(10.0/sws_lum_sharpen, 1); - g->coeff[1]=2.0; - sws_addVec(id, g); - sws_convVec(src_filter.lumH, id); - sws_convVec(src_filter.lumV, id); - sws_freeVec(g); - sws_freeVec(id); - } - - if(sws_chr_hshift) - sws_shiftVec(src_filter.chrH, sws_chr_hshift); - - if(sws_chr_vshift) - sws_shiftVec(src_filter.chrV, sws_chr_vshift); - - sws_normalizeVec(src_filter.chrH, 1.0); - sws_normalizeVec(src_filter.chrV, 1.0); - sws_normalizeVec(src_filter.lumH, 1.0); - sws_normalizeVec(src_filter.lumV, 1.0); - - if(verbose > 1) sws_printVec(src_filter.chrH); - if(verbose > 1) sws_printVec(src_filter.lumH); - - switch(sws_flags) - { - case 0: *flags|= SWS_FAST_BILINEAR; break; - case 1: *flags|= SWS_BILINEAR; break; - case 2: *flags|= SWS_BICUBIC; break; - case 3: *flags|= SWS_X; break; - case 4: *flags|= SWS_POINT; break; - case 5: *flags|= SWS_AREA; break; - case 6: *flags|= SWS_BICUBLIN; break; - case 7: *flags|= SWS_GAUSS; break; - case 8: *flags|= SWS_SINC; break; - case 9: *flags|= SWS_LANCZOS; break; - case 10:*flags|= SWS_SPLINE; break; - default:*flags|= SWS_BILINEAR; break; - } - - *srcFilterParam= &src_filter; - *dstFilterParam= NULL; -} - -// will use sws_flags & src_filter (from cmd line) -SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) -{ - int flags; - SwsFilter *dstFilterParam, *srcFilterParam; - sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); - - return sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, srcFilterParam, dstFilterParam); -} - static double getSplineCoeff(double a, double b, double c, double d, double dist) { // printf("%f %f %f %f %f\n", a,b,c,d,dist); @@ -915,7 +760,7 @@ double *filter=NULL; double *filter2=NULL; #ifdef ARCH_X86 - if(gCpuCaps.hasMMX) + if(flags & SWS_CPU_CAPS_MMX) asm volatile("emms\n\t"::: "memory"); //FIXME this shouldnt be required but it IS (even for non mmx versions) #endif @@ -1438,38 +1283,34 @@ int c= MIN(MAX(i-256, 0), 255); clip_table[i]=c; } - -cpuCaps= gCpuCaps; +} +static SwsFunc getSwsFunc(int flags){ + #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#ifdef ARCH_X86 // ordered per speed fasterst first - if(gCpuCaps.hasMMX2) - swScale= swScale_MMX2; - else if(gCpuCaps.has3DNow) - swScale= swScale_3DNow; - else if(gCpuCaps.hasMMX) - swScale= swScale_MMX; + if(flags & SWS_CPU_CAPS_MMX2) + return swScale_MMX2; + else if(flags & SWS_CPU_CAPS_3DNOW) + return swScale_3DNow; + else if(flags & SWS_CPU_CAPS_MMX) + return swScale_MMX; else - swScale= swScale_C; + return swScale_C; #else - swScale= swScale_C; - cpuCaps.hasMMX2 = cpuCaps.hasMMX = cpuCaps.has3DNow = 0; + return swScale_C; #endif #else //RUNTIME_CPUDETECT #ifdef HAVE_MMX2 - swScale= swScale_MMX2; - cpuCaps.has3DNow = 0; + return swScale_MMX2; #elif defined (HAVE_3DNOW) - swScale= swScale_3DNow; - cpuCaps.hasMMX2 = 0; + return swScale_3DNow; #elif defined (HAVE_MMX) - swScale= swScale_MMX; - cpuCaps.hasMMX2 = cpuCaps.has3DNow = 0; + return swScale_MMX; #else - swScale= swScale_C; - cpuCaps.hasMMX2 = cpuCaps.hasMMX = cpuCaps.has3DNow = 0; + return swScale_C; #endif #endif //!RUNTIME_CPUDETECT } @@ -1856,10 +1697,21 @@ int srcFormat, dstFormat; SwsFilter dummyFilter= {NULL, NULL, NULL, NULL}; #ifdef ARCH_X86 - if(gCpuCaps.hasMMX) + if(flags & SWS_CPU_CAPS_MMX) asm volatile("emms\n\t"::: "memory"); #endif - if(swScale==NULL) globalInit(); + +#ifndef RUNTIME_CPUDETECT //ensure that the flags match the compiled variant if cpudetect is off + flags &= ~(SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2|SWS_CPU_CAPS_3DNOW); +#ifdef HAVE_MMX2 + flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_MMX2; +#elif defined (HAVE_3DNOW) + flags |= SWS_CPU_CAPS_MMX|SWS_CPU_CAPS_3DNOW; +#elif defined (HAVE_MMX) + flags |= SWS_CPU_CAPS_MMX; +#endif +#endif + if(clip_table[512] != 255) globalInit(); /* avoid dupplicate Formats, so we dont need to check to much */ srcFormat = remove_dup_fourcc(origSrcFormat); @@ -2003,7 +1855,7 @@ } } - if(cpuCaps.hasMMX2) + if(flags & SWS_CPU_CAPS_MMX2) { c->canMMX2BeUsed= (dstW >=srcW && (dstW&31)==0 && (srcW&15)==0) ? 1 : 0; if(!c->canMMX2BeUsed && dstW >=srcW && (srcW&15)==0 && (flags&SWS_FAST_BILINEAR)) @@ -2032,7 +1884,7 @@ c->chrXInc+= 20; } //we dont use the x86asm scaler if mmx is available - else if(cpuCaps.hasMMX) + else if(flags & SWS_CPU_CAPS_MMX) { c->lumXInc = ((srcW-2)<<16)/(dstW-2) - 20; c->chrXInc = ((c->chrSrcW-2)<<16)/(c->chrDstW-2) - 20; @@ -2041,7 +1893,7 @@ /* precalculate horizontal scaler filter coefficients */ { - const int filterAlign= cpuCaps.hasMMX ? 4 : 1; + const int filterAlign= (flags & SWS_CPU_CAPS_MMX) ? 4 : 1; initFilter(&c->hLumFilter, &c->hLumFilterPos, &c->hLumFilterSize, c->lumXInc, srcW , dstW, filterAlign, 1<<14, @@ -2148,19 +2000,19 @@ MSG_INFO("from %s to %s ", vo_format_name(srcFormat), vo_format_name(dstFormat)); - if(cpuCaps.hasMMX2) + if(flags & SWS_CPU_CAPS_MMX2) MSG_INFO("using MMX2\n"); - else if(cpuCaps.has3DNow) + else if(flags & SWS_CPU_CAPS_3DNOW) MSG_INFO("using 3DNOW\n"); - else if(cpuCaps.hasMMX) + else if(flags & SWS_CPU_CAPS_MMX) MSG_INFO("using MMX\n"); else MSG_INFO("using C\n"); } - if((flags & SWS_PRINT_INFO) && verbose>0) + if(flags & SWS_PRINT_INFO) { - if(cpuCaps.hasMMX) + if(flags & SWS_CPU_CAPS_MMX) { if(c->canMMX2BeUsed && (flags&SWS_FAST_BILINEAR)) MSG_V("SwScaler: using FAST_BILINEAR MMX2 scaler for horizontal scaling\n"); @@ -2195,34 +2047,34 @@ if(isPlanarYUV(dstFormat)) { if(c->vLumFilterSize==1) - MSG_V("SwScaler: using 1-tap %s \"scaler\" for vertical scaling (YV12 like)\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using 1-tap %s \"scaler\" for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); else - MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (YV12 like)\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (YV12 like)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); } else { if(c->vLumFilterSize==1 && c->vChrFilterSize==2) MSG_V("SwScaler: using 1-tap %s \"scaler\" for vertical luminance scaling (BGR)\n" - "SwScaler: 2-tap scaler for vertical chrominance scaling (BGR)\n",cpuCaps.hasMMX ? "MMX" : "C"); + "SwScaler: 2-tap scaler for vertical chrominance scaling (BGR)\n",(flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); else if(c->vLumFilterSize==2 && c->vChrFilterSize==2) - MSG_V("SwScaler: using 2-tap linear %s scaler for vertical scaling (BGR)\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using 2-tap linear %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); else - MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (BGR)\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using n-tap %s scaler for vertical scaling (BGR)\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); } if(dstFormat==IMGFMT_BGR24) MSG_V("SwScaler: using %s YV12->BGR24 Converter\n", - cpuCaps.hasMMX2 ? "MMX2" : (cpuCaps.hasMMX ? "MMX" : "C")); + (flags & SWS_CPU_CAPS_MMX2) ? "MMX2" : ((flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C")); else if(dstFormat==IMGFMT_BGR32) - MSG_V("SwScaler: using %s YV12->BGR32 Converter\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using %s YV12->BGR32 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); else if(dstFormat==IMGFMT_BGR16) - MSG_V("SwScaler: using %s YV12->BGR16 Converter\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using %s YV12->BGR16 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); else if(dstFormat==IMGFMT_BGR15) - MSG_V("SwScaler: using %s YV12->BGR15 Converter\n", cpuCaps.hasMMX ? "MMX" : "C"); + MSG_V("SwScaler: using %s YV12->BGR15 Converter\n", (flags & SWS_CPU_CAPS_MMX) ? "MMX" : "C"); MSG_V("SwScaler: %dx%d -> %dx%d\n", srcW, srcH, dstW, dstH); } - if((flags & SWS_PRINT_INFO) && verbose>1) + if(flags & SWS_PRINT_INFO) { MSG_DBG2("SwScaler:Lum srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n", c->srcW, c->srcH, c->dstW, c->dstH, c->lumXInc, c->lumYInc); @@ -2230,7 +2082,7 @@ c->chrSrcW, c->chrSrcH, c->chrDstW, c->chrDstH, c->chrXInc, c->chrYInc); } - c->swScale= swScale; + c->swScale= getSwsFunc(flags); return c; }
--- a/postproc/swscale.h Thu Apr 24 08:20:10 2003 +0000 +++ b/postproc/swscale.h Thu Apr 24 17:04:20 2003 +0000 @@ -57,6 +57,10 @@ #define SWS_FULL_CHR_H_INP 0x4000 #define SWS_DIRECT_BGR 0x8000 +#define SWS_CPU_CAPS_MMX 0x80000000 +#define SWS_CPU_CAPS_MMX2 0x20000000 +#define SWS_CPU_CAPS_3DNOW 0x40000000 + #define SWS_MAX_REDUCE_CUTOFF 0.002 #define SWS_CS_ITU709 1 @@ -86,20 +90,8 @@ struct SwsContext; -//typedef struct SwsContext; -// *** 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 -// dstbpp == 12 -> yv12 output -// will use sws_flags -// deprecated, will be removed -void SwScale_YV12slice(unsigned char* src[],int srcStride[], int srcSliceY, - int srcSliceH, uint8_t* dst[], int dstStride, int dstbpp, - int srcW, int srcH, int dstW, int dstH); - - void sws_freeContext(struct SwsContext *swsContext); -struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat); struct SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter); int sws_scale(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, @@ -107,7 +99,6 @@ int sws_scale_ordered(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]); -void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); //FIXME try to seperate this int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation); int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation);