From 68ff54c2141c7c6cde563b4587b9ec98019d2d7b Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Sat, 20 Apr 2024 11:24:23 +0200 Subject: [PATCH] added Robot 72 decoder --- .../java/xdsopl/robot36/Robot_72_Color.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java index 0484b77..ab292c5 100644 --- a/app/src/main/java/xdsopl/robot36/Robot_72_Color.java +++ b/app/src/main/java/xdsopl/robot36/Robot_72_Color.java @@ -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; }