WIP: added correct scottie decoder

This commit is contained in:
Ahmet Inan 2014-12-10 23:39:08 +01:00
parent 2c52be93cd
commit 56e75346d2
6 changed files with 61 additions and 36 deletions

View file

@ -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];

View file

@ -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;

View file

@ -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();
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;