added Robot 72 decoder

This commit is contained in:
Ahmet Inan 2024-04-20 11:24:23 +02:00
parent 5b7ace099a
commit 68ff54c214

View file

@ -8,6 +8,12 @@ package xdsopl.robot36;
public class Robot_72_Color implements Mode {
private final int scanLineSamples;
private final int luminanceSamples;
private final int chrominanceSamples;
private final int yBeginSamples;
private final int vBeginSamples;
private final int uBeginSamples;
private final int uEndSamples;
Robot_72_Color(int sampleRate) {
double syncPulseSeconds = 0.009;
@ -18,6 +24,18 @@ public class Robot_72_Color implements Mode {
double chrominanceSeconds = 0.069;
double scanLineSeconds = syncPulseSeconds + syncPorchSeconds + luminanceSeconds + 2 * (separatorSeconds + porchSeconds + chrominanceSeconds);
scanLineSamples = (int) Math.round(scanLineSeconds * sampleRate);
luminanceSamples = (int) Math.round(luminanceSeconds * sampleRate);
chrominanceSamples = (int) Math.round(chrominanceSeconds * sampleRate);
double yBeginSeconds = syncPulseSeconds / 2 + syncPorchSeconds;
yBeginSamples = (int) Math.round(yBeginSeconds * sampleRate);
double yEndSeconds = yBeginSeconds + luminanceSeconds;
double vBeginSeconds = yEndSeconds + separatorSeconds + porchSeconds;
vBeginSamples = (int) Math.round(vBeginSeconds * sampleRate);
double vEndSeconds = vBeginSeconds + chrominanceSeconds;
double uBeginSeconds = vEndSeconds + separatorSeconds + porchSeconds;
uBeginSamples = (int) Math.round(uBeginSeconds * sampleRate);
double uEndSeconds = uBeginSeconds + chrominanceSeconds;
uEndSamples = (int) Math.round(uEndSeconds * sampleRate);
}
@Override
@ -32,11 +50,13 @@ public class Robot_72_Color implements Mode {
@Override
public int decodeScanLine(int[] evenBuffer, int[] oddBuffer, float[] scanLineBuffer, int prevPulseIndex, int scanLineSamples) {
if (prevPulseIndex < 0 || prevPulseIndex + scanLineSamples >= scanLineBuffer.length)
if (prevPulseIndex + yBeginSamples < 0 || prevPulseIndex + uEndSamples > scanLineBuffer.length)
return 0;
for (int i = 0; i < evenBuffer.length; ++i) {
int position = (i * scanLineSamples) / evenBuffer.length + prevPulseIndex;
evenBuffer[i] = ColorConverter.GRAY(scanLineBuffer[position]);
int yPos = yBeginSamples + (i * luminanceSamples) / evenBuffer.length + prevPulseIndex;
int uPos = uBeginSamples + (i * chrominanceSamples) / evenBuffer.length + prevPulseIndex;
int vPos = vBeginSamples + (i * chrominanceSamples) / evenBuffer.length + prevPulseIndex;
evenBuffer[i] = ColorConverter.YUV2RGB(scanLineBuffer[yPos], scanLineBuffer[uPos], scanLineBuffer[vPos]);
}
return 1;
}