31 #include <sys/types.h>
40 for (k = 1, j = 0; j < 7; j++)
45 if ((k & 1) == ((n >> 7) & 1))
47 for (k = 1, j = 8; j < 15; j++)
52 if ((k & 1) == ((n >> 15) & 1))
58 static bool decodebit(
const unsigned char *data,
int threshold,
int scale1)
61 for (
int i = 0; i < scale1; i++)
63 return (sum > threshold * scale1);
67 static int decode(
unsigned char *vbiline,
int scale0,
int scale1)
69 std::array<int,7> max {};
70 std::array<int,7> min {};
71 std::array<int,7> val {};
82 while (i < 600 && clk < 7)
87 if (sample > 85 && sample > val[clk])
88 (val[clk] = sample,
tmp = i);
89 else if (val[clk] - sample > 30)
90 (max[clk] =
tmp, i =
tmp + 10);
94 if (sample < 85 && sample < val[clk])
95 (val[clk] = sample,
tmp = i);
96 else if (sample - val[clk] > 30)
97 (min[clk++] =
tmp, i =
tmp + 10);
102 min[6] = min[5] - max[5] + max[6];
104 if (clk != 7 || vbiline[max[3]] - vbiline[min[5]] < 45)
108 for (i = 0, sample = 0; i < 7; i++)
109 sample = (sample + vbiline[min[i]] + vbiline[max[i]]) / 3;
111 for (i = min[6]; vbiline[i] < sample; i++);
114 for (i = 0; i < 16; i++)
115 if (
decodebit(&vbiline[
tmp + i * scale0], sample, scale1))
116 packedbits |= 1 << i;
117 return packedbits &
parityok(packedbits);
121 static int webtv_check(
char *buf,
int len)
124 unsigned long nwords;
125 unsigned short csum = 0;
128 while (buf[0] !=
'<' && len > 6)
137 while (nbytes + 6 <= len)
140 if (buf[nbytes] ==
'[' && buf[nbytes + 5] ==
']' && buf[nbytes + 6] !=
'[')
145 if (nbytes + 6 > len)
148 nwords = nbytes >> 1;
161 csum = (
unsigned short) (sum >> 16);
164 sum = csum + (sum & 0xffff);
165 csum = (
unsigned short) (sum >> 16);
168 std::array<char,9> temp {};
169 sprintf(temp.data(),
"%04X\n", (
int) ~sum & 0xffff);
171 if (!strncmp(buf, temp.data(), 4))
174 printf(
"\33[35mWEBTV: %s\33[0m\n", buf - nbytes - 1);
187 if (!(
cc =
new struct cc))
189 printf(
"out of memory\n");
193 if ((
cc->
fd = open(vbi_name, O_RDONLY)) == -1)
195 printf(
"cannot open vbi device\n");
225 printf(
"Can't read vbi data\n");
241 int l21_f1 = spl * (21 - sl);