if (streamtype != CX18_ENC_STREAM_TYPE_VBI)
                return;
 
+       /*
+        * The CX23418 sends us data that is 32 bit LE swapped, but we want
+        * the raw VBI bytes in the order they were in the raster line
+        */
        cx18_buf_swap(buf);
 
        /*
        if (cx18_raw_vbi(cx)) {
                u8 type;
 
-               /* Skip 12 bytes of header that gets stuffed in */
+               /*
+                * We've set up to get a field's worth of VBI data at a time.
+                * Skip 12 bytes of header prefixing the first field or the
+                * last 12 bytes in the last VBI line from the first field that
+                * prefixes the second field.
+                */
                size -= 12;
                memcpy(p, &buf->buf[12], size);
                type = p[3];
 
+               /* Extrapolate the last 12 bytes of the field's last line */
+               memset(&p[size], (int) p[size - 1], 12);
+
                size = buf->bytesused = compress_raw_buf(cx, p, size);
 
-               /* second field of the frame? */
                if (type == raw_vbi_sav_rp[1]) {
-                       /* Dirty hack needed for backwards
-                          compatibility of old VBI software. */
+                       /*
+                        * Hack needed for compatibility with old VBI software.
+                        * Write the frame # at the end of the last line of the
+                        * second field
+                        */
                        p += size - 4;
                        memcpy(p, &cx->vbi.frame, 4);
                        cx->vbi.frame++;
 
        /* Sliced VBI data with data insertion */
 
-       pts = (q[0] == 0x3fffffff) ? q[2] : 0;
+       pts = (be32_to_cpu(q[0] == 0x3fffffff)) ? be32_to_cpu(q[2]) : 0;
 
        /* first field */
        /* compress_sliced_buf() will skip the 12 bytes of header */