+static inline void process_bayer(AVFrame *frame)
+{
+ const int linesize = frame->linesize[0];
+ uint16_t *r = (uint16_t *)frame->data[0];
+ uint16_t *g1 = (uint16_t *)(frame->data[0] + 2);
+ uint16_t *g2 = (uint16_t *)(frame->data[0] + frame->linesize[0]);
+ uint16_t *b = (uint16_t *)(frame->data[0] + frame->linesize[0] + 2);
+ const int mid = 2048;
+
+ for (int y = 0; y < frame->height >> 1; y++) {
+ for (int x = 0; x < frame->width; x += 2) {
+ int R, G1, G2, B;
+ int g, rg, bg, gd;
+
+ g = r[x];
+ rg = g1[x];
+ bg = g2[x];
+ gd = b[x];
+ gd -= mid;
+
+ R = (rg - mid) * 2 + g;
+ G1 = g + gd;
+ G2 = g - gd;
+ B = (bg - mid) * 2 + g;
+
+ R = av_clip_uintp2(R * 16, 16);
+ G1 = av_clip_uintp2(G1 * 16, 16);
+ G2 = av_clip_uintp2(G2 * 16, 16);
+ B = av_clip_uintp2(B * 16, 16);
+
+ r[x] = R;
+ g1[x] = G1;
+ g2[x] = G2;
+ b[x] = B;
+ }
+
+ r += linesize;
+ g1 += linesize;
+ g2 += linesize;
+ b += linesize;
+ }
+}
+