📄 wss.java
字号:
/*
* @(#)WSS.java - mini info about WSS
*
* Copyright (c) 2004-2005 by dvb.matt, All Rights Reserved.
*
* This file is part of X, a free Java based demux utility.
* X is intended for educational purposes only, as a non-commercial test project.
* It may not be used otherwise. Most parts are only experimental.
*
*
* This program is free software; you can redistribute it free of charge
* and/or modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.video;
import net.sourceforge.dvb.projectx.common.Resource;
//DM30072004 introduced with 081.7 int07
public final class WSS
{
private static int pixels[] = new int[267];
private static int a;
private static String str;
private static String start = Resource.getString("wss.start");
public WSS()
{
init(new int[0], 0);
}
public static void init(int source_pixels[], int width)
{
str = null;
if (source_pixels.length < 200)
return;
scale(source_pixels, width);
}
public static String getWSS()
{
return str;
}
private static void scale(int source_pixels[], int width)
{
java.util.Arrays.fill(pixels, 0);
int nx = 267;
float fx = 0;
float Xdecimate = width / (float)(nx);
for (int x = 0; fx < width && x < nx; fx += Xdecimate, x++)
pixels[x] = 0xFF & source_pixels[(int)fx]>>>16;
a = 0;
handlepixels("line 0 (23)"); // read out
if (str == null)
{
fx = 0;
for (int x = 0; fx < width && x < nx; fx += Xdecimate, x++)
pixels[x] = 0xFF & source_pixels[width + (int)fx]>>>16;
a = 0;
handlepixels("line 1 (24)"); // read out
}
}
private static void handlepixels(String _str)
{
str = "WSS status @ " + _str;
str += ":<p>";
if (getRunIn())
{
str += Resource.getString("wss.run_in") + " @ " + a + "<p>";
a += 29;
if (getStartCode())
{
str += Resource.getString("wss.startcode") + " @ " + a + "<p>";
a += 24;
str += Resource.getString("wss.group_1") + " " + start + " @ " + a + " :" + "<p>";
str += " * " + getGroup1() + "<p>";
a += 24;
str += Resource.getString("wss.group_2") + " " + start + " @ " + a + " :" + "<p>";
String[] group = getGroup2();
for (int d=0; d < 4; d++)
str += " * " + group[d] + "<p>";
a += 24;
str += Resource.getString("wss.group_3") + " " + start + " @ " + a + " :" + "<p>";
group = getGroup3();
for (int d=0; d < 2; d++)
str += " * " + group[d] + "<p>";
a += 18;
str += Resource.getString("wss.group_4") + " " + start + " @ " + a + " :" + "<p>";
group = getGroup4();
for (int d=0; d < 2; d++)
str += " * " + group[d] + "<p>";
}
else
str += Resource.getString("wss.no_startcode");
}
else
{
str += Resource.getString("wss.no_run_in");
str = null;
}
a=0;
}
private static boolean getRunIn()
{
for (; a < 30; a++)
if ( pixels[a] > 120
&& pixels[a + 2] >= 120
&& pixels[a + 5] < 120
&& pixels[a + 8] >= 120
&& pixels[a + 11] < 120
&& pixels[a + 14] >= 120
&& pixels[a + 17] < 120
&& pixels[a + 20] >= 120
&& pixels[a + 23] < 120
&& pixels[a + 26] >= 120 )
return true;
return false;
}
private static boolean getStartCode()
{
if ( pixels[a] < 120
&& pixels[a + 3] >= 120
&& pixels[a + 7] < 120
&& pixels[a + 10] >= 120
&& pixels[a + 14] < 120
&& pixels[a + 19] >= 120 )
return true;
return false;
}
private static String getGroup1()
{
int b1=0;
for (int c=0; c < 8; c++)
b1 |= pixels[a + (3 * c)] < 120 ? 0 : (1<<(7 - c));
switch (b1)
{
case 0x56: // 0001 Biphase 01010110
return (" " + Resource.getString("wss.group_1.0001"));
case 0x95: // 1000 Biphase 10010101
return (" " + Resource.getString("wss.group_1.1000"));
case 0x65: // 0100 Biphase 01100101
return (" " + Resource.getString("wss.group_1.0100"));
case 0xA6: // 1101 Biphase 10100110
return (" " + Resource.getString("wss.group_1.1101"));
case 0x59: // 0010 Biphase 01011001
return (" " + Resource.getString("wss.group_1.0010"));
case 0x6A: // 0111 Biphase 01101010
return (" " + Resource.getString("wss.group_1.0111"));
case 0xA9: // 1110 Biphase 10101001
return (" " + Resource.getString("wss.group_1.1110"));
default:
return (" " + Resource.getString("wss.group_1.error"));
}
}
private static String[] getGroup2()
{
int b1=0;
for (int c=0; c < 8; c++)
b1 |= pixels[a + (3 * c)] < 120 ? 0 : (1<<(7 - c));
String[] group2 = new String[4];
switch (b1>>>6)
{
case 1: // 0 Biphase 01
group2[0]= " " + Resource.getString("wss.group_2.0.01");
break;
case 2: // 1 Biphase 10
group2[0]= " " + Resource.getString("wss.group_2.0.10");
break;
default:
group2[0]= " " + Resource.getString("wss.group_2.0.00");
}
switch (0x3 & (b1>>>4))
{
case 1: // 0 Biphase 01
group2[1]= " " + Resource.getString("wss.group_2.1.01");
break;
case 2: // 1 Biphase 10
group2[1]= " " + Resource.getString("wss.group_2.1.10");
break;
default:
group2[1]= " " + Resource.getString("wss.group_2.1.00");
}
switch (0x3 & (b1>>>2))
{
case 1: // 0 Biphase 01
group2[2]= " " + Resource.getString("wss.group_2.2.01");
break;
case 2: // 1 Biphase 10
group2[2]= " " + Resource.getString("wss.group_2.2.10");
break;
default:
group2[2]= " " + Resource.getString("wss.group_2.2.00");
}
switch (0x3 & b1)
{
case 1: // 0 Biphase 01
group2[3]= " " + Resource.getString("wss.group_2.3.01");
break;
case 2: // 1 Biphase 10
group2[3]= " " + Resource.getString("wss.group_2.3.10");
break;
default:
group2[3]= " " + Resource.getString("wss.group_2.3.00");
}
return group2;
}
private static String[] getGroup3()
{
int b1 = 0;
for (int c=0; c < 6; c++)
b1 |= pixels[a + (3 * c)] < 120 ? 0 : (1<<(5 - c));
String[] group2 = new String[2];
switch (0x3 & (b1>>>4))
{
case 1: // 0 Biphase 01
group2[0]= " " + Resource.getString("wss.group_3.0.01");
break;
case 2: // 1 Biphase 10
group2[0]= " " + Resource.getString("wss.group_3.0.10");
break;
default:
group2[0]= " " + Resource.getString("wss.group_3.0.00");
}
switch (0xF & b1)
{
case 5: // 00 Biphase 0101
group2[1]= " " + Resource.getString("wss.group_3.1.00");
break;
case 6: // 01 Biphase 0110
group2[1]= " " + Resource.getString("wss.group_3.1.01");
break;
case 9: // 10 Biphase 1001
group2[1]= " " + Resource.getString("wss.group_3.1.10");
break;
case 0xA: // 11 Biphase 1010
group2[1]= " " + Resource.getString("wss.group_3.1.11");
break;
default:
group2[1]= " " + Resource.getString("wss.group_3.1.err");
}
return group2;
}
private static String[] getGroup4()
{
int b1 = 0;
for (int c=0; c < 6; c++)
b1 |= pixels[a + (3 * c)] < 120 ? 0 : (1<<(5 - c));
String[] group2 = new String[2];
switch (0x3 & (b1>>>4))
{
case 1: // 0 Biphase 01
group2[0]= " " + Resource.getString("wss.group_4.0.01");
break;
case 2: // 1 Biphase 10
group2[0]= " " + Resource.getString("wss.group_4.0.10");
break;
default:
group2[0]= " " + Resource.getString("wss.group_4.0.00");
}
switch (0xF & b1)
{
case 5: // 00 Biphase 0101
group2[1]= " " + Resource.getString("wss.group_4.1.00");
break;
case 6: // 01 Biphase 0110
group2[1]= " " + Resource.getString("wss.group_4.1.01");
break;
case 9: // 10 Biphase 1001
group2[1]= " " + Resource.getString("wss.group_4.1.10");
break;
case 0xA: // 11 Biphase 1010
group2[1]= " " + Resource.getString("wss.group_4.1.11");
break;
default:
group2[1]= " " + Resource.getString("wss.group_4.1.err");
}
return group2;
}
}
/***
WSS
takt = 200ns
1 bit = 3*200ns = 600ns
1NRZ bit = 2*3*200 = 1200ns
864 bit auf 64000ns PAL @ 13.5MHz 74.074 (864*15.625khz)
320 bit auf 64000ns @ 5MHz 200ns
= 74.074 ns / bit
= 702 pix auf 52000ns
= 720 pix auf 53333ns = 266.666 bits bei 200ns/b
142 + 20
858 bit auf 63560ns NTSC @ 13.5MHz
**/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -