From ba5793d3783dce6c4c048f22b44d33c07f6f5a9c Mon Sep 17 00:00:00 2001 From: Niels Elburg Date: Sat, 31 Jul 2004 11:37:30 +0000 Subject: [PATCH] Using weighted averaging for subsampling 2x2 -> 1x1 git-svn-id: svn://code.dyne.org/veejay/trunk@6 eb8d1916-c9e9-0310-b8de-cf0c9472ead5 --- veejay-30aug04/veejay-0.6/veejay/subsample.c | 58 +++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/veejay-30aug04/veejay-0.6/veejay/subsample.c b/veejay-30aug04/veejay-0.6/veejay/subsample.c index cc2ec049..d17b7e47 100644 --- a/veejay-30aug04/veejay-0.6/veejay/subsample.c +++ b/veejay-30aug04/veejay-0.6/veejay/subsample.c @@ -95,26 +95,58 @@ static void ss_444_to_420jpeg(uint8_t *buffer, int width, int height) } } */ +/* + + using weighted averaging for subsampling 2x2 -> 1x1 + here, 4 pixels are filled in each inner loop, (weighting + 16 source pixels) +*/ static void ss_444_to_420jpeg(uint8_t *buffer, int width, int height) { - uint8_t *in0, *in1, *out; - int x, y; + const uint8_t *in0, *in1; + uint8_t *out; + int x, y = height; in0 = buffer; in1 = buffer + width; out = buffer; - for (y = 0; y < height; y += 2) { - for (x = 0; x < width; x += 2) { - *out = (in0[0] + 3 * (in0[1] + in1[0]) + (9 * in1[1]) + 8) >> 4; - in0 += 2; - in1 += 2; - out++; - } - in0 += width; - in1 += width; - } -} +// for (y = 0; y < height; y += 2) { +// for (x = 0; x < width; x += 2) { +// *out = (in0[0] + 3 * (in0[1] + in1[0]) + (9 * in1[1]) + 8) >> 4; +// in0 += 2; +// in1 += 2; +// out++; +// } +// in0 += width; +// in1 += width; +// } + for(; y > 0; y -- ) + { + in0 = buffer; + in1 = buffer + width; + out = buffer; + for( x = width; x >= 4; x -= 4 ) + { + out[0] = ( in0[0] + 3 * ( in0[1] + in1[0] ) + (9 * in1[1]) + 8) >> 4; + out[1] = ( in0[2] + 3 * ( in0[3] + in1[2] ) + (9 * in1[3]) + 8) >> 4; + out[2] = ( in0[4] + 3 * ( in0[5] + in1[4] ) + (9 * in1[5]) + 8) >> 4; + out[3] = ( in0[6] + 3 * ( in0[7] + in1[6] ) + (9 * in1[7]) + 8) >> 4; + in0 += 8; + in1 += 8; + out += 4; + } + for(; x > 0; x -- ) + { + out[0] = ( in0[0] + 3 * ( in0[1] + in1[0] ) + (9 * in1[1] ) + 8) >> 4; + in0 += 2; + in1 += 2; + out ++; + } + buffer += (width << 1); + out += width; + } +} /* vertical/horizontal interstitial siting