#!/usr/bin/perl use Video::Capture::V4l; use Video::Capture::VBI; package Decoder; use Video::Capture::VBI; # derive from videotext-decoder use base 'Video::Capture::VBI::VT'; # just display the page sub enter_page { my($self,$page)=@_; my $sub = $page->{ctrl} & VTX_SUB; #return unless $page->{page}>=0x110 && $page->{page}<=0x134; #return unless $page->{page}==0x150; my $x = join ("", map { $_ ne "" ? "*" : "-" } @{$page->{packet}}); printf "Teletext page %02x / %04x ($x)\n", $page->{page}, $sub; #return unless $page->{page} == 0x1df; # now print the page for ($y=0; $y<25; $y++) { my $x = $page->{packet}[$y]; print $x ? decode_ansi decode_vtpage $x : "","\n"; } } sub enter_packet { my $packet = $_; } package main; $vbi = new Video::Capture::V4l::VBI or die; # the next line is optional (it enables buffering) $vbi->backlog(25); # max. 1 second backlog (~900kB) $inp_fd = fileno STDIN; $vbi_fd = $vbi->fileno; $vt = new Decoder; print "Capturing VBI block. Make sure you have tuned in to a channel!\n"; for(;;) { my $r=""; vec($r,$inp_fd,1)=1; vec($r,$vbi_fd,1)=1; select $r,undef,undef,0.04; $vt->feed(decode_field $vbi->field, VBI_VT) while $vbi->queued; if (vec($r,$inp_fd,1)) { #print "HI\n"; #sleep 5; } }