Go to the documentation of this file.
16 #include <linux/videodev2.h>
24 #define FAC (1<<16) // factor for fix-point arithmetic
26 static unsigned char *
rawbuf =
nullptr;
32 #define BTTV_VBISIZE _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
52 for (err = 0; n--;
p++)
68 for (i = 0; i < 8; ++i)
102 struct vt_page *cvtp =
nullptr;
171 printf(
"pll_reset (fixed@%d)\n",
vbi->
pll_adj);
173 printf(
"pll_reset (auto)\n");
182 struct vt_page *cvtp =
nullptr;
192 int pkt = (hdr >> 3) & 0x1f;
215 cvtp->
pgno = mag8 * 256 + b1;
216 cvtp->
subno = (b2 + b3 * 256) & 0x3f7f;
217 cvtp->
lang =
"\0\4\2\6\1\5\3\7"[b4 >> 5] + (
isLatin1 ? 0 : 8);
218 cvtp->
flags = b4 & 0x1f;
219 cvtp->
flags |= b3 & 0xc0;
220 cvtp->
flags |= (b2 & 0x80) >> 2;
235 memcpy(cvtp->
data[0]+0,
p, 40);
236 memset(cvtp->
data[0]+40,
' ',
sizeof(cvtp->
data)-40);
248 cvtp->
lines |= 1 << pkt;
250 memcpy(cvtp->
data[pkt],
p, 40);
262 std::array<unsigned int,13>
t {};
263 for (ptrdiff_t i = 0; i < 13; ++i)
279 int b2 =
hamm8(
p + 37, &err);
282 if (b1 != 0 || !(b2 & 8))
285 for (ptrdiff_t i = 0; i < 6; ++i)
290 int b3 =
hamm16(
p+5+6*i, &err);
293 int x = (b2 >> 7) | ((b3 >> 5) & 0x06);
294 cvtp->
link[i].
pgno = ((mag ^ x) ?: 8) * 256 + b1;
295 cvtp->
link[i].
subno = (b2 + b3 * 256) & 0x3f7f;
333 std::array<unsigned char,43> data {};
334 std::array<int,2566> dt {};
335 std::array<int,6> hi {};
336 std::array<int,6> lo {};
342 for (i =
vbi->
soc; i < vbi->eoc; ++i)
343 dt[i] =
p[i+bpb/
FAC] -
p[i];
346 for (i =
vbi->
eoc; i < vbi->eoc+16; i += 2)
347 dt[i] = 100, dt[i+1] = -100;
350 for (i =
vbi->
soc, n = 0; n < 6; ++n)
363 if (i < vbi->bp8bl || i >
vbi->
bp8bh)
367 unsigned char min = 255;
368 unsigned char max = 0;
370 for (i = hi[4]; i < hi[5]; ++i)
372 max =
p[i], sync = i;
373 for (i = lo[4]; i < lo[5]; ++i)
376 int thr = (min + max) / 2;
381 for (i = 4*bpb +
vbi->
pll_adj*bpb/10; i < 16*bpb; i += bpb)
383 if (
p[i/
FAC] > thr &&
p[(i+bpb)/
FAC] > thr)
388 for (n = 0; n < 43*8; ++n, i += bpb)
390 data[n/8] |= 1 << (n%8);
416 unsigned int seq = 0;
428 seq = *(
unsigned int *)&
rawbuf[n - 4];
432 if (seq < 3 && vbi->seq >= 3)
494 if (
p->sample_format != V4L2_PIX_FMT_GREY)
496 fprintf(
stderr,
"got pix fmt %x\n",
p->sample_format);
497 error(
"v4l2: unsupported vbi data format");
512 int bpl =
p->samples_per_line;
513 double fs =
p->sampling_rate;
514 double bpb = fs/6937500.0;
515 int soc = (int)(9.2e-6*fs) - (int)
p->offset;
516 int eoc = (
int)(12.9e-6*fs) - (
int)
p->offset;
519 if (eoc > bpl - (
int)(43*8*bpb))
520 eoc = bpl - (int)(43*8*bpb);
521 if (eoc - soc < (
int)(16*bpb))
524 error(
"v4l2: broken vbi format specification");
530 error(
"v4l2: unable to handle these sampling parameters");
551 struct v4l2_format v4l2_format {};
552 struct v4l2_vbi_format *vbifmt = &v4l2_format.fmt.vbi;
554 memset(&v4l2_format, 0,
sizeof(v4l2_format));
555 v4l2_format.type = V4L2_BUF_TYPE_VBI_CAPTURE;
556 if (ioctl(
vbi->
fd, VIDIOC_G_FMT, &v4l2_format) == -1)
558 error(
"Video 4 Linux version 1 support is not enabled.");
572 if (rawbuf_size < vbi->bufsize)
578 error(
"unable to allocate in setup_dev()\n");
592 vbi_open(
const char *vbi_dev_name,
struct cache *ca,
int fine_tune,
int big_buf)
594 static int s_inited = 0;
595 struct vbi *
vbi =
nullptr;
606 error(
"out of memory");
610 if ((
vbi->
fd = open(vbi_dev_name, O_RDONLY)) == -1)
612 error(
"cannot open vbi device");
617 error(
"-oldbttv/-newbttv is obsolete. option ignored.");
const std::array< const std::array< const uint8_t, 256 >, 3 > hamm24par
This table generates the parity checks for hamm24/18 decoding.
static void error(const char *str,...)
static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1)
struct dl_head clients[1]
static int setup_dev(struct vbi *vbi)
def read(device=None, features=[])
struct vt_page::@69 link[6]
struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno)
static int vbi_line(struct vbi *vbi, const unsigned char *p)
static int vt_line(struct vbi *vbi, unsigned char *p)
void vbi_close(struct vbi *vbi)
void vbi_handler(struct vbi *vbi, int fd)
static constexpr int8_t PLL_ERROR
void vbi_pll_reset(struct vbi *vbi, int fine_tune)
void do_enhancements(struct enhance *eh, struct vt_page *vtp)
static constexpr int8_t PLL_SAMPLES
static struct dl_node * dl_remove(struct dl_node *n)
static void out_of_sync(struct vbi *vbi)
void conv2latin(unsigned char *p, int n, int lang)
static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page)
static int chk_parity(uint8_t *p, int n)
static constexpr int8_t PLL_ADJUST
void init_enhance(struct enhance *eh)
static unsigned char * rawbuf
int vbi_add_handler(struct vbi *vbi, vbic_handler handler, void *data)
int hamm8(const uint8_t *p, int *err)
void vbi_reset(struct vbi *vbi)
#define dl_insert_last(h, n)
static void pll_add(struct vbi *vbi, int n, int err)
static int set_decode_parms(struct vbi *vbi, struct v4l2_vbi_format *p)
static struct dl_head * dl_init(struct dl_head *h)
static const iso6937table * d
void vbi_del_handler(struct vbi *vbi, vbic_handler handler, void *data)
unsigned char data[VT_HEIGHT][VT_WIDTH]
struct vbi * vbi_open(const char *vbi_dev_name, struct cache *ca, int fine_tune, int big_buf)
void add_enhance(struct enhance *eh, int dcode, std::array< unsigned int, 13 > &data)
void(*)(void *data, struct vt_event *ev) vbic_handler
int hamm16(const uint8_t *p, int *err)
int hamm24(const uint8_t *p, int *err)