📄 show.c
字号:
write_rgb(cur_rgb+rgb_line, bpp, cur_bay[0], cur_bay[bay_line], cur_bay[bay_line-1]); bay += bay_line2; rgb += rgb_line2; } while (--row_cnt);} /* Interpolate R,G,B fully. columns and rows must be even */static inline void bayer_to_rgb_ip(unsigned char *bay, int bay_line, unsigned char *rgb, int rgb_line, unsigned int columns, unsigned int rows, int bpp) { unsigned char *cur_bay, *cur_rgb; int bay_line2, rgb_line2; int total_columns; unsigned char red, green, blue; unsigned int column_cnt, row_cnt; /* Process 2 lines and rows per each iteration */ total_columns = (columns-2) / 2; row_cnt = (rows-2) / 2; bay_line2 = 2*bay_line; rgb_line2 = 2*rgb_line; /* First scanline is handled here as a special case */ write_rgb(rgb, bpp, bay[1], bay[0], bay[bay_line]); cur_bay = bay + 1; cur_rgb = rgb + bpp; column_cnt = total_columns; do { green = ((unsigned int)cur_bay[-1] + cur_bay[1] + cur_bay[bay_line]) / 3; blue = ((unsigned int)cur_bay[bay_line-1] + cur_bay[bay_line+1]) / 2; write_rgb(cur_rgb, bpp, cur_bay[0], green, blue); red = ((unsigned int)cur_bay[0] + cur_bay[2]) / 2; write_rgb(cur_rgb+bpp, bpp, red, cur_bay[1], cur_bay[bay_line+1]); cur_bay += 2; cur_rgb += 2*bpp; } while (--column_cnt); green = ((unsigned int)cur_bay[-1] + cur_bay[bay_line]) / 2; write_rgb(cur_rgb, bpp, cur_bay[0], green, cur_bay[bay_line-1]); /* Process here all other scanlines except first and last */ bay += bay_line; rgb += rgb_line; do { red = ((unsigned int)bay[-bay_line+1] + bay[bay_line+1]) / 2; green = ((unsigned int)bay[-bay_line] + bay[1] + bay[bay_line]) / 3; write_rgb(rgb+0, bpp, red, green, bay[0]); blue = ((unsigned int)bay[0] + bay[bay_line2]) / 2; write_rgb(rgb+rgb_line, bpp, bay[bay_line+1], bay[bay_line], blue); cur_bay = bay + 1; cur_rgb = rgb + bpp; column_cnt = total_columns; do { red = ((unsigned int)cur_bay[-bay_line]+cur_bay[bay_line]) / 2; blue = ((unsigned int)cur_bay[-1]+cur_bay[1]) / 2; write_rgb(cur_rgb+0, bpp, red, cur_bay[0], blue); red = ((unsigned int)cur_bay[-bay_line]+cur_bay[-bay_line+2]+cur_bay[bay_line]+cur_bay[bay_line+2]) / 4; green = ((unsigned int)cur_bay[0]+cur_bay[2]+cur_bay[-bay_line+1]+cur_bay[bay_line+1]) / 4; write_rgb(cur_rgb+bpp, bpp, red, green, cur_bay[1]); green = ((unsigned int)cur_bay[0]+cur_bay[bay_line2]+cur_bay[bay_line-1]+cur_bay[bay_line+1]) / 4; blue = ((unsigned int)cur_bay[-1]+cur_bay[1]+cur_bay[bay_line2-1]+cur_bay[bay_line2+1]) / 4; write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line], green, blue); red = ((unsigned int)cur_bay[bay_line]+cur_bay[bay_line+2]) / 2; blue = ((unsigned int)cur_bay[1]+cur_bay[bay_line2+1]) / 2; write_rgb(cur_rgb+rgb_line+bpp, bpp, red, cur_bay[bay_line+1], blue); cur_bay += 2; cur_rgb += 2*bpp; } while (--column_cnt); red = ((unsigned int)cur_bay[-bay_line] + cur_bay[bay_line]) / 2; write_rgb(cur_rgb, bpp, red, cur_bay[0], cur_bay[-1]); green = ((unsigned int)cur_bay[0] + cur_bay[bay_line-1] + cur_bay[bay_line2]) / 3; blue = ((unsigned int)cur_bay[-1] + cur_bay[bay_line2-1]) / 2; write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line], green, blue); bay += bay_line2; rgb += rgb_line2; } while (--row_cnt); /* Last scanline is handled here as a special case */ green = ((unsigned int)bay[-bay_line] + bay[1]) / 2; write_rgb(rgb, bpp, bay[-bay_line+1], green, bay[0]); cur_bay = bay + 1; cur_rgb = rgb + bpp; column_cnt = total_columns; do { blue = ((unsigned int)cur_bay[-1] + cur_bay[1]) / 2; write_rgb(cur_rgb, bpp, cur_bay[-bay_line], cur_bay[0], blue); red = ((unsigned int)cur_bay[-bay_line] + cur_bay[-bay_line+2]) / 2; green = ((unsigned int)cur_bay[0] + cur_bay[-bay_line+1] + cur_bay[2]) / 3; write_rgb(cur_rgb+bpp, bpp, red, green, cur_bay[1]); cur_bay += 2; cur_rgb += 2*bpp; } while (--column_cnt); write_rgb(cur_rgb, bpp, cur_bay[-bay_line], cur_bay[0], cur_bay[-1]);} static inline void bayer_to_rgb_cott(unsigned char *bay, int bay_line, unsigned char *rgb, int rgb_line, int columns, int rows, int bpp){ unsigned char *cur_bay, *cur_rgb; int bay_line2, rgb_line2; int total_columns; /* Process 2 lines and rows per each iteration, but process the last row and column separately */ total_columns = (columns>>1) - 1; rows = (rows>>1) - 1; bay_line2 = 2*bay_line; rgb_line2 = 2*rgb_line; do { cur_bay = bay; cur_rgb = rgb; columns = total_columns; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], ((unsigned int)cur_bay[0] + cur_bay[bay_line+1]) /2, cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], ((unsigned int)cur_bay[2] + cur_bay[bay_line+1]) /2, cur_bay[bay_line+2]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line2+1], ((unsigned int)cur_bay[bay_line2] + cur_bay[bay_line+1]) /2, cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[bay_line2+1], ((unsigned int)cur_bay[bay_line2+2] + cur_bay[bay_line+1])/2, cur_bay[bay_line+2]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); write_rgb(cur_rgb+0, bpp, cur_bay[1], ((unsigned int)cur_bay[0] + cur_bay[bay_line+1])/2, cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line2+1], ((unsigned int)cur_bay[bay_line2] + cur_bay[bay_line+1])/2, cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[bay_line2+1], cur_bay[bay_line+1], cur_bay[bay_line]); bay += bay_line2; rgb += rgb_line2; } while (--rows); /* Last scanline handled here as special case */ cur_bay = bay; cur_rgb = rgb; columns = total_columns; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], ((unsigned int)cur_bay[0] + cur_bay[bay_line+1])/2, cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], ((unsigned int)cur_bay[2] + cur_bay[bay_line+1])/2, cur_bay[bay_line+2]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line+2]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); /* Last lower-right pixel is handled here as special case */ write_rgb(cur_rgb+0, bpp, cur_bay[1], ((unsigned int)cur_bay[0] + cur_bay[bay_line+1])/2, cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]);} static inline void bayer_to_rgb_cottnoip(unsigned char *bay, int bay_line, unsigned char *rgb, int rgb_line, int columns, int rows, int bpp){ unsigned char *cur_bay, *cur_rgb; int bay_line2, rgb_line2; int total_columns; /* Process 2 lines and rows per each iteration, but process the last row and column separately */ total_columns = (columns>>1) - 1; rows = (rows>>1) - 1; bay_line2 = 2*bay_line; rgb_line2 = 2*rgb_line; do { cur_bay = bay; cur_rgb = rgb; columns = total_columns; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[2], cur_bay[bay_line+2]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line2+1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[bay_line2+1], cur_bay[bay_line+1], cur_bay[bay_line+2]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[bay_line2+1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[bay_line2+1], cur_bay[bay_line+1], cur_bay[bay_line]); bay += bay_line2; rgb += rgb_line2; } while (--rows); /* Last scanline handled here as special case */ cur_bay = bay; cur_rgb = rgb; columns = total_columns; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[2], cur_bay[bay_line+2]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line+2]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); /* Last lower-right pixel is handled here as special case */ write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]);}#if 0 /* Bilinear filtering */ static int wrg0 = 0; /* Weight for Red on Green */ static int wbg0 = 0; static int wgr0 = 0; static int wbr0 = 0; static int wgb0 = 0; static int wrb0 = 0;#elif 1 /* Best PSNR */ static int wrg0 = 144; static int wbg0 = 160; static int wgr0 = 120; static int wbr0 = 192; static int wgb0 = 120; static int wrb0 = 168;#elif 0 /* Very sharp */ static int wrg0 = ; static int wbg0 = ; static int wgr0 = ; static int wbr0 = ; static int wgb0 = ; static int wrb0 = ;#else /* Sharp with round multipliers */ static int wrg0 = 256; static int wbg0 = 256; static int wgr0 = 128; static int wbr0 = 128; static int wgb0 = 256; static int wrb0 = 256;#endif static unsigned int sharpness = 32767; int wrg; int wbg; int wgr; int wbr; int wgb; int wrb;static void bayer_to_rgb_gptm_printval(void) { printf("0: wrg %i wbg %i wgr %i wbr %i wgb %i wrb %i\n", wrg0, wbg0, wgr0, wbr0, wgb0, wrb0); printf("f: wrg %i wbg %i wgr %i wbr %i wgb %i wrb %i\n", wrg, wbg, wgr, wbr, wgb, wrb); printf("sharpness = %i\n", sharpness);}static inline void bayer_to_rgb_gptm(unsigned char *bay, int bay_line, unsigned char *rgb, int rgb_line, int columns, int rows, int bpp){ /* 0.4 fixed point weights, should be between 0-16. Larger value = sharper */ unsigned int wu; int r,g,b,w; unsigned char *cur_bay, *cur_rgb; int bay_line2, bay_line3, rgb_line2; int total_columns; /* Compute weights */ wu = (sharpness * sharpness) >> 16; wu = (wu * wu) >> 16; wrg = (wrg0 * wu) >> 10; wbg = (wbg0 * wu) >> 10; wgr = (wgr0 * wu) >> 10; wbr = (wbr0 * wu) >> 10; wgb = (wgb0 * wu) >> 10; wrb = (wrb0 * wu) >> 10;// bayer_to_rgb_gptm_printval(); /* Process 2 lines and rows per each iteration, but process the first and last two columns and rows separately */ total_columns = (columns>>1) - 2; rows = (rows>>1) - 2; bay_line2 = 2*bay_line; bay_line3 = 3*bay_line; rgb_line2 = 2*rgb_line; /* Process first two pixel rows here */ cur_bay = bay; cur_rgb = rgb; columns = total_columns + 2; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); bay += bay_line2; rgb += rgb_line2; do { cur_bay = bay; cur_rgb = rgb; columns = total_columns; /* Process first 2x2 pixel block in a row here */ write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); cur_bay += 2; cur_rgb += 2*bpp; do { w = 4*cur_bay[0] - (cur_bay[-bay_line-1] + cur_bay[-bay_line+1] + cur_bay[bay_line-1] + cur_bay[bay_line+1]); r = (512*(cur_bay[-1] + cur_bay[1]) + w*wrg) >> 10; b = (512*(cur_bay[-bay_line] + cur_bay[bay_line]) + w*wbg) >> 10; write_rgb(cur_rgb+0, bpp, CLIP(r,0,255), cur_bay[0], CLIP(b,0,255)); w = 4*cur_bay[1] - (cur_bay[-bay_line2+1] + cur_bay[-1] + cur_bay[3] + cur_bay[bay_line2+1]); g = (256*(cur_bay[-bay_line+1] + cur_bay[0] + cur_bay[2] + cur_bay[bay_line+1]) + w*wgr) >> 10; b = (256*(cur_bay[-bay_line] + cur_bay[-bay_line+2] + cur_bay[bay_line] + cur_bay[bay_line+2]) + w*wbr) >> 10; write_rgb(cur_rgb+bpp, bpp, cur_bay[1], CLIP(g,0,255), CLIP(b,0,255)); w = 4*cur_bay[bay_line] - (cur_bay[-bay_line] + cur_bay[bay_line-2] + cur_bay[bay_line+2] + cur_bay[bay_line3]); r = (256*(cur_bay[-1] + cur_bay[1] + cur_bay[bay_line2-1] + cur_bay[bay_line2+1]) + w*wrb) >> 10; g = (256*(cur_bay[0] + cur_bay[bay_line-1] + cur_bay[bay_line+1] + cur_bay[bay_line2]) + w*wgb) >> 10; write_rgb(cur_rgb+rgb_line, bpp, CLIP(r,0,255), CLIP(g,0,255), cur_bay[bay_line]); w = 4*cur_bay[bay_line+1] - (cur_bay[0] + cur_bay[2] + cur_bay[bay_line2] + cur_bay[bay_line2+2]); r = (512*(cur_bay[1] + cur_bay[bay_line2+1]) + w*wrg) >> 10; b = (512*(cur_bay[bay_line] + cur_bay[bay_line+2]) + w*wbg) >> 10; write_rgb(cur_rgb+rgb_line+bpp, bpp, CLIP(r,0,255), cur_bay[bay_line+1], CLIP(b,0,255)); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns); /* Process last 2x2 pixel block in a row here */ write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); bay += bay_line2; rgb += rgb_line2; } while (--rows); /* Process last two pixel rows here */ cur_bay = bay; cur_rgb = rgb; columns = total_columns + 2; do { write_rgb(cur_rgb+0, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+bpp, bpp, cur_bay[1], cur_bay[0], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); write_rgb(cur_rgb+rgb_line+bpp, bpp, cur_bay[1], cur_bay[bay_line+1], cur_bay[bay_line]); cur_bay += 2; cur_rgb += 2*bpp; } while (--columns);}/* faster version of bayer_to_rgb_gptm with fixed multipliers */static inline void bayer_to_rgb_gptm_fast(unsigned char *bay, int bay_line, unsigned char *rgb, int rgb_line, int columns, int rows, int bpp){ int r,g,b,w; unsigned char *cur_bay, *cur_rgb; int bay_line2, bay_line3, rgb_line2; int total_columns;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -