Mercurial > mplayer.hg
changeset 30040:79adcc3e4e83
Set horizontal scaler's range conversion in context in sws_init_swScale().
author | ramiro |
---|---|
date | Sun, 20 Dec 2009 16:32:58 +0000 |
parents | 3b0026eb9c4d |
children | dea60722b5a3 |
files | libswscale/swscale_internal.h libswscale/swscale_template.c |
diffstat | 2 files changed, 50 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/libswscale/swscale_internal.h Sun Dec 20 16:21:25 2009 +0000 +++ b/libswscale/swscale_internal.h Sun Dec 20 16:32:58 2009 +0000 @@ -273,6 +273,9 @@ int xInc, const int16_t *filter, const int16_t *filterPos, long filterSize); + void (*lumConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for luma plane if needed. + void (*chrConvertRange)(uint16_t *dst, int width); ///< Color range conversion function for chroma planes if needed. + int lumSrcOffset; ///< Offset given to luma src pointers passed to horizontal input functions. int chrSrcOffset; ///< Offset given to chroma src pointers passed to horizontal input functions. int alpSrcOffset; ///< Offset given to alpha src pointers passed to horizontal input functions.
--- a/libswscale/swscale_template.c Sun Dec 20 16:21:25 2009 +0000 +++ b/libswscale/swscale_template.c Sun Dec 20 16:32:58 2009 +0000 @@ -2219,6 +2219,37 @@ #endif /* COMPILE_MMX */ } +//FIXME all pal and rgb srcFormats could do this convertion as well +//FIXME all scalers more complex than bilinear could do half of this transform +static void RENAME(chrRangeToJpeg)(uint16_t *dst, int width) +{ + int i; + for (i = 0; i < width; i++) { + dst[i ] = (FFMIN(dst[i ],30775)*4663 - 9289992)>>12; //-264 + dst[i+VOFW] = (FFMIN(dst[i+VOFW],30775)*4663 - 9289992)>>12; //-264 + } +} +static void RENAME(chrRangeFromJpeg)(uint16_t *dst, int width) +{ + int i; + for (i = 0; i < width; i++) { + dst[i ] = (dst[i ]*1799 + 4081085)>>11; //1469 + dst[i+VOFW] = (dst[i+VOFW]*1799 + 4081085)>>11; //1469 + } +} +static void RENAME(lumRangeToJpeg)(uint16_t *dst, int width) +{ + int i; + for (i = 0; i < width; i++) + dst[i] = (FFMIN(dst[i],30189)*19077 - 39057361)>>14; +} +static void RENAME(lumRangeFromJpeg)(uint16_t *dst, int width) +{ + int i; + for (i = 0; i < width; i++) + dst[i] = (dst[i]*14071 + 33561947)>>14; +} + #define FAST_BILINEAR_X86 \ "subl %%edi, %%esi \n\t" /* src[xx+1] - src[xx] */ \ "imull %%ecx, %%esi \n\t" /* (src[xx+1] - src[xx])*xalpha */ \ @@ -2253,6 +2284,7 @@ int av_unused canMMX2BeUsed = c->canMMX2BeUsed; void av_unused *mmx2FilterCode= c->lumMmx2FilterCode; void (*internal_func)(uint8_t *, const uint8_t *, long, uint32_t *) = isAlpha ? c->hascale_internal : c->hyscale_internal; + void (*convertRange)(uint16_t *, int) = isAlpha ? NULL : c->lumConvertRange; src += isAlpha ? c->alpSrcOffset : c->lumSrcOffset; @@ -2377,18 +2409,8 @@ #endif /* ARCH_X86 */ } - if(!isAlpha && c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) { - int i; - //FIXME all pal and rgb srcFormats could do this convertion as well - //FIXME all scalers more complex than bilinear could do half of this transform - if(c->srcRange) { - for (i=0; i<dstWidth; i++) - dst[i]= (dst[i]*14071 + 33561947)>>14; - } else { - for (i=0; i<dstWidth; i++) - dst[i]= (FFMIN(dst[i],30189)*19077 - 39057361)>>14; - } - } + if (convertRange) + convertRange(dst, dstWidth); } static inline void RENAME(hcscale_fast)(SwsContext *c, int16_t *dst, @@ -2543,22 +2565,9 @@ c->hcscale_fast(c, dst, dstWidth, src1, src2, srcW, xInc); #endif /* ARCH_X86 */ } - if(c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) { - int i; - //FIXME all pal and rgb srcFormats could do this convertion as well - //FIXME all scalers more complex than bilinear could do half of this transform - if(c->srcRange) { - for (i=0; i<dstWidth; i++) { - dst[i ]= (dst[i ]*1799 + 4081085)>>11; //1469 - dst[i+VOFW]= (dst[i+VOFW]*1799 + 4081085)>>11; //1469 - } - } else { - for (i=0; i<dstWidth; i++) { - dst[i ]= (FFMIN(dst[i ],30775)*4663 - 9289992)>>12; //-264 - dst[i+VOFW]= (FFMIN(dst[i+VOFW],30775)*4663 - 9289992)>>12; //-264 - } - } - } + + if (c->chrConvertRange) + c->chrConvertRange(dst, dstWidth); } #define DEBUG_SWSCALE_BUFFERS 0 @@ -3050,4 +3059,14 @@ c->alpSrcOffset = 1; break; } + + if (c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) { + if (c->srcRange) { + c->lumConvertRange = RENAME(lumRangeFromJpeg); + c->chrConvertRange = RENAME(chrRangeFromJpeg); + } else { + c->lumConvertRange = RENAME(lumRangeToJpeg); + c->chrConvertRange = RENAME(chrRangeToJpeg); + } + } }