[mythtv] [patch] enable vbi recording

Daniel Thor Kristjansson danielk at mrl.nyu.edu
Fri Dec 3 00:42:19 UTC 2004


This patch enables recording of the VBI data in the MPEG output of the 
PVR-250. You need an ivtv from the 0.2.0-rc series for this to work:
   http://67.18.1.101/~ckennedy/ivtv/

We don't have a PVR-250 VBI decoder yet in Myth, but if we apply this 
patch now the captions will be viewable in recordings made with this 
patch, once we implement a PCR-250 VBI decoder.

-- Daniel
-------------- next part --------------
Index: libs/libmythtv/ivtv-ext-api.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/ivtv-ext-api.h,v
retrieving revision 1.9
diff -u -r1.9 ivtv-ext-api.h
--- libs/libmythtv/ivtv-ext-api.h	1 Jun 2004 06:59:37 -0000	1.9
+++ libs/libmythtv/ivtv-ext-api.h	3 Dec 2004 00:32:33 -0000
@@ -10,6 +10,34 @@
 
 #define IVTV_MBOX_MAX_DATA 16
 
+#define IVTV_SLICED_TELETEXT_B 	(1 << 0)
+#define IVTV_SLICED_CAPTION_625	(1 << 1)
+#define IVTV_SLICED_CAPTION_525	(1 << 2)
+#define IVTV_SLICED_WSS_625	(1 << 3)
+#define IVTV_SLICED_VPS		(1 << 4)
+
+struct ivtv_sliced_vbi_format {
+	unsigned long service_set;	/* one or more of the IVTV_SLICED_ defines */
+	unsigned long packet_size; 	/* the size in bytes of the ivtv_sliced_data packet */
+	unsigned long io_size;		/* maximum number of bytes passed by one read() call */
+	unsigned long reserved;
+};
+
+/* This structure is the same as the proposed v4l2_sliced_data structure */
+/* id is one of the VBI_SLICED_ flags. */
+struct ivtv_sliced_data {
+	unsigned long id;
+	unsigned long line;
+	unsigned char *data;
+};
+
+/* The four bit VBI data type found in the embedded VBI data of an
+   MPEG stream has one of the following values: */
+#define VBI_TYPE_TELETEXT 	0x1 	// Teletext (uses lines 6-22 for PAL, 10-21 for NTSC)
+#define VBI_TYPE_CC 		0x4 	// Closed Captions (line 21 NTSC, line 22 PAL)
+#define VBI_TYPE_WSS 		0x5 	// Wide Screen Signal (line 20 NTSC, line 23 PAL)
+#define VBI_TYPE_VPS 		0x7 	// Video Programming System (PAL) (line 16)
+
 /* allow direct access to the saa7115 registers for testing */
 #define SAA7115_GET_REG         0xFFEE7705
 #define SAA7115_SET_REG         0xFFEE7706
@@ -30,13 +58,14 @@
 #define IVTV_IOC_S_OSD          0xFFEE7788
 #define IVTV_IOC_GET_FB         0xFFEE7789
 
-#define IVTV_IOC_START_DECODE   _IOW('@', 29, struct ivtv_cfg_start_decode)
-#define IVTV_IOC_STOP_DECODE    _IOW('@', 30, struct ivtv_cfg_stop_decode)
-#define IVTV_IOC_G_SPEED        _IOR('@', 31, struct ivtv_speed)
-#define IVTV_IOC_S_SPEED        _IOW('@', 32, struct ivtv_speed)
-#define IVTV_IOC_DEC_STEP       _IOW('@', 33, int)
-#define IVTV_IOC_DEC_FLUSH      _IOW('@', 34, int)
-
+#define IVTV_IOC_START_DECODE  _IOW ('@', 29, struct ivtv_cfg_start_decode)
+#define IVTV_IOC_STOP_DECODE   _IOW ('@', 30, struct ivtv_cfg_stop_decode)
+#define IVTV_IOC_G_SPEED       _IOR ('@', 31, struct ivtv_speed)
+#define IVTV_IOC_S_SPEED       _IOW ('@', 32, struct ivtv_speed)
+#define IVTV_IOC_DEC_STEP      _IOW ('@', 33, int)
+#define IVTV_IOC_DEC_FLUSH     _IOW ('@', 34, int)
+#define IVTV_IOC_S_VBI_MODE    _IOWR('@', 35, struct ivtv_sliced_vbi_format)
+#define IVTV_IOC_G_VBI_MODE    _IOR ('@', 36, struct ivtv_sliced_vbi_format)
 
 /* ioctl for MSP_SET_MATRIX will have to be registered */
 #define MSP_SET_MATRIX     _IOW('m',17,struct msp_matrix)
Index: libs/libmythtv/mpegrecorder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/mpegrecorder.cpp,v
retrieving revision 1.45
diff -u -r1.45 mpegrecorder.cpp
--- libs/libmythtv/mpegrecorder.cpp	18 Nov 2004 05:59:37 -0000	1.45
+++ libs/libmythtv/mpegrecorder.cpp	3 Dec 2004 00:32:34 -0000
@@ -343,6 +343,17 @@
         return false;
     }
 
+    struct ivtv_sliced_vbi_format vbifmt;
+    memset(&vbifmt, 0, sizeof(struct ivtv_sliced_vbi_format));
+    vbifmt.service_set = VBI_TYPE_CC | VBI_TYPE_WSS;
+    if (ioctl(chanfd, IVTV_IOC_S_VBI_MODE, &vbifmt) < 0) {
+        VERBOSE(VB_IMPORTANT, QString("Can't enable VBI recording"));
+        perror("vbi");
+    }
+    ioctl(chanfd, IVTV_IOC_G_VBI_MODE, &vbifmt);
+    VERBOSE(VB_RECORD, QString("VBI %1, %2, %3").
+            arg(vbifmt.service_set).arg(vbifmt.packet_size).arg(vbifmt.io_size));
+
     readfd = open(videodevice.ascii(), O_RDWR);
     if (readfd < 0)
     {


More information about the mythtv-dev mailing list