mirror of
https://github.com/xdsopl/robot36.git
synced 2026-01-23 08:10:15 +01:00
added Robot 72 decoder
This commit is contained in:
parent
5b7ace099a
commit
68ff54c214
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue