📄 image.cpp
字号:
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u) >> SCALEBITS_OUT);
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv) >> SCALEBITS_OUT);
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v) >> SCALEBITS_OUT);
*(uint16_t *) (x_ptr+((ROW)*x_stride)+0) = C1::MK(r[ROW], g[ROW], b[ROW]);
rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[y_stride*(ROW) + 1] ];
b[ROW] = (b[ROW] & 0x7) + ((rgb_y + b_u) >> SCALEBITS_OUT);
g[ROW] = (g[ROW] & 0x7) + ((rgb_y - g_uv) >> SCALEBITS_OUT);
r[ROW] = (r[ROW] & 0x7) + ((rgb_y + r_v) >> SCALEBITS_OUT);
*(uint16_t *) (x_ptr+((ROW)*x_stride)+2) = C1::MK(r[ROW], g[ROW], b[ROW]);
}
template<int ROW> static __forceinline void READ_RGB16_Y(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
{
uint32_t rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 0);
b0 += b = C1::B(rgb);
g0 += g = C1::G(rgb);
r0 += r = C1::R(rgb);
y_ptr[(ROW)*y_stride+0] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2);
b0 += b = C1::B(rgb);
g0 += g = C1::G(rgb);
r0 += r = C1::R(rgb);
y_ptr[(ROW)*y_stride+1] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
}
template<int ROW,int UV_ROW> static __forceinline void READ_RGB16_UV(uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
{
u_ptr[(UV_ROW)*uv_stride] =
(uint8_t)((uint8_t) ((-FIX_IN(YUV_RGB_DATA<CCIR>::U_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::U_G_IN) * g0 +
FIX_IN(YUV_RGB_DATA<CCIR>::U_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::U_ADD_IN);
v_ptr[(UV_ROW)*uv_stride] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::V_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::V_G_IN) * g0 -
FIX_IN(YUV_RGB_DATA<CCIR>::V_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::V_ADD_IN);
}
template<int ROW> static __forceinline void WRITE_RGB(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
int r[2],int g[2],int b[2],
const int b_u,const int g_uv,const int r_v)
{
int rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[(ROW)*y_stride + 0] ];
x_ptr[(ROW)*x_stride+(C3)] = limit_uint8((rgb_y + b_u) >> SCALEBITS_OUT);
x_ptr[(ROW)*x_stride+(C2)] = limit_uint8((rgb_y - g_uv) >> SCALEBITS_OUT);
x_ptr[(ROW)*x_stride+(C1::value)] = limit_uint8((rgb_y + r_v) >> SCALEBITS_OUT);
if ((SIZE)>3) x_ptr[(ROW)*x_stride+(C4)] = 0;
rgb_y = YUV_RGB_DATA<CCIR>::RGB_Y_tab[ y_ptr[(ROW)*y_stride + 1] ];
x_ptr[(ROW)*x_stride+(SIZE)+(C3)] = limit_uint8((rgb_y + b_u) >> SCALEBITS_OUT);
x_ptr[(ROW)*x_stride+(SIZE)+(C2)] = limit_uint8((rgb_y - g_uv) >> SCALEBITS_OUT);
x_ptr[(ROW)*x_stride+(SIZE)+(C1::value)] = limit_uint8((rgb_y + r_v) >> SCALEBITS_OUT);
if ((SIZE)>3) x_ptr[(ROW)*x_stride+(SIZE)+(C4)] = 0;
}
template<int ROW> static __forceinline void READ_RGB_Y(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
{
r0 += r = x_ptr[(ROW)*x_stride+(C1::value)];
g0 += g = x_ptr[(ROW)*x_stride+(C2)];
b0 += b = x_ptr[(ROW)*x_stride+(C3)];
y_ptr[(ROW)*y_stride+0] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
r0 += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1::value)];
g0 += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)];
b0 += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)];
y_ptr[(ROW)*y_stride+1] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::Y_R_IN) * r + FIX_IN(YUV_RGB_DATA<CCIR>::Y_G_IN) * g +
FIX_IN(YUV_RGB_DATA<CCIR>::Y_B_IN) * b) >> SCALEBITS_IN) + YUV_RGB_DATA<CCIR>::Y_ADD_IN);
}
template<int ROW,int UV_ROW> static __forceinline void READ_RGB_UV(uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
uint32_t &r,uint32_t &g,uint32_t &b,uint32_t &r0,uint32_t &g0,uint32_t &b0)
{
u_ptr[(UV_ROW)*uv_stride] =
(uint8_t)((uint8_t) ((-FIX_IN(YUV_RGB_DATA<CCIR>::U_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::U_G_IN) * g0 +
FIX_IN(YUV_RGB_DATA<CCIR>::U_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::U_ADD_IN);
v_ptr[(UV_ROW)*uv_stride] =
(uint8_t)((uint8_t) ((FIX_IN(YUV_RGB_DATA<CCIR>::V_R_IN) * r0 - FIX_IN(YUV_RGB_DATA<CCIR>::V_G_IN) * g0 -
FIX_IN(YUV_RGB_DATA<CCIR>::V_B_IN) * b0) >> (SCALEBITS_IN + 2)) + YUV_RGB_DATA<CCIR>::V_ADD_IN);
}
struct YV12_TO_RGB16
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
r[0] = r[1] = g[0] = g[1] = b[0] = b[1] = 0;
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
int b_u = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
int g_uv = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
int r_v = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
WRITE_RGB16<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
}
};
struct YV12_TO_RGB16I
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
r[0] = r[1] = r[2] = r[3] = 0;
g[0] = g[1] = g[2] = g[3] = 0;
b[0] = b[1] = b[2] = b[3] = 0;
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
int b_u0 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
int g_uv0 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
int r_v0 = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
int b_u1=0,g_uv1=0,r_v1=0;
WRITE_RGB16<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
if(full)
{
b_u1 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[uv_stride] ];
g_uv1 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[uv_stride] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[uv_stride] ];
r_v1 = YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[uv_stride] ];
WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
WRITE_RGB16<2>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
WRITE_RGB16<3>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
}
else
WRITE_RGB16<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
}
};
struct YV12_TO_RGB
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
int b_u = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
int g_uv = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
int r_v= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
WRITE_RGB<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u,g_uv,r_v);
}
};
struct YV12_TO_RGBI
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
int b_u0 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[0] ];
int g_uv0 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[0] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[0] ];
int r_v0= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[0] ];
int b_u1=0,g_uv1=0,r_v1=0;
WRITE_RGB<0>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
if(full) // Without flag(full), it crashes when input size is not multiple of 4.
{
b_u1 = YUV_RGB_DATA<CCIR>::B_U_tab[ u_ptr[uv_stride] ];
g_uv1 = YUV_RGB_DATA<CCIR>::G_U_tab[ u_ptr[uv_stride] ] + YUV_RGB_DATA<CCIR>::G_V_tab[ v_ptr[uv_stride] ];
r_v1= YUV_RGB_DATA<CCIR>::R_V_tab[ v_ptr[uv_stride] ];
WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
WRITE_RGB<2>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
WRITE_RGB<3>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u1,g_uv1,r_v1);
}
else
WRITE_RGB<1>(x_ptr,x_stride,y_ptr,y_stride,r,g,b,b_u0,g_uv0,r_v0);
}
};
template<int ROW,int UV_ROW> static __forceinline void WRITE_YUYV(uint8_t *x_ptr,stride_t x_stride,uint8_t *y_ptr,stride_t y_stride,uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride)
{
x_ptr[(ROW)*x_stride+(C1::value)] = y_ptr[ (ROW)*y_stride +0];
x_ptr[(ROW)*x_stride+(C2)] = u_ptr[(UV_ROW)*uv_stride+0];
x_ptr[(ROW)*x_stride+(C3)] = y_ptr[ (ROW)*y_stride +1];
x_ptr[(ROW)*x_stride+(C4)] = v_ptr[(UV_ROW)*uv_stride+0];
}
struct YV12_TO_YUYV
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
WRITE_YUYV<0, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
WRITE_YUYV<1, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
}
};
template<int ROW> static __forceinline void READ_YUYV_Y(uint8_t *y_ptr,stride_t y_stride,uint8_t *x_ptr,stride_t x_stride)
{
y_ptr[(ROW)*y_stride+0] = x_ptr[(ROW)*x_stride+(C1::value)];
y_ptr[(ROW)*y_stride+1] = x_ptr[(ROW)*x_stride+(C3)];
}
template<int UV_ROW,int ROW1,int ROW2> static __forceinline void READ_YUYV_UV(uint8_t *x_ptr,stride_t x_stride,uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride)
{
u_ptr[(UV_ROW)*uv_stride] = (uint8_t)((x_ptr[(ROW1)*x_stride+(C2)] + x_ptr[(ROW2)*x_stride+(C2)] + 1) / 2);
v_ptr[(UV_ROW)*uv_stride] = (uint8_t)((x_ptr[(ROW1)*x_stride+(C4)] + x_ptr[(ROW2)*x_stride+(C4)] + 1) / 2);
}
struct YV12_TO_YUYVI
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
WRITE_YUYV<0, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
WRITE_YUYV<1, 1>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
WRITE_YUYV<2, 0>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
WRITE_YUYV<3, 1>(x_ptr,x_stride,y_ptr,y_stride,u_ptr,v_ptr,uv_stride);
}
};
struct YUYV_TO_YV12
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
READ_YUYV_Y<0>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_Y<1>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_UV<0, 0,1>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
}
};
struct YUYVI_TO_YV12
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
uint8_t *y_ptr,stride_t y_stride,
uint8_t *u_ptr,uint8_t *v_ptr,stride_t uv_stride,
int r[4],int g[4],int b[4],
bool full=true)
{
READ_YUYV_Y<0>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_Y<1>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_Y<2>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_Y<3>(y_ptr,y_stride,x_ptr,x_stride);
READ_YUYV_UV<0, 0,2>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
READ_YUYV_UV<1, 1,3>(x_ptr,x_stride,u_ptr,v_ptr,uv_stride);
}
};
struct RGB16_TO_YV12
{
static __forceinline void ROW(int r[4],int g[4],int b[4])
{
}
static __forceinline void PROCESS(uint8_t *x_ptr,stride_t x_stride,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -