From 56e75346d2722aec17ff1f03e99fcff51273c47b Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Wed, 10 Dec 2014 23:39:08 +0100 Subject: [PATCH] WIP: added correct scottie decoder --- .../main/java/xdsopl/robot36/ImageView.java | 2 +- app/src/main/rs/constants.rsh | 1 + app/src/main/rs/decoder.rs | 53 +++++++++++++++---- app/src/main/rs/initialization.rsh | 3 +- app/src/main/rs/modes.rsh | 36 ++++++------- app/src/main/rs/state.rsh | 2 +- 6 files changed, 61 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/xdsopl/robot36/ImageView.java b/app/src/main/java/xdsopl/robot36/ImageView.java index da62827..afdeebe 100644 --- a/app/src/main/java/xdsopl/robot36/ImageView.java +++ b/app/src/main/java/xdsopl/robot36/ImageView.java @@ -113,7 +113,7 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback { int framesPerSecond = Math.max(1, sampleRate / bufferSizeInSamples); audioBuffer = new short[framesPerSecond * bufferSizeInSamples]; - int maxHorizontalLength = 2 * sampleRate; + int maxHorizontalLength = 3 * sampleRate; currentMode = new int[1]; savedWidth = new int[1]; diff --git a/app/src/main/rs/constants.rsh b/app/src/main/rs/constants.rsh index 55419b1..d139a54 100644 --- a/app/src/main/rs/constants.rsh +++ b/app/src/main/rs/constants.rsh @@ -21,6 +21,7 @@ static const int decoder_raw = 0; static const int decoder_robot36 = 1; static const int decoder_yuv = 2; static const int decoder_rgb = 3; +static const int decoder_scottie = 4; static const int mode_debug = 0; static const int mode_robot36 = 1; diff --git a/app/src/main/rs/decoder.rs b/app/src/main/rs/decoder.rs index 4e916f3..16b92f9 100644 --- a/app/src/main/rs/decoder.rs +++ b/app/src/main/rs/decoder.rs @@ -41,7 +41,7 @@ static void reset_buffer() { vpos = 0; hpos = 0; - even_hpos = 0; + prev_hpos = 0; seperator_counter = 0; sync_counter = sync_length; buffer_cleared = 1; @@ -70,8 +70,8 @@ static void robot36_decoder() for (int i = 0; i < bitmap_width; ++i) { uchar even_y = value_blur(i * (y_end-y_begin) / bitmap_width + y_begin); uchar v = value_blur(i * (v_end-v_begin) / bitmap_width + v_begin); - uchar odd_y = value_blur(i * (y_end-y_begin) / bitmap_width + even_hpos + y_begin); - uchar u = value_blur(i * (u_end-u_begin) / bitmap_width + even_hpos + u_begin); + uchar odd_y = value_blur(i * (y_end-y_begin) / bitmap_width + prev_hpos + y_begin); + uchar u = value_blur(i * (u_end-u_begin) / bitmap_width + prev_hpos + u_begin); pixel_buffer[bitmap_width * (vpos-1) + i] = yuv(even_y, u, v); pixel_buffer[bitmap_width * vpos + i] = yuv(odd_y, u, v); } @@ -79,13 +79,13 @@ static void robot36_decoder() hpos -= scanline_length; else hpos = 0; - even_hpos = 0; + prev_hpos = 0; } else { if (prev_timeout) { - even_hpos = scanline_length; + prev_hpos = scanline_length; hpos -= scanline_length; } else { - even_hpos = hpos; + prev_hpos = hpos; hpos = 0; } } @@ -103,7 +103,7 @@ static void yuv_decoder() hpos -= scanline_length; else hpos = 0; - even_hpos = 0; + prev_hpos = 0; } static void rgb_decoder() @@ -118,7 +118,7 @@ static void rgb_decoder() hpos -= scanline_length; else hpos = 0; - even_hpos = 0; + prev_hpos = 0; } static void raw_decoder() @@ -127,7 +127,35 @@ static void raw_decoder() uchar value = value_blur(i * hpos / bitmap_width); pixel_buffer[bitmap_width * vpos + i] = rgb(value, value, value); } - even_hpos = hpos = 0; + prev_hpos = hpos = 0; +} + +// 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; + // TODO: don't do this here .. + vpos = vpos < 0 ? vpos : vpos - 1; + return; + } + for (int i = 0; i < bitmap_width; ++i) { + uchar r = value_blur(i * (r_end-r_begin) / bitmap_width + prev_hpos + r_begin); + uchar g = value_blur(i * (g_end-g_begin) / bitmap_width + g_begin); + uchar b = value_blur(i * (b_end-b_begin) / bitmap_width + b_begin); + pixel_buffer[bitmap_width * vpos + i] = rgb(r, g, b); + } + for (int i = g_begin; i < g_end; ++i) + value_buffer[i] = value_buffer[i + prev_hpos]; + for (int i = b_begin; i < b_end; ++i) + value_buffer[i] = value_buffer[i + prev_hpos]; + prev_hpos = scanline_length; + hpos = 0; } void decode(int samples) { @@ -149,7 +177,7 @@ void decode(int samples) { int dat_active = cabs(cnt_baseband) < 4.0f * cabs(dat_baseband); 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 + even_hpos] = cnt_level | dat_level; + value_buffer[hpos + prev_hpos] = cnt_level | dat_level; int cnt_quantized = round(cnt_value); int dat_quantized = round(dat_value); @@ -176,7 +204,7 @@ void decode(int samples) { if (++hpos >= maximum_length || sync_pulse) { if (hpos < minimum_length) { hpos = 0; - even_hpos = 0; + prev_hpos = 0; seperator_counter = 0; continue; } @@ -190,6 +218,9 @@ void decode(int samples) { case decoder_rgb: rgb_decoder(); break; + case decoder_scottie: + scottie_decoder(); + break; default: raw_decoder(); } diff --git a/app/src/main/rs/initialization.rsh b/app/src/main/rs/initialization.rsh index 714788c..7d12707 100644 --- a/app/src/main/rs/initialization.rsh +++ b/app/src/main/rs/initialization.rsh @@ -29,8 +29,7 @@ void initialize(float rate, int length, int width, int height) maximum_height = height; vpos = 0; - even_hpos = hpos = 0; - even_hpos = 0; + prev_hpos = hpos = 0; sync_counter = 0; seperator_counter = 0; buffer_cleared = 0; diff --git a/app/src/main/rs/modes.rsh b/app/src/main/rs/modes.rsh index 4c226d6..60d0a97 100644 --- a/app/src/main/rs/modes.rsh +++ b/app/src/main/rs/modes.rsh @@ -180,25 +180,23 @@ void scottie1_mode() save_dat = 1; blur_power = 3; *current_mode = mode_scottie1; - current_decoder = decoder_rgb; + current_decoder = decoder_scottie; 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 r_scan_seconds = 0.138240f; - const float g_scan_seconds = 0.138240f; - const float b_scan_seconds = 0.138240f; + 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_end = r_begin + r_scan_seconds * sample_rate; + r_end = r_begin + rgb_scan_seconds * sample_rate; g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + g_scan_seconds * sample_rate; + g_end = g_begin + rgb_scan_seconds * sample_rate; b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + b_scan_seconds * sample_rate; + b_end = b_begin + rgb_scan_seconds * sample_rate; scanline_length = scottie1_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } @@ -208,25 +206,23 @@ void scottie2_mode() save_dat = 1; blur_power = 2; *current_mode = mode_scottie2; - current_decoder = decoder_rgb; + current_decoder = decoder_scottie; 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 r_scan_seconds = 0.088064f; - const float g_scan_seconds = 0.088064f; - const float b_scan_seconds = 0.088064f; + 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_end = r_begin + r_scan_seconds * sample_rate; + r_end = r_begin + rgb_scan_seconds * sample_rate; g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + g_scan_seconds * sample_rate; + g_end = g_begin + rgb_scan_seconds * sample_rate; b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + b_scan_seconds * sample_rate; + b_end = b_begin + rgb_scan_seconds * sample_rate; scanline_length = scottie2_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } @@ -236,25 +232,23 @@ void scottieDX_mode() save_dat = 1; blur_power = 5; *current_mode = mode_scottieDX; - current_decoder = decoder_rgb; + current_decoder = decoder_scottie; 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 r_scan_seconds = 0.3456f; - const float g_scan_seconds = 0.3456f; - const float b_scan_seconds = 0.3456f; + 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_end = r_begin + r_scan_seconds * sample_rate; + r_end = r_begin + rgb_scan_seconds * sample_rate; g_begin = r_end + seperator_seconds * sample_rate; - g_end = g_begin + g_scan_seconds * sample_rate; + g_end = g_begin + rgb_scan_seconds * sample_rate; b_begin = g_end + seperator_seconds * sample_rate; - b_end = b_begin + b_scan_seconds * sample_rate; + b_end = b_begin + rgb_scan_seconds * sample_rate; scanline_length = scottieDX_scanline_length; maximum_length = scanline_length + sync_porch_seconds * sample_rate; } diff --git a/app/src/main/rs/state.rsh b/app/src/main/rs/state.rsh index ad457b6..7346637 100644 --- a/app/src/main/rs/state.rsh +++ b/app/src/main/rs/state.rsh @@ -22,7 +22,7 @@ static ddc_t cnt_ddc, dat_ddc; static fmd_t cnt_fmd, dat_fmd; static int current_decoder; static int blur_power; -static int sample_rate, even_hpos; +static int sample_rate, prev_hpos; static int maximum_variance, minimum_sync_length; static int scanline_length, minimum_length, maximum_length; static int vis_timeout, vis_length, bit_length;