mirror of
https://github.com/game-stop/veejay.git
synced 2025-12-18 13:49:58 +01:00
Using weighted averaging for subsampling 2x2 -> 1x1
git-svn-id: svn://code.dyne.org/veejay/trunk@6 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
This commit is contained in:
@@ -95,28 +95,60 @@ 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;
|
||||
|
||||
// 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 ++;
|
||||
}
|
||||
in0 += width;
|
||||
in1 += width;
|
||||
buffer += (width << 1);
|
||||
out += width;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vertical/horizontal interstitial siting
|
||||
*
|
||||
* Y Y Y Y
|
||||
|
||||
Reference in New Issue
Block a user