#include "xfer.h"

void BC_Xfer::xfer_yuv420p_to_rgb8 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 uint32_t ot = (r&0xc0u) | ((g>>2)&0x38u) | ((b>>5)&0x07u);
 *out++ = ot; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgb565 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 uint32_t ot = ((r<<8) & 0xf800u) | ((g<<3) & 0x07e0u) | ((b>>3) & 0x001fu);
 *(uint16_t*)out = ot; out += sizeof(uint16_t); xfer_end
}

void BC_Xfer::xfer_yuv420p_to_bgr565 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 uint32_t ot = ((b&0xf8u)<<8) | ((g&0xfcu)<<3) | ((r&0xf8u)>>3);
 *(uint16_t*)out = ot; out += sizeof(uint16_t)/sizeof(*out); xfer_end
}

void BC_Xfer::xfer_yuv420p_to_bgr888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = b; *out++ = g; *out++ = r; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_bgr8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = b; *out++ = g; *out++ = r;  xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgb888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgba8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;  z_int a=0xff; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b;  *out++ = a; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_argb8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;  z_int a=0xff; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = a;  *out++ = r; *out++ = g; *out++ = b; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_abgr8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;  z_int a=0xff; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = a;  *out++ = b; *out++ = g; *out++ = r; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgb161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgba16161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8;  z_int a=0xffff; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b;  *out++ = a; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 *out++ = y; *out++ = u; *out++ = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuva8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;  z_int a=0xff; 
 *out++ = y; *out++ = u; *out++ = v;  *out++ = a; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 *out++ = y; *out++ = u; *out++ = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuva16161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8;  z_int a=0xffff; 
 *out++ = y; *out++ = u; *out++ = v;  *out++ = a; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_ayuv16161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8;  z_int a=0xffff; 
 *out++ = a;  *out++ = y; *out++ = u; *out++ = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_uvy422 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 if( !(j&1) ) { *out++ = u; *out++ = y; *out++ = v; *out = y; }
 else { *out++= y; } xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv422 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 if( !(j&1) ) { *out++ = y; *out = u; out[2] = v; }
 else { *out++ = u; *out++= y; *out++ = v; } xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv101010 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 uint32_t ot = ((y&0xffc0u)<<16) | ((u&0xffc0u)<<6) | ((v&0xffc0u)>>4);
 *(uint32_t*)out = ot; out += sizeof(uint32_t)/sizeof(*out); xfer_end
}

void BC_Xfer::xfer_yuv420p_to_vyu888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 *out++ = v; *out++ = y; *out++ = u; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_uyva8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip;  z_int a=0xff; 
 *out++ = u; *out++ = y; *out++ = v;  *out++ = a; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgb_float (unsigned y0, unsigned y1) {
 xfer_flat_row_out(float)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 float r, g, b; YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v); 
 *out++ = r; *out++ = g; *out++ = b; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgba_float (unsigned y0, unsigned y1) {
 xfer_flat_row_out(float)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 float r, g, b; YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);  z_float fa = 1; 
 *out++ = r; *out++ = g; *out++ = b;  *out++ = fa; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv420p (unsigned y0, unsigned y1) {
 xfer_yuv420p_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j/2] = u;  vop[j/2] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv422p (unsigned y0, unsigned y1) {
 xfer_yuv422p_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j/2] = u;  vop[j/2] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv444p (unsigned y0, unsigned y1) {
 xfer_yuv444p_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j] = u;  vop[j] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv411p (unsigned y0, unsigned y1) {
 xfer_yuv411p_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j/4] = u;  vop[j/4] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv410p (unsigned y0, unsigned y1) {
 xfer_yuv410p_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j/4] = u;  vop[j/4] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgb_floatp (unsigned y0, unsigned y1) {
 xfer_rgbp_row_out(float)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 float r, g, b; YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v); 
 *rop++ = r; *gop++ = g; *bop++ = b; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgba_floatp (unsigned y0, unsigned y1) {
 xfer_rgbap_row_out(float)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 float r, g, b; YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);  z_float fa = 1; 
 *rop++ = r; *gop++ = g; *bop++ = b;  *aop++ = fa; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuv420pi (unsigned y0, unsigned y1) {
 xfer_yuv420pi_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 yop[j] = y;  uop[j/2] = u;  vop[j/2] = v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_grey8 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 *out++ = y; (void)u; (void)v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_grey16 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 *out++ = y; (void)u; (void)v; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_gbrp (unsigned y0, unsigned y1) {
 xfer_rgbp_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *rop++ = g; *gop++ = b; *bop++ = r; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgbx8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b;  *out++ = 0xff; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgbx16161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 int32_t r, g, b;  YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
 *out++ = r; *out++ = g; *out++ = b;  *out++ = 0xffff; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuvx8888 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint8_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 *out++ = y; *out++ = u; *out++ = v;  *out++ = 0xff; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_yuvx16161616 (unsigned y0, unsigned y1) {
 xfer_flat_row_out(uint16_t)  xfer_yuv420p_row_in(uint8_t) 
 int32_t iy = *yip, y = (iy<<8) | iy, u = *uip<<8, v = *vip<<8; 
 *out++ = y; *out++ = u; *out++ = v;  *out++ = 0xffff; xfer_end
}

void BC_Xfer::xfer_yuv420p_to_rgbx_float (unsigned y0, unsigned y1) {
 xfer_flat_row_out(float)  xfer_yuv420p_row_in(uint8_t) 
 int32_t y = *yip, u = *uip, v = *vip; 
 float r, g, b; YUV::yuv.yuv_to_rgb_8(r, g, b, y, u, v); 
 *out++ = r; *out++ = g; *out++ = b;  *out++ = 1.f; xfer_end
}

