The DVR device
Prev | Chapter 16. Examples | Next

## The DVR device

The following program code shows how to use the DVR device for recording.

     #include <sys/ioctl.h>
     #include <stdio.h>
     #include <stdint.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     #include <fcntl.h>
     #include <time.h>
     #include <unistd.h>

     #include <linux/dvb/dmx.h>
     #include <linux/dvb/video.h>
     #include <sys/poll.h>
     #define DVR "/dev/dvb/adapter0/dvr1"
     #define AUDIO "/dev/dvb/adapter0/audio1"
     #define VIDEO "/dev/dvb/adapter0/video1"

     #define BUFFY (188⋆20)
     #define MAX_LENGTH (1024⋆1024⋆5) /⋆ record 5MB ⋆/

     /⋆ switch the demuxes to recording, assuming the transponder is tuned ⋆/

     /⋆ demux1, demux2: file descriptor of video and audio filters ⋆/
     /⋆ vpid, apid:     PIDs of video and audio channels           ⋆/

     int switch_to_record(int demux1, int demux2, uint16_t vpid, uint16_t apid)
     {
    	 struct dmx_pes_filter_params pesFilterParams;

    	 if (demux1 < 0){
    		 if ((demux1=open(DMX, O_RDWR|O_NONBLOCK))
    		     < 0){
    			 perror("DEMUX DEVICE: ");
    			 return -1;
    		 }
    	 }

    	 if (demux2 < 0){
    		 if ((demux2=open(DMX, O_RDWR|O_NONBLOCK))
    		     < 0){
    			 perror("DEMUX DEVICE: ");
    			 return -1;
    		 }
    	 }

    	 pesFilterParams.pid = vpid;
    	 pesFilterParams.input = DMX_IN_FRONTEND;
    	 pesFilterParams.output = DMX_OUT_TS_TAP;
    	 pesFilterParams.pes_type = DMX_PES_VIDEO;
    	 pesFilterParams.flags = DMX_IMMEDIATE_START;
    	 if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
    		 perror("DEMUX DEVICE");
    		 return -1;
    	 }
    	 pesFilterParams.pid = apid;
    	 pesFilterParams.input = DMX_IN_FRONTEND;
    	 pesFilterParams.output = DMX_OUT_TS_TAP;
    	 pesFilterParams.pes_type = DMX_PES_AUDIO;
    	 pesFilterParams.flags = DMX_IMMEDIATE_START;
    	 if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){
    		 perror("DEMUX DEVICE");
    		 return -1;
    	 }
    	 return 0;
     }

     /⋆ start recording MAX_LENGTH , assuming the transponder is tuned ⋆/

     /⋆ demux1, demux2: file descriptor of video and audio filters ⋆/
     /⋆ vpid, apid:     PIDs of video and audio channels           ⋆/
     int record_dvr(int demux1, int demux2, uint16_t vpid, uint16_t apid)
     {
    	 int i;
    	 int len;
    	 int written;
    	 uint8_t buf[BUFFY];
    	 uint64_t length;
    	 struct pollfd pfd[1];
    	 int dvr, dvr_out;

    	 /⋆ open dvr device ⋆/
    	 if ((dvr = open(DVR, O_RDONLY|O_NONBLOCK)) < 0){
    			 perror("DVR DEVICE");
    			 return -1;
    	 }

    	 /⋆ switch video and audio demuxes to dvr ⋆/
    	 printf ("Switching dvr on\n");
    	 i = switch_to_record(demux1, demux2, vpid, apid);
    	 printf("finished: ");

    	 printf("Recording %2.0f MB of test file in TS format\n",
    		MAX_LENGTH/(1024.0⋆1024.0));
    	 length = 0;

    	 /⋆ open output file ⋆/
    	 if ((dvr_out = open(DVR_FILE,O_WRONLY|O_CREAT
    				  |O_TRUNC, S_IRUSR|S_IWUSR
    				  |S_IRGRP|S_IWGRP|S_IROTH|
    				  S_IWOTH)) < 0){
    		 perror("Can't open file for dvr test");
    		 return -1;
    	 }

    	 pfd[0].fd = dvr;
    	 pfd[0].events = POLLIN;

    	 /⋆ poll for dvr data and write to file ⋆/
    	 while (length < MAX_LENGTH ) {
    		 if (poll(pfd,1,1)){
    			 if (pfd[0].revents & POLLIN){
    				 len = read(dvr, buf, BUFFY);
    				 if (len < 0){
    					 perror("recording");
    					 return -1;
    				 }
    				 if (len > 0){
    					 written = 0;
    					 while (written < len)
    						 written +=
    							 write (dvr_out,
    								buf, len);
    					 length += len;
    					 printf("written %2.0f MB\r",
    						length/1024./1024.);
    				 }
    			 }
    		 }
    	 }
    	 return 0;
     }

Prev | Up | Next
Chapter 16. Examples | Home | Appendix F. DVB Audio Header File