mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-06-25 17:47:25 +08:00
Set horizontal scaler's range conversion in context in sws_init_swScale().
Originally committed as revision 30082 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
This commit is contained in:
@ -273,6 +273,9 @@ typedef struct SwsContext {
|
|||||||
int xInc, const int16_t *filter, const int16_t *filterPos,
|
int xInc, const int16_t *filter, const int16_t *filterPos,
|
||||||
long filterSize);
|
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 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 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.
|
int alpSrcOffset; ///< Offset given to alpha src pointers passed to horizontal input functions.
|
||||||
|
@ -2219,6 +2219,37 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, const uint8_t *src, in
|
|||||||
#endif /* COMPILE_MMX */
|
#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 \
|
#define FAST_BILINEAR_X86 \
|
||||||
"subl %%edi, %%esi \n\t" /* src[xx+1] - src[xx] */ \
|
"subl %%edi, %%esi \n\t" /* src[xx+1] - src[xx] */ \
|
||||||
"imull %%ecx, %%esi \n\t" /* (src[xx+1] - src[xx])*xalpha */ \
|
"imull %%ecx, %%esi \n\t" /* (src[xx+1] - src[xx])*xalpha */ \
|
||||||
@ -2253,6 +2284,7 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth,
|
|||||||
int av_unused canMMX2BeUsed = c->canMMX2BeUsed;
|
int av_unused canMMX2BeUsed = c->canMMX2BeUsed;
|
||||||
void av_unused *mmx2FilterCode= c->lumMmx2FilterCode;
|
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 (*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;
|
src += isAlpha ? c->alpSrcOffset : c->lumSrcOffset;
|
||||||
|
|
||||||
@ -2377,18 +2409,8 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth,
|
|||||||
#endif /* ARCH_X86 */
|
#endif /* ARCH_X86 */
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isAlpha && c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) {
|
if (convertRange)
|
||||||
int i;
|
convertRange(dst, dstWidth);
|
||||||
//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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void RENAME(hcscale_fast)(SwsContext *c, int16_t *dst,
|
static inline void RENAME(hcscale_fast)(SwsContext *c, int16_t *dst,
|
||||||
@ -2543,22 +2565,9 @@ inline static void RENAME(hcscale)(SwsContext *c, uint16_t *dst, long dstWidth,
|
|||||||
c->hcscale_fast(c, dst, dstWidth, src1, src2, srcW, xInc);
|
c->hcscale_fast(c, dst, dstWidth, src1, src2, srcW, xInc);
|
||||||
#endif /* ARCH_X86 */
|
#endif /* ARCH_X86 */
|
||||||
}
|
}
|
||||||
if(c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))) {
|
|
||||||
int i;
|
if (c->chrConvertRange)
|
||||||
//FIXME all pal and rgb srcFormats could do this convertion as well
|
c->chrConvertRange(dst, dstWidth);
|
||||||
//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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEBUG_SWSCALE_BUFFERS 0
|
#define DEBUG_SWSCALE_BUFFERS 0
|
||||||
@ -3050,4 +3059,14 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
|
|||||||
c->alpSrcOffset = 1;
|
c->alpSrcOffset = 1;
|
||||||
break;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user