aboutsummaryrefslogtreecommitdiffstats
path: root/test/setpid.c
blob: fa0333cd08eb30f110a64713e7ba6497560655ca (plain)
1
2
3
4
5pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #b
/*
 * Set video and audio PIDs in the demux; useful only if you have
 * a hardware MPEG decoder and you're tuned to a transport stream.
 *
 * usage: DEMUX=/dev/dvb/adapterX/demuxX setpid video_pid audio_pid
 */

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/dvb/dmx.h>


static
int setup_demux (char *dmxdev, int video_pid, int audio_pid)
{
   int vfd, afd;
   struct dmx_pes_filter_params pesfilter;

   printf ("video_pid == 0x%04x\n", video_pid);
   printf ("audio_pid == 0x%04x\n", audio_pid);

   if ((vfd = open (dmxdev, O_RDWR)) < 0) {
      perror("open 1");
      return -1;
   }

   pesfilter.pid = video_pid;
   pesfilter.input = DMX_IN_FRONTEND;
   pesfilter.output = DMX_OUT_DECODER;
   pesfilter.pes_type = DMX_PES_VIDEO;
   pesfilter.flags = DMX_IMMEDIATE_START;

   if (ioctl (vfd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
      perror("ioctl DMX_SET_PES_FILTER (video)");
      return -1;
   }

   close (vfd);

   if ((afd = open (dmxdev, O_RDWR)) < 0) {
      perror("open 1");
      return -1;
   }

   pesfilter.pid = audio_pid;
   pesfilter.input = DMX_IN_FRONTEND;
   pesfilter.output = DMX_OUT_DECODER;
   pesfilter.pes_type = DMX_PES_AUDIO;
   pesfilter.flags = DMX_IMMEDIATE_START;

   if (ioctl (afd, DMX_SET_PES_FILTER, &pesfilter) < 0) {
      perror("ioctl DMX_SET_PES_FILTER (audio)");
      return -1;
   }

   close (afd);
   return 0;
}


int main (int argc, char **argv)
{
   char *dmxdev = "/dev/dvb/adapter0/demux0";
   int video_pid, audio_pid;

   if (argc != 3) {
      printf ("\nusage: %s <video pid> <audio pid>\n\n", argv[0]);
      exit (1);
   }
   if (getenv("DEMUX"))
      dmxdev = getenv("DEMUX");
   printf("setpid: using '%s'\n", dmxdev);

   video_pid = strtol(argv[1], NULL, 0);
   audio_pid = strtol(argv[2], NULL, 0);
   if (setup_demux (dmxdev, video_pid, audio_pid) < 0)
      return 1;

   return 0;
}