Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.4
@@ -5,7 +5,8 @@ NAME = swscale | |||
HEADERS = swscale.h \ | |||
version.h \ | |||
OBJS = input.o \ | |||
OBJS = hscale_fast_bilinear.o \ | |||
input.o \ | |||
options.o \ | |||
output.o \ | |||
rgb2rgb.o \ | |||
@@ -0,0 +1,55 @@ | |||
/* | |||
* Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at> | |||
* | |||
* This file is part of FFmpeg. | |||
* | |||
* FFmpeg is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 2.1 of the License, or (at your option) any later version. | |||
* | |||
* FFmpeg is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public | |||
* License along with FFmpeg; if not, write to the Free Software | |||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
*/ | |||
#include "swscale_internal.h" | |||
void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, | |||
const uint8_t *src, int srcW, int xInc) | |||
{ | |||
int i; | |||
unsigned int xpos = 0; | |||
for (i = 0; i < dstWidth; i++) { | |||
register unsigned int xx = xpos >> 16; | |||
register unsigned int xalpha = (xpos & 0xFFFF) >> 9; | |||
dst[i] = (src[xx] << 7) + (src[xx + 1] - src[xx]) * xalpha; | |||
xpos += xInc; | |||
} | |||
for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) | |||
dst[i] = src[srcW-1]*128; | |||
} | |||
void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, | |||
int dstWidth, const uint8_t *src1, | |||
const uint8_t *src2, int srcW, int xInc) | |||
{ | |||
int i; | |||
unsigned int xpos = 0; | |||
for (i = 0; i < dstWidth; i++) { | |||
register unsigned int xx = xpos >> 16; | |||
register unsigned int xalpha = (xpos & 0xFFFF) >> 9; | |||
dst1[i] = (src1[xx] * (xalpha ^ 127) + src1[xx + 1] * xalpha); | |||
dst2[i] = (src2[xx] * (xalpha ^ 127) + src2[xx + 1] * xalpha); | |||
xpos += xInc; | |||
} | |||
for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) { | |||
dst1[i] = src1[srcW-1]*128; | |||
dst2[i] = src2[srcW-1]*128; | |||
} | |||
} |
@@ -221,21 +221,6 @@ static void lumRangeFromJpeg16_c(int16_t *_dst, int width) | |||
dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12; | |||
} | |||
static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, | |||
const uint8_t *src, int srcW, int xInc) | |||
{ | |||
int i; | |||
unsigned int xpos = 0; | |||
for (i = 0; i < dstWidth; i++) { | |||
register unsigned int xx = xpos >> 16; | |||
register unsigned int xalpha = (xpos & 0xFFFF) >> 9; | |||
dst[i] = (src[xx] << 7) + (src[xx + 1] - src[xx]) * xalpha; | |||
xpos += xInc; | |||
} | |||
for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) | |||
dst[i] = src[srcW-1]*128; | |||
} | |||
// *** horizontal scale Y line to temp buffer | |||
static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, | |||
const uint8_t *src_in[4], | |||
@@ -273,25 +258,6 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth, | |||
convertRange(dst, dstWidth); | |||
} | |||
static void hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, | |||
int dstWidth, const uint8_t *src1, | |||
const uint8_t *src2, int srcW, int xInc) | |||
{ | |||
int i; | |||
unsigned int xpos = 0; | |||
for (i = 0; i < dstWidth; i++) { | |||
register unsigned int xx = xpos >> 16; | |||
register unsigned int xalpha = (xpos & 0xFFFF) >> 9; | |||
dst1[i] = (src1[xx] * (xalpha ^ 127) + src1[xx + 1] * xalpha); | |||
dst2[i] = (src2[xx] * (xalpha ^ 127) + src2[xx + 1] * xalpha); | |||
xpos += xInc; | |||
} | |||
for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) { | |||
dst1[i] = src1[srcW-1]*128; | |||
dst2[i] = src2[srcW-1]*128; | |||
} | |||
} | |||
static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, | |||
int16_t *dst2, int dstWidth, | |||
const uint8_t *src_in[4], | |||
@@ -745,8 +711,8 @@ static av_cold void sws_init_swscale(SwsContext *c) | |||
if (c->dstBpc <= 14) { | |||
c->hyScale = c->hcScale = hScale8To15_c; | |||
if (c->flags & SWS_FAST_BILINEAR) { | |||
c->hyscale_fast = hyscale_fast_c; | |||
c->hcscale_fast = hcscale_fast_c; | |||
c->hyscale_fast = ff_hyscale_fast_c; | |||
c->hcscale_fast = ff_hcscale_fast_c; | |||
} | |||
} else { | |||
c->hyScale = c->hcScale = hScale8To19_c; | |||
@@ -859,6 +859,12 @@ void ff_sws_init_output_funcs(SwsContext *c, | |||
void ff_sws_init_swscale_ppc(SwsContext *c); | |||
void ff_sws_init_swscale_x86(SwsContext *c); | |||
void ff_hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth, | |||
const uint8_t *src, int srcW, int xInc); | |||
void ff_hcscale_fast_c(SwsContext *c, int16_t *dst1, int16_t *dst2, | |||
int dstWidth, const uint8_t *src1, | |||
const uint8_t *src2, int srcW, int xInc); | |||
static inline void fillPlane16(uint8_t *plane, int stride, int width, int height, int y, | |||
int alpha, int bits, const int big_endian) | |||
{ | |||