The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use Video::Capture::V4l;
use Video::Capture::VBI;
use Fcntl;

$vbi = new Video::Capture::V4l::VBI or die;

# the next line is optional (it enables buffering)
$vbi->backlog(50); # max. 1 second backlog (~900kB)

open $fh, ">/dev/null" or die;

# 162203 -> 162586 jinglesize (5000)
# line 0 - relatively normal teletext line (80a Data)
# line 1 - hhFFOOOOLLLLcccccc
#          h maybe vertical/horizontal ecc like in intercast?
#          F fileno?
#          O offset in file
#          L length of file
#          c checksum?

my $head;
my $body;

for (;;) {
   for (decode_field $vbi->field, VBI_VT) {
      if ($_->[1] == 0) {
         if ($_->[2] == 0) {
            printf "\n %04x %s", $_->[5], (unpack "H*", $_->[3]);
         } elsif ($_->[2] == 1) {
            $head = $_->[3];
            $body = "";
         } else {
            print " ",unpack "H8", $_->[3];
            $body .= substr ($_->[3], 1);
            if ($_->[2] == 23 && length($body) == (22*39) && $head) {
               my ($fno, $t2, $t3) = unpack "xxvVV", $head;
               my $seq = Video::Capture::VBI::unham8($head);
               if ($t2 <= $t3 && $fno) {
                  (print "\n$seq X"), next if substr($head,0,1) eq "\xea";
                  (print "\n$seq Y"), next if substr($head,0,1) eq "\xfd";
                  my ($s) = unpack "H*", $head;
                  printf "\n(%2x, %5d, %8d, %8d) # %s-%s", $seq, $fno, $t2, $t3, substr($s,12*2,6*2), substr($s,18*2);
                  print "X" if substr($head,0,1) eq "\xea";
                  print "Y" if substr($head,0,1) eq "\xfd";
                  sysopen FH, "/tmp/nbc/$fno", O_CREAT|O_RDWR, 0666 or die "/tmp/nbc/$fno: $!";
                  seek FH, $t2, 0;
                  print " offset $t2 appending (",tell(FH),")";
                  print FH substr($head, 18);
                  print FH $body;
                  close FH;
               }
            }
         }
      }
   }
}