summaryrefslogtreecommitdiffstats
path: root/libswscale/swscale_template.c
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-09-08 12:36:38 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-09-08 12:36:38 +0000
commitb128f3e558af20ac6e7bbfedaf1c47c5860ec53c (patch)
tree8598343332fe87774c77e82bf79a54ed836694a1 /libswscale/swscale_template.c
parent65f45532e3f9d109f31a0ad97d2bc8c36461b102 (diff)
downloadmpv-b128f3e558af20ac6e7bbfedaf1c47c5860ec53c.tar.bz2
mpv-b128f3e558af20ac6e7bbfedaf1c47c5860ec53c.tar.xz
Fix jpeg yuv.
Fixes issue504. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27547 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libswscale/swscale_template.c')
-rw-r--r--libswscale/swscale_template.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c
index 7b82da5b55..ef964ff8ef 100644
--- a/libswscale/swscale_template.c
+++ b/libswscale/swscale_template.c
@@ -2501,7 +2501,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW
#endif /* HAVE_MMX */
}
// *** horizontal scale Y line to temp buffer
-static inline void RENAME(hyscale)(uint16_t *dst, long dstWidth, uint8_t *src, int srcW, int xInc,
+static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth, uint8_t *src, int srcW, int xInc,
int flags, int canMMX2BeUsed, int16_t *hLumFilter,
int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode,
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
@@ -2711,9 +2711,22 @@ FUNNY_Y_CODE
}
#endif /* defined(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]*14071 + 33561947)>>14;
+ }else{
+ for (i=0; i<dstWidth; i++)
+ dst[i]= (dst[i]*19077 - 39057361)>>14;
+ }
+ }
}
-inline static void RENAME(hcscale)(uint16_t *dst, long dstWidth, uint8_t *src1, uint8_t *src2,
+inline static void RENAME(hcscale)(SwsContext *c, uint16_t *dst, long dstWidth, uint8_t *src1, uint8_t *src2,
int srcW, int xInc, int flags, int canMMX2BeUsed, int16_t *hChrFilter,
int16_t *hChrFilterPos, int hChrFilterSize, void *funnyUVCode,
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
@@ -2962,6 +2975,22 @@ FUNNY_UV_CODE
}
#endif /* defined(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 ]= (dst[i ]*4663 - 9289992)>>12; //-264
+ dst[i+VOFW]= (dst[i+VOFW]*4663 - 9289992)>>12; //-264
+ }
+ }
+ }
}
static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
@@ -3097,7 +3126,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s
assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
assert(lastInLumBuf + 1 - srcSliceY >= 0);
//printf("%d %d\n", lumBufIndex, vLumBufSize);
- RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc,
+ RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc,
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize,
funnyYCode, c->srcFormat, formatConvBuffer,
c->lumMmx2Filter, c->lumMmx2FilterPos, pal);
@@ -3114,7 +3143,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s
//FIXME replace parameters through context struct (some at least)
if (!(isGray(srcFormat) || isGray(dstFormat)))
- RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc,
+ RENAME(hcscale)(c, chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc,
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize,
funnyUVCode, c->srcFormat, formatConvBuffer,
c->chrMmx2Filter, c->chrMmx2FilterPos, pal);
@@ -3139,7 +3168,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s
assert(lumBufIndex < 2*vLumBufSize);
assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
assert(lastInLumBuf + 1 - srcSliceY >= 0);
- RENAME(hyscale)(lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc,
+ RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc,
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize,
funnyYCode, c->srcFormat, formatConvBuffer,
c->lumMmx2Filter, c->lumMmx2FilterPos, pal);
@@ -3155,7 +3184,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s
assert(lastInChrBuf + 1 - chrSrcSliceY >= 0);
if (!(isGray(srcFormat) || isGray(dstFormat)))
- RENAME(hcscale)(chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc,
+ RENAME(hcscale)(c, chrPixBuf[ chrBufIndex ], chrDstW, src1, src2, chrSrcW, chrXInc,
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize,
funnyUVCode, c->srcFormat, formatConvBuffer,
c->chrMmx2Filter, c->chrMmx2FilterPos, pal);