Commit 299006612a811ba5acc92e2686f2e8b8bc10d4b7

Authored by Hans Verkuil
Committed by Mauro Carvalho Chehab
1 parent 784e8fe417

V4L/DVB (4547): Add YUV HM12 and VBI IVTV format documentation.

README.hm12: documentation on the HM12 YUV format used by the cx23415/6 chip.
README.vbi: documentation on the V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI format
used in MPEG streams.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

Showing 2 changed files with 161 additions and 0 deletions Side-by-side Diff

Documentation/video4linux/cx2341x/README.hm12
  1 +The cx23416 can produce (and the cx23415 can also read) raw YUV output. The
  2 +format of a YUV frame is specific to this chip and is called HM12. 'HM' stands
  3 +for 'Hauppauge Macroblock', which is a misnomer as 'Conexant Macroblock' would
  4 +be more accurate.
  5 +
  6 +The format is YUV 4:2:0 which uses 1 Y byte per pixel and 1 U and V byte per
  7 +four pixels.
  8 +
  9 +The data is encoded as two macroblock planes, the first containing the Y
  10 +values, the second containing UV macroblocks.
  11 +
  12 +The Y plane is divided into blocks of 16x16 pixels from left to right
  13 +and from top to bottom. Each block is transmitted in turn, line-by-line.
  14 +
  15 +So the first 16 bytes are the first line of the top-left block, the
  16 +second 16 bytes are the second line of the top-left block, etc. After
  17 +transmitting this block the first line of the block on the right to the
  18 +first block is transmitted, etc.
  19 +
  20 +The UV plane is divided into blocks of 16x8 UV values going from left
  21 +to right, top to bottom. Each block is transmitted in turn, line-by-line.
  22 +
  23 +So the first 16 bytes are the first line of the top-left block and
  24 +contain 8 UV value pairs (16 bytes in total). The second 16 bytes are the
  25 +second line of 8 UV pairs of the top-left block, etc. After transmitting
  26 +this block the first line of the block on the right to the first block is
  27 +transmitted, etc.
  28 +
  29 +The code below is given as an example on how to convert HM12 to separate
  30 +Y, U and V planes. This code assumes frames of 720x576 (PAL) pixels.
  31 +
  32 +The width of a frame is always 720 pixels, regardless of the actual specified
  33 +width.
  34 +
  35 +--------------------------------------------------------------------------
  36 +
  37 +#include <stdio.h>
  38 +#include <stdlib.h>
  39 +#include <string.h>
  40 +
  41 +static unsigned char frame[576*720*3/2];
  42 +static unsigned char framey[576*720];
  43 +static unsigned char frameu[576*720 / 4];
  44 +static unsigned char framev[576*720 / 4];
  45 +
  46 +static void de_macro_y(unsigned char* dst, unsigned char *src, int dstride, int w, int h)
  47 +{
  48 + unsigned int y, x, i;
  49 +
  50 + // descramble Y plane
  51 + // dstride = 720 = w
  52 + // The Y plane is divided into blocks of 16x16 pixels
  53 + // Each block in transmitted in turn, line-by-line.
  54 + for (y = 0; y < h; y += 16) {
  55 + for (x = 0; x < w; x += 16) {
  56 + for (i = 0; i < 16; i++) {
  57 + memcpy(dst + x + (y + i) * dstride, src, 16);
  58 + src += 16;
  59 + }
  60 + }
  61 + }
  62 +}
  63 +
  64 +static void de_macro_uv(unsigned char *dstu, unsigned char *dstv, unsigned char *src, int dstride, int w, int h)
  65 +{
  66 + unsigned int y, x, i;
  67 +
  68 + // descramble U/V plane
  69 + // dstride = 720 / 2 = w
  70 + // The U/V values are interlaced (UVUV...).
  71 + // Again, the UV plane is divided into blocks of 16x16 UV values.
  72 + // Each block in transmitted in turn, line-by-line.
  73 + for (y = 0; y < h; y += 16) {
  74 + for (x = 0; x < w; x += 8) {
  75 + for (i = 0; i < 16; i++) {
  76 + int idx = x + (y + i) * dstride;
  77 +
  78 + dstu[idx+0] = src[0]; dstv[idx+0] = src[1];
  79 + dstu[idx+1] = src[2]; dstv[idx+1] = src[3];
  80 + dstu[idx+2] = src[4]; dstv[idx+2] = src[5];
  81 + dstu[idx+3] = src[6]; dstv[idx+3] = src[7];
  82 + dstu[idx+4] = src[8]; dstv[idx+4] = src[9];
  83 + dstu[idx+5] = src[10]; dstv[idx+5] = src[11];
  84 + dstu[idx+6] = src[12]; dstv[idx+6] = src[13];
  85 + dstu[idx+7] = src[14]; dstv[idx+7] = src[15];
  86 + src += 16;
  87 + }
  88 + }
  89 + }
  90 +}
  91 +
  92 +/*************************************************************************/
  93 +int main(int argc, char **argv)
  94 +{
  95 + FILE *fin;
  96 + int i;
  97 +
  98 + if (argc == 1) fin = stdin;
  99 + else fin = fopen(argv[1], "r");
  100 +
  101 + if (fin == NULL) {
  102 + fprintf(stderr, "cannot open input\n");
  103 + exit(-1);
  104 + }
  105 + while (fread(frame, sizeof(frame), 1, fin) == 1) {
  106 + de_macro_y(framey, frame, 720, 720, 576);
  107 + de_macro_uv(frameu, framev, frame + 720 * 576, 720 / 2, 720 / 2, 576 / 2);
  108 + fwrite(framey, sizeof(framey), 1, stdout);
  109 + fwrite(framev, sizeof(framev), 1, stdout);
  110 + fwrite(frameu, sizeof(frameu), 1, stdout);
  111 + }
  112 + fclose(fin);
  113 + return 0;
  114 +}
  115 +
  116 +--------------------------------------------------------------------------
