mirror of
https://github.com/xdsopl/robot36.git
synced 2025-12-06 07:12:07 +01:00
WIP: added correct scottie decoder
This commit is contained in:
parent
2c52be93cd
commit
56e75346d2
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue