<html><head><meta name="qrichtext" content="1" /></head><body style="font-size:10pt;font-family:Sans">
<p>Hello,</p>
<p> could you integrate the SBGGR8 pixel format in VLC, which is defined by</p>
<p>the V4L2 API (in videodev2.h)? This way I could write and test a simple v4l2 </p>
<p>input module for webcams (and video capture devices in general) in 1 day.</p>
<p></p>
<p>The functions below that I wrote for xawtv might help. I think they are </p>
<p>already clear enough to be mostly copied and placed in the right place </p>
<p>without any problems. The code is released under GPL.</p>
<p></p>
<p>Thanks.</p>
<p></p>
<p>#define RED 0</p>
<p>#define GREEN 1</p>
<p>#define BLUE 2</p>
<p></p>
<p>#define avg2(x,y) ((((int)(x)) + ((int)(y))) / 2)</p>
<p>#define avg3(x,y,z) ((((int)(x)) + ((int)(y)) + ((int)(z))) / 3)</p>
<p>#define avg4(w,x,y,z) ((((int)(w)) + ((int)(x)) + ((int)(y)) + ((int)(z))) / </p>
<p>4)</p>
<p></p>
<p>/* ------------------------------------------------------------------- */</p>
<p>/* bayer bgbg...grgr...to rgb24                                        */</p>
<p></p>
<p>/*</p>
<p> bgbgbg</p>
<p> grgrgr</p>
<p> bgbgbg</p>
<p> grgrgr</p>
<p>*/</p>
<p></p>
<p>static void</p>
<p>sbggr8_to_rgb24(void *h, struct ng_video_buf *out, struct ng_video_buf *in)</p>
<p>{</p>
<p>    unsigned char *restrict s, *restrict d;</p>
<p>    unsigned long x, y, i, j;</p>
<p></p>
<p>    d = out->data;</p>
<p>    s = in->data;</p>
<p>    x  = in->fmt.width;</p>
<p>    y  = in->fmt.height;</p>
<p></p>
<p>    /* upper left corner */</p>
<p>    d[0 + RED] = s[x + 1];</p>
<p>    d[0 + BLUE] = s[0];</p>
<p>    d[0 + GREEN] = ((int)s[1] + (int)s[x]) / 2;</p>
<p></p>
<p>    /* top line (minus corners) */</p>
<p>    i = 1;</p>
<p>    while (i < x - 2) {</p>
<p> d[i * 3 + RED] = s[x + i];</p>
<p> d[i * 3 + GREEN] = s[i];</p>
<p> d[i * 3 + BLUE] = avg2(s[i - 1], s[i + 1]);</p>
<p></p>
<p> i++;</p>
<p></p>
<p> d[i * 3 + RED] = avg2(s[x + i - 1], s[x + i + 1]);</p>
<p> d[i * 3 + GREEN] = avg3(s[i - 1], s[i + 1], s[x + 1]);</p>
<p> d[i * 3 + BLUE] = s[i];</p>
<p></p>
<p> i++;</p>
<p>    }</p>
<p></p>
<p>    /* upper right corner */</p>
<p>    d[i * 3 + RED] = s[x + i];</p>
<p>    d[i * 3 + GREEN] = s[i];</p>
<p>    d[i * 3 + BLUE] = s[i - 1];</p>
<p></p>
<p>    /* middle lines */</p>
<p>    j = 1;</p>
<p>    while (j < y - 2) {</p>
<p> d[j * x * 3 + RED] = s[j * x + 1];</p>
<p> d[j * x * 3 + GREEN] = s[j * x];</p>
<p> d[j * x * 3 + BLUE] = avg2(s[(j - 1) * x], s[(j + 1) * x]);</p>
<p></p>
<p> i = 1;</p>
<p> while (i < x - 2) {</p>
<p>     d[(j * x + i) * 3 + RED] = s[j * x + i];</p>
<p>     d[(j * x + i) * 3 + GREEN] = avg4(s[(j - 1) * x + i],</p>
<p>           s[j * x + i - 1],</p>
<p>           s[j * x + i + 1],</p>
<p>           s[(j + 1) * x + i]);</p>
<p>     d[(j * x + i) * 3 + BLUE] = avg4(s[(j - 1) * x + i - 1],</p>
<p>          s[(j - 1) * x + i + 1],</p>
<p>          s[(j + 1) * x + i - 1],</p>
<p>          s[(j + 1) * x + i + 1]);</p>
<p></p>
<p>     i++;</p>
<p></p>
<p>     d[(j * x + i) * 3 + RED] = avg2(s[j * x + i - 1],</p>
<p>         s[j * x + i + 1]);</p>
<p>     d[(j * x + i) * 3 + GREEN] = s[j * x + i];</p>
<p>     d[(j * x + i) * 3 + BLUE] = avg2(s[(j - 1) * x + i],</p>
<p>          s[(j + 1) * x + i]);</p>
<p></p>
<p>     i++;</p>
<p> }</p>
<p></p>
<p> d[(j * x + i) * 3 + RED] = s[j * x + i];</p>
<p> d[(j * x + i) * 3 + BLUE] = avg2(s[(j - 1) * x + i - 1],</p>
<p>      s[(j + 1) * x + i - 1]);</p>
<p> d[(j * x + i) * 3 + GREEN] = avg2(s[(j - 1) * x + i],</p>
<p>       s[(j + 1) * x + i]);</p>
<p></p>
<p> j++;</p>
<p></p>
<p> d[(j * x + i) * 3 + RED] = avg2(s[(j - 1) * x + i + 1],</p>
<p>     s[(j + 1) * x + i + 1]);</p>
<p> d[(j * x + i) * 3 + BLUE] = s[j * x + i];</p>
<p> d[(j * x + i) * 3 + GREEN] = avg3(s[(j - 1) * x + i],</p>
<p>       s[j * x + i + 1],</p>
<p>       s[(j + 1) * x + i]);</p>
<p></p>
<p> i = 1;</p>
<p> while (i < x - 2) {</p>
<p>     d[(j * x + i) * 3 + RED] = avg2(s[(j - 1) * x + i],</p>
<p>         s[(j + 1) * x + i]);</p>
<p>     d[(j * x + i) * 3 + GREEN] = s[j * x + i];</p>
<p>     d[(j * x + i) * 3 + BLUE] = avg2(s[j * x + i - 1],</p>
<p>          s[j * x + i + 1]);</p>
<p></p>
<p>     i++;</p>
<p></p>
<p>     d[(j * x + i) * 3 + RED] = avg4(s[(j - 1) * x + i - 1],</p>
<p>         s[(j - 1) * x + i + 1],</p>
<p>         s[(j + 1) * x + i - 1],</p>
<p>         s[(j + 1) * x + i + 1]);</p>
<p>     d[(j * x + i) * 3 + GREEN] = avg4(s[(j - 1) * x + i],</p>
<p>           s[j * x + i - 1],</p>
<p>           s[j * x + i + 1],</p>
<p>           s[(j + 1) * x + i]);</p>
<p>     d[(j * x + i) * 3 + BLUE] = s[j * x + i];</p>
<p></p>
<p>     i++;</p>
<p> }</p>
<p></p>
<p> j++;</p>
<p>    }</p>
<p></p>
<p>    /* lower left corner */</p>
<p>    d[(j * x) * 3 + RED] = s[j * x + 1];</p>
<p>    d[(j * x) * 3 + GREEN] = s[j * x];</p>
<p>    d[(j * x) * 3 + BLUE] = s[(j - 1) * x];</p>
<p></p>
<p>    /* bottom line */</p>
<p>    i = 1;</p>
<p>    while (i < x - 2) {</p>
<p> d[(j * x + i) * 3 + RED] = s[j * x + i];</p>
<p> d[(j * x + i) * 3 + GREEN] = avg2(s[j * x + i - 1],  s[j * x + i + 1]);</p>
<p> d[(j * x + i) * 3 + BLUE] = avg2(s[(j - 1) * x + i - 1],</p>
<p>      s[(j - 1) * x + i + 1]);</p>
<p></p>
<p> i++;</p>
<p></p>
<p> d[(j * x + i) * 3 + RED] = avg2(s[j * x + i - 1], s[j * x + i + 1]);</p>
<p> d[(j * x + i) * 3 + GREEN] = s[j * x + i];</p>
<p> d[(j * x + i) * 3 + BLUE] = s[(j - 1) * x + i];</p>
<p></p>
<p> i++;</p>
<p>    }</p>
<p></p>
<p>    /* lower right corner */</p>
<p>    d[(j * x + i) * 3 + RED] = s[j * x + i];</p>
<p>    d[(j * x + i) * 3 + GREEN] = avg2(s[(j - 1) * x + i], s[j * x + i - 1]);</p>
<p>    d[(j * x + i) * 3 + BLUE] = s[(j - 1) * x + i - 1];</p>
<p>}</p>
<p></p>
<p>/* ------------------------------------------------------------------- */</p>
<p>/* bayer bgbg...grgr...to rgb16                                        */</p>
<p></p>
<p>static void</p>
<p>sbggr8_to_rgb16(void *p, struct ng_video_buf *out, struct ng_video_buf *in)</p>
<p>{</p>
<p> unsigned char *restrict s;</p>
<p> uint16_t *d1, *d2;</p>
<p> unsigned long i, j, x, y, w, h;</p>
<p> unsigned char r, g1, g2, b, g;</p>
<p></p>
<p> s = in->data;</p>
<p> w  = in->fmt.width;</p>
<p> h  = in->fmt.height;</p>
<p> d1 = (uint16_t *)out->data;</p>
<p> d2 = d1 + w;</p>
<p> i = 0;</p>
<p> j = w;</p>
<p></p>
<p> for (y = 0; y < h; y += 2, i += w * 2, j += w * 2, d1 += w, d2 += w) {</p>
<p>  for (x = 0; x < w; x += 2) {</p>
<p></p>
<p>   b = s[i + x] ;</p>
<p>   g1 = s[i + 1 + x];</p>
<p>   g2 = s[j + x];</p>
<p>   r = s[j + 1 + x];</p>
<p></p>
<p>   g = (g1 >> 1) + (g2 >> 1);</p>
<p></p>
<p>   *d1++ = (((b) & 0xF8) >> 3 |</p>
<p>         (((g1) & 0xFC) << 3) |</p>
<p>         (((r) & 0xF8) << 8)) ;</p>
<p></p>
<p>   *d1++ = (((b) & 0xF8) >> 3 |</p>
<p>         (((g) & 0xFC) << 3) |</p>
<p>         (((r) & 0xF8) << 8)) ;</p>
<p></p>
<p>   *d2++ = (((b) & 0xF8) >> 3 |</p>
<p>         (((g) & 0xFC) << 3) |</p>
<p>         (((r) & 0xF8) << 8)) ;</p>
<p></p>
<p>   *d2++ = (((b) & 0xF8) >> 3 |</p>
<p>         (((g2) & 0xFC) << 3) |</p>
<p>         (((r) & 0xF8) << 8)) ;</p>
<p></p>
<p>  }</p>
<p> }</p>
<p>}</p>
<p></p>
<p>static void</p>
<p>sbggr8_to_rgb32(void *p, struct ng_video_buf *out, struct ng_video_buf *in)</p>
<p>{</p>
<p> unsigned char *restrict s;</p>
<p> unsigned char *d1, *d2;</p>
<p> unsigned long i, j, x, y, w, h;</p>
<p> unsigned char r, g1, g2, b, g;</p>
<p></p>
<p> s = in->data;</p>
<p> w  = in->fmt.width;</p>
<p> h  = in->fmt.height;</p>
<p> d1 = out->data;</p>
<p> d2 = d1 + 4*w;</p>
<p> i = 0;</p>
<p> j = w;</p>
<p></p>
<p> for (y = 0; y < h; y += 2, i += w * 2, j += w * 2, d1 += 4*w, d2 += 4*w) {</p>
<p>  for (x = 0; x < w; x += 2) {</p>
<p></p>
<p>   b = s[i + x] ;</p>
<p>   g1 = s[i + 1 + x];</p>
<p>   g2 = s[j + x];</p>
<p>   r = s[j + 1 + x];</p>
<p>   g = (g1 >> 1) + (g2 >> 1);</p>
<p></p>
<p>   d1[0] = (r);</p>
<p>   d1[1] = (g1);</p>
<p>   d1[2] = (b);</p>
<p>   d1 += 4;</p>
<p></p>
<p>   d1[0] = (r);</p>
<p>   d1[1] = (g);</p>
<p>   d1[2] = (b);</p>
<p>   d1 += 4;</p>
<p></p>
<p>   d2[0] = (r);</p>
<p>   d2[1] = (g);</p>
<p>   d2[2] = (b);</p>
<p>   d2 += 4;</p>
<p></p>
<p>   d2[0] = (r);</p>
<p>   d2[1] = (g2);</p>
<p>   d2[2] = (b);</p>
<p>   d2 += 4;</p>
<p></p>
<p>  }</p>
<p> }</p>
<p>}</p>
<p></p>
<p>static void</p>
<p>sbggr8_to_yuv420p(void *p, struct ng_video_buf *out, struct ng_video_buf *in)</p>
<p>{</p>
<p> unsigned char *restrict s;</p>
<p> unsigned char *d1, *d2, *U, *V;</p>
<p> unsigned long i, j, x, y, w, h;</p>
<p> unsigned char tr, tb, r, g1, g2, b, g, y1, y2, y3, y4;</p>
<p> int u, v;</p>
<p></p>
<p> #define CLIP(color) ((color > 0xff) ? 0xff : ((color < 0) ? 0 : color))</p>
<p></p>
<p> s = in->data;</p>
<p> w  = in->fmt.width;</p>
<p> h  = in->fmt.height;</p>
<p> d1 = out->data;</p>
<p> d2 = d1 + w;</p>
<p> i = 0;</p>
<p> j = w;</p>
<p> U = d1 + w*h;</p>
<p> V = U + ((w*h) >> 2);</p>
<p></p>
<p> for (y = 0; y < h; y += 2, i += w * 2, j += w * 2, d1 += w, d2 += w) {</p>
<p>  for (x = 0; x < w; x += 2) {</p>
<p></p>
<p>   tb = s[i + x] ;</p>
<p>   g1 = s[i + 1 + x];</p>
<p>   g2 = s[j + x];</p>
<p>   tr = s[j + 1 + x];</p>
<p></p>
<p>   g = (g1 >> 1) + (g2 >> 1);</p>
<p>   r = ((tr << 8) - (tr << 4) - (tr << 3)) >> 10;</p>
<p>   b = ((tb << 7) >> 10);</p>
<p>   g1 = ((g1 << 9) + (g1 << 7) + (g1 << 5)) >> 10;</p>
<p>   g2 = ((g2 << 9) + (g2 << 7) + (g2 << 5)) >> 10;</p>
<p>   g = ((g << 9) + (g << 7) + (g << 5)) >> 10;</p>
<p></p>
<p>   y1 = CLIP((r + g1 + b));</p>
<p>   y2 = CLIP((r + g + b));</p>
<p>   y3 =  CLIP((r + g + b));</p>
<p>   y4 =  CLIP((r + g2 + b));</p>
<p></p>
<p>   *d1++ = y1;</p>
<p>   *d1++ = y2;</p>
<p>   *d2++ = y3;</p>
<p>   *d2++ = y4;</p>
<p></p>
<p>   v = tr - ((y1 + y2 + y3 + y4) >> 2);</p>
<p>   u = ((v << 9) + (v << 7) + (v << 5)) >> 10;</p>
<p>   v = (tb - ((y1 + y2 + y3 + y4) >> 2)) >> 1;</p>
<p></p>
<p>   *U++ = 128 + v;</p>
<p>   *V++ = 128 + u;</p>
<p></p>
<p>  }</p>
<p> }</p>
<p>}</p>
<p></p>
</body></html>