# HG changeset patch # User michael # Date 1046037955 0 # Node ID 543ab3909b78c8559b35a4a42d0cc22b50136ad3 # Parent d1f82707ad788779bc1933475ae7aee6b394883b sws_ prefix, more seperation between internal & external swscaler API sws_scale() returns the number of outputed lines diff -r d1f82707ad78 -r 543ab3909b78 libmpcodecs/vf_sab.c --- a/libmpcodecs/vf_sab.c Sun Feb 23 20:48:13 2003 +0000 +++ b/libmpcodecs/vf_sab.c Sun Feb 23 22:05:55 2003 +0000 @@ -43,7 +43,7 @@ float preFilterRadius; float strength; float quality; - SwsContext *preFilterContext; + struct SwsContext *preFilterContext; uint8_t *preFilterBuf; int preFilterStride; int distWidth; @@ -95,14 +95,14 @@ f->preFilterBuf= (uint8_t*)memalign(8, stride*height); f->preFilterStride= stride; - vec = getGaussianVec(f->preFilterRadius, f->quality); + vec = sws_getGaussianVec(f->preFilterRadius, f->quality); swsF.lumH= swsF.lumV= vec; swsF.chrH= swsF.chrV= NULL; - f->preFilterContext= getSwsContext( + f->preFilterContext= sws_getContext( width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, 0, &swsF, NULL); - freeVec(vec); - vec = getGaussianVec(f->strength, 5.0); + sws_freeVec(vec); + vec = sws_getGaussianVec(f->strength, 5.0); for(i=0; i<512; i++){ double d; int index= i-256 + vec->length/2; @@ -112,8 +112,8 @@ f->colorDiffCoeff[i]= (int)(d/vec->coeff[vec->length/2]*(1<<12) + 0.5); } - freeVec(vec); - vec = getGaussianVec(f->radius, f->quality); + sws_freeVec(vec); + vec = sws_getGaussianVec(f->radius, f->quality); f->distWidth= vec->length; f->distStride= (vec->length+7)&~7; f->distCoeff= (int32_t*)memalign(8, f->distWidth*f->distStride*sizeof(int32_t)); @@ -127,7 +127,7 @@ // printf("%6d ", f->distCoeff[x + y*f->distStride]); } } - freeVec(vec); + sws_freeVec(vec); return 0; } @@ -147,7 +147,7 @@ } static void freeBuffers(FilterParam *f){ - if(f->preFilterContext) freeSwsContext(f->preFilterContext); + if(f->preFilterContext) sws_freeContext(f->preFilterContext); f->preFilterContext=NULL; if(f->preFilterBuf) free(f->preFilterBuf); @@ -176,7 +176,8 @@ int srcStrideArray[3]= {srcStride, 0, 0}; int dstStrideArray[3]= {f.preFilterStride, 0, 0}; - f.preFilterContext->swScale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); +// f.preFilterContext->swScale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); + sws_scale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); for(y=0; ypriv->w,vf->priv->h,vo_format_name(best)); // free old ctx: - if(vf->priv->ctx) freeSwsContext(vf->priv->ctx); + if(vf->priv->ctx) sws_freeContext(vf->priv->ctx); // new swscaler: - swsGetFlagsAndFilterFromCmdLine(&int_sws_flags, &srcFilter, &dstFilter); + sws_getFlagsAndFilterFromCmdLine(&int_sws_flags, &srcFilter, &dstFilter); int_sws_flags|= vf->priv->v_chr_drop << SWS_SRC_V_CHR_DROP_SHIFT; int_sws_flags|= vf->priv->param << SWS_PARAM_SHIFT; - vf->priv->ctx=getSwsContext(width,height, + vf->priv->ctx=sws_getContext(width,height, (outfmt==IMGFMT_I420 || outfmt==IMGFMT_IYUV)?IMGFMT_YV12:outfmt, vf->priv->w,vf->priv->h, (best==IMGFMT_I420 || best==IMGFMT_IYUV)?IMGFMT_YV12:best, @@ -218,7 +218,7 @@ return; } // printf("vf_scale::draw_slice() y=%d h=%d\n",y,h); - vf->priv->ctx->swScale(vf->priv->ctx,src,stride,y,h,dmpi->planes,dmpi->stride); + sws_scale(vf->priv->ctx,src,stride,y,h,dmpi->planes,dmpi->stride); } static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ @@ -233,7 +233,7 @@ dmpi=vf_get_image(vf->next,vf->priv->fmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, vf->priv->w, vf->priv->h); - vf->priv->ctx->swScale(vf->priv->ctx,mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride); + sws_scale(vf->priv->ctx,mpi->planes,mpi->stride,0,mpi->h,dmpi->planes,dmpi->stride); } diff -r d1f82707ad78 -r 543ab3909b78 libmpcodecs/vf_smartblur.c --- a/libmpcodecs/vf_smartblur.c Sun Feb 23 20:48:13 2003 +0000 +++ b/libmpcodecs/vf_smartblur.c Sun Feb 23 22:05:55 2003 +0000 @@ -46,7 +46,7 @@ float strength; int threshold; float quality; - SwsContext *filterContext; + struct SwsContext *filterContext; }FilterParam; struct vf_priv_s { @@ -88,15 +88,15 @@ SwsVector *vec; SwsFilter swsF; - vec = getGaussianVec(f->radius, f->quality); - scaleVec(vec, f->strength); + vec = sws_getGaussianVec(f->radius, f->quality); + sws_scaleVec(vec, f->strength); vec->coeff[vec->length/2]+= 1.0 - f->strength; swsF.lumH= swsF.lumV= vec; swsF.chrH= swsF.chrV= NULL; - f->filterContext= getSwsContext( + f->filterContext= sws_getContext( width, height, IMGFMT_Y8, width, height, IMGFMT_Y8, 0, &swsF, NULL); - freeVec(vec); + sws_freeVec(vec); return 0; } @@ -116,7 +116,7 @@ } static void freeBuffers(FilterParam *f){ - if(f->filterContext) freeSwsContext(f->filterContext); + if(f->filterContext) sws_freeContext(f->filterContext); f->filterContext=NULL; } @@ -138,7 +138,7 @@ int srcStrideArray[3]= {srcStride, 0, 0}; int dstStrideArray[3]= {dstStride, 0, 0}; - f.filterContext->swScale(f.filterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); + sws_scale(f.filterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); if(f.threshold > 0){ for(y=0; y>1; if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE(); - sws->swScale(sws,image,stride,y,h,dst,dstStride); + sws_scale(sws,image,stride,y,h,dst,dstStride); flip_trigger = 1; return 0; } @@ -423,7 +423,7 @@ else srcStride[0] = srcW*2; if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE(); - sws->swScale(sws,src,srcStride,0,srcH,dst,dstStride); + sws_scale(sws,src,srcStride,0,srcH,dst,dstStride); flip_trigger=1; } return 0; @@ -800,7 +800,7 @@ #endif ) { - sws = getSwsContextFromCmdLine(srcW,srcH,srcFourcc,dstW,dstH,dstFourcc); + sws = sws_getContextFromCmdLine(srcW,srcH,srcFourcc,dstW,dstH,dstFourcc); if(!sws) { printf("vo_vesa: Can't initialize SwScaler\n"); diff -r d1f82707ad78 -r 543ab3909b78 libvo/vo_x11.c --- a/libvo/vo_x11.c Sun Feb 23 20:48:13 2003 +0000 +++ b/libvo/vo_x11.c Sun Feb 23 22:05:55 2003 +0000 @@ -23,6 +23,7 @@ #include "sub.h" #include "../postproc/swscale.h" +#include "../postproc/swscale_internal.h" //FIXME #include "../postproc/rgb2rgb.h" #include "../mp_msg.h" @@ -371,7 +372,7 @@ if ( myximage ) { freeMyXImage(); - freeSwsContext(swsContext); + sws_freeContext(swsContext); } getMyXImage(); @@ -397,7 +398,7 @@ } /* always allocate swsContext as size could change between frames */ - swsContext= getSwsContextFromCmdLine(width, height, in_format, width, height, out_format ); + swsContext= sws_getContextFromCmdLine(width, height, in_format, width, height, out_format ); //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask ); @@ -482,7 +483,7 @@ if(sws_flags==0) newW&= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed - swsContext= getSwsContextFromCmdLine(srcW, srcH, in_format, + swsContext= sws_getContextFromCmdLine(srcW, srcH, in_format, newW, newH, out_format); if(swsContext) { @@ -491,7 +492,7 @@ freeMyXImage(); getMyXImage(); - freeSwsContext(oldContext); + sws_freeContext(oldContext); } else { @@ -507,13 +508,13 @@ { dstStride[0]= -image_width*((bpp+7)/8); dst[0]=ImageData - dstStride[0]*(image_height-1); - swsContext->swScale(swsContext,src,stride,y,h,dst, dstStride); + sws_scale(swsContext,src,stride,y,h,dst, dstStride); } else { dstStride[0]=image_width*((bpp+7)/8); dst[0]=ImageData; - swsContext->swScale(swsContext,src,stride,y,h,dst, dstStride); + sws_scale(swsContext,src,stride,y,h,dst, dstStride); } return 0; } @@ -609,7 +610,7 @@ zoomFlag=0; vo_x11_uninit(); - freeSwsContext(swsContext); + sws_freeContext(swsContext); } static uint32_t preinit(const char *arg) diff -r d1f82707ad78 -r 543ab3909b78 postproc/swscale.c --- a/postproc/swscale.c Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/swscale.c Sun Feb 23 22:05:55 2003 +0000 @@ -226,11 +226,11 @@ (if there is no support for something compiled in it wont appear here) */ static CpuCaps cpuCaps; -void (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, +int (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])=NULL; -static SwsVector *getConvVec(SwsVector *a, SwsVector *b); - +static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b); + extern const uint8_t dither_2x2_4[2][8]; extern const uint8_t dither_2x2_8[2][8]; extern const uint8_t dither_8x8_32[8][8]; @@ -306,9 +306,9 @@ out[i]= malloc(refStride[i]*h); } - srcContext= getSwsContext(w, h, IMGFMT_YV12, srcW, srcH, srcFormat, flags, NULL, NULL); - dstContext= getSwsContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL); - outContext= getSwsContext(dstW, dstH, dstFormat, w, h, IMGFMT_YV12, flags, NULL, NULL); + srcContext= sws_getContext(w, h, IMGFMT_YV12, srcW, srcH, srcFormat, flags, NULL, NULL); + dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL); + outContext= sws_getContext(dstW, dstH, dstFormat, w, h, IMGFMT_YV12, flags, NULL, NULL); if(srcContext==NULL ||dstContext==NULL ||outContext==NULL){ printf("Failed allocating swsContext\n"); goto end; @@ -340,9 +340,9 @@ end: - freeSwsContext(srcContext); - freeSwsContext(dstContext); - freeSwsContext(outContext); + sws_freeContext(srcContext); + sws_freeContext(dstContext); + sws_freeContext(outContext); for(i=0; i<3; i++){ free(src[i]); @@ -918,12 +918,12 @@ default: return; } - if(!context) context=getSwsContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat); + if(!context) context=sws_getContextFromCmdLine(srcW, srcH, IMGFMT_YV12, dstW, dstH, dstFormat); context->swScale(context, src, srcStride, srcSliceY, srcSliceH, dst, dstStride3); } -void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) +void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam) { static int firstTime=1; *flags=0; @@ -939,62 +939,62 @@ } else if(verbose>1) *flags= SWS_PRINT_INFO; - if(src_filter.lumH) freeVec(src_filter.lumH); - if(src_filter.lumV) freeVec(src_filter.lumV); - if(src_filter.chrH) freeVec(src_filter.chrH); - if(src_filter.chrV) freeVec(src_filter.chrV); + 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= getGaussianVec(sws_lum_gblur, 3.0); - src_filter.lumV= getGaussianVec(sws_lum_gblur, 3.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= getIdentityVec(); - src_filter.lumV= getIdentityVec(); + src_filter.lumH= sws_getIdentityVec(); + src_filter.lumV= sws_getIdentityVec(); } if(sws_chr_gblur!=0.0){ - src_filter.chrH= getGaussianVec(sws_chr_gblur, 3.0); - src_filter.chrV= getGaussianVec(sws_chr_gblur, 3.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= getIdentityVec(); - src_filter.chrV= getIdentityVec(); + src_filter.chrH= sws_getIdentityVec(); + src_filter.chrV= sws_getIdentityVec(); } if(sws_chr_sharpen!=0.0){ - SwsVector *g= getConstVec(-1.0, 3); - SwsVector *id= getConstVec(10.0/sws_chr_sharpen, 1); + SwsVector *g= sws_getConstVec(-1.0, 3); + SwsVector *id= sws_getConstVec(10.0/sws_chr_sharpen, 1); g->coeff[1]=2.0; - addVec(id, g); - convVec(src_filter.chrH, id); - convVec(src_filter.chrV, id); - freeVec(g); - freeVec(id); + 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= getConstVec(-1.0, 3); - SwsVector *id= getConstVec(10.0/sws_lum_sharpen, 1); + SwsVector *g= sws_getConstVec(-1.0, 3); + SwsVector *id= sws_getConstVec(10.0/sws_lum_sharpen, 1); g->coeff[1]=2.0; - addVec(id, g); - convVec(src_filter.lumH, id); - convVec(src_filter.lumV, id); - freeVec(g); - freeVec(id); + 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) - shiftVec(src_filter.chrH, sws_chr_hshift); + sws_shiftVec(src_filter.chrH, sws_chr_hshift); if(sws_chr_vshift) - shiftVec(src_filter.chrV, sws_chr_vshift); + sws_shiftVec(src_filter.chrV, sws_chr_vshift); - normalizeVec(src_filter.chrH, 1.0); - normalizeVec(src_filter.chrV, 1.0); - normalizeVec(src_filter.lumH, 1.0); - normalizeVec(src_filter.lumV, 1.0); + 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) printVec(src_filter.chrH); - if(verbose > 1) printVec(src_filter.lumH); + if(verbose > 1) sws_printVec(src_filter.chrH); + if(verbose > 1) sws_printVec(src_filter.lumH); switch(sws_flags) { @@ -1017,13 +1017,13 @@ } // will use sws_flags & src_filter (from cmd line) -SwsContext *getSwsContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) +SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) { int flags; SwsFilter *dstFilterParam, *srcFilterParam; - swsGetFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); + sws_getFlagsAndFilterFromCmdLine(&flags, &srcFilterParam, &dstFilterParam); - return getSwsContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, 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) @@ -1245,7 +1245,7 @@ scaleFilter.coeff= filter + i*filterSize; scaleFilter.length= filterSize; - if(srcFilter) outVec= getConvVec(srcFilter, &scaleFilter); + if(srcFilter) outVec= sws_getConvVec(srcFilter, &scaleFilter); else outVec= &scaleFilter; ASSERT(outVec->length == filter2Size) @@ -1258,7 +1258,7 @@ (*filterPos)[i]+= (filterSize-1)/2 - (filter2Size-1)/2; - if(outVec != &scaleFilter) freeVec(outVec); + if(outVec != &scaleFilter) sws_freeVec(outVec); } free(filter); filter=NULL; @@ -1607,7 +1607,7 @@ #endif //!RUNTIME_CPUDETECT } -static void PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, +static int PlanarToNV12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]){ uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; /* Copy Y plane */ @@ -1630,9 +1630,10 @@ interleaveBytes( src[1],src[2],dst,c->srcW,srcSliceH,srcStride[1],srcStride[2],dstStride[0] ); else /* I420 & IYUV */ interleaveBytes( src[2],src[1],dst,c->srcW,srcSliceH,srcStride[2],srcStride[1],dstStride[0] ); + return srcSliceH; } -static void PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, +static int PlanarToYuy2Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStride[]){ uint8_t *dst=dstParam[0] + dstStride[0]*srcSliceY; @@ -1640,10 +1641,11 @@ yv12toyuy2( src[0],src[1],src[2],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] ); else /* I420 & IYUV */ yv12toyuy2( src[0],src[2],src[1],dst,c->srcW,srcSliceH,srcStride[0],srcStride[1],dstStride[0] ); + return srcSliceH; } /* {RGB,BGR}{15,16,24,32} -> {RGB,BGR}{15,16,24,32} */ -static void rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, +static int rgb2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ const int srcFormat= c->srcFormat; const int dstFormat= c->dstFormat; @@ -1714,9 +1716,10 @@ dstPtr+= dstStride[0]; } } + return srcSliceH; } -static void bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, +static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ rgb24toyv12( @@ -1726,9 +1729,10 @@ dst[2]+(srcSliceY>>1)*dstStride[2], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + return srcSliceH; } -static void yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, +static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int i; @@ -1754,6 +1758,7 @@ planar2x(src[1], dst[2], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[2]); planar2x(src[2], dst[1], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[1]); } + return srcSliceH; } /** @@ -1792,7 +1797,7 @@ } /* unscaled copy like stuff (assumes nearly identical formats) */ -static void simpleCopy(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static int simpleCopy(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){ int srcStride[3]; @@ -1860,6 +1865,7 @@ } } } + return srcSliceH; } static int remove_dup_fourcc(int fourcc) @@ -1985,7 +1991,7 @@ return 0; } -SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags, +SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter){ SwsContext *c; @@ -2374,11 +2380,20 @@ } /** + * swscale warper, so we dont need to export the SwsContext + */ +int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + return c->swScale(c, src, srcStride, srcSliceY, srcSliceH, dst, dstStride); +} +//FIXME order YV12/I420 here + +/** * returns a normalized gaussian curve used to filter stuff * quality=3 is high quality, lowwer is lowwer quality */ -SwsVector *getGaussianVec(double variance, double quality){ +SwsVector *sws_getGaussianVec(double variance, double quality){ const int length= (int)(variance*quality + 0.5) | 1; int i; double *coeff= memalign(sizeof(double), length*sizeof(double)); @@ -2394,12 +2409,12 @@ coeff[i]= exp( -dist*dist/(2*variance*variance) ) / sqrt(2*variance*PI); } - normalizeVec(vec, 1.0); + sws_normalizeVec(vec, 1.0); return vec; } -SwsVector *getConstVec(double c, int length){ +SwsVector *sws_getConstVec(double c, int length){ int i; double *coeff= memalign(sizeof(double), length*sizeof(double)); SwsVector *vec= malloc(sizeof(SwsVector)); @@ -2414,7 +2429,7 @@ } -SwsVector *getIdentityVec(void){ +SwsVector *sws_getIdentityVec(void){ double *coeff= memalign(sizeof(double), sizeof(double)); SwsVector *vec= malloc(sizeof(SwsVector)); coeff[0]= 1.0; @@ -2425,7 +2440,7 @@ return vec; } -void normalizeVec(SwsVector *a, double height){ +void sws_normalizeVec(SwsVector *a, double height){ int i; double sum=0; double inv; @@ -2439,14 +2454,14 @@ a->coeff[i]*= inv; } -void scaleVec(SwsVector *a, double scalar){ +void sws_scaleVec(SwsVector *a, double scalar){ int i; for(i=0; ilength; i++) a->coeff[i]*= scalar; } -static SwsVector *getConvVec(SwsVector *a, SwsVector *b){ +static SwsVector *sws_getConvVec(SwsVector *a, SwsVector *b){ int length= a->length + b->length - 1; double *coeff= memalign(sizeof(double), length*sizeof(double)); int i, j; @@ -2468,7 +2483,7 @@ return vec; } -static SwsVector *sumVec(SwsVector *a, SwsVector *b){ +static SwsVector *sws_sumVec(SwsVector *a, SwsVector *b){ int length= MAX(a->length, b->length); double *coeff= memalign(sizeof(double), length*sizeof(double)); int i; @@ -2485,7 +2500,7 @@ return vec; } -static SwsVector *diffVec(SwsVector *a, SwsVector *b){ +static SwsVector *sws_diffVec(SwsVector *a, SwsVector *b){ int length= MAX(a->length, b->length); double *coeff= memalign(sizeof(double), length*sizeof(double)); int i; @@ -2503,7 +2518,7 @@ } /* shift left / or right if "shift" is negative */ -static SwsVector *getShiftedVec(SwsVector *a, int shift){ +static SwsVector *sws_getShiftedVec(SwsVector *a, int shift){ int length= a->length + ABS(shift)*2; double *coeff= memalign(sizeof(double), length*sizeof(double)); int i; @@ -2522,39 +2537,39 @@ return vec; } -void shiftVec(SwsVector *a, int shift){ - SwsVector *shifted= getShiftedVec(a, shift); +void sws_shiftVec(SwsVector *a, int shift){ + SwsVector *shifted= sws_getShiftedVec(a, shift); free(a->coeff); a->coeff= shifted->coeff; a->length= shifted->length; free(shifted); } -void addVec(SwsVector *a, SwsVector *b){ - SwsVector *sum= sumVec(a, b); +void sws_addVec(SwsVector *a, SwsVector *b){ + SwsVector *sum= sws_sumVec(a, b); free(a->coeff); a->coeff= sum->coeff; a->length= sum->length; free(sum); } -void subVec(SwsVector *a, SwsVector *b){ - SwsVector *diff= diffVec(a, b); +void sws_subVec(SwsVector *a, SwsVector *b){ + SwsVector *diff= sws_diffVec(a, b); free(a->coeff); a->coeff= diff->coeff; a->length= diff->length; free(diff); } -void convVec(SwsVector *a, SwsVector *b){ - SwsVector *conv= getConvVec(a, b); - free(a->coeff); +void sws_convVec(SwsVector *a, SwsVector *b){ + SwsVector *conv= sws_getConvVec(a, b); + free(a->coeff); a->coeff= conv->coeff; a->length= conv->length; free(conv); } -SwsVector *cloneVec(SwsVector *a){ +SwsVector *sws_cloneVec(SwsVector *a){ double *coeff= memalign(sizeof(double), a->length*sizeof(double)); int i; SwsVector *vec= malloc(sizeof(SwsVector)); @@ -2567,7 +2582,7 @@ return vec; } -void printVec(SwsVector *a){ +void sws_printVec(SwsVector *a){ int i; double max=0; double min=0; @@ -2590,7 +2605,7 @@ } } -void freeVec(SwsVector *a){ +void sws_freeVec(SwsVector *a){ if(!a) return; if(a->coeff) free(a->coeff); a->coeff=NULL; @@ -2598,7 +2613,7 @@ free(a); } -void freeSwsContext(SwsContext *c){ +void sws_freeContext(SwsContext *c){ int i; if(!c) return; diff -r d1f82707ad78 -r 543ab3909b78 postproc/swscale.h --- a/postproc/swscale.h Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/swscale.h Sun Feb 23 22:05:55 2003 +0000 @@ -19,7 +19,15 @@ #ifndef SWSCALE_H #define SWSCALE_H -#include "swscale_internal.h" //FIXME HACK REMOVE +/** + * @file swscale.h + * @brief + * external api for the swscale stuff + */ + +#ifdef __cplusplus +extern "C" { +#endif /* values for the flags, the stuff on the command line is different */ #define SWS_FAST_BILINEAR 1 @@ -76,42 +84,47 @@ SwsVector *chrV; } SwsFilter; +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); -// Obsolete, will be removed soon -void SwScale_Init(); - +void sws_freeContext(struct SwsContext *swsContext); -void freeSwsContext(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, + int srcSliceH, uint8_t* dst[], int dstStride[]); -SwsContext *getSwsContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat); -SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags, - SwsFilter *srcFilter, SwsFilter *dstFilter); -void swsGetFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); +void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, SwsFilter **dstFilterParam); //FIXME try to seperate this -int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation); -int sws_getColorspaceDetails(SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation); +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); +SwsVector *sws_getGaussianVec(double variance, double quality); +SwsVector *sws_getConstVec(double c, int length); +SwsVector *sws_getIdentityVec(void); +void sws_scaleVec(SwsVector *a, double scalar); +void sws_normalizeVec(SwsVector *a, double height); +void sws_convVec(SwsVector *a, SwsVector *b); +void sws_addVec(SwsVector *a, SwsVector *b); +void sws_subVec(SwsVector *a, SwsVector *b); +void sws_shiftVec(SwsVector *a, int shift); +SwsVector *sws_cloneVec(SwsVector *a); -SwsVector *getGaussianVec(double variance, double quality); -SwsVector *getConstVec(double c, int length); -SwsVector *getIdentityVec(void); -void scaleVec(SwsVector *a, double scalar); -void normalizeVec(SwsVector *a, double height); -void convVec(SwsVector *a, SwsVector *b); -void addVec(SwsVector *a, SwsVector *b); -void subVec(SwsVector *a, SwsVector *b); -void shiftVec(SwsVector *a, int shift); -SwsVector *cloneVec(SwsVector *a); +void sws_printVec(SwsVector *a); +void sws_freeVec(SwsVector *a); -void printVec(SwsVector *a); -void freeVec(SwsVector *a); +#ifdef __cplusplus +} +#endif #endif diff -r d1f82707ad78 -r 543ab3909b78 postproc/swscale_internal.h --- a/postproc/swscale_internal.h Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/swscale_internal.h Sun Feb 23 22:05:55 2003 +0000 @@ -21,13 +21,12 @@ #define MAX_FILTER_SIZE 256 -struct SwsContext; - -typedef void (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, +typedef int (*SwsFunc)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]); /* this struct should be aligned on at least 32-byte boundary */ typedef struct SwsContext{ + SwsFunc swScale; int srcW, srcH, dstH; int chrSrcW, chrSrcH, chrDstW, chrDstH; int lumXInc, chrXInc; @@ -85,8 +84,6 @@ int dstColorspaceTable[4]; int srcRange, dstRange; - SwsFunc swScale; - #define RED_DITHER "0*8" #define GREEN_DITHER "1*8" #define BLUE_DITHER "2*8" @@ -121,7 +118,6 @@ int esp; } SwsContext; //FIXME check init (where 0) -//FIXME split private & public inline void sws_orderYUV(int format, uint8_t * sortedP[], int sortedStride[], uint8_t * p[], int stride[]); SwsFunc yuv2rgb_get_func_ptr (SwsContext *c); diff -r d1f82707ad78 -r 543ab3909b78 postproc/swscale_template.c --- a/postproc/swscale_template.c Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/swscale_template.c Sun Feb 23 22:05:55 2003 +0000 @@ -2502,7 +2502,7 @@ } } -static void RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static int RENAME(swScale)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dstParam[], int dstStrideParam[]){ /* load a few things into local vars to make the code more readable? and faster */ @@ -2540,6 +2540,7 @@ uint8_t *formatConvBuffer= c->formatConvBuffer; const int chrSrcSliceY= srcSliceY >> c->chrSrcVSubSample; const int chrSrcSliceH= -((-srcSliceH) >> c->chrSrcVSubSample); + int lastDstY; /* vars whch will change and which we need to storw back in the context */ int dstY= c->dstY; @@ -2603,6 +2604,8 @@ lastInChrBuf= -1; } + lastDstY= dstY; + for(;dstY < dstH; dstY++){ unsigned char *dest =dst[0]+dstStride[0]*dstY; const int chrDstY= dstY>>c->chrDstVSubSample; @@ -2810,4 +2813,6 @@ c->chrBufIndex= chrBufIndex; c->lastInLumBuf= lastInLumBuf; c->lastInChrBuf= lastInChrBuf; + + return dstY - lastDstY; } diff -r d1f82707ad78 -r 543ab3909b78 postproc/yuv2rgb.c --- a/postproc/yuv2rgb.c Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/yuv2rgb.c Sun Feb 23 22:05:55 2003 +0000 @@ -262,7 +262,7 @@ dst_2[6*i+3] = b[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = r[Y]; #define PROLOG(func_name, dst_type) \ -static void func_name(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, \ +static int func_name(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, \ int srcSliceH, uint8_t* dst[], int dstStride[]){\ uint8_t *src[3];\ int srcStride[3];\ @@ -294,6 +294,7 @@ dst_2 += dst_delta;\ }\ }\ + return srcSliceH;\ } PROLOG(yuv2rgb_c_32, uint32_t) diff -r d1f82707ad78 -r 543ab3909b78 postproc/yuv2rgb_mlib.c --- a/postproc/yuv2rgb_mlib.c Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/yuv2rgb_mlib.c Sun Feb 23 22:05:55 2003 +0000 @@ -33,7 +33,7 @@ #include "../libvo/img_format.h" //FIXME try to reduce dependency of such stuff #include "swscale.h" -static void mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static int mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ uint8_t *src[3]; int srcStride[3]; @@ -48,9 +48,10 @@ mlib_VideoColorYUV2ARGB420(dst[0], src[0], src[1], src[2], c->dstW, c->dstH, dstStride[0], srcStride[0], srcStride[1]); + return srcSliceH; } -static void mlib_YUV2ABGR420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static int mlib_YUV2ABGR420_32(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ uint8_t *src[3]; int srcStride[3]; @@ -65,9 +66,10 @@ mlib_VideoColorYUV2ABGR420(dst[0], src[0], src[1], src[2], c->dstW, c->dstH, dstStride[0], srcStride[0], srcStride[1]); + return srcSliceH; } -static void mlib_YUV2RGB420_24(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static int mlib_YUV2RGB420_24(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ uint8_t *src[3]; int srcStride[3]; @@ -82,6 +84,7 @@ mlib_VideoColorYUV2RGB420(dst[0], src[0], src[1], src[2], c->dstW, c->dstH, dstStride[0], srcStride[0], srcStride[1]); + return srcSliceH; } diff -r d1f82707ad78 -r 543ab3909b78 postproc/yuv2rgb_template.c --- a/postproc/yuv2rgb_template.c Sun Feb 23 20:48:13 2003 +0000 +++ b/postproc/yuv2rgb_template.c Sun Feb 23 22:05:55 2003 +0000 @@ -123,7 +123,7 @@ "punpcklbw %%mm5, %%mm2;" /* G7 G6 G5 G4 G3 G2 G1 G0 */\ -static inline void RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcStride[3]; uint8_t *src[3]; @@ -217,9 +217,11 @@ } __asm__ __volatile__ (EMMS); + + return srcSliceH; } -static inline void RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcStride[3]; uint8_t *src[3]; @@ -308,9 +310,10 @@ } __asm__ __volatile__ (EMMS); + return srcSliceH; } -static inline void RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcStride[3]; uint8_t *src[3]; @@ -456,9 +459,10 @@ } __asm__ __volatile__ (EMMS); + return srcSliceH; } -static inline void RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, +static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* srcParam[], int srcStrideParam[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcStride[3]; uint8_t *src[3]; @@ -544,4 +548,5 @@ } __asm__ __volatile__ (EMMS); + return srcSliceH; } diff -r d1f82707ad78 -r 543ab3909b78 spudec.c --- a/spudec.c Sun Feb 23 20:48:13 2003 +0000 +++ b/spudec.c Sun Feb 23 22:05:55 2003 +0000 @@ -724,27 +724,27 @@ void sws_spu_image(unsigned char *d1, unsigned char *d2, int dw, int dh, int ds, unsigned char *s1, unsigned char *s2, int sw, int sh, int ss) { - SwsContext *ctx; + struct SwsContext *ctx; static SwsFilter filter; static int firsttime = 1; static float oldvar; int i; - if (!firsttime && oldvar != spu_gaussvar) freeVec(filter.lumH); + if (!firsttime && oldvar != spu_gaussvar) sws_freeVec(filter.lumH); if (firsttime) { filter.lumH = filter.lumV = - filter.chrH = filter.chrV = getGaussianVec(spu_gaussvar, 3.0); - normalizeVec(filter.lumH, 1.0); + filter.chrH = filter.chrV = sws_getGaussianVec(spu_gaussvar, 3.0); + sws_normalizeVec(filter.lumH, 1.0); firsttime = 0; oldvar = spu_gaussvar; } - ctx=getSwsContext(sw, sh, IMGFMT_Y800, dw, dh, IMGFMT_Y800, SWS_GAUSS, &filter, NULL); - ctx->swScale(ctx,&s1,&ss,0,sh,&d1,&ds); + ctx=sws_getContext(sw, sh, IMGFMT_Y800, dw, dh, IMGFMT_Y800, SWS_GAUSS, &filter, NULL); + sws_scale(ctx,&s1,&ss,0,sh,&d1,&ds); for (i=ss*sh-1; i>=0; i--) if (!s2[i]) s2[i] = 255; //else s2[i] = 1; - ctx->swScale(ctx,&s2,&ss,0,sh,&d2,&ds); + sws_scale(ctx,&s2,&ss,0,sh,&d2,&ds); for (i=ds*dh-1; i>=0; i--) if (d2[i]==0) d2[i] = 1; else if (d2[i]==255) d2[i] = 0; - freeSwsContext(ctx); + sws_freeContext(ctx); } void spudec_draw_scaled(void *me, unsigned int dxs, unsigned int dys, void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride))