From: Robert Abel <abel@uni-bielefeld.de>
To: Gregor Jasny <gjasny@googlemail.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH][libv4l] Bytes per Line
Date: Sun, 26 Feb 2012 13:15:28 +0100 [thread overview]
Message-ID: <4F4A2260.2000203@uni-bielefeld.de> (raw)
In-Reply-To: <4F49183A.6080105@googlemail.com>
[-- Attachment #1: Type: text/plain, Size: 296 bytes --]
A patch for conversion bayer => rgb as well as bayer => yuv is attached.
Basically, every time where width was assumed to be the offset to the
neighboring pixel below, now step is used for compatibility with images
where width != bytesperline.
Signed-off-by: Robert Abel <abel@uni-bielefeld.de>
[-- Attachment #2: 0001-fix_bayer_stepsize.patch --]
[-- Type: text/plain, Size: 18153 bytes --]
diff -Naur a/lib/libv4lconvert/bayer.c b/lib/libv4lconvert/bayer.c
--- a/lib/libv4lconvert/bayer.c 2012-02-15 11:03:46.792279638 +0100
+++ b/lib/libv4lconvert/bayer.c 2012-02-20 20:17:36.741026768 +0100
@@ -44,7 +44,7 @@
/* inspired by OpenCV's Bayer decoding */
static void v4lconvert_border_bayer_line_to_bgr24(
const unsigned char *bayer, const unsigned char *adjacent_bayer,
- unsigned char *bgr, int width, int start_with_green, int blue_line)
+ unsigned char *bgr, int width, const int start_with_green, const int blue_line)
{
int t0, t1;
@@ -164,11 +164,11 @@
/* From libdc1394, which on turn was based on OpenCV's Bayer decoding */
static void bayer_to_rgbbgr24(const unsigned char *bayer,
- unsigned char *bgr, int width, int height, unsigned int pixfmt,
+ unsigned char *bgr, int width, int height, const unsigned int step, unsigned int pixfmt,
int start_with_green, int blue_line)
{
/* render the first line */
- v4lconvert_border_bayer_line_to_bgr24(bayer, bayer + width, bgr, width,
+ v4lconvert_border_bayer_line_to_bgr24(bayer, bayer + step, bgr, width,
start_with_green, blue_line);
bgr += width * 3;
@@ -179,139 +179,141 @@
const unsigned char *bayer_end = bayer + (width - 2);
if (start_with_green) {
- /* OpenCV has a bug in the next line, which was
- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1; */
- t0 = (bayer[1] + bayer[width * 2 + 1] + 1) >> 1;
+
+ t0 = (bayer[1] + bayer[step * 2 + 1] + 1) >> 1;
/* Write first pixel */
- t1 = (bayer[0] + bayer[width * 2] + bayer[width + 1] + 1) / 3;
+ t1 = (bayer[0] + bayer[step * 2] + bayer[step + 1] + 1) / 3;
if (blue_line) {
*bgr++ = t0;
*bgr++ = t1;
- *bgr++ = bayer[width];
+ *bgr++ = bayer[step];
} else {
- *bgr++ = bayer[width];
+ *bgr++ = bayer[step];
*bgr++ = t1;
*bgr++ = t0;
}
/* Write second pixel */
- t1 = (bayer[width] + bayer[width + 2] + 1) >> 1;
+ t1 = (bayer[step] + bayer[step + 2] + 1) >> 1;
if (blue_line) {
*bgr++ = t0;
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
*bgr++ = t1;
} else {
*bgr++ = t1;
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
*bgr++ = t0;
}
bayer++;
} else {
/* Write first pixel */
- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1;
+ t0 = (bayer[0] + bayer[step * 2] + 1) >> 1;
if (blue_line) {
*bgr++ = t0;
- *bgr++ = bayer[width];
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step];
+ *bgr++ = bayer[step + 1];
} else {
- *bgr++ = bayer[width + 1];
- *bgr++ = bayer[width];
+ *bgr++ = bayer[step + 1];
+ *bgr++ = bayer[step];
*bgr++ = t0;
}
}
if (blue_line) {
for (; bayer <= bayer_end - 2; bayer += 2) {
- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
- bayer[width * 2 + 2] + 2) >> 2;
- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
- bayer[width * 2 + 1] + 2) >> 2;
+ t0 = (bayer[0] + bayer[2] + bayer[step * 2] +
+ bayer[step * 2 + 2] + 2) >> 2;
+ t1 = (bayer[1] + bayer[step] + bayer[step + 2] +
+ bayer[step * 2 + 1] + 2) >> 2;
*bgr++ = t0;
*bgr++ = t1;
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
- t1 = (bayer[width + 1] + bayer[width + 3] + 1) >> 1;
+ t0 = (bayer[2] + bayer[step * 2 + 2] + 1) >> 1;
+ t1 = (bayer[step + 1] + bayer[step + 3] + 1) >> 1;
*bgr++ = t0;
- *bgr++ = bayer[width + 2];
+ *bgr++ = bayer[step + 2];
*bgr++ = t1;
}
} else {
for (; bayer <= bayer_end - 2; bayer += 2) {
- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
- bayer[width * 2 + 2] + 2) >> 2;
- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
- bayer[width * 2 + 1] + 2) >> 2;
- *bgr++ = bayer[width + 1];
+ t0 = (bayer[0] + bayer[2] + bayer[step * 2] +
+ bayer[step * 2 + 2] + 2) >> 2;
+ t1 = (bayer[1] + bayer[step] + bayer[step + 2] +
+ bayer[step * 2 + 1] + 2) >> 2;
+ *bgr++ = bayer[step + 1];
*bgr++ = t1;
*bgr++ = t0;
- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
- t1 = (bayer[width + 1] + bayer[width + 3] + 1) >> 1;
+ t0 = (bayer[2] + bayer[step * 2 + 2] + 1) >> 1;
+ t1 = (bayer[step + 1] + bayer[step + 3] + 1) >> 1;
*bgr++ = t1;
- *bgr++ = bayer[width + 2];
+ *bgr++ = bayer[step + 2];
*bgr++ = t0;
}
}
if (bayer < bayer_end) {
/* write second to last pixel */
- t0 = (bayer[0] + bayer[2] + bayer[width * 2] +
- bayer[width * 2 + 2] + 2) >> 2;
- t1 = (bayer[1] + bayer[width] + bayer[width + 2] +
- bayer[width * 2 + 1] + 2) >> 2;
+ t0 = (bayer[0] + bayer[2] + bayer[step * 2] +
+ bayer[step * 2 + 2] + 2) >> 2;
+ t1 = (bayer[1] + bayer[step] + bayer[step + 2] +
+ bayer[step * 2 + 1] + 2) >> 2;
if (blue_line) {
*bgr++ = t0;
*bgr++ = t1;
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
} else {
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
*bgr++ = t1;
*bgr++ = t0;
}
/* write last pixel */
- t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1;
+ t0 = (bayer[2] + bayer[step * 2 + 2] + 1) >> 1;
if (blue_line) {
*bgr++ = t0;
- *bgr++ = bayer[width + 2];
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 2];
+ *bgr++ = bayer[step + 1];
} else {
- *bgr++ = bayer[width + 1];
- *bgr++ = bayer[width + 2];
+ *bgr++ = bayer[step + 1];
+ *bgr++ = bayer[step + 2];
*bgr++ = t0;
}
+
bayer++;
+
} else {
/* write last pixel */
- t0 = (bayer[0] + bayer[width * 2] + 1) >> 1;
- t1 = (bayer[1] + bayer[width * 2 + 1] + bayer[width] + 1) / 3;
+ t0 = (bayer[0] + bayer[step * 2] + 1) >> 1;
+ t1 = (bayer[1] + bayer[step * 2 + 1] + bayer[step] + 1) / 3;
if (blue_line) {
*bgr++ = t0;
*bgr++ = t1;
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
} else {
- *bgr++ = bayer[width + 1];
+ *bgr++ = bayer[step + 1];
*bgr++ = t1;
*bgr++ = t0;
}
+
}
- /* skip 2 border pixels */
- bayer += 2;
+ /* skip 2 border pixels and padding */
+ bayer += (step - width) + 2;
blue_line = !blue_line;
start_with_green = !start_with_green;
}
/* render the last line */
- v4lconvert_border_bayer_line_to_bgr24(bayer + width, bayer, bgr, width,
+ v4lconvert_border_bayer_line_to_bgr24(bayer + step, bayer, bgr, width,
!start_with_green, !blue_line);
}
void v4lconvert_bayer_to_rgb24(const unsigned char *bayer,
- unsigned char *bgr, int width, int height, unsigned int pixfmt)
+ unsigned char *bgr, int width, int height, const unsigned int step, unsigned int pixfmt)
{
- bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt,
+ bayer_to_rgbbgr24(bayer, bgr, width, height, step, pixfmt,
pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */
|| pixfmt == V4L2_PIX_FMT_SGRBG8,
pixfmt != V4L2_PIX_FMT_SBGGR8 /* blue line */
@@ -319,9 +321,9 @@
}
void v4lconvert_bayer_to_bgr24(const unsigned char *bayer,
- unsigned char *bgr, int width, int height, unsigned int pixfmt)
+ unsigned char *bgr, int width, int height, const unsigned int step, unsigned int pixfmt)
{
- bayer_to_rgbbgr24(bayer, bgr, width, height, pixfmt,
+ bayer_to_rgbbgr24(bayer, bgr, width, height, step, pixfmt,
pixfmt == V4L2_PIX_FMT_SGBRG8 /* start with green */
|| pixfmt == V4L2_PIX_FMT_SGRBG8,
pixfmt == V4L2_PIX_FMT_SBGGR8 /* blue line */
@@ -428,7 +430,7 @@
}
void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
- int width, int height, unsigned int src_pixfmt, int yvu)
+ int width, int height, const unsigned int step, unsigned int src_pixfmt, int yvu)
{
int blue_line = 0, start_with_green = 0, x, y;
unsigned char *ydst = yuv;
@@ -451,12 +453,12 @@
b = bayer[x];
g = bayer[x + 1];
- g += bayer[x + width];
- r = bayer[x + width + 1];
+ g += bayer[x + step];
+ r = bayer[x + step + 1];
*udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
*vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
}
- bayer += 2 * width;
+ bayer += 2 * step;
}
blue_line = 1;
break;
@@ -468,12 +470,12 @@
r = bayer[x];
g = bayer[x + 1];
- g += bayer[x + width];
- b = bayer[x + width + 1];
+ g += bayer[x + step];
+ b = bayer[x + step + 1];
*udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
*vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
}
- bayer += 2 * width;
+ bayer += 2 * step;
}
break;
@@ -484,12 +486,12 @@
g = bayer[x];
b = bayer[x + 1];
- r = bayer[x + width];
- g += bayer[x + width + 1];
+ r = bayer[x + step];
+ g += bayer[x + step + 1];
*udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
*vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
}
- bayer += 2 * width;
+ bayer += 2 * step;
}
blue_line = 1;
start_with_green = 1;
@@ -502,21 +504,22 @@
g = bayer[x];
r = bayer[x + 1];
- b = bayer[x + width];
- g += bayer[x + width + 1];
+ b = bayer[x + step];
+ g += bayer[x + step + 1];
*udst++ = (-4878 * r - 4789 * g + 14456 * b + 4210688) >> 15;
*vdst++ = (14456 * r - 6052 * g - 2351 * b + 4210688) >> 15;
}
- bayer += 2 * width;
+ bayer += 2 * step;
}
start_with_green = 1;
break;
}
- bayer -= width * height;
+ /* Point bayer back to start of frame */
+ bayer -= step * height;
/* render the first line */
- v4lconvert_border_bayer_line_to_y(bayer, bayer + width, ydst, width,
+ v4lconvert_border_bayer_line_to_y(bayer, bayer + step, ydst, width,
start_with_green, blue_line);
ydst += width;
@@ -527,104 +530,104 @@
const unsigned char *bayer_end = bayer + (width - 2);
if (start_with_green) {
- t0 = bayer[1] + bayer[width * 2 + 1];
+ t0 = bayer[1] + bayer[step * 2 + 1];
/* Write first pixel */
- t1 = bayer[0] + bayer[width * 2] + bayer[width + 1];
+ t1 = bayer[0] + bayer[step * 2] + bayer[step + 1];
if (blue_line)
- *ydst++ = (8453 * bayer[width] + 5516 * t1 +
+ *ydst++ = (8453 * bayer[step] + 5516 * t1 +
1661 * t0 + 524288) >> 15;
else
*ydst++ = (4226 * t0 + 5516 * t1 +
- 3223 * bayer[width] + 524288) >> 15;
+ 3223 * bayer[step] + 524288) >> 15;
/* Write second pixel */
- t1 = bayer[width] + bayer[width + 2];
+ t1 = bayer[step] + bayer[step + 2];
if (blue_line)
- *ydst++ = (4226 * t1 + 16594 * bayer[width + 1] +
+ *ydst++ = (4226 * t1 + 16594 * bayer[step + 1] +
1611 * t0 + 524288) >> 15;
else
- *ydst++ = (4226 * t0 + 16594 * bayer[width + 1] +
+ *ydst++ = (4226 * t0 + 16594 * bayer[step + 1] +
1611 * t1 + 524288) >> 15;
bayer++;
} else {
/* Write first pixel */
- t0 = bayer[0] + bayer[width * 2];
+ t0 = bayer[0] + bayer[step * 2];
if (blue_line) {
- *ydst++ = (8453 * bayer[width + 1] + 16594 * bayer[width] +
+ *ydst++ = (8453 * bayer[step + 1] + 16594 * bayer[step] +
1661 * t0 + 524288) >> 15;
} else {
- *ydst++ = (4226 * t0 + 16594 * bayer[width] +
- 3223 * bayer[width + 1] + 524288) >> 15;
+ *ydst++ = (4226 * t0 + 16594 * bayer[step] +
+ 3223 * bayer[step + 1] + 524288) >> 15;
}
}
if (blue_line) {
for (; bayer <= bayer_end - 2; bayer += 2) {
- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
- *ydst++ = (8453 * bayer[width + 1] + 4148 * t1 +
+ t0 = bayer[0] + bayer[2] + bayer[step * 2] + bayer[step * 2 + 2];
+ t1 = bayer[1] + bayer[step] + bayer[step + 2] + bayer[step * 2 + 1];
+ *ydst++ = (8453 * bayer[step + 1] + 4148 * t1 +
806 * t0 + 524288) >> 15;
- t0 = bayer[2] + bayer[width * 2 + 2];
- t1 = bayer[width + 1] + bayer[width + 3];
- *ydst++ = (4226 * t1 + 16594 * bayer[width + 2] +
+ t0 = bayer[2] + bayer[step * 2 + 2];
+ t1 = bayer[step + 1] + bayer[step + 3];
+ *ydst++ = (4226 * t1 + 16594 * bayer[step + 2] +
1611 * t0 + 524288) >> 15;
}
} else {
for (; bayer <= bayer_end - 2; bayer += 2) {
- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
+ t0 = bayer[0] + bayer[2] + bayer[step * 2] + bayer[step * 2 + 2];
+ t1 = bayer[1] + bayer[step] + bayer[step + 2] + bayer[step * 2 + 1];
*ydst++ = (2113 * t0 + 4148 * t1 +
- 3223 * bayer[width + 1] + 524288) >> 15;
+ 3223 * bayer[step + 1] + 524288) >> 15;
- t0 = bayer[2] + bayer[width * 2 + 2];
- t1 = bayer[width + 1] + bayer[width + 3];
- *ydst++ = (4226 * t0 + 16594 * bayer[width + 2] +
+ t0 = bayer[2] + bayer[step * 2 + 2];
+ t1 = bayer[step + 1] + bayer[step + 3];
+ *ydst++ = (4226 * t0 + 16594 * bayer[step + 2] +
1611 * t1 + 524288) >> 15;
}
}
if (bayer < bayer_end) {
/* Write second to last pixel */
- t0 = bayer[0] + bayer[2] + bayer[width * 2] + bayer[width * 2 + 2];
- t1 = bayer[1] + bayer[width] + bayer[width + 2] + bayer[width * 2 + 1];
+ t0 = bayer[0] + bayer[2] + bayer[step * 2] + bayer[step * 2 + 2];
+ t1 = bayer[1] + bayer[step] + bayer[step + 2] + bayer[step * 2 + 1];
if (blue_line)
- *ydst++ = (8453 * bayer[width + 1] + 4148 * t1 +
+ *ydst++ = (8453 * bayer[step + 1] + 4148 * t1 +
806 * t0 + 524288) >> 15;
else
*ydst++ = (2113 * t0 + 4148 * t1 +
- 3223 * bayer[width + 1] + 524288) >> 15;
+ 3223 * bayer[step + 1] + 524288) >> 15;
/* write last pixel */
- t0 = bayer[2] + bayer[width * 2 + 2];
+ t0 = bayer[2] + bayer[step * 2 + 2];
if (blue_line) {
- *ydst++ = (8453 * bayer[width + 1] + 16594 * bayer[width + 2] +
+ *ydst++ = (8453 * bayer[step + 1] + 16594 * bayer[step + 2] +
1661 * t0 + 524288) >> 15;
} else {
- *ydst++ = (4226 * t0 + 16594 * bayer[width + 2] +
- 3223 * bayer[width + 1] + 524288) >> 15;
+ *ydst++ = (4226 * t0 + 16594 * bayer[step + 2] +
+ 3223 * bayer[step + 1] + 524288) >> 15;
}
bayer++;
} else {
/* write last pixel */
- t0 = bayer[0] + bayer[width * 2];
- t1 = bayer[1] + bayer[width * 2 + 1] + bayer[width];
+ t0 = bayer[0] + bayer[step * 2];
+ t1 = bayer[1] + bayer[step * 2 + 1] + bayer[step];
if (blue_line)
- *ydst++ = (8453 * bayer[width + 1] + 5516 * t1 +
+ *ydst++ = (8453 * bayer[step + 1] + 5516 * t1 +
1661 * t0 + 524288) >> 15;
else
*ydst++ = (4226 * t0 + 5516 * t1 +
- 3223 * bayer[width + 1] + 524288) >> 15;
+ 3223 * bayer[step + 1] + 524288) >> 15;
}
- /* skip 2 border pixels */
- bayer += 2;
+ /* skip 2 border pixels and padding */
+ bayer += (step - width) + 2;
blue_line = !blue_line;
start_with_green = !start_with_green;
}
/* render the last line */
- v4lconvert_border_bayer_line_to_y(bayer + width, bayer, ydst, width,
+ v4lconvert_border_bayer_line_to_y(bayer + step, bayer, ydst, width,
!start_with_green, !blue_line);
}
diff -Naur a/lib/libv4lconvert/libv4lconvert.c b/lib/libv4lconvert/libv4lconvert.c
--- a/lib/libv4lconvert/libv4lconvert.c 2012-02-15 11:03:46.792279638 +0100
+++ b/lib/libv4lconvert/libv4lconvert.c 2012-02-16 11:41:45.301387267 +0100
@@ -629,6 +629,7 @@
unsigned int src_pix_fmt = fmt->fmt.pix.pixelformat;
unsigned int width = fmt->fmt.pix.width;
unsigned int height = fmt->fmt.pix.height;
+ unsigned int bytesperline = fmt->fmt.pix.bytesperline;
switch (src_pix_fmt) {
/* JPG and variants */
@@ -858,16 +859,16 @@
case V4L2_PIX_FMT_SRGGB8:
switch (dest_pix_fmt) {
case V4L2_PIX_FMT_RGB24:
- v4lconvert_bayer_to_rgb24(src, dest, width, height, src_pix_fmt);
+ v4lconvert_bayer_to_rgb24(src, dest, width, height, bytesperline, src_pix_fmt);
break;
case V4L2_PIX_FMT_BGR24:
- v4lconvert_bayer_to_bgr24(src, dest, width, height, src_pix_fmt);
+ v4lconvert_bayer_to_bgr24(src, dest, width, height, bytesperline, src_pix_fmt);
break;
case V4L2_PIX_FMT_YUV420:
- v4lconvert_bayer_to_yuv420(src, dest, width, height, src_pix_fmt, 0);
+ v4lconvert_bayer_to_yuv420(src, dest, width, height, bytesperline, src_pix_fmt, 0);
break;
case V4L2_PIX_FMT_YVU420:
- v4lconvert_bayer_to_yuv420(src, dest, width, height, src_pix_fmt, 1);
+ v4lconvert_bayer_to_yuv420(src, dest, width, height, bytesperline, src_pix_fmt, 1);
break;
}
if (src_size < (width * height)) {
diff -Naur a/lib/libv4lconvert/libv4lconvert-priv.h b/lib/libv4lconvert/libv4lconvert-priv.h
--- a/lib/libv4lconvert/libv4lconvert-priv.h 2012-02-15 11:03:46.792279638 +0100
+++ b/lib/libv4lconvert/libv4lconvert-priv.h 2012-02-16 11:42:50.081054833 +0100
@@ -230,13 +230,13 @@
int width, int height);
void v4lconvert_bayer_to_rgb24(const unsigned char *bayer,
- unsigned char *rgb, int width, int height, unsigned int pixfmt);
+ unsigned char *rgb, int width, int height, const unsigned int step, unsigned int pixfmt);
void v4lconvert_bayer_to_bgr24(const unsigned char *bayer,
- unsigned char *rgb, int width, int height, unsigned int pixfmt);
+ unsigned char *rgb, int width, int height, const unsigned int step, unsigned int pixfmt);
void v4lconvert_bayer_to_yuv420(const unsigned char *bayer, unsigned char *yuv,
- int width, int height, unsigned int src_pixfmt, int yvu);
+ int width, int height, const unsigned int step, unsigned int src_pixfmt, int yvu);
void v4lconvert_hm12_to_rgb24(const unsigned char *src,
unsigned char *dst, int width, int height);
prev parent reply other threads:[~2012-02-26 12:15 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-15 15:53 [libv4l] Bytes per Line Robert Abel
2012-02-15 22:30 ` Gregor Jasny
2012-02-20 19:42 ` [PATCH][libv4l] Bytes per Line (was: [libv4l] Bytes per Line) Robert Abel
2012-02-25 17:19 ` [PATCH][libv4l] Bytes per Line Gregor Jasny
2012-02-26 12:15 ` Robert Abel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F4A2260.2000203@uni-bielefeld.de \
--to=abel@uni-bielefeld.de \
--cc=gjasny@googlemail.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox