Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ffd1a6a authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb

* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (180 commits)
  V4L/DVB (4641): Trivial: use lowercase letters in hex subsystem ids
  V4L/DVB (4639): Cx88: add autodetection for alternate revision of Leadtek PVR
  V4L/DVB (4638): Basic DVB-T and analog TV support for the HVR1300.
  V4L/DVB (4637): Add a default method for VIDIOC_G_PARM
  V4L/DVB (4635): Extend bttv and saa7134 to check for both AGP and PCI PCI failure case
  V4L/DVB (4634): Zr36120: implement pcipci checks
  V4L/DVB (4632): Zoran: Implement pcipci failure check
  V4L/DVB (4631): Av7110: remove V4L2_CAP_VBI_CAPTURE flag
  V4L/DVB (4630): Av7110: FW_LOADER depemdency fixed
  V4L/DVB (4629): Saa7134: add card support for Proteus Pro 2309
  V4L/DVB (4628): Fix VIDIOC_ENUMSTD ioctl in videodev.c
  V4L/DVB (4627): Vivi crashes with mplayer
  V4L/DVB (4626): On saa7111/7113, LUMA_CTRL need a different value
  V4L/DVB (4624): Tvaudio: Replaced kernel_thread() with kthread_run()
  V4L/DVB (4622): Copy-paste bug in videodev.c
  V4L/DVB (4620): Fix AGC configuration for MOD3000P-based boards
  V4L/DVB (4619): Fixes some I2C dependencies on V4L devices
  V4L/DVB (4617): Problem with dibusb-mb.c USB IDs
  V4L/DVB (4616): [PATCH] Nebula DigiTV USB RC support
  V4L/DVB (4614): Export symbol saa7134_tvaudio_setmute from saa7134 for saa7134-alsa
  ...
parents 0cd43f83 8dd86eeb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ Who: Jody McIntyre <scjody@modernduck.com>
---------------------------

What:	Video4Linux API 1 ioctls and video_decoder.h from Video devices.
When:	July 2006
When:	December 2006
Why:	V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
	series. The old API have lots of drawbacks and don't provide enough
	means to work with all video and audio standards. The newer API is
+6 −2
Original line number Diff line number Diff line
@@ -7,10 +7,10 @@
  6 -> AverTV Studio 303 (M126)                            [1461:000b]
  7 -> MSI TV-@nywhere Master                              [1462:8606]
  8 -> Leadtek Winfast DV2000                              [107d:6620]
  9 -> Leadtek PVR 2000                                    [107d:663b,107d:663C]
  9 -> Leadtek PVR 2000                                    [107d:663b,107d:663c,107d:6632]
 10 -> IODATA GV-VCP3/PCI                                  [10fc:d003]
 11 -> Prolink PlayTV PVR
 12 -> ASUS PVR-416                                        [1043:4823]
 12 -> ASUS PVR-416                                        [1043:4823,1461:c111]
 13 -> MSI TV-@nywhere
 14 -> KWorld/VStream XPert DVB-T                          [17de:08a6]
 15 -> DViCO FusionHDTV DVB-T1                             [18ac:db00]
@@ -51,3 +51,7 @@
 50 -> NPG Tech Real TV FM Top 10                          [14f1:0842]
 51 -> WinFast DTV2000 H                                   [107d:665e]
 52 -> Geniatech DVB-S                                     [14f1:0084]
 53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T  [0070:1404]
 54 -> Norwood Micro TV Tuner
 55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM  [c180:c980]
 56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder   [0070:9600,0070:9601,0070:9602]
+5 −2
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@
 57 -> Avermedia AVerTV GO 007 FM               [1461:f31f]
 58 -> ADS Tech Instant TV (saa7135)            [1421:0350,1421:0351,1421:0370,1421:1370]
 59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
 60 -> LifeView/Typhoon FlyDVB-T Duo Cardbus    [5168:0502,4e42:0502]
 60 -> LifeView/Typhoon/Genius FlyDVB-T Duo Cardbus [5168:0502,4e42:0502,1489:0502]
 61 -> Philips TOUGH DVB-T reference design     [1131:2004]
 62 -> Compro VideoMate TV Gold+II
 63 -> Kworld Xpert TV PVR7134
@@ -83,7 +83,7 @@
 82 -> MSI TV@Anywhere plus                     [1462:6231]
 83 -> Terratec Cinergy 250 PCI TV              [153b:1160]
 84 -> LifeView FlyDVB Trio                     [5168:0319]
 85 -> AverTV DVB-T 777                         [1461:2c05]
 85 -> AverTV DVB-T 777                         [1461:2c05,1461:2c05]
 86 -> LifeView FlyDVB-T / Genius VideoWonder DVB-T [5168:0301,1489:0301]
 87 -> ADS Instant TV Duo Cardbus PTV331        [0331:1421]
 88 -> Tevion/KWorld DVB-T 220RF                [17de:7201]
