mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
Fix jpeg yuv.
Fixes issue504. Originally committed as revision 27547 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
This commit is contained in:
parent
f7b1d72f45
commit
6bc0c7928a
@ -1984,7 +1984,6 @@ int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange
|
|||||||
int64_t cy = 1<<16;
|
int64_t cy = 1<<16;
|
||||||
int64_t oy = 0;
|
int64_t oy = 0;
|
||||||
|
|
||||||
if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return -1;
|
|
||||||
memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
|
memcpy(c->srcColorspaceTable, inv_table, sizeof(int)*4);
|
||||||
memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
|
memcpy(c->dstColorspaceTable, table, sizeof(int)*4);
|
||||||
|
|
||||||
@ -1993,6 +1992,7 @@ int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange
|
|||||||
c->saturation= saturation;
|
c->saturation= saturation;
|
||||||
c->srcRange = srcRange;
|
c->srcRange = srcRange;
|
||||||
c->dstRange = dstRange;
|
c->dstRange = dstRange;
|
||||||
|
if (isYUV(c->dstFormat) || isGray(c->dstFormat)) return 0;
|
||||||
|
|
||||||
c->uOffset= 0x0400040004000400LL;
|
c->uOffset= 0x0400040004000400LL;
|
||||||
c->vOffset= 0x0400040004000400LL;
|
c->vOffset= 0x0400040004000400LL;
|
||||||
@ -2213,7 +2213,7 @@ SwsContext *sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH
|
|||||||
sws_setColorspaceDetails(c, Inverse_Table_6_9[SWS_CS_DEFAULT], srcRange, Inverse_Table_6_9[SWS_CS_DEFAULT] /* FIXME*/, dstRange, 0, 1<<16, 1<<16);
|
sws_setColorspaceDetails(c, Inverse_Table_6_9[SWS_CS_DEFAULT], srcRange, Inverse_Table_6_9[SWS_CS_DEFAULT] /* FIXME*/, dstRange, 0, 1<<16, 1<<16);
|
||||||
|
|
||||||
/* unscaled special Cases */
|
/* unscaled special Cases */
|
||||||
if (unscaled && !usesHFilter && !usesVFilter)
|
if (unscaled && !usesHFilter && !usesVFilter && (srcRange == dstRange || isBGR(dstFormat) || isRGB(dstFormat)))
|
||||||
{
|
{
|
||||||
/* yv12_to_nv12 */
|
/* yv12_to_nv12 */
|
||||||
if (srcFormat == PIX_FMT_YUV420P && (dstFormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21))
|
if (srcFormat == PIX_FMT_YUV420P && (dstFormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21))
|
||||||
|
@ -2501,7 +2501,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW
|
|||||||
#endif /* HAVE_MMX */
|
#endif /* HAVE_MMX */
|
||||||
}
|
}
|
||||||
// *** horizontal scale Y line to temp buffer
|
// *** 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,
|
int flags, int canMMX2BeUsed, int16_t *hLumFilter,
|
||||||
int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode,
|
int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode,
|
||||||
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
|
||||||
@ -2711,9 +2711,22 @@ FUNNY_Y_CODE
|
|||||||
}
|
}
|
||||||
#endif /* defined(ARCH_X86) */
|
#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,
|
int srcW, int xInc, int flags, int canMMX2BeUsed, int16_t *hChrFilter,
|
||||||
int16_t *hChrFilterPos, int hChrFilterSize, void *funnyUVCode,
|
int16_t *hChrFilterPos, int hChrFilterSize, void *funnyUVCode,
|
||||||
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
|
int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter,
|
||||||
@ -2962,6 +2975,22 @@ FUNNY_UV_CODE
|
|||||||
}
|
}
|
||||||
#endif /* defined(ARCH_X86) */
|
#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,
|
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 < srcSliceH);
|
||||||
assert(lastInLumBuf + 1 - srcSliceY >= 0);
|
assert(lastInLumBuf + 1 - srcSliceY >= 0);
|
||||||
//printf("%d %d\n", lumBufIndex, vLumBufSize);
|
//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,
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize,
|
||||||
funnyYCode, c->srcFormat, formatConvBuffer,
|
funnyYCode, c->srcFormat, formatConvBuffer,
|
||||||
c->lumMmx2Filter, c->lumMmx2FilterPos, pal);
|
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)
|
//FIXME replace parameters through context struct (some at least)
|
||||||
|
|
||||||
if (!(isGray(srcFormat) || isGray(dstFormat)))
|
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,
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize,
|
||||||
funnyUVCode, c->srcFormat, formatConvBuffer,
|
funnyUVCode, c->srcFormat, formatConvBuffer,
|
||||||
c->chrMmx2Filter, c->chrMmx2FilterPos, pal);
|
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(lumBufIndex < 2*vLumBufSize);
|
||||||
assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
|
assert(lastInLumBuf + 1 - srcSliceY < srcSliceH);
|
||||||
assert(lastInLumBuf + 1 - srcSliceY >= 0);
|
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,
|
flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize,
|
||||||
funnyYCode, c->srcFormat, formatConvBuffer,
|
funnyYCode, c->srcFormat, formatConvBuffer,
|
||||||
c->lumMmx2Filter, c->lumMmx2FilterPos, pal);
|
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);
|
assert(lastInChrBuf + 1 - chrSrcSliceY >= 0);
|
||||||
|
|
||||||
if (!(isGray(srcFormat) || isGray(dstFormat)))
|
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,
|
flags, canMMX2BeUsed, hChrFilter, hChrFilterPos, hChrFilterSize,
|
||||||
funnyUVCode, c->srcFormat, formatConvBuffer,
|
funnyUVCode, c->srcFormat, formatConvBuffer,
|
||||||
c->chrMmx2Filter, c->chrMmx2FilterPos, pal);
|
c->chrMmx2Filter, c->chrMmx2FilterPos, pal);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user