Fix conversion of Y value - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 2b646382a5745b65d32e6bc66b9cf41149673c8c | |
parent 233e70bd856bb1b90844b51b0e7b3534e804c4ef | |
Author: Mattias Andrée <[email protected]> | |
Date: Sat, 23 Sep 2017 19:14:42 +0200 | |
Fix conversion of Y value | |
Signed-off-by: Mattias Andrée <[email protected]> | |
Diffstat: | |
M TODO | 3 +-- | |
M src/blind-convert.c | 36 ++++++++++++++++-------------… | |
M src/blind-from-video.c | 14 +++++++------- | |
M src/blind-to-video.c | 12 ++++++------ | |
M src/util/colour.h | 12 ++++++------ | |
5 files changed, 38 insertions(+), 39 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,5 +1,4 @@ | |
-Why does blind-from-video produce darker images than blind-from-image and | |
-why does blind-to-video produce brighter images than blind-to-image? | |
+Conversion either from or to video changes the brightness of the primitives (b… | |
blind-transform affine transformation by matrix multiplication,… | |
improve quality on downscaling (pixels' neighb… | |
diff --git a/src/blind-convert.c b/src/blind-convert.c | |
@@ -47,12 +47,12 @@ static size_t | |
remove_alpha_u16(uint16_t *buf, size_t n) | |
{ | |
size_t i, j; | |
- long int a, max = (long int)UINT16_MAX; | |
+ long int a, max = (long int)UINT16_MAX, ymax = 0xDAF4L; | |
for (i = j = 0; i < n; i += 4, j += 3) { | |
a = (long int)(buf[i + 3]); | |
- buf[j + 0] = (uint16_t)(((long int)(buf[i + 0]) - 16L * 256L)… | |
- buf[j + 1] = (uint16_t)(((long int)(buf[i + 1]) - 128L * 256L)… | |
- buf[j + 2] = (uint16_t)(((long int)(buf[i + 2]) - 128L * 256L)… | |
+ buf[j + 0] = (uint16_t)(((long int)(buf[i + 0]) - 0x1001L) * a… | |
+ buf[j + 1] = (uint16_t)(((long int)(buf[i + 1]) - 0x8000L) * a… | |
+ buf[j + 2] = (uint16_t)(((long int)(buf[i + 2]) - 0x8000L) * a… | |
} | |
return j; | |
} | |
@@ -108,12 +108,12 @@ raw1_to_raw0(uint16_t *buf, size_t n) | |
#define RAW2_TO_RAW3(TYPE, WITH_ALPHA)\ | |
do {\ | |
size_t i;\ | |
- TYPE max = (TYPE)UINT16_MAX;\ | |
+ TYPE max = (TYPE)UINT16_MAX, ymax = (TYPE)0xDAF4;\ | |
if (sizeof(*in) > sizeof(*out)) {\ | |
for (i = 0; i < n; i += 3 + WITH_ALPHA) {\ | |
- out[i + 0] = (TYPE)((long int)(in[i + 0]) - 1… | |
- out[i + 1] = (TYPE)((long int)(in[i + 1]) - 12… | |
- out[i + 2] = (TYPE)((long int)(in[i + 2]) - 12… | |
+ out[i + 0] = (TYPE)((long int)(in[i + 0]) - 0x… | |
+ out[i + 1] = (TYPE)((long int)(in[i + 1]) - 0x… | |
+ out[i + 2] = (TYPE)((long int)(in[i + 2]) - 0x… | |
if (WITH_ALPHA)\ | |
out[i + 3] = (TYPE)(in[i + 3]) / max;\ | |
}\ | |
@@ -121,9 +121,9 @@ raw1_to_raw0(uint16_t *buf, size_t n) | |
for (i = n; i; i -= 3 + WITH_ALPHA) {\ | |
if (WITH_ALPHA)\ | |
out[i - 1] = (TYPE)(in[i - 1]) / max;\ | |
- out[i - 1 - WITH_ALPHA] = (TYPE)((long int)(in… | |
- out[i - 2 - WITH_ALPHA] = (TYPE)((long int)(in… | |
- out[i - 3 - WITH_ALPHA] = (TYPE)((long int)(in… | |
+ out[i - 1 - WITH_ALPHA] = (TYPE)((long int)(in… | |
+ out[i - 2 - WITH_ALPHA] = (TYPE)((long int)(in… | |
+ out[i - 3 - WITH_ALPHA] = (TYPE)((long int)(in… | |
}\ | |
}\ | |
} while (0) | |
@@ -136,13 +136,13 @@ static void raw2a_to_raw3a_f (uint16_t *in, float *out, … | |
#define RAW3_TO_RAW2(TYPE, WITH_ALPHA)\ | |
do {\ | |
size_t i;\ | |
- TYPE max = (TYPE)UINT16_MAX;\ | |
+ TYPE max = (TYPE)UINT16_MAX, ymax = (TYPE)0xDAF4;\ | |
long int y, u, v;\ | |
if (sizeof(*in) > sizeof(*out)) {\ | |
for (i = 0; i < n; i += 3 + WITH_ALPHA) {\ | |
- y = (long int)(in[i + 0] * max) + 16L * 256L;\ | |
- u = (long int)(in[i + 1] * max) + 128L * 256L;\ | |
- v = (long int)(in[i + 2] * max) + 128L * 256L;\ | |
+ y = (long int)(in[i + 0] * ymax) + 0x1001L;\ | |
+ u = (long int)(in[i + 1] * max) + 0x8000L;\ | |
+ v = (long int)(in[i + 2] * max) + 0x8000L;\ | |
out[i + 0] = (uint16_t)CLIP(0, y, 0xFFFFL);\ | |
out[i + 1] = (uint16_t)CLIP(0, u, 0xFFFFL);\ | |
out[i + 2] = (uint16_t)CLIP(0, v, 0xFFFFL);\ | |
@@ -157,9 +157,9 @@ static void raw2a_to_raw3a_f (uint16_t *in, float *out, si… | |
v = (long int)(in[i - 1] * max);\ | |
out[i - 1] = (uint16_t)CLIP(0, v, 0xFF… | |
}\ | |
- v = (long int)(in[i - 1 - WITH_ALPHA] * max) +… | |
- u = (long int)(in[i - 2 - WITH_ALPHA] * max) +… | |
- y = (long int)(in[i - 3 - WITH_ALPHA] * max) +… | |
+ v = (long int)(in[i - 1 - WITH_ALPHA] * max) … | |
+ u = (long int)(in[i - 2 - WITH_ALPHA] * max) … | |
+ y = (long int)(in[i - 3 - WITH_ALPHA] * ymax) … | |
out[i - 1 - WITH_ALPHA] = (uint16_t)CLIP(0, v,… | |
out[i - 2 - WITH_ALPHA] = (uint16_t)CLIP(0, u,… | |
out[i - 3 - WITH_ALPHA] = (uint16_t)CLIP(0, y,… | |
diff --git a/src/blind-from-video.c b/src/blind-from-video.c | |
@@ -75,7 +75,7 @@ get_metadata(char *file, size_t *width, size_t *height) | |
do {\ | |
typedef TYPE pixel_t[4];\ | |
size_t i, ptr;\ | |
- TYPE y, u, v, max = (TYPE)UINT16_MAX;\ | |
+ TYPE y, u, v, max = (TYPE)UINT16_MAX, ymax = (TYPE)0xDAF4;\ | |
TYPE r, g, b;\ | |
pixel_t pixels[1024];\ | |
uint16_t *pix;\ | |
@@ -83,9 +83,9 @@ get_metadata(char *file, size_t *width, size_t *height) | |
for (ptr = i = 0; ptr < n; ptr += 8) {\ | |
pix = (uint16_t *)(buf + ptr);\ | |
pixels[i][3] = 1;\ | |
- y = (TYPE)((long int)(le16toh(pix[1])) - 16L … | |
- u = (TYPE)((long int)(le16toh(pix[2])) - 128L … | |
- v = (TYPE)((long int)(le16toh(pix[3])) - 128L … | |
+ y = (TYPE)((long int)(le16toh(pix[1])) - 0x100… | |
+ u = (TYPE)((long int)(le16toh(pix[2])) - 0x800… | |
+ v = (TYPE)((long int)(le16toh(pix[3])) - 0x800… | |
scaled_yuv_to_ciexyz(y, u, v, pixels[i] + 0,\ | |
pixels[i] + 1, pixels[i] … | |
if (++i == 1024) {\ | |
@@ -97,9 +97,9 @@ get_metadata(char *file, size_t *width, size_t *height) | |
for (ptr = i = 0; ptr < n; ptr += 8) {\ | |
pix = (uint16_t *)(buf + ptr);\ | |
pixels[i][3] = le16toh(pix[0]) / max;\ | |
- y = (TYPE)((long int)le16toh(pix[1]) - 16L * … | |
- u = (TYPE)((long int)le16toh(pix[2]) - 128L * … | |
- v = (TYPE)((long int)le16toh(pix[3]) - 128L * … | |
+ y = (TYPE)((long int)le16toh(pix[1]) - 0x1001L… | |
+ u = (TYPE)((long int)le16toh(pix[2]) - 0x8000L… | |
+ v = (TYPE)((long int)le16toh(pix[3]) - 0x8000L… | |
yuv_to_srgb(y, u, v, &r, &g, &b);\ | |
r = srgb_decode(r);\ | |
g = srgb_decode(g);\ | |
diff --git a/src/blind-to-video.c b/src/blind-to-video.c | |
@@ -99,9 +99,9 @@ PROCESS(struct stream *stream, size_t n) | |
for (ptr = 0; ptr < n; ptr += 4 * sizeof(TYPE)) { | |
pixel = (TYPE *)(buf + ptr); | |
ciexyz_to_scaled_yuv(pixel[0], pixel[1], pixel[2], &r,… | |
- y = (long int)r + 16L * 256L; | |
- u = (long int)g + 128L * 256L; | |
- v = (long int)b + 128L * 256L; | |
+ y = (long int)r + 0x1001L; | |
+ u = (long int)g + 0x8000L; | |
+ v = (long int)b + 0x8000L; | |
*pixels++ = 0xFFFFU; | |
*pixels++ = htole((uint16_t)CLIP(0, y, 0xFFFFL)); | |
*pixels++ = htole((uint16_t)CLIP(0, u, 0xFFFFL)); | |
@@ -118,9 +118,9 @@ PROCESS(struct stream *stream, size_t n) | |
g = srgb_encode(g); | |
b = srgb_encode(b); | |
srgb_to_yuv(r, g, b, pixel + 0, pixel + 1, pixel + 2); | |
- y = (long int)(pixel[0] * 0xFFFFL) + 16L * 256L; | |
- u = (long int)(pixel[1] * 0xFFFFL) + 128L * 256L; | |
- v = (long int)(pixel[2] * 0xFFFFL) + 128L * 256L; | |
+ y = (long int)(pixel[0] * 0xDAF4L) + 0x1001L; | |
+ u = (long int)(pixel[1] * 0xFFFFL) + 0x8000L; | |
+ v = (long int)(pixel[2] * 0xFFFFL) + 0x8000L; | |
*pixels++ = htole((uint16_t)CLIP(0, a, 0xFFFFL)); | |
*pixels++ = htole((uint16_t)CLIP(0, y, 0xFFFFL)); | |
*pixels++ = htole((uint16_t)CLIP(0, u, 0xFFFFL)); | |
diff --git a/src/util/colour.h b/src/util/colour.h | |
@@ -99,20 +99,20 @@ MATRIX_MULTIPLY_FUNCTIONS(srgb_to_ciexyz, | |
0.950302838552371742508739771438) | |
MATRIX_MULTIPLY_FUNCTIONS(scaled_yuv_to_ciexyz, | |
- 0.0000145032510666709863215648179668448847223771736… | |
+ 0.0000145032510666709863215648179668448847223771736… | |
0.0000034558679063934273909322863332915787282217934… | |
0.0000040092339863055289348511139868591612867021467… | |
- 0.0000152590218966964183704062424373759654372406657… | |
+ 0.0000152590218966964183704062424373759654372406657… | |
-0.0000020772281440939065361454742703051223884358478… | |
-0.0000026389860769230541030240782401916632693428255… | |
- 0.0000166144615304170882542564302575271995010552927… | |
+ 0.0000166144615304170882542564302575271995010552927… | |
0.0000288592575261911806914962713710437469671887811… | |
-0.0000007178108687576917952650134256697977974681634… | |
MATRIX_MULTIPLY_FUNCTIONS(ciexyz_to_scaled_yuv, | |
- 26625.38231027395886485464870929718017578125, | |
- 40524.0090949436053051613271236419677734375, | |
- -271.5313105642117079696618020534515380859375, | |
+ 26625.38231027395886485464870929718017578125 * 0… | |
+ 40524.0090949436053051613271236419677734375 * 0… | |
+ -271.5313105642117079696618020534515380859375 * 0… | |
-11278.3751445417292416095733642578125, | |
-26409.91773157499847002327442169189453125, | |
34100.5706543184860493056476116180419921875, |