From a69b4089f5e88444e03c7dda282f5edda38705fd Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Thu, 1 Jan 2015 17:06:48 +0100 Subject: [PATCH] WIP: replaced linear with much more flexible circular buffer --- app/src/main/rs/blur.rsh | 1 + app/src/main/rs/blur_generated.rsh | 1111 ++++++++++++++-------------- app/src/main/rs/constants.rsh | 2 + app/src/main/rs/decoder.rs | 96 +-- app/src/main/rs/initialization.rsh | 6 +- app/src/main/rs/modes.rsh | 45 +- app/src/main/rs/state.rsh | 6 +- utils/blur.c | 15 +- 8 files changed, 630 insertions(+), 652 deletions(-) diff --git a/app/src/main/rs/blur.rsh b/app/src/main/rs/blur.rsh index 8e6f6da..c0a81d3 100644 --- a/app/src/main/rs/blur.rsh +++ b/app/src/main/rs/blur.rsh @@ -18,6 +18,7 @@ limitations under the License. #define BLUR_RSH #include "exports.rsh" +#include "state.rsh" #include "blur_generated.rsh" void incr_blur() diff --git a/app/src/main/rs/blur_generated.rsh b/app/src/main/rs/blur_generated.rsh index 178e53b..a7afb4d 100644 --- a/app/src/main/rs/blur_generated.rsh +++ b/app/src/main/rs/blur_generated.rsh @@ -1,23 +1,24 @@ /* code generated by 'utils/blur.c' */ static uchar value_blur(int pixel, int begin, int end) { - int i = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin; + int p = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin; + int i = p & buffer_mask; int weight_sum = 0; int value_sum = 0; switch (blur_power) { case 0: - if ((i-1) < begin || end <= (i+1)) { - if (begin <= (i-1)) { + if ((p-1) < begin || end <= (p+1) || (i-1) < 0 || buffer_length <= (i+1)) { + if (begin <= (p-1)) { weight_sum += 217; - value_sum += 217 * value_buffer[i-1]; + value_sum += 217 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 19608; - value_sum += 19608 * value_buffer[i+0]; + value_sum += 19608 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 217; - value_sum += 217 * value_buffer[i+1]; + value_sum += 217 * value_buffer[(i+1)&buffer_mask]; } return value_sum / weight_sum; } @@ -25,34 +26,34 @@ static uchar value_blur(int pixel, int begin, int end) 16027 * value_buffer[i+0] + 178 * value_buffer[i+1]) >> 14; case 1: - if ((i-3) < begin || end <= (i+3)) { - if (begin <= (i-3)) { + if ((p-3) < begin || end <= (p+3) || (i-3) < 0 || buffer_length <= (i+3)) { + if (begin <= (p-3)) { weight_sum += 72; - value_sum += 72 * value_buffer[i-3]; + value_sum += 72 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 884; - value_sum += 884 * value_buffer[i-2]; + value_sum += 884 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 3964; - value_sum += 3964 * value_buffer[i-1]; + value_sum += 3964 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 6536; - value_sum += 6536 * value_buffer[i+0]; + value_sum += 6536 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 3964; - value_sum += 3964 * value_buffer[i+1]; + value_sum += 3964 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 884; - value_sum += 884 * value_buffer[i+2]; + value_sum += 884 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 72; - value_sum += 72 * value_buffer[i+3]; + value_sum += 72 * value_buffer[(i+3)&buffer_mask]; } return value_sum / weight_sum; } @@ -64,50 +65,50 @@ static uchar value_blur(int pixel, int begin, int end) 884 * value_buffer[i+2] + 72 * value_buffer[i+3]) >> 14; case 2: - if ((i-5) < begin || end <= (i+5)) { - if (begin <= (i-5)) { + if ((p-5) < begin || end <= (p+5) || (i-5) < 0 || buffer_length <= (i+5)) { + if (begin <= (p-5)) { weight_sum += 43; - value_sum += 43 * value_buffer[i-5]; + value_sum += 43 * value_buffer[(i-5)&buffer_mask]; } - if (begin <= (i-4)) { + if (begin <= (p-4)) { weight_sum += 220; - value_sum += 220 * value_buffer[i-4]; + value_sum += 220 * value_buffer[(i-4)&buffer_mask]; } - if (begin <= (i-3)) { + if (begin <= (p-3)) { weight_sum += 776; - value_sum += 776 * value_buffer[i-3]; + value_sum += 776 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 1908; - value_sum += 1908 * value_buffer[i-2]; + value_sum += 1908 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 3275; - value_sum += 3275 * value_buffer[i-1]; + value_sum += 3275 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 3921; - value_sum += 3921 * value_buffer[i+0]; + value_sum += 3921 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 3275; - value_sum += 3275 * value_buffer[i+1]; + value_sum += 3275 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 1908; - value_sum += 1908 * value_buffer[i+2]; + value_sum += 1908 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 776; - value_sum += 776 * value_buffer[i+3]; + value_sum += 776 * value_buffer[(i+3)&buffer_mask]; } - if ((i+4) < end) { + if ((p+4) < end) { weight_sum += 220; - value_sum += 220 * value_buffer[i+4]; + value_sum += 220 * value_buffer[(i+4)&buffer_mask]; } - if ((i+5) < end) { + if ((p+5) < end) { weight_sum += 43; - value_sum += 43 * value_buffer[i+5]; + value_sum += 43 * value_buffer[(i+5)&buffer_mask]; } return value_sum / weight_sum; } @@ -123,82 +124,82 @@ static uchar value_blur(int pixel, int begin, int end) 220 * value_buffer[i+4] + 43 * value_buffer[i+5]) >> 14; case 3: - if ((i-9) < begin || end <= (i+9)) { - if (begin <= (i-9)) { + if ((p-9) < begin || end <= (p+9) || (i-9) < 0 || buffer_length <= (i+9)) { + if (begin <= (p-9)) { weight_sum += 24; - value_sum += 24 * value_buffer[i-9]; + value_sum += 24 * value_buffer[(i-9)&buffer_mask]; } - if (begin <= (i-8)) { + if (begin <= (p-8)) { weight_sum += 62; - value_sum += 62 * value_buffer[i-8]; + value_sum += 62 * value_buffer[(i-8)&buffer_mask]; } - if (begin <= (i-7)) { + if (begin <= (p-7)) { weight_sum += 143; - value_sum += 143 * value_buffer[i-7]; + value_sum += 143 * value_buffer[(i-7)&buffer_mask]; } - if (begin <= (i-6)) { + if (begin <= (p-6)) { weight_sum += 294; - value_sum += 294 * value_buffer[i-6]; + value_sum += 294 * value_buffer[(i-6)&buffer_mask]; } - if (begin <= (i-5)) { + if (begin <= (p-5)) { weight_sum += 543; - value_sum += 543 * value_buffer[i-5]; + value_sum += 543 * value_buffer[(i-5)&buffer_mask]; } - if (begin <= (i-4)) { + if (begin <= (p-4)) { weight_sum += 895; - value_sum += 895 * value_buffer[i-4]; + value_sum += 895 * value_buffer[(i-4)&buffer_mask]; } - if (begin <= (i-3)) { + if (begin <= (p-3)) { weight_sum += 1321; - value_sum += 1321 * value_buffer[i-3]; + value_sum += 1321 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 1744; - value_sum += 1744 * value_buffer[i-2]; + value_sum += 1744 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 2061; - value_sum += 2061 * value_buffer[i-1]; + value_sum += 2061 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 2178; - value_sum += 2178 * value_buffer[i+0]; + value_sum += 2178 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 2061; - value_sum += 2061 * value_buffer[i+1]; + value_sum += 2061 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 1744; - value_sum += 1744 * value_buffer[i+2]; + value_sum += 1744 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 1321; - value_sum += 1321 * value_buffer[i+3]; + value_sum += 1321 * value_buffer[(i+3)&buffer_mask]; } - if ((i+4) < end) { + if ((p+4) < end) { weight_sum += 895; - value_sum += 895 * value_buffer[i+4]; + value_sum += 895 * value_buffer[(i+4)&buffer_mask]; } - if ((i+5) < end) { + if ((p+5) < end) { weight_sum += 543; - value_sum += 543 * value_buffer[i+5]; + value_sum += 543 * value_buffer[(i+5)&buffer_mask]; } - if ((i+6) < end) { + if ((p+6) < end) { weight_sum += 294; - value_sum += 294 * value_buffer[i+6]; + value_sum += 294 * value_buffer[(i+6)&buffer_mask]; } - if ((i+7) < end) { + if ((p+7) < end) { weight_sum += 143; - value_sum += 143 * value_buffer[i+7]; + value_sum += 143 * value_buffer[(i+7)&buffer_mask]; } - if ((i+8) < end) { + if ((p+8) < end) { weight_sum += 62; - value_sum += 62 * value_buffer[i+8]; + value_sum += 62 * value_buffer[(i+8)&buffer_mask]; } - if ((i+9) < end) { + if ((p+9) < end) { weight_sum += 24; - value_sum += 24 * value_buffer[i+9]; + value_sum += 24 * value_buffer[(i+9)&buffer_mask]; } return value_sum / weight_sum; } @@ -222,146 +223,146 @@ static uchar value_blur(int pixel, int begin, int end) 62 * value_buffer[i+8] + 24 * value_buffer[i+9]) >> 14; case 4: - if ((i-17) < begin || end <= (i+17)) { - if (begin <= (i-17)) { + if ((p-17) < begin || end <= (p+17) || (i-17) < 0 || buffer_length <= (i+17)) { + if (begin <= (p-17)) { weight_sum += 12; - value_sum += 12 * value_buffer[i-17]; + value_sum += 12 * value_buffer[(i-17)&buffer_mask]; } - if (begin <= (i-16)) { + if (begin <= (p-16)) { weight_sum += 21; - value_sum += 21 * value_buffer[i-16]; + value_sum += 21 * value_buffer[(i-16)&buffer_mask]; } - if (begin <= (i-15)) { + if (begin <= (p-15)) { weight_sum += 34; - value_sum += 34 * value_buffer[i-15]; + value_sum += 34 * value_buffer[(i-15)&buffer_mask]; } - if (begin <= (i-14)) { + if (begin <= (p-14)) { weight_sum += 54; - value_sum += 54 * value_buffer[i-14]; + value_sum += 54 * value_buffer[(i-14)&buffer_mask]; } - if (begin <= (i-13)) { + if (begin <= (p-13)) { weight_sum += 83; - value_sum += 83 * value_buffer[i-13]; + value_sum += 83 * value_buffer[(i-13)&buffer_mask]; } - if (begin <= (i-12)) { + if (begin <= (p-12)) { weight_sum += 122; - value_sum += 122 * value_buffer[i-12]; + value_sum += 122 * value_buffer[(i-12)&buffer_mask]; } - if (begin <= (i-11)) { + if (begin <= (p-11)) { weight_sum += 175; - value_sum += 175 * value_buffer[i-11]; + value_sum += 175 * value_buffer[(i-11)&buffer_mask]; } - if (begin <= (i-10)) { + if (begin <= (p-10)) { weight_sum += 243; - value_sum += 243 * value_buffer[i-10]; + value_sum += 243 * value_buffer[(i-10)&buffer_mask]; } - if (begin <= (i-9)) { + if (begin <= (p-9)) { weight_sum += 326; - value_sum += 326 * value_buffer[i-9]; + value_sum += 326 * value_buffer[(i-9)&buffer_mask]; } - if (begin <= (i-8)) { + if (begin <= (p-8)) { weight_sum += 425; - value_sum += 425 * value_buffer[i-8]; + value_sum += 425 * value_buffer[(i-8)&buffer_mask]; } - if (begin <= (i-7)) { + if (begin <= (p-7)) { weight_sum += 537; - value_sum += 537 * value_buffer[i-7]; + value_sum += 537 * value_buffer[(i-7)&buffer_mask]; } - if (begin <= (i-6)) { + if (begin <= (p-6)) { weight_sum += 658; - value_sum += 658 * value_buffer[i-6]; + value_sum += 658 * value_buffer[(i-6)&buffer_mask]; } - if (begin <= (i-5)) { + if (begin <= (p-5)) { weight_sum += 781; - value_sum += 781 * value_buffer[i-5]; + value_sum += 781 * value_buffer[(i-5)&buffer_mask]; } - if (begin <= (i-4)) { + if (begin <= (p-4)) { weight_sum += 899; - value_sum += 899 * value_buffer[i-4]; + value_sum += 899 * value_buffer[(i-4)&buffer_mask]; } - if (begin <= (i-3)) { + if (begin <= (p-3)) { weight_sum += 1002; - value_sum += 1002 * value_buffer[i-3]; + value_sum += 1002 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 1083; - value_sum += 1083 * value_buffer[i-2]; + value_sum += 1083 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 1135; - value_sum += 1135 * value_buffer[i-1]; + value_sum += 1135 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 1153; - value_sum += 1153 * value_buffer[i+0]; + value_sum += 1153 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 1135; - value_sum += 1135 * value_buffer[i+1]; + value_sum += 1135 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 1083; - value_sum += 1083 * value_buffer[i+2]; + value_sum += 1083 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 1002; - value_sum += 1002 * value_buffer[i+3]; + value_sum += 1002 * value_buffer[(i+3)&buffer_mask]; } - if ((i+4) < end) { + if ((p+4) < end) { weight_sum += 899; - value_sum += 899 * value_buffer[i+4]; + value_sum += 899 * value_buffer[(i+4)&buffer_mask]; } - if ((i+5) < end) { + if ((p+5) < end) { weight_sum += 781; - value_sum += 781 * value_buffer[i+5]; + value_sum += 781 * value_buffer[(i+5)&buffer_mask]; } - if ((i+6) < end) { + if ((p+6) < end) { weight_sum += 658; - value_sum += 658 * value_buffer[i+6]; + value_sum += 658 * value_buffer[(i+6)&buffer_mask]; } - if ((i+7) < end) { + if ((p+7) < end) { weight_sum += 537; - value_sum += 537 * value_buffer[i+7]; + value_sum += 537 * value_buffer[(i+7)&buffer_mask]; } - if ((i+8) < end) { + if ((p+8) < end) { weight_sum += 425; - value_sum += 425 * value_buffer[i+8]; + value_sum += 425 * value_buffer[(i+8)&buffer_mask]; } - if ((i+9) < end) { + if ((p+9) < end) { weight_sum += 326; - value_sum += 326 * value_buffer[i+9]; + value_sum += 326 * value_buffer[(i+9)&buffer_mask]; } - if ((i+10) < end) { + if ((p+10) < end) { weight_sum += 243; - value_sum += 243 * value_buffer[i+10]; + value_sum += 243 * value_buffer[(i+10)&buffer_mask]; } - if ((i+11) < end) { + if ((p+11) < end) { weight_sum += 175; - value_sum += 175 * value_buffer[i+11]; + value_sum += 175 * value_buffer[(i+11)&buffer_mask]; } - if ((i+12) < end) { + if ((p+12) < end) { weight_sum += 122; - value_sum += 122 * value_buffer[i+12]; + value_sum += 122 * value_buffer[(i+12)&buffer_mask]; } - if ((i+13) < end) { + if ((p+13) < end) { weight_sum += 83; - value_sum += 83 * value_buffer[i+13]; + value_sum += 83 * value_buffer[(i+13)&buffer_mask]; } - if ((i+14) < end) { + if ((p+14) < end) { weight_sum += 54; - value_sum += 54 * value_buffer[i+14]; + value_sum += 54 * value_buffer[(i+14)&buffer_mask]; } - if ((i+15) < end) { + if ((p+15) < end) { weight_sum += 34; - value_sum += 34 * value_buffer[i+15]; + value_sum += 34 * value_buffer[(i+15)&buffer_mask]; } - if ((i+16) < end) { + if ((p+16) < end) { weight_sum += 21; - value_sum += 21 * value_buffer[i+16]; + value_sum += 21 * value_buffer[(i+16)&buffer_mask]; } - if ((i+17) < end) { + if ((p+17) < end) { weight_sum += 12; - value_sum += 12 * value_buffer[i+17]; + value_sum += 12 * value_buffer[(i+17)&buffer_mask]; } return value_sum / weight_sum; } @@ -401,274 +402,274 @@ static uchar value_blur(int pixel, int begin, int end) 21 * value_buffer[i+16] + 12 * value_buffer[i+17]) >> 14; case 5: - if ((i-33) < begin || end <= (i+33)) { - if (begin <= (i-33)) { + if ((p-33) < begin || end <= (p+33) || (i-33) < 0 || buffer_length <= (i+33)) { + if (begin <= (p-33)) { weight_sum += 6; - value_sum += 6 * value_buffer[i-33]; + value_sum += 6 * value_buffer[(i-33)&buffer_mask]; } - if (begin <= (i-32)) { + if (begin <= (p-32)) { weight_sum += 8; - value_sum += 8 * value_buffer[i-32]; + value_sum += 8 * value_buffer[(i-32)&buffer_mask]; } - if (begin <= (i-31)) { + if (begin <= (p-31)) { weight_sum += 11; - value_sum += 11 * value_buffer[i-31]; + value_sum += 11 * value_buffer[(i-31)&buffer_mask]; } - if (begin <= (i-30)) { + if (begin <= (p-30)) { weight_sum += 14; - value_sum += 14 * value_buffer[i-30]; + value_sum += 14 * value_buffer[(i-30)&buffer_mask]; } - if (begin <= (i-29)) { + if (begin <= (p-29)) { weight_sum += 18; - value_sum += 18 * value_buffer[i-29]; + value_sum += 18 * value_buffer[(i-29)&buffer_mask]; } - if (begin <= (i-28)) { + if (begin <= (p-28)) { weight_sum += 23; - value_sum += 23 * value_buffer[i-28]; + value_sum += 23 * value_buffer[(i-28)&buffer_mask]; } - if (begin <= (i-27)) { + if (begin <= (p-27)) { weight_sum += 29; - value_sum += 29 * value_buffer[i-27]; + value_sum += 29 * value_buffer[(i-27)&buffer_mask]; } - if (begin <= (i-26)) { + if (begin <= (p-26)) { weight_sum += 36; - value_sum += 36 * value_buffer[i-26]; + value_sum += 36 * value_buffer[(i-26)&buffer_mask]; } - if (begin <= (i-25)) { + if (begin <= (p-25)) { weight_sum += 44; - value_sum += 44 * value_buffer[i-25]; + value_sum += 44 * value_buffer[(i-25)&buffer_mask]; } - if (begin <= (i-24)) { + if (begin <= (p-24)) { weight_sum += 54; - value_sum += 54 * value_buffer[i-24]; + value_sum += 54 * value_buffer[(i-24)&buffer_mask]; } - if (begin <= (i-23)) { + if (begin <= (p-23)) { weight_sum += 66; - value_sum += 66 * value_buffer[i-23]; + value_sum += 66 * value_buffer[(i-23)&buffer_mask]; } - if (begin <= (i-22)) { + if (begin <= (p-22)) { weight_sum += 80; - value_sum += 80 * value_buffer[i-22]; + value_sum += 80 * value_buffer[(i-22)&buffer_mask]; } - if (begin <= (i-21)) { + if (begin <= (p-21)) { weight_sum += 96; - value_sum += 96 * value_buffer[i-21]; + value_sum += 96 * value_buffer[(i-21)&buffer_mask]; } - if (begin <= (i-20)) { + if (begin <= (p-20)) { weight_sum += 113; - value_sum += 113 * value_buffer[i-20]; + value_sum += 113 * value_buffer[(i-20)&buffer_mask]; } - if (begin <= (i-19)) { + if (begin <= (p-19)) { weight_sum += 133; - value_sum += 133 * value_buffer[i-19]; + value_sum += 133 * value_buffer[(i-19)&buffer_mask]; } - if (begin <= (i-18)) { + if (begin <= (p-18)) { weight_sum += 155; - value_sum += 155 * value_buffer[i-18]; + value_sum += 155 * value_buffer[(i-18)&buffer_mask]; } - if (begin <= (i-17)) { + if (begin <= (p-17)) { weight_sum += 180; - value_sum += 180 * value_buffer[i-17]; + value_sum += 180 * value_buffer[(i-17)&buffer_mask]; } - if (begin <= (i-16)) { + if (begin <= (p-16)) { weight_sum += 206; - value_sum += 206 * value_buffer[i-16]; + value_sum += 206 * value_buffer[(i-16)&buffer_mask]; } - if (begin <= (i-15)) { + if (begin <= (p-15)) { weight_sum += 234; - value_sum += 234 * value_buffer[i-15]; + value_sum += 234 * value_buffer[(i-15)&buffer_mask]; } - if (begin <= (i-14)) { + if (begin <= (p-14)) { weight_sum += 264; - value_sum += 264 * value_buffer[i-14]; + value_sum += 264 * value_buffer[(i-14)&buffer_mask]; } - if (begin <= (i-13)) { + if (begin <= (p-13)) { weight_sum += 295; - value_sum += 295 * value_buffer[i-13]; + value_sum += 295 * value_buffer[(i-13)&buffer_mask]; } - if (begin <= (i-12)) { + if (begin <= (p-12)) { weight_sum += 327; - value_sum += 327 * value_buffer[i-12]; + value_sum += 327 * value_buffer[(i-12)&buffer_mask]; } - if (begin <= (i-11)) { + if (begin <= (p-11)) { weight_sum += 360; - value_sum += 360 * value_buffer[i-11]; + value_sum += 360 * value_buffer[(i-11)&buffer_mask]; } - if (begin <= (i-10)) { + if (begin <= (p-10)) { weight_sum += 393; - value_sum += 393 * value_buffer[i-10]; + value_sum += 393 * value_buffer[(i-10)&buffer_mask]; } - if (begin <= (i-9)) { + if (begin <= (p-9)) { weight_sum += 425; - value_sum += 425 * value_buffer[i-9]; + value_sum += 425 * value_buffer[(i-9)&buffer_mask]; } - if (begin <= (i-8)) { + if (begin <= (p-8)) { weight_sum += 456; - value_sum += 456 * value_buffer[i-8]; + value_sum += 456 * value_buffer[(i-8)&buffer_mask]; } - if (begin <= (i-7)) { + if (begin <= (p-7)) { weight_sum += 485; - value_sum += 485 * value_buffer[i-7]; + value_sum += 485 * value_buffer[(i-7)&buffer_mask]; } - if (begin <= (i-6)) { + if (begin <= (p-6)) { weight_sum += 512; - value_sum += 512 * value_buffer[i-6]; + value_sum += 512 * value_buffer[(i-6)&buffer_mask]; } - if (begin <= (i-5)) { + if (begin <= (p-5)) { weight_sum += 535; - value_sum += 535 * value_buffer[i-5]; + value_sum += 535 * value_buffer[(i-5)&buffer_mask]; } - if (begin <= (i-4)) { + if (begin <= (p-4)) { weight_sum += 556; - value_sum += 556 * value_buffer[i-4]; + value_sum += 556 * value_buffer[(i-4)&buffer_mask]; } - if (begin <= (i-3)) { + if (begin <= (p-3)) { weight_sum += 572; - value_sum += 572 * value_buffer[i-3]; + value_sum += 572 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 584; - value_sum += 584 * value_buffer[i-2]; + value_sum += 584 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 591; - value_sum += 591 * value_buffer[i-1]; + value_sum += 591 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 594; - value_sum += 594 * value_buffer[i+0]; + value_sum += 594 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 591; - value_sum += 591 * value_buffer[i+1]; + value_sum += 591 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 584; - value_sum += 584 * value_buffer[i+2]; + value_sum += 584 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 572; - value_sum += 572 * value_buffer[i+3]; + value_sum += 572 * value_buffer[(i+3)&buffer_mask]; } - if ((i+4) < end) { + if ((p+4) < end) { weight_sum += 556; - value_sum += 556 * value_buffer[i+4]; + value_sum += 556 * value_buffer[(i+4)&buffer_mask]; } - if ((i+5) < end) { + if ((p+5) < end) { weight_sum += 535; - value_sum += 535 * value_buffer[i+5]; + value_sum += 535 * value_buffer[(i+5)&buffer_mask]; } - if ((i+6) < end) { + if ((p+6) < end) { weight_sum += 512; - value_sum += 512 * value_buffer[i+6]; + value_sum += 512 * value_buffer[(i+6)&buffer_mask]; } - if ((i+7) < end) { + if ((p+7) < end) { weight_sum += 485; - value_sum += 485 * value_buffer[i+7]; + value_sum += 485 * value_buffer[(i+7)&buffer_mask]; } - if ((i+8) < end) { + if ((p+8) < end) { weight_sum += 456; - value_sum += 456 * value_buffer[i+8]; + value_sum += 456 * value_buffer[(i+8)&buffer_mask]; } - if ((i+9) < end) { + if ((p+9) < end) { weight_sum += 425; - value_sum += 425 * value_buffer[i+9]; + value_sum += 425 * value_buffer[(i+9)&buffer_mask]; } - if ((i+10) < end) { + if ((p+10) < end) { weight_sum += 393; - value_sum += 393 * value_buffer[i+10]; + value_sum += 393 * value_buffer[(i+10)&buffer_mask]; } - if ((i+11) < end) { + if ((p+11) < end) { weight_sum += 360; - value_sum += 360 * value_buffer[i+11]; + value_sum += 360 * value_buffer[(i+11)&buffer_mask]; } - if ((i+12) < end) { + if ((p+12) < end) { weight_sum += 327; - value_sum += 327 * value_buffer[i+12]; + value_sum += 327 * value_buffer[(i+12)&buffer_mask]; } - if ((i+13) < end) { + if ((p+13) < end) { weight_sum += 295; - value_sum += 295 * value_buffer[i+13]; + value_sum += 295 * value_buffer[(i+13)&buffer_mask]; } - if ((i+14) < end) { + if ((p+14) < end) { weight_sum += 264; - value_sum += 264 * value_buffer[i+14]; + value_sum += 264 * value_buffer[(i+14)&buffer_mask]; } - if ((i+15) < end) { + if ((p+15) < end) { weight_sum += 234; - value_sum += 234 * value_buffer[i+15]; + value_sum += 234 * value_buffer[(i+15)&buffer_mask]; } - if ((i+16) < end) { + if ((p+16) < end) { weight_sum += 206; - value_sum += 206 * value_buffer[i+16]; + value_sum += 206 * value_buffer[(i+16)&buffer_mask]; } - if ((i+17) < end) { + if ((p+17) < end) { weight_sum += 180; - value_sum += 180 * value_buffer[i+17]; + value_sum += 180 * value_buffer[(i+17)&buffer_mask]; } - if ((i+18) < end) { + if ((p+18) < end) { weight_sum += 155; - value_sum += 155 * value_buffer[i+18]; + value_sum += 155 * value_buffer[(i+18)&buffer_mask]; } - if ((i+19) < end) { + if ((p+19) < end) { weight_sum += 133; - value_sum += 133 * value_buffer[i+19]; + value_sum += 133 * value_buffer[(i+19)&buffer_mask]; } - if ((i+20) < end) { + if ((p+20) < end) { weight_sum += 113; - value_sum += 113 * value_buffer[i+20]; + value_sum += 113 * value_buffer[(i+20)&buffer_mask]; } - if ((i+21) < end) { + if ((p+21) < end) { weight_sum += 96; - value_sum += 96 * value_buffer[i+21]; + value_sum += 96 * value_buffer[(i+21)&buffer_mask]; } - if ((i+22) < end) { + if ((p+22) < end) { weight_sum += 80; - value_sum += 80 * value_buffer[i+22]; + value_sum += 80 * value_buffer[(i+22)&buffer_mask]; } - if ((i+23) < end) { + if ((p+23) < end) { weight_sum += 66; - value_sum += 66 * value_buffer[i+23]; + value_sum += 66 * value_buffer[(i+23)&buffer_mask]; } - if ((i+24) < end) { + if ((p+24) < end) { weight_sum += 54; - value_sum += 54 * value_buffer[i+24]; + value_sum += 54 * value_buffer[(i+24)&buffer_mask]; } - if ((i+25) < end) { + if ((p+25) < end) { weight_sum += 44; - value_sum += 44 * value_buffer[i+25]; + value_sum += 44 * value_buffer[(i+25)&buffer_mask]; } - if ((i+26) < end) { + if ((p+26) < end) { weight_sum += 36; - value_sum += 36 * value_buffer[i+26]; + value_sum += 36 * value_buffer[(i+26)&buffer_mask]; } - if ((i+27) < end) { + if ((p+27) < end) { weight_sum += 29; - value_sum += 29 * value_buffer[i+27]; + value_sum += 29 * value_buffer[(i+27)&buffer_mask]; } - if ((i+28) < end) { + if ((p+28) < end) { weight_sum += 23; - value_sum += 23 * value_buffer[i+28]; + value_sum += 23 * value_buffer[(i+28)&buffer_mask]; } - if ((i+29) < end) { + if ((p+29) < end) { weight_sum += 18; - value_sum += 18 * value_buffer[i+29]; + value_sum += 18 * value_buffer[(i+29)&buffer_mask]; } - if ((i+30) < end) { + if ((p+30) < end) { weight_sum += 14; - value_sum += 14 * value_buffer[i+30]; + value_sum += 14 * value_buffer[(i+30)&buffer_mask]; } - if ((i+31) < end) { + if ((p+31) < end) { weight_sum += 11; - value_sum += 11 * value_buffer[i+31]; + value_sum += 11 * value_buffer[(i+31)&buffer_mask]; } - if ((i+32) < end) { + if ((p+32) < end) { weight_sum += 8; - value_sum += 8 * value_buffer[i+32]; + value_sum += 8 * value_buffer[(i+32)&buffer_mask]; } - if ((i+33) < end) { + if ((p+33) < end) { weight_sum += 6; - value_sum += 6 * value_buffer[i+33]; + value_sum += 6 * value_buffer[(i+33)&buffer_mask]; } return value_sum / weight_sum; } @@ -740,530 +741,530 @@ static uchar value_blur(int pixel, int begin, int end) 8 * value_buffer[i+32] + 6 * value_buffer[i+33]) >> 14; case 6: - if ((i-65) < begin || end <= (i+65)) { - if (begin <= (i-65)) { + if ((p-65) < begin || end <= (p+65) || (i-65) < 0 || buffer_length <= (i+65)) { + if (begin <= (p-65)) { weight_sum += 3; - value_sum += 3 * value_buffer[i-65]; + value_sum += 3 * value_buffer[(i-65)&buffer_mask]; } - if (begin <= (i-64)) { + if (begin <= (p-64)) { weight_sum += 3; - value_sum += 3 * value_buffer[i-64]; + value_sum += 3 * value_buffer[(i-64)&buffer_mask]; } - if (begin <= (i-63)) { + if (begin <= (p-63)) { weight_sum += 4; - value_sum += 4 * value_buffer[i-63]; + value_sum += 4 * value_buffer[(i-63)&buffer_mask]; } - if (begin <= (i-62)) { + if (begin <= (p-62)) { weight_sum += 5; - value_sum += 5 * value_buffer[i-62]; + value_sum += 5 * value_buffer[(i-62)&buffer_mask]; } - if (begin <= (i-61)) { + if (begin <= (p-61)) { weight_sum += 5; - value_sum += 5 * value_buffer[i-61]; + value_sum += 5 * value_buffer[(i-61)&buffer_mask]; } - if (begin <= (i-60)) { + if (begin <= (p-60)) { weight_sum += 6; - value_sum += 6 * value_buffer[i-60]; + value_sum += 6 * value_buffer[(i-60)&buffer_mask]; } - if (begin <= (i-59)) { + if (begin <= (p-59)) { weight_sum += 7; - value_sum += 7 * value_buffer[i-59]; + value_sum += 7 * value_buffer[(i-59)&buffer_mask]; } - if (begin <= (i-58)) { + if (begin <= (p-58)) { weight_sum += 8; - value_sum += 8 * value_buffer[i-58]; + value_sum += 8 * value_buffer[(i-58)&buffer_mask]; } - if (begin <= (i-57)) { + if (begin <= (p-57)) { weight_sum += 9; - value_sum += 9 * value_buffer[i-57]; + value_sum += 9 * value_buffer[(i-57)&buffer_mask]; } - if (begin <= (i-56)) { + if (begin <= (p-56)) { weight_sum += 10; - value_sum += 10 * value_buffer[i-56]; + value_sum += 10 * value_buffer[(i-56)&buffer_mask]; } - if (begin <= (i-55)) { + if (begin <= (p-55)) { weight_sum += 12; - value_sum += 12 * value_buffer[i-55]; + value_sum += 12 * value_buffer[(i-55)&buffer_mask]; } - if (begin <= (i-54)) { + if (begin <= (p-54)) { weight_sum += 13; - value_sum += 13 * value_buffer[i-54]; + value_sum += 13 * value_buffer[(i-54)&buffer_mask]; } - if (begin <= (i-53)) { + if (begin <= (p-53)) { weight_sum += 15; - value_sum += 15 * value_buffer[i-53]; + value_sum += 15 * value_buffer[(i-53)&buffer_mask]; } - if (begin <= (i-52)) { + if (begin <= (p-52)) { weight_sum += 16; - value_sum += 16 * value_buffer[i-52]; + value_sum += 16 * value_buffer[(i-52)&buffer_mask]; } - if (begin <= (i-51)) { + if (begin <= (p-51)) { weight_sum += 18; - value_sum += 18 * value_buffer[i-51]; + value_sum += 18 * value_buffer[(i-51)&buffer_mask]; } - if (begin <= (i-50)) { + if (begin <= (p-50)) { weight_sum += 21; - value_sum += 21 * value_buffer[i-50]; + value_sum += 21 * value_buffer[(i-50)&buffer_mask]; } - if (begin <= (i-49)) { + if (begin <= (p-49)) { weight_sum += 23; - value_sum += 23 * value_buffer[i-49]; + value_sum += 23 * value_buffer[(i-49)&buffer_mask]; } - if (begin <= (i-48)) { + if (begin <= (p-48)) { weight_sum += 25; - value_sum += 25 * value_buffer[i-48]; + value_sum += 25 * value_buffer[(i-48)&buffer_mask]; } - if (begin <= (i-47)) { + if (begin <= (p-47)) { weight_sum += 28; - value_sum += 28 * value_buffer[i-47]; + value_sum += 28 * value_buffer[(i-47)&buffer_mask]; } - if (begin <= (i-46)) { + if (begin <= (p-46)) { weight_sum += 31; - value_sum += 31 * value_buffer[i-46]; + value_sum += 31 * value_buffer[(i-46)&buffer_mask]; } - if (begin <= (i-45)) { + if (begin <= (p-45)) { weight_sum += 34; - value_sum += 34 * value_buffer[i-45]; + value_sum += 34 * value_buffer[(i-45)&buffer_mask]; } - if (begin <= (i-44)) { + if (begin <= (p-44)) { weight_sum += 38; - value_sum += 38 * value_buffer[i-44]; + value_sum += 38 * value_buffer[(i-44)&buffer_mask]; } - if (begin <= (i-43)) { + if (begin <= (p-43)) { weight_sum += 42; - value_sum += 42 * value_buffer[i-43]; + value_sum += 42 * value_buffer[(i-43)&buffer_mask]; } - if (begin <= (i-42)) { + if (begin <= (p-42)) { weight_sum += 46; - value_sum += 46 * value_buffer[i-42]; + value_sum += 46 * value_buffer[(i-42)&buffer_mask]; } - if (begin <= (i-41)) { + if (begin <= (p-41)) { weight_sum += 50; - value_sum += 50 * value_buffer[i-41]; + value_sum += 50 * value_buffer[(i-41)&buffer_mask]; } - if (begin <= (i-40)) { + if (begin <= (p-40)) { weight_sum += 54; - value_sum += 54 * value_buffer[i-40]; + value_sum += 54 * value_buffer[(i-40)&buffer_mask]; } - if (begin <= (i-39)) { + if (begin <= (p-39)) { weight_sum += 59; - value_sum += 59 * value_buffer[i-39]; + value_sum += 59 * value_buffer[(i-39)&buffer_mask]; } - if (begin <= (i-38)) { + if (begin <= (p-38)) { weight_sum += 64; - value_sum += 64 * value_buffer[i-38]; + value_sum += 64 * value_buffer[(i-38)&buffer_mask]; } - if (begin <= (i-37)) { + if (begin <= (p-37)) { weight_sum += 70; - value_sum += 70 * value_buffer[i-37]; + value_sum += 70 * value_buffer[(i-37)&buffer_mask]; } - if (begin <= (i-36)) { + if (begin <= (p-36)) { weight_sum += 75; - value_sum += 75 * value_buffer[i-36]; + value_sum += 75 * value_buffer[(i-36)&buffer_mask]; } - if (begin <= (i-35)) { + if (begin <= (p-35)) { weight_sum += 81; - value_sum += 81 * value_buffer[i-35]; + value_sum += 81 * value_buffer[(i-35)&buffer_mask]; } - if (begin <= (i-34)) { + if (begin <= (p-34)) { weight_sum += 88; - value_sum += 88 * value_buffer[i-34]; + value_sum += 88 * value_buffer[(i-34)&buffer_mask]; } - if (begin <= (i-33)) { + if (begin <= (p-33)) { weight_sum += 94; - value_sum += 94 * value_buffer[i-33]; + value_sum += 94 * value_buffer[(i-33)&buffer_mask]; } - if (begin <= (i-32)) { + if (begin <= (p-32)) { weight_sum += 101; - value_sum += 101 * value_buffer[i-32]; + value_sum += 101 * value_buffer[(i-32)&buffer_mask]; } - if (begin <= (i-31)) { + if (begin <= (p-31)) { weight_sum += 108; - value_sum += 108 * value_buffer[i-31]; + value_sum += 108 * value_buffer[(i-31)&buffer_mask]; } - if (begin <= (i-30)) { + if (begin <= (p-30)) { weight_sum += 115; - value_sum += 115 * value_buffer[i-30]; + value_sum += 115 * value_buffer[(i-30)&buffer_mask]; } - if (begin <= (i-29)) { + if (begin <= (p-29)) { weight_sum += 123; - value_sum += 123 * value_buffer[i-29]; + value_sum += 123 * value_buffer[(i-29)&buffer_mask]; } - if (begin <= (i-28)) { + if (begin <= (p-28)) { weight_sum += 130; - value_sum += 130 * value_buffer[i-28]; + value_sum += 130 * value_buffer[(i-28)&buffer_mask]; } - if (begin <= (i-27)) { + if (begin <= (p-27)) { weight_sum += 138; - value_sum += 138 * value_buffer[i-27]; + value_sum += 138 * value_buffer[(i-27)&buffer_mask]; } - if (begin <= (i-26)) { + if (begin <= (p-26)) { weight_sum += 146; - value_sum += 146 * value_buffer[i-26]; + value_sum += 146 * value_buffer[(i-26)&buffer_mask]; } - if (begin <= (i-25)) { + if (begin <= (p-25)) { weight_sum += 155; - value_sum += 155 * value_buffer[i-25]; + value_sum += 155 * value_buffer[(i-25)&buffer_mask]; } - if (begin <= (i-24)) { + if (begin <= (p-24)) { weight_sum += 163; - value_sum += 163 * value_buffer[i-24]; + value_sum += 163 * value_buffer[(i-24)&buffer_mask]; } - if (begin <= (i-23)) { + if (begin <= (p-23)) { weight_sum += 171; - value_sum += 171 * value_buffer[i-23]; + value_sum += 171 * value_buffer[(i-23)&buffer_mask]; } - if (begin <= (i-22)) { + if (begin <= (p-22)) { weight_sum += 180; - value_sum += 180 * value_buffer[i-22]; + value_sum += 180 * value_buffer[(i-22)&buffer_mask]; } - if (begin <= (i-21)) { + if (begin <= (p-21)) { weight_sum += 188; - value_sum += 188 * value_buffer[i-21]; + value_sum += 188 * value_buffer[(i-21)&buffer_mask]; } - if (begin <= (i-20)) { + if (begin <= (p-20)) { weight_sum += 197; - value_sum += 197 * value_buffer[i-20]; + value_sum += 197 * value_buffer[(i-20)&buffer_mask]; } - if (begin <= (i-19)) { + if (begin <= (p-19)) { weight_sum += 205; - value_sum += 205 * value_buffer[i-19]; + value_sum += 205 * value_buffer[(i-19)&buffer_mask]; } - if (begin <= (i-18)) { + if (begin <= (p-18)) { weight_sum += 213; - value_sum += 213 * value_buffer[i-18]; + value_sum += 213 * value_buffer[(i-18)&buffer_mask]; } - if (begin <= (i-17)) { + if (begin <= (p-17)) { weight_sum += 221; - value_sum += 221 * value_buffer[i-17]; + value_sum += 221 * value_buffer[(i-17)&buffer_mask]; } - if (begin <= (i-16)) { + if (begin <= (p-16)) { weight_sum += 229; - value_sum += 229 * value_buffer[i-16]; + value_sum += 229 * value_buffer[(i-16)&buffer_mask]; } - if (begin <= (i-15)) { + if (begin <= (p-15)) { weight_sum += 237; - value_sum += 237 * value_buffer[i-15]; + value_sum += 237 * value_buffer[(i-15)&buffer_mask]; } - if (begin <= (i-14)) { + if (begin <= (p-14)) { weight_sum += 244; - value_sum += 244 * value_buffer[i-14]; + value_sum += 244 * value_buffer[(i-14)&buffer_mask]; } - if (begin <= (i-13)) { + if (begin <= (p-13)) { weight_sum += 251; - value_sum += 251 * value_buffer[i-13]; + value_sum += 251 * value_buffer[(i-13)&buffer_mask]; } - if (begin <= (i-12)) { + if (begin <= (p-12)) { weight_sum += 258; - value_sum += 258 * value_buffer[i-12]; + value_sum += 258 * value_buffer[(i-12)&buffer_mask]; } - if (begin <= (i-11)) { + if (begin <= (p-11)) { weight_sum += 265; - value_sum += 265 * value_buffer[i-11]; + value_sum += 265 * value_buffer[(i-11)&buffer_mask]; } - if (begin <= (i-10)) { + if (begin <= (p-10)) { weight_sum += 271; - value_sum += 271 * value_buffer[i-10]; + value_sum += 271 * value_buffer[(i-10)&buffer_mask]; } - if (begin <= (i-9)) { + if (begin <= (p-9)) { weight_sum += 276; - value_sum += 276 * value_buffer[i-9]; + value_sum += 276 * value_buffer[(i-9)&buffer_mask]; } - if (begin <= (i-8)) { + if (begin <= (p-8)) { weight_sum += 281; - value_sum += 281 * value_buffer[i-8]; + value_sum += 281 * value_buffer[(i-8)&buffer_mask]; } - if (begin <= (i-7)) { + if (begin <= (p-7)) { weight_sum += 286; - value_sum += 286 * value_buffer[i-7]; + value_sum += 286 * value_buffer[(i-7)&buffer_mask]; } - if (begin <= (i-6)) { + if (begin <= (p-6)) { weight_sum += 290; - value_sum += 290 * value_buffer[i-6]; + value_sum += 290 * value_buffer[(i-6)&buffer_mask]; } - if (begin <= (i-5)) { + if (begin <= (p-5)) { weight_sum += 293; - value_sum += 293 * value_buffer[i-5]; + value_sum += 293 * value_buffer[(i-5)&buffer_mask]; } - if (begin <= (i-4)) { + if (begin <= (p-4)) { weight_sum += 296; - value_sum += 296 * value_buffer[i-4]; + value_sum += 296 * value_buffer[(i-4)&buffer_mask]; } - if (begin <= (i-3)) { + if (begin <= (p-3)) { weight_sum += 298; - value_sum += 298 * value_buffer[i-3]; + value_sum += 298 * value_buffer[(i-3)&buffer_mask]; } - if (begin <= (i-2)) { + if (begin <= (p-2)) { weight_sum += 300; - value_sum += 300 * value_buffer[i-2]; + value_sum += 300 * value_buffer[(i-2)&buffer_mask]; } - if (begin <= (i-1)) { + if (begin <= (p-1)) { weight_sum += 301; - value_sum += 301 * value_buffer[i-1]; + value_sum += 301 * value_buffer[(i-1)&buffer_mask]; } - if ((i+0) < end) { + if ((p+0) < end) { weight_sum += 301; - value_sum += 301 * value_buffer[i+0]; + value_sum += 301 * value_buffer[(i+0)&buffer_mask]; } - if ((i+1) < end) { + if ((p+1) < end) { weight_sum += 301; - value_sum += 301 * value_buffer[i+1]; + value_sum += 301 * value_buffer[(i+1)&buffer_mask]; } - if ((i+2) < end) { + if ((p+2) < end) { weight_sum += 300; - value_sum += 300 * value_buffer[i+2]; + value_sum += 300 * value_buffer[(i+2)&buffer_mask]; } - if ((i+3) < end) { + if ((p+3) < end) { weight_sum += 298; - value_sum += 298 * value_buffer[i+3]; + value_sum += 298 * value_buffer[(i+3)&buffer_mask]; } - if ((i+4) < end) { + if ((p+4) < end) { weight_sum += 296; - value_sum += 296 * value_buffer[i+4]; + value_sum += 296 * value_buffer[(i+4)&buffer_mask]; } - if ((i+5) < end) { + if ((p+5) < end) { weight_sum += 293; - value_sum += 293 * value_buffer[i+5]; + value_sum += 293 * value_buffer[(i+5)&buffer_mask]; } - if ((i+6) < end) { + if ((p+6) < end) { weight_sum += 290; - value_sum += 290 * value_buffer[i+6]; + value_sum += 290 * value_buffer[(i+6)&buffer_mask]; } - if ((i+7) < end) { + if ((p+7) < end) { weight_sum += 286; - value_sum += 286 * value_buffer[i+7]; + value_sum += 286 * value_buffer[(i+7)&buffer_mask]; } - if ((i+8) < end) { + if ((p+8) < end) { weight_sum += 281; - value_sum += 281 * value_buffer[i+8]; + value_sum += 281 * value_buffer[(i+8)&buffer_mask]; } - if ((i+9) < end) { + if ((p+9) < end) { weight_sum += 276; - value_sum += 276 * value_buffer[i+9]; + value_sum += 276 * value_buffer[(i+9)&buffer_mask]; } - if ((i+10) < end) { + if ((p+10) < end) { weight_sum += 271; - value_sum += 271 * value_buffer[i+10]; + value_sum += 271 * value_buffer[(i+10)&buffer_mask]; } - if ((i+11) < end) { + if ((p+11) < end) { weight_sum += 265; - value_sum += 265 * value_buffer[i+11]; + value_sum += 265 * value_buffer[(i+11)&buffer_mask]; } - if ((i+12) < end) { + if ((p+12) < end) { weight_sum += 258; - value_sum += 258 * value_buffer[i+12]; + value_sum += 258 * value_buffer[(i+12)&buffer_mask]; } - if ((i+13) < end) { + if ((p+13) < end) { weight_sum += 251; - value_sum += 251 * value_buffer[i+13]; + value_sum += 251 * value_buffer[(i+13)&buffer_mask]; } - if ((i+14) < end) { + if ((p+14) < end) { weight_sum += 244; - value_sum += 244 * value_buffer[i+14]; + value_sum += 244 * value_buffer[(i+14)&buffer_mask]; } - if ((i+15) < end) { + if ((p+15) < end) { weight_sum += 237; - value_sum += 237 * value_buffer[i+15]; + value_sum += 237 * value_buffer[(i+15)&buffer_mask]; } - if ((i+16) < end) { + if ((p+16) < end) { weight_sum += 229; - value_sum += 229 * value_buffer[i+16]; + value_sum += 229 * value_buffer[(i+16)&buffer_mask]; } - if ((i+17) < end) { + if ((p+17) < end) { weight_sum += 221; - value_sum += 221 * value_buffer[i+17]; + value_sum += 221 * value_buffer[(i+17)&buffer_mask]; } - if ((i+18) < end) { + if ((p+18) < end) { weight_sum += 213; - value_sum += 213 * value_buffer[i+18]; + value_sum += 213 * value_buffer[(i+18)&buffer_mask]; } - if ((i+19) < end) { + if ((p+19) < end) { weight_sum += 205; - value_sum += 205 * value_buffer[i+19]; + value_sum += 205 * value_buffer[(i+19)&buffer_mask]; } - if ((i+20) < end) { + if ((p+20) < end) { weight_sum += 197; - value_sum += 197 * value_buffer[i+20]; + value_sum += 197 * value_buffer[(i+20)&buffer_mask]; } - if ((i+21) < end) { + if ((p+21) < end) { weight_sum += 188; - value_sum += 188 * value_buffer[i+21]; + value_sum += 188 * value_buffer[(i+21)&buffer_mask]; } - if ((i+22) < end) { + if ((p+22) < end) { weight_sum += 180; - value_sum += 180 * value_buffer[i+22]; + value_sum += 180 * value_buffer[(i+22)&buffer_mask]; } - if ((i+23) < end) { + if ((p+23) < end) { weight_sum += 171; - value_sum += 171 * value_buffer[i+23]; + value_sum += 171 * value_buffer[(i+23)&buffer_mask]; } - if ((i+24) < end) { + if ((p+24) < end) { weight_sum += 163; - value_sum += 163 * value_buffer[i+24]; + value_sum += 163 * value_buffer[(i+24)&buffer_mask]; } - if ((i+25) < end) { + if ((p+25) < end) { weight_sum += 155; - value_sum += 155 * value_buffer[i+25]; + value_sum += 155 * value_buffer[(i+25)&buffer_mask]; } - if ((i+26) < end) { + if ((p+26) < end) { weight_sum += 146; - value_sum += 146 * value_buffer[i+26]; + value_sum += 146 * value_buffer[(i+26)&buffer_mask]; } - if ((i+27) < end) { + if ((p+27) < end) { weight_sum += 138; - value_sum += 138 * value_buffer[i+27]; + value_sum += 138 * value_buffer[(i+27)&buffer_mask]; } - if ((i+28) < end) { + if ((p+28) < end) { weight_sum += 130; - value_sum += 130 * value_buffer[i+28]; + value_sum += 130 * value_buffer[(i+28)&buffer_mask]; } - if ((i+29) < end) { + if ((p+29) < end) { weight_sum += 123; - value_sum += 123 * value_buffer[i+29]; + value_sum += 123 * value_buffer[(i+29)&buffer_mask]; } - if ((i+30) < end) { + if ((p+30) < end) { weight_sum += 115; - value_sum += 115 * value_buffer[i+30]; + value_sum += 115 * value_buffer[(i+30)&buffer_mask]; } - if ((i+31) < end) { + if ((p+31) < end) { weight_sum += 108; - value_sum += 108 * value_buffer[i+31]; + value_sum += 108 * value_buffer[(i+31)&buffer_mask]; } - if ((i+32) < end) { + if ((p+32) < end) { weight_sum += 101; - value_sum += 101 * value_buffer[i+32]; + value_sum += 101 * value_buffer[(i+32)&buffer_mask]; } - if ((i+33) < end) { + if ((p+33) < end) { weight_sum += 94; - value_sum += 94 * value_buffer[i+33]; + value_sum += 94 * value_buffer[(i+33)&buffer_mask]; } - if ((i+34) < end) { + if ((p+34) < end) { weight_sum += 88; - value_sum += 88 * value_buffer[i+34]; + value_sum += 88 * value_buffer[(i+34)&buffer_mask]; } - if ((i+35) < end) { + if ((p+35) < end) { weight_sum += 81; - value_sum += 81 * value_buffer[i+35]; + value_sum += 81 * value_buffer[(i+35)&buffer_mask]; } - if ((i+36) < end) { + if ((p+36) < end) { weight_sum += 75; - value_sum += 75 * value_buffer[i+36]; + value_sum += 75 * value_buffer[(i+36)&buffer_mask]; } - if ((i+37) < end) { + if ((p+37) < end) { weight_sum += 70; - value_sum += 70 * value_buffer[i+37]; + value_sum += 70 * value_buffer[(i+37)&buffer_mask]; } - if ((i+38) < end) { + if ((p+38) < end) { weight_sum += 64; - value_sum += 64 * value_buffer[i+38]; + value_sum += 64 * value_buffer[(i+38)&buffer_mask]; } - if ((i+39) < end) { + if ((p+39) < end) { weight_sum += 59; - value_sum += 59 * value_buffer[i+39]; + value_sum += 59 * value_buffer[(i+39)&buffer_mask]; } - if ((i+40) < end) { + if ((p+40) < end) { weight_sum += 54; - value_sum += 54 * value_buffer[i+40]; + value_sum += 54 * value_buffer[(i+40)&buffer_mask]; } - if ((i+41) < end) { + if ((p+41) < end) { weight_sum += 50; - value_sum += 50 * value_buffer[i+41]; + value_sum += 50 * value_buffer[(i+41)&buffer_mask]; } - if ((i+42) < end) { + if ((p+42) < end) { weight_sum += 46; - value_sum += 46 * value_buffer[i+42]; + value_sum += 46 * value_buffer[(i+42)&buffer_mask]; } - if ((i+43) < end) { + if ((p+43) < end) { weight_sum += 42; - value_sum += 42 * value_buffer[i+43]; + value_sum += 42 * value_buffer[(i+43)&buffer_mask]; } - if ((i+44) < end) { + if ((p+44) < end) { weight_sum += 38; - value_sum += 38 * value_buffer[i+44]; + value_sum += 38 * value_buffer[(i+44)&buffer_mask]; } - if ((i+45) < end) { + if ((p+45) < end) { weight_sum += 34; - value_sum += 34 * value_buffer[i+45]; + value_sum += 34 * value_buffer[(i+45)&buffer_mask]; } - if ((i+46) < end) { + if ((p+46) < end) { weight_sum += 31; - value_sum += 31 * value_buffer[i+46]; + value_sum += 31 * value_buffer[(i+46)&buffer_mask]; } - if ((i+47) < end) { + if ((p+47) < end) { weight_sum += 28; - value_sum += 28 * value_buffer[i+47]; + value_sum += 28 * value_buffer[(i+47)&buffer_mask]; } - if ((i+48) < end) { + if ((p+48) < end) { weight_sum += 25; - value_sum += 25 * value_buffer[i+48]; + value_sum += 25 * value_buffer[(i+48)&buffer_mask]; } - if ((i+49) < end) { + if ((p+49) < end) { weight_sum += 23; - value_sum += 23 * value_buffer[i+49]; + value_sum += 23 * value_buffer[(i+49)&buffer_mask]; } - if ((i+50) < end) { + if ((p+50) < end) { weight_sum += 21; - value_sum += 21 * value_buffer[i+50]; + value_sum += 21 * value_buffer[(i+50)&buffer_mask]; } - if ((i+51) < end) { + if ((p+51) < end) { weight_sum += 18; - value_sum += 18 * value_buffer[i+51]; + value_sum += 18 * value_buffer[(i+51)&buffer_mask]; } - if ((i+52) < end) { + if ((p+52) < end) { weight_sum += 16; - value_sum += 16 * value_buffer[i+52]; + value_sum += 16 * value_buffer[(i+52)&buffer_mask]; } - if ((i+53) < end) { + if ((p+53) < end) { weight_sum += 15; - value_sum += 15 * value_buffer[i+53]; + value_sum += 15 * value_buffer[(i+53)&buffer_mask]; } - if ((i+54) < end) { + if ((p+54) < end) { weight_sum += 13; - value_sum += 13 * value_buffer[i+54]; + value_sum += 13 * value_buffer[(i+54)&buffer_mask]; } - if ((i+55) < end) { + if ((p+55) < end) { weight_sum += 12; - value_sum += 12 * value_buffer[i+55]; + value_sum += 12 * value_buffer[(i+55)&buffer_mask]; } - if ((i+56) < end) { + if ((p+56) < end) { weight_sum += 10; - value_sum += 10 * value_buffer[i+56]; + value_sum += 10 * value_buffer[(i+56)&buffer_mask]; } - if ((i+57) < end) { + if ((p+57) < end) { weight_sum += 9; - value_sum += 9 * value_buffer[i+57]; + value_sum += 9 * value_buffer[(i+57)&buffer_mask]; } - if ((i+58) < end) { + if ((p+58) < end) { weight_sum += 8; - value_sum += 8 * value_buffer[i+58]; + value_sum += 8 * value_buffer[(i+58)&buffer_mask]; } - if ((i+59) < end) { + if ((p+59) < end) { weight_sum += 7; - value_sum += 7 * value_buffer[i+59]; + value_sum += 7 * value_buffer[(i+59)&buffer_mask]; } - if ((i+60) < end) { + if ((p+60) < end) { weight_sum += 6; - value_sum += 6 * value_buffer[i+60]; + value_sum += 6 * value_buffer[(i+60)&buffer_mask]; } - if ((i+61) < end) { + if ((p+61) < end) { weight_sum += 5; - value_sum += 5 * value_buffer[i+61]; + value_sum += 5 * value_buffer[(i+61)&buffer_mask]; } - if ((i+62) < end) { + if ((p+62) < end) { weight_sum += 5; - value_sum += 5 * value_buffer[i+62]; + value_sum += 5 * value_buffer[(i+62)&buffer_mask]; } - if ((i+63) < end) { + if ((p+63) < end) { weight_sum += 4; - value_sum += 4 * value_buffer[i+63]; + value_sum += 4 * value_buffer[(i+63)&buffer_mask]; } - if ((i+64) < end) { + if ((p+64) < end) { weight_sum += 3; - value_sum += 3 * value_buffer[i+64]; + value_sum += 3 * value_buffer[(i+64)&buffer_mask]; } - if ((i+65) < end) { + if ((p+65) < end) { weight_sum += 3; - value_sum += 3 * value_buffer[i+65]; + value_sum += 3 * value_buffer[(i+65)&buffer_mask]; } return value_sum / weight_sum; } @@ -1399,8 +1400,6 @@ static uchar value_blur(int pixel, int begin, int end) 3 * value_buffer[i+64] + 3 * value_buffer[i+65]) >> 14; default: - if (i < begin || end <= i) - return 0; return value_buffer[i]; } return 0; diff --git a/app/src/main/rs/constants.rsh b/app/src/main/rs/constants.rsh index d139a54..2c8b45c 100644 --- a/app/src/main/rs/constants.rsh +++ b/app/src/main/rs/constants.rsh @@ -33,6 +33,8 @@ static const int mode_scottie2 = 6; static const int mode_scottieDX = 7; static const int mode_wrasseSC2_180 = 8; + +static const float sync_buildup_seconds = 0.0011f; static const float robot36_scanline_seconds = 0.15f; static const float robot72_scanline_seconds = 0.3f; static const float martin1_scanline_seconds = 0.446446f; diff --git a/app/src/main/rs/decoder.rs b/app/src/main/rs/decoder.rs index 7bb1770..3e60a3b 100644 --- a/app/src/main/rs/decoder.rs +++ b/app/src/main/rs/decoder.rs @@ -41,7 +41,8 @@ static void reset_buffer() { vpos = 0; hpos = 0; - prev_hpos = 0; + prev_sync_pos = sync_pos = 0; + buffer_pos = 0; seperator_counter = 0; sync_counter = sync_length; buffer_cleared = 1; @@ -69,103 +70,66 @@ static void robot36_decoder() if ((free_running && mismatch_counter > 1) || mismatch_counter > 5) vpos ^= 1; prev_timeout = hpos >= maximum_length; + static int even_sync_pos, odd_sync_pos; if (vpos & 1) { + odd_sync_pos = prev_sync_pos; for (int i = 0; i < bitmap_width; ++i) { - uchar even_y = value_blur(i, y_begin, y_end); - uchar v = value_blur(i, v_begin, v_end); - uchar odd_y = value_blur(i, prev_hpos + y_begin, prev_hpos + y_end); - uchar u = value_blur(i, prev_hpos + u_begin, prev_hpos + u_end); + uchar even_y = value_blur(i, even_sync_pos + y_begin, even_sync_pos + y_end); + uchar v = value_blur(i, even_sync_pos + v_begin, even_sync_pos + v_end); + uchar odd_y = value_blur(i, odd_sync_pos + y_begin, odd_sync_pos + y_end); + uchar u = value_blur(i, odd_sync_pos + u_begin, odd_sync_pos + u_end); pixel_buffer[bitmap_width * (vpos-1) + i] = yuv(even_y, u, v); pixel_buffer[bitmap_width * vpos + i] = yuv(odd_y, u, v); } - if (prev_timeout) - hpos -= scanline_length; - else - hpos = 0; - prev_hpos = 0; } else { - if (prev_timeout) { - prev_hpos = scanline_length; - hpos -= scanline_length; - } else { - prev_hpos = hpos; - hpos = 0; - } + even_sync_pos = prev_sync_pos; } - ++vpos; } static void yuv_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar y = value_blur(i, y_begin, y_end); - uchar u = value_blur(i, u_begin, u_end); - uchar v = value_blur(i, v_begin, v_end); + uchar y = value_blur(i, y_begin + prev_sync_pos, y_end + prev_sync_pos); + uchar u = value_blur(i, u_begin + prev_sync_pos, u_end + prev_sync_pos); + uchar v = value_blur(i, v_begin + prev_sync_pos, v_end + prev_sync_pos); pixel_buffer[bitmap_width * vpos + i] = yuv(y, u, v); } - if (hpos >= maximum_length) - hpos -= scanline_length; - else - hpos = 0; - prev_hpos = 0; - ++vpos; } static void rgb_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar r = value_blur(i, r_begin, r_end); - uchar g = value_blur(i, g_begin, g_end); - uchar b = value_blur(i, b_begin, b_end); + uchar r = value_blur(i, r_begin + prev_sync_pos, r_end + prev_sync_pos); + uchar g = value_blur(i, g_begin + prev_sync_pos, g_end + prev_sync_pos); + uchar b = value_blur(i, b_begin + prev_sync_pos, b_end + prev_sync_pos); pixel_buffer[bitmap_width * vpos + i] = rgb(r, g, b); } - if (hpos >= maximum_length) - hpos -= scanline_length; - else - hpos = 0; - prev_hpos = 0; - ++vpos; } static void raw_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar value = value_blur(i, 0, hpos); + uchar value = value_blur(i, prev_sync_pos, sync_pos); pixel_buffer[bitmap_width * vpos + i] = rgb(value, value, value); } - prev_hpos = hpos = 0; - ++vpos; } // don't you guys have anything better to do? static void scottie_decoder() { - if (!prev_hpos) { - for (int i = g_begin; i < g_end; ++i) - value_buffer[i + b_begin - g_begin] = value_buffer[i]; - for (int i = r_begin; i < r_end; ++i) - value_buffer[i + g_begin - r_begin] = value_buffer[i]; - prev_hpos = scanline_length; - hpos = 0; + static int first_sync = 1; + if (!free_running && !vpos && first_sync) { + first_sync = 0; return; } - for (int i = 0; i < bitmap_width; ++i) { - uchar r = value_blur(i, prev_hpos + r_begin, prev_hpos + r_end); - uchar g = value_blur(i, g_begin, g_end); - uchar b = value_blur(i, b_begin, b_end); - pixel_buffer[bitmap_width * vpos + i] = rgb(r, g, b); - } - for (int i = 0; i < scanline_length; ++i) - value_buffer[i] = value_buffer[i + prev_hpos]; - prev_hpos = scanline_length; - hpos = 0; - ++vpos; + first_sync = 1; + rgb_decoder(); } void decode(int samples) { *saved_width = 0; *saved_height = 0; - for (int sample = 0; sample < samples; ++sample) { + for (int sample = 0; sample < samples; ++sample, ++buffer_pos) { float amp = audio_buffer[sample] / 32768.0f; float power = amp * amp; if (filter(&avg_power, power) < 0.0000001f) @@ -184,7 +148,7 @@ void decode(int samples) { int dat_active = cnt_amp < 2.0f * dat_amp; uchar cnt_level = save_cnt && cnt_active ? 127.5f - 127.5f * cnt_value : 0.0f; uchar dat_level = save_dat && dat_active ? 127.5f + 127.5f * dat_value : 0.0f; - value_buffer[hpos + prev_hpos] = cnt_level | dat_level; + value_buffer[buffer_pos & buffer_mask] = cnt_level | dat_level; int cnt_quantized = round(cnt_value); int dat_quantized = round(dat_value); @@ -192,6 +156,10 @@ void decode(int samples) { int sync_level = cnt_active && cnt_quantized == 0; int sync_pulse = !sync_level && sync_counter >= sync_length; sync_counter = sync_level ? sync_counter + 1 : 0; + if (sync_pulse) { + prev_sync_pos = sync_pos; + sync_pos = buffer_pos - sync_buildup_length; + } if (*current_mode != mode_debug) { int detected_mode = calibration_detector(dat_value, dat_amp, cnt_amp, cnt_quantized); @@ -214,8 +182,7 @@ void decode(int samples) { if (++hpos >= maximum_length || sync_pulse) { if (hpos < minimum_length) { - hpos = 0; - prev_hpos = 0; + hpos = buffer_pos - sync_pos; seperator_counter = 0; continue; } @@ -235,6 +202,13 @@ void decode(int samples) { default: raw_decoder(); } + if (hpos >= maximum_length) { + hpos -= scanline_length; + sync_pos = prev_sync_pos + scanline_length; + } else { + hpos = buffer_pos - sync_pos; + } + ++vpos; if (vpos == bitmap_height) save_buffer(); if (vpos >= maximum_height) diff --git a/app/src/main/rs/initialization.rsh b/app/src/main/rs/initialization.rsh index 21f2a2d..3a3317a 100644 --- a/app/src/main/rs/initialization.rsh +++ b/app/src/main/rs/initialization.rsh @@ -25,6 +25,7 @@ void initialize(float rate, int length, int width, int height) { sample_rate = rate; buffer_length = length; + buffer_mask = length - 1; maximum_width = width; maximum_height = height; @@ -32,13 +33,16 @@ void initialize(float rate, int length, int width, int height) pixel_buffer[i] = 0; vpos = 0; - prev_hpos = hpos = 0; + hpos = 0; + prev_sync_pos = sync_pos = 0; + buffer_pos = 0; sync_counter = 0; seperator_counter = 0; buffer_cleared = 0; free_running = 1; minimum_length = 0.05f * sample_rate; minimum_sync_length = 0.002f * sample_rate; + sync_buildup_length = sync_buildup_seconds * sample_rate; robot36_scanline_length = robot36_scanline_seconds * sample_rate; robot72_scanline_length = robot72_scanline_seconds * sample_rate; diff --git a/app/src/main/rs/modes.rsh b/app/src/main/rs/modes.rsh index 60d0a97..be17003 100644 --- a/app/src/main/rs/modes.rsh +++ b/app/src/main/rs/modes.rsh @@ -70,7 +70,6 @@ void robot36_mode() bitmap_width = 320; bitmap_height = 240; const float tolerance = 0.8f; - const float settling_time = 0.0011f; const float sync_seconds = 0.009f; const float sync_porch_seconds = 0.003f; const float sep_porch_seconds = 0.0015f; @@ -79,7 +78,7 @@ void robot36_mode() const float seperator_seconds = 0.0045f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - y_begin = (sync_porch_seconds - settling_time) * sample_rate; + y_begin = sync_porch_seconds * sample_rate; y_end = y_begin + y_scan_seconds * sample_rate; u_sep_begin = v_sep_begin = y_end; u_sep_end = v_sep_end = u_sep_begin + seperator_seconds * sample_rate; @@ -98,7 +97,6 @@ void robot72_mode() bitmap_width = 320; bitmap_height = 240; const float tolerance = 0.8f; - const float settling_time = 0.0011f; const float sync_seconds = 0.009f; const float sync_porch_seconds = 0.003f; const float sep_porch_seconds = 0.0015f; @@ -107,7 +105,7 @@ void robot72_mode() const float seperator_seconds = 0.0045f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - y_begin = (sync_porch_seconds - settling_time) * sample_rate; + y_begin = sync_porch_seconds * sample_rate; y_end = y_begin + y_scan_seconds * sample_rate; v_sep_begin = y_end; v_sep_end = v_sep_begin + seperator_seconds * sample_rate; @@ -138,7 +136,7 @@ void martin1_mode() const float seperator_seconds = 0.000572f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - g_begin = 0; + g_begin = sync_porch_seconds * sample_rate; g_end = g_begin + g_scan_seconds * sample_rate; b_begin = g_end + seperator_seconds * sample_rate; b_end = b_begin + b_scan_seconds * sample_rate; @@ -165,7 +163,7 @@ void martin2_mode() const float seperator_seconds = 0.000572f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - g_begin = 0; + g_begin = sync_porch_seconds * sample_rate; g_end = g_begin + g_scan_seconds * sample_rate; b_begin = g_end + seperator_seconds * sample_rate; b_end = b_begin + b_scan_seconds * sample_rate; @@ -184,19 +182,18 @@ void scottie1_mode() bitmap_width = 320; bitmap_height = 256; const float tolerance = 0.8f; - const float settling_time = 0.0011f; const float sync_seconds = 0.009f; const float sync_porch_seconds = 0.0015f; const float rgb_scan_seconds = 0.138240f; const float seperator_seconds = 0.0015f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - r_begin = (sync_porch_seconds - settling_time) * sample_rate; + r_begin = sync_porch_seconds * sample_rate; r_end = r_begin + rgb_scan_seconds * sample_rate; - g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + rgb_scan_seconds * sample_rate; - b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + rgb_scan_seconds * sample_rate; + b_end = - sync_seconds * sample_rate; + b_begin = b_end - rgb_scan_seconds * sample_rate; + g_end = b_begin - seperator_seconds * sample_rate; + g_begin = g_end - rgb_scan_seconds * sample_rate; scanline_length = scottie1_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } @@ -210,19 +207,18 @@ void scottie2_mode() bitmap_width = 320; bitmap_height = 256; const float tolerance = 0.8f; - const float settling_time = 0.0011f; const float sync_seconds = 0.009f; const float sync_porch_seconds = 0.0015f; const float rgb_scan_seconds = 0.088064f; const float seperator_seconds = 0.0015f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - r_begin = (sync_porch_seconds - settling_time) * sample_rate; + r_begin = sync_porch_seconds * sample_rate; r_end = r_begin + rgb_scan_seconds * sample_rate; - g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + rgb_scan_seconds * sample_rate; - b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + rgb_scan_seconds * sample_rate; + b_end = - sync_seconds * sample_rate; + b_begin = b_end - rgb_scan_seconds * sample_rate; + g_end = b_begin - seperator_seconds * sample_rate; + g_begin = g_end - rgb_scan_seconds * sample_rate; scanline_length = scottie2_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } @@ -236,19 +232,18 @@ void scottieDX_mode() bitmap_width = 320; bitmap_height = 256; const float tolerance = 0.8f; - const float settling_time = 0.0011f; const float sync_seconds = 0.009f; const float sync_porch_seconds = 0.0015f; const float rgb_scan_seconds = 0.3456f; const float seperator_seconds = 0.0015f; seperator_length = seperator_seconds * sample_rate; sync_length = tolerance * sync_seconds * sample_rate; - r_begin = (sync_porch_seconds - settling_time) * sample_rate; + r_begin = sync_porch_seconds * sample_rate; r_end = r_begin + rgb_scan_seconds * sample_rate; - g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + rgb_scan_seconds * sample_rate; - b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + rgb_scan_seconds * sample_rate; + b_end = - sync_seconds * sample_rate; + b_begin = b_end - rgb_scan_seconds * sample_rate; + g_end = b_begin - seperator_seconds * sample_rate; + g_begin = g_end - rgb_scan_seconds * sample_rate; scanline_length = scottieDX_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } @@ -266,7 +261,7 @@ void wrasseSC2_180_mode() const float sync_porch_seconds = 0.0005f; const float rgb_scan_seconds = 0.235f; sync_length = tolerance * sync_seconds * sample_rate; - r_begin = 0; + r_begin = sync_porch_seconds * sample_rate; r_end = r_begin + rgb_scan_seconds * sample_rate; g_begin = r_end; g_end = g_begin + rgb_scan_seconds * sample_rate; diff --git a/app/src/main/rs/state.rsh b/app/src/main/rs/state.rsh index 11201d1..b7fb925 100644 --- a/app/src/main/rs/state.rsh +++ b/app/src/main/rs/state.rsh @@ -22,14 +22,15 @@ static ddc_t cnt_ddc, dat_ddc; static fmd_t cnt_fmd, dat_fmd; static int current_decoder; static int blur_power, free_running; -static int sample_rate, prev_hpos; +static int sample_rate, sync_pos, prev_sync_pos; static int maximum_variance, minimum_sync_length; static int scanline_length, minimum_length, maximum_length; static int vis_timeout, vis_length, bit_length; static int break_timeout, break_length; static int leader_timeout, leader_length; static int first_leader_length, second_leader_length; -static int buffer_length, buffer_cleared; +static int buffer_length, buffer_mask, buffer_pos; +static int buffer_cleared; static int bitmap_width, bitmap_height; static int maximum_width, maximum_height; static int sync_length, sync_counter, vpos, hpos; @@ -37,6 +38,7 @@ static int save_cnt, save_dat, seperator_counter, seperator_length; static int u_sep_begin, u_sep_end, v_sep_begin, v_sep_end; static int y_begin, y_end, u_begin, u_end, v_begin, v_end; static int r_begin, r_end, b_begin, b_end, g_begin, g_end; +static int sync_buildup_length; static int robot36_scanline_length; static int robot72_scanline_length; static int martin1_scanline_length; diff --git a/utils/blur.c b/utils/blur.c index 24183c2..43ca1c6 100644 --- a/utils/blur.c +++ b/utils/blur.c @@ -24,20 +24,20 @@ double gauss(double x, double radius) } void emit(int radius) { - printf("\t\tif ((i-%d) < begin || end <= (i+%d)) {\n", radius, radius); + printf("\t\tif ((p-%d) < begin || end <= (p+%d) || (i-%d) < 0 || buffer_length <= (i+%d)) {\n", radius, radius, radius, radius); for (int i = -radius; i < 0; ++i) { - printf("\t\t\tif (begin <= (i%d)) {\n", i); + printf("\t\t\tif (begin <= (p%d)) {\n", i); printf("\t\t\t\tweight_sum += %d;\n", (int)(16384 * gauss(i, radius))); - printf("\t\t\t\tvalue_sum += %d * value_buffer[i%d];\n", + printf("\t\t\t\tvalue_sum += %d * value_buffer[(i%d)&buffer_mask];\n", (int)(16384 * gauss(i, radius)), i); printf("\t\t\t}\n"); } for (int i = 0; i <= radius; ++i) { - printf("\t\t\tif ((i+%d) < end) {\n", i); + printf("\t\t\tif ((p+%d) < end) {\n", i); printf("\t\t\t\tweight_sum += %d;\n", (int)(16384 * gauss(i, radius))); - printf("\t\t\t\tvalue_sum += %d * value_buffer[i+%d];\n", + printf("\t\t\t\tvalue_sum += %d * value_buffer[(i+%d)&buffer_mask];\n", (int)(16384 * gauss(i, radius)), i); printf("\t\t\t}\n"); } @@ -59,7 +59,8 @@ int main() { printf("/* code generated by 'utils/blur.c' */\n"); printf("static uchar value_blur(int pixel, int begin, int end)\n{\n"); - printf("\tint i = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin;\n"); + printf("\tint p = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin;\n"); + printf("\tint i = p & buffer_mask;\n"); printf("\tint weight_sum = 0;\n"); printf("\tint value_sum = 0;\n"); printf("\tswitch (blur_power) {\n"); @@ -67,6 +68,6 @@ int main() printf("\tcase %d:\n", i); emit((1 << i) | 1); } - printf("\tdefault:\n\t\tif (i < begin || end <= i)\n\t\t\treturn 0;\n\t\treturn value_buffer[i];\n\t}\n\treturn 0;\n}\n"); + printf("\tdefault:\n\t\treturn value_buffer[i];\n\t}\n\treturn 0;\n}\n"); return 0; }