Documentation/video4linux/cx2341x/README.vbi
  1 +
  2 +Format of embedded V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI data
  3 +=========================================================
  4 +
  5 +This document describes the V4L2_MPEG_STREAM_VBI_FMT_IVTV format of the VBI data
  6 +embedded in an MPEG-2 program stream. This format is in part dictated by some
  7 +hardware limitations of the ivtv driver (the driver for the Conexant cx23415/6
  8 +chips), in particular a maximum size for the VBI data. Anything longer is cut
  9 +off when the MPEG stream is played back through the cx23415.
  10 +
  11 +The advantage of this format is it is very compact and that all VBI data for
  12 +all lines can be stored while still fitting within the maximum allowed size.
  13 +
  14 +The stream ID of the VBI data is 0xBD. The maximum size of the embedded data is
  15 +4 + 43 * 36, which is 4 bytes for a header and 2 * 18 VBI lines with a 1 byte
  16 +header and a 42 bytes payload each. Anything beyond this limit is cut off by
  17 +the cx23415/6 firmware. Besides the data for the VBI lines we also need 36 bits
  18 +for a bitmask determining which lines are captured and 4 bytes for a magic cookie,
  19 +signifying that this data package contains V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI data.
  20 +If all lines are used, then there is no longer room for the bitmask. To solve this
  21 +two different magic numbers were introduced:
  22 +
  23 +'itv0': After this magic number two unsigned longs follow. Bits 0-17 of the first
  24 +unsigned long denote which lines of the first field are captured. Bits 18-31 of
  25 +the first unsigned long and bits 0-3 of the second unsigned long are used for the
  26 +second field.
  27 +
  28 +'ITV0': This magic number assumes all VBI lines are captured, i.e. it implicitly
  29 +implies that the bitmasks are 0xffffffff and 0xf.
  30 +
  31 +After these magic cookies (and the 8 byte bitmask in case of cookie 'itv0') the
  32 +captured VBI lines start:
  33 +
  34 +For each line the least significant 4 bits of the first byte contain the data type.
  35 +Possible values are shown in the table below. The payload is in the following 42
  36 +bytes.
  37 +
  38 +Here is the list of possible data types:
  39 +
  40 +#define IVTV_SLICED_TYPE_TELETEXT 0x1 // Teletext (uses lines 6-22 for PAL)
  41 +#define IVTV_SLICED_TYPE_CC 0x4 // Closed Captions (line 21 NTSC)
  42 +#define IVTV_SLICED_TYPE_WSS 0x5 // Wide Screen Signal (line 23 PAL)
  43 +#define IVTV_SLICED_TYPE_VPS 0x7 // Video Programming System (PAL) (line 16)
  44 +
  45 +Hans Verkuil <hverkuil@xs4all.nl>