@@ -94,3 +94,6 @@
 93 -> Medion 7134 Bridge #2                    [16be:0005]
 94 -> LifeView FlyDVB-T Hybrid Cardbus         [5168:3306,5168:3502]
 95 -> LifeView FlyVIDEO3000 (NTSC)             [5169:0138]
 96 -> Medion Md8800 Quadro                     [16be:0007,16be:0008]
 97 -> LifeView FlyDVB-S /Acorp TV134DS         [5168:0300,4e42:0300]
 98 -> Proteus Pro 2309                         [0919:2003]
+6 −0
Original line number Diff line number Diff line
@@ -54,6 +54,12 @@ bttv.o
				dropouts.
		chroma_agc=0/1	AGC of chroma signal, off by default.
		adc_crush=0/1	Luminance ADC crush, on by default.
		i2c_udelay=     Allow reduce I2C speed. Default is 5 usecs
				(meaning 66,67 Kbps). The default is the
				maximum supported speed by kernel bitbang
				algoritm. You may use lower numbers, if I2C
				messages are lost (16 is known to work on
				all supported cards).

		bttv_gpio=0/1
		gpiomask=
+116 −0
Original line number Diff line number Diff line
The cx23416 can produce (and the cx23415 can also read) raw YUV output. The
format of a YUV frame is specific to this chip and is called HM12. 'HM' stands
for 'Hauppauge Macroblock', which is a misnomer as 'Conexant Macroblock' would
be more accurate.

The format is YUV 4:2:0 which uses 1 Y byte per pixel and 1 U and V byte per
four pixels.

The data is encoded as two macroblock planes, the first containing the Y
values, the second containing UV macroblocks.

The Y plane is divided into blocks of 16x16 pixels from left to right
and from top to bottom. Each block is transmitted in turn, line-by-line.

So the first 16 bytes are the first line of the top-left block, the
second 16 bytes are the second line of the top-left block, etc. After
transmitting this block the first line of the block on the right to the
first block is transmitted, etc.

The UV plane is divided into blocks of 16x8 UV values going from left
to right, top to bottom. Each block is transmitted in turn, line-by-line.

So the first 16 bytes are the first line of the top-left block and
contain 8 UV value pairs (16 bytes in total). The second 16 bytes are the
second line of 8 UV pairs of the top-left block, etc. After transmitting
this block the first line of the block on the right to the first block is
transmitted, etc.

The code below is given as an example on how to convert HM12 to separate
Y, U and V planes. This code assumes frames of 720x576 (PAL) pixels.

The width of a frame is always 720 pixels, regardless of the actual specified
width.

--------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static unsigned char frame[576*720*3/2];
static unsigned char framey[576*720];
static unsigned char frameu[576*720 / 4];
static unsigned char framev[576*720 / 4];

static void de_macro_y(unsigned char* dst, unsigned char *src, int dstride, int w, int h)
{
    unsigned int y, x, i;

    // descramble Y plane
    // dstride = 720 = w
    // The Y plane is divided into blocks of 16x16 pixels
    // Each block in transmitted in turn, line-by-line.
    for (y = 0; y < h; y += 16) {
	for (x = 0; x < w; x += 16) {
	    for (i = 0; i < 16; i++) {
		memcpy(dst + x + (y + i) * dstride, src, 16);
		src += 16;
	    }
	}
    }
}

static void de_macro_uv(unsigned char *dstu, unsigned char *dstv, unsigned char *src, int dstride, int w, int h)
{
    unsigned int y, x, i;

    // descramble U/V plane
    // dstride = 720 / 2 = w
    // The U/V values are interlaced (UVUV...).
    // Again, the UV plane is divided into blocks of 16x16 UV values.
    // Each block in transmitted in turn, line-by-line.
    for (y = 0; y < h; y += 16) {
	for (x = 0; x < w; x += 8) {
	    for (i = 0; i < 16; i++) {
		int idx = x + (y + i) * dstride;

		dstu[idx+0] = src[0];  dstv[idx+0] = src[1];
		dstu[idx+1] = src[2];  dstv[idx+1] = src[3];
		dstu[idx+2] = src[4];  dstv[idx+2] = src[5];
		dstu[idx+3] = src[6];  dstv[idx+3] = src[7];
		dstu[idx+4] = src[8];  dstv[idx+4] = src[9];
		dstu[idx+5] = src[10]; dstv[idx+5] = src[11];
		dstu[idx+6] = src[12]; dstv[idx+6] = src[13];
		dstu[idx+7] = src[14]; dstv[idx+7] = src[15];
		src += 16;
	    }
	}
    }
}

/*************************************************************************/
int main(int argc, char **argv)
{
    FILE *fin;
    int i;

    if (argc == 1) fin = stdin;
    else fin = fopen(argv[1], "r");

    if (fin == NULL) {
	fprintf(stderr, "cannot open input\n");
	exit(-1);
    }
    while (fread(frame, sizeof(frame), 1, fin) == 1) {
	de_macro_y(framey, frame, 720, 720, 576);
	de_macro_uv(frameu, framev, frame + 720 * 576, 720 / 2, 720 / 2, 576 / 2);
	fwrite(framey, sizeof(framey), 1, stdout);
	fwrite(framev, sizeof(framev), 1, stdout);
	fwrite(frameu, sizeof(frameu), 1, stdout);
    }
    fclose(fin);
    return 0;
}

--------------------------------------------------------------------------
Loading