diff options
Diffstat (limited to 'test/setpid.c')
-rw-r--r-- | test/setpid.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/test/setpid.c b/test/setpid.c new file mode 100644 index 0000000..fa0333c --- /dev/null +++ b/test/setpid.c @@ -0,0 +1,87 @@ +/* + * 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; +} + + |