Skip to content
Snippets Groups Projects

Front-end Additions and Fixes for Cava

Merged Aaron Councilman requested to merge juno_cava into main
12 files
+ 1273
531
Compare changes
  • Side-by-side
  • Inline
Files
12
@@ -52,7 +52,7 @@ fn descale<row : usize, col : usize>(input : f32[CHAN, row, col]) -> u8[CHAN, ro
for chan = 0 to CHAN {
for r = 0 to row {
for c = 0 to col {
res[chan, r, c] = min(max(input[chan, r, c] * 255, 0), 255) as u8;
res[chan, r, c] = min::<f32>(max::<f32>(input[chan, r, c] * 255, 0), 255) as u8;
}
}
}
@@ -66,10 +66,10 @@ fn demosaic<row : usize, col : usize>(input : f32[CHAN, row, col]) -> f32[CHAN,
for r = 1 to row-1 {
for c = 1 to col-1 {
if r % 2 == 0 && col % 2 == 0 {
let R1 : f32 = input[0, r, c-1];
let R2 : f32 = input[0, r, c+1];
let B1 : f32 = input[2, r-1, c];
let B2 : f32 = input[2, r+1, c];
let R1 = input[0, r, c-1];
let R2 = input[0, r, c+1];
let B1 = input[2, r-1, c];
let B2 = input[2, r+1, c];
res[0, r, c] = (R1 + R2) / 2;
res[1, r, c] = input[1, r, c] * 2;
res[2, r, c] = (B1 + B2) / 2;
@@ -125,7 +125,7 @@ fn denoise<row : usize, col : usize>(input : f32[CHAN, row, col]) -> f32[CHAN, r
filter[i+1, j+1] = input[chan, r + i, c + j];
}
}
result[chan, r, c] = medianMatrix(filter);
res[chan, r, c] = medianMatrix::<f32, 3, 3>(filter);
} else {
res[chan, r, c] = input[chan, r, c];
}
@@ -144,9 +144,11 @@ fn transform<row : usize, col : usize>
for chan = 0 to CHAN {
for r = 0 to row {
for c = 0 to col {
result[chan, r, c] = max(input[0, r, c] * tstw_trans[0, chan]
+ input[1, r, c] * tstw_trans[1, chan]
+ input[2, r, c] * tstw_trans[2, chan], 0);
result[chan, r, c] = max::<f32>(
input[0, r, c] * tstw_trans[0, chan]
+ input[1, r, c] * tstw_trans[1, chan]
+ input[2, r, c] * tstw_trans[2, chan]
, 0);
}
}
}
@@ -163,11 +165,11 @@ fn gamut<row : usize, col : usize>
for r = 0 to row {
for c = 0 to col {
for cp = 0 to CTRL_PTS {
let v1 : f32 = input[0, r, c] - ctrl_pts[cp, 0];
let v2 : f32 = input[1, r, c] - ctrl_pts[cp, 1];
let v3 : f32 = input[2, r, c] - ctrl_pts[cp, 2];
let v : f32 = v1 * v1 + v2 * v2 + v3 * v3;
l2_dist[cp] = math::sqrt(v); // NOTE: Somehow some libraries will likely have to be external
let v1 = input[0, r, c] - ctrl_pts[cp, 0];
let v2 = input[1, r, c] - ctrl_pts[cp, 1];
let v3 = input[2, r, c] - ctrl_pts[cp, 2];
let v = v1 * v1 + v2 * v2 + v3 * v3;
l2_dist[cp] = sqrt!::<f32>(v);
}
for chan = 0 to CHAN {
@@ -179,7 +181,7 @@ fn gamut<row : usize, col : usize>
chan_val += coefs[0, chan] + coefs[1, chan] * input[0, r, c]
+ coefs[2, chan] * input[1, r, c]
+ coefs[3, chan] * input[2, r, c];
result[chan, row, col] = max(chan_val, 0);
result[chan, row, col] = max::<f32>(chan_val, 0);
}
}
}
@@ -195,7 +197,7 @@ fn tone_map<row : usize, col:usize>
for r = 0 to row {
for c = 0 to col {
let x = (input[chan, r, c] * 255) as u8;
result[chan, r, c] = tone_map[x, chan];
result[chan, r, c] = tone_map[x as usize, chan];
}
}
}
@@ -205,14 +207,14 @@ fn tone_map<row : usize, col:usize>
fn cava<r, c : usize>(input : u8[CHAN, r, c], TsTw : f32[CHAN, CHAN],
ctrl_pts : f32[CTRL_PTS, CHAN],
weights : f32[CTRl_PTHS, CHAN],
coefs : f32[4, CHAN], tone_map : f32[255, CHAN])
-> u8[CHAN, row, col] {
weights : f32[CTRL_PTS, CHAN],
coefs : f32[4, CHAN], tonemap : f32[255, CHAN])
-> u8[CHAN, r, c] {
let scaled = scale::<r, c>(input);
let demosc = demosaic::<r, c>(scaled);
let denosd = denoise::<r, c>(demosc);
let transf = transform::<r, c>(denosd, TsTw);
let gamutd = gamut::<r, c>(transf, ctrl_pts, weights, coefs);
let tonemd = tone_map::<r, c>(gamutd, tone_map);
let tonemd = tone_map::<r, c>(gamutd, tonemap);
return descale::<r, c>(tonemd);
}
Loading