[linux-dvb] gnutv: move channel_name to flag to allow piped output

David Liontooth lionteeth at cogweb.net
Sun Nov 28 05:42:21 CET 2010

I need to capture ATSC QAM closed captioning to file, and at the same 
time the mpeg-ts stream to a different file. I've been looking for an 
app that will let me do this.

A simple cat works:

  cat /dev/dvb/adapter0/dvr0 | tee $FIL.mpg | zvbi-atsc-cc --atsc -m -C 
$FIL.txt -T KCBS

But there is naturally no tuner or timer in cat, so closing the 
processes at the end of the recording is a hassle; there may be other 
issues cat doesn't handle optimally. I looked around and found gnutv in 
the dvb-apps project.

gnutv is actively maintained, tunes ATSC QAM-256, handles individual 
channels well, and has a timer -- but it has a small, show-stopper problem.

gnutv mandates that the channel name be placed at the end of the user 
input. There is a great -out stdout option, but you can't use it to 
pipe, since the channel name has to be placed afterwards.

I suggest we move the channel name into a flag, like the other user 
values, so that we can pipe the output like this:

  gnutv -adapter 0 -channel_list ~/.azap/channels.conf -timeout 10 
-channel_name  KCBS \
  -out stdout | tee $FIL.mpg | zvbi-atsc-cc --atsc -T -9 $FIL.txt -n KCBS

With a simple patch against the today's mercurial tree, as below, this 
works great. For clarity, I renamed channels to channels_list; I'll be 
happy to remove that change if it breaks too many scripts. I don't know 
how to make the change to channel_name so that it's backwardly 
compatible, but maybe we don't need to.


--- gnutv.c    2010-11-27 10:56:57.000000000 -0800
+++ gnutv-new.c    2010-11-27 11:34:41.000000000 -0800
@@ -54,7 +54,8 @@
          " -frontend <id>    frontend to use (default 0)\n"
          " -demux <id>        demux to use (default 0)\n"
          " -caslotnum <id>    ca slot number to use (default 0)\n"
-        " -channels <filename>    channels.conf file.\n"
+        " -channel_list <filename>    channels.conf file.\n"
+        " -channel_name <name>     Name of the channel to tune to.\n"
          " -secfile <filename>    Optional sec.conf file.\n"
          " -secid <secid>    ID of the SEC configuration to use, one of:\n"
          "             * UNIVERSAL (default) - Europe, 10800 to 11800 
MHz and 11600 to 12700 Mhz,\n"
@@ -82,8 +83,7 @@
          " -timeout <secs>    Number of seconds to output channel for\n"
          "                (0=>exit immediately after successful tuning, 
default is to output forever)\n"
          " -cammenu        Show the CAM menu\n"
-        " -nomoveca        Do not attempt to move CA descriptors from 
stream to programme level\n"
-        " <channel name>\n";
+        " -nomoveca        Do not attempt to move CA descriptors from 
stream to programme level\n";
      fprintf(stderr, "%s\n", _usage);

@@ -154,11 +154,16 @@
              if (sscanf(argv[argpos+1], "%i", &caslot_num) != 1)
-        } else if (!strcmp(argv[argpos], "-channels")) {
+        } else if (!strcmp(argv[argpos], "-channel_list")) {
              if ((argc - argpos) < 2)
              chanfile = argv[argpos+1];
+        } else if (!strcmp(argv[argpos], "-channel_name")) {
+            if ((argc - argpos) < 2)
+                usage();
+            channel_name = argv[argpos+1];
+            argpos+=2;
          } else if (!strcmp(argv[argpos], "-secfile")) {
              if ((argc - argpos) < 2)
@@ -235,11 +240,6 @@
          } else if (!strcmp(argv[argpos], "-cammenu")) {
              cammenu = 1;
-        } else {
-            if ((argc - argpos) != 1)
-                usage();
-            channel_name = argv[argpos];
-            argpos++;

More information about the linux-dvb mailing list