#include "colormodels.h" #include #define RGB_TO_YUV(y, u, v, r, g, b) \ { \ y = ((yuv_table->rtoy_tab[r] + yuv_table->gtoy_tab[g] + yuv_table->btoy_tab[b]) >> 16); \ u = ((yuv_table->rtou_tab[r] + yuv_table->gtou_tab[g] + yuv_table->btou_tab[b]) >> 16); \ v = ((yuv_table->rtov_tab[r] + yuv_table->gtov_tab[g] + yuv_table->btov_tab[b]) >> 16); \ RECLIP(y, 0, 255); \ RECLIP(u, 0, 255); \ RECLIP(v, 0, 255); \ } #define YUV_TO_RGB(y, u, v, r, g, b) \ { \ (r) = ((y + yuv_table->vtor_tab[v]) >> 16); \ (g) = ((y + yuv_table->utog_tab[u] + yuv_table->vtog_tab[v]) >> 16); \ (b) = ((y + yuv_table->utob_tab[u]) >> 16); \ RECLIP(r, 0, 255); \ RECLIP(g, 0, 255); \ RECLIP(b, 0, 255); \ } // Pixel transfers static inline void transfer_RGBA16161616_to_RGB8(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = ((u_int16_t*)input)[3] >> 8; r = (unsigned int)((u_int16_t*)input)[0] * a; g = (unsigned int)((u_int16_t*)input)[1] * a; b = (unsigned int)((u_int16_t*)input)[2] * a; *(*output) = (unsigned char)(((r & 0xc00000) >> 16) + ((g & 0xe00000) >> 18) + ((b & 0xe00000) >> 21)); (*output)++; } static inline void transfer_RGBA16161616_to_RGB565(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = ((u_int16_t*)input)[3] >> 8; r = (unsigned int)((u_int16_t*)input)[0] * a; g = (unsigned int)((u_int16_t*)input)[1] * a; b = (unsigned int)((u_int16_t*)input)[2] * a; *(u_int16_t*)(*output) = (u_int16_t)(((r & 0xf80000) >> 8) + ((g & 0xfc0000) >> 13) + ((b & 0xf80000) >> 19)); (*output) += 2; } static inline void transfer_RGBA16161616_to_BGR888(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = ((u_int16_t*)input)[3] >> 8; r = (unsigned int)((u_int16_t*)input)[0] * a; g = (unsigned int)((u_int16_t*)input)[1] * a; b = (unsigned int)((u_int16_t*)input)[2] * a; (*output)[0] = (unsigned char)(b >> 16); (*output)[1] = (unsigned char)(g >> 16); (*output)[2] = (unsigned char)(r >> 16); (*output) += 3; } static inline void transfer_RGBA16161616_to_BGR8888(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = ((u_int16_t*)input)[3] >> 8; r = ((u_int16_t*)input)[0] * a; g = ((u_int16_t*)input)[1] * a; b = ((u_int16_t*)input)[2] * a; (*output)[0] = (unsigned char)(b >> 16); (*output)[1] = (unsigned char)(g >> 16); (*output)[2] = (unsigned char)(r >> 16); (*output) += 4; } static inline void transfer_RGBA8888_to_TRANSPARENCY(unsigned char *(*output), unsigned char *input, int (*bit_counter)) { if((*bit_counter) == 7) *(*output) = 0; if(input[3] < 127) { *(*output) |= (unsigned char)1 << (7 - (*bit_counter)); } if((*bit_counter) == 0) { (*output)++; (*bit_counter) = 7; } else (*bit_counter)--; } // These routines blend in a background color since they should be // exclusively used for widgets. static inline void transfer_RGBA8888_to_RGB8bg(unsigned char *(*output), unsigned char *input, int bg_r, int bg_g, int bg_b) { unsigned int r, g, b, a, anti_a; a = input[3]; anti_a = 255 - a; r = (unsigned int)input[0] * a + bg_r * anti_a; g = (unsigned int)input[1] * a + bg_g * anti_a; b = (unsigned int)input[2] * a + bg_b * anti_a; *(*output) = (unsigned char)(((r & 0xc000) >> 8) + ((g & 0xe000) >> 10) + ((b & 0xe000) >> 13)); (*output)++; } static inline void transfer_RGBA8888_to_RGB565bg(unsigned char *(*output), unsigned char *input, int bg_r, int bg_g, int bg_b) { unsigned int r, g, b, a, anti_a; a = input[3]; anti_a = 255 - a; r = (unsigned int)input[0] * a + bg_r * anti_a; g = (unsigned int)input[1] * a + bg_g * anti_a; b = (unsigned int)input[2] * a + bg_b * anti_a; *(u_int16_t*)(*output) = (u_int16_t)((r & 0xf800) + ((g & 0xfc00) >> 5) + ((b & 0xf800) >> 11)); (*output) += 2; } static inline void transfer_RGBA8888_to_BGR888bg(unsigned char *(*output), unsigned char *input, int bg_r, int bg_g, int bg_b) { unsigned int r, g, b, a, anti_a; a = input[3]; anti_a = 255 - a; r = (unsigned int)input[0] * a + bg_r * anti_a; g = (unsigned int)input[1] * a + bg_g * anti_a; b = (unsigned int)input[2] * a + bg_b * anti_a; (*output)[0] = (b >> 8) + 1; (*output)[1] = (g >> 8) + 1; (*output)[2] = (r >> 8) + 1; (*output) += 3; } static inline void transfer_RGBA8888_to_BGR8888bg(unsigned char *(*output), unsigned char *input, int bg_r, int bg_g, int bg_b) { unsigned int r, g, b, a, anti_a; a = input[3]; anti_a = 255 - a; r = (unsigned int)input[0] * a + bg_r * anti_a; g = (unsigned int)input[1] * a + bg_g * anti_a; b = (unsigned int)input[2] * a + bg_b * anti_a; (*output)[0] = (b >> 8) + 1; (*output)[1] = (g >> 8) + 1; (*output)[2] = (r >> 8) + 1; (*output) += 4; } // These routines blend in a black background static inline void transfer_RGBA8888_to_RGB8(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = input[3]; r = (unsigned int)input[0] * a; g = (unsigned int)input[1] * a; b = (unsigned int)input[2] * a; *(*output) = (unsigned char)(((r & 0xc000) >> 8) + ((g & 0xe000) >> 10) + ((b & 0xe000) >> 13)); (*output)++; } static inline void transfer_RGBA8888_to_RGB565(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = input[3]; r = (unsigned int)input[0] * a; g = (unsigned int)input[1] * a; b = (unsigned int)input[2] * a; *(u_int16_t*)(*output) = (u_int16_t)((r & 0xf800) + ((g & 0xfc00) >> 5) + ((b & 0xf800) >> 11)); (*output) += 2; } static inline void transfer_RGBA8888_to_BGR888(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = input[3]; r = (unsigned int)input[0] * a; g = (unsigned int)input[1] * a; b = (unsigned int)input[2] * a; (*output)[0] = (b >> 8) + 1; (*output)[1] = (g >> 8) + 1; (*output)[2] = (r >> 8) + 1; (*output) += 3; } static inline void transfer_RGBA8888_to_BGR8888(unsigned char *(*output), unsigned char *input) { unsigned int r, g, b, a; a = input[3]; r = (unsigned int)input[0] * a; g = (unsigned int)input[1] * a; b = (unsigned int)input[2] * a; (*output)[0] = (b >> 8) + 1; (*output)[1] = (g >> 8) + 1; (*output)[2] = (r >> 8) + 1; (*output) += 4; } static inline void transfer_RGB888_to_RGB8(unsigned char *(*output), unsigned char *input) { *(*output) = (unsigned char)((input[0] & 0xc0) + ((input[1] & 0xe0) >> 2) + ((input[2] & 0xe0) >> 5)); (*output)++; } static inline void transfer_RGB888_to_RGB565(unsigned char *(*output), unsigned char *input) { u_int16_t r, g, b; r = *input++; g = *input++; b = *input; *(u_int16_t*)(*output) = ((r & 0xf8) << 8) + ((g & 0xfc) << 3) + ((b & 0xf8) >> 3); (*output) += 2; } static inline void transfer_RGB888_to_BGR888(unsigned char *(*output), unsigned char *input) { (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 3; } static inline void transfer_RGB888_to_BGR8888(unsigned char *(*output), unsigned char *input) { (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 4; } static inline void transfer_BGR8888_to_RGB888(unsigned char *(*output), unsigned char *input) { (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 3; } static inline void transfer_BGR888_to_RGB888(unsigned char *(*output), unsigned char *input) { (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[0]; (*output) += 3; } static inline void transfer_RGB888_to_YUV420P_YUV422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column) { int y, u, v; RGB_TO_YUV(y, u, v, input[0], input[1], input[2]); output_y[output_column] = y; output_u[output_column / 2] = u; output_v[output_column / 2] = v; } static inline void transfer_YUV888_to_RGB8(unsigned char *(*output), unsigned char *input) { int y, u, v; int r, g, b; y = ((int)input[0]) << 16; u = input[1]; v = input[2]; YUV_TO_RGB(y, u, v, r, g, b); *(*output) = (unsigned char)((r & 0xc0) + ((g & 0xe0) >> 2) + ((b & 0xe0) >> 5)); (*output)++; } static inline void transfer_YUV888_to_RGB565(unsigned char *(*output), unsigned char *input) { int y, u, v; int r, g, b; y = ((int)input[0]) << 16; u = input[1]; v = input[2]; YUV_TO_RGB(y, u, v, r, g, b); *(u_int16_t*)(*output) = ((r & 0xf8) << 8) + ((g & 0xfc) << 3) + ((b & 0xf8) >> 3); (*output) += 2; } static inline void transfer_YUV888_to_BGR888(unsigned char *(*output), unsigned char *input) { int y, u, v; int r, g, b; y = ((int)input[0]) << 16; u = input[1]; v = input[2]; YUV_TO_RGB(y, u, v, r, g, b); (*output)[2] = r; (*output)[1] = g; (*output)[0] = b; (*output) += 3; } static inline void transfer_YUV888_to_BGR8888(unsigned char *(*output), unsigned char *input) { int y, u, v; int r, g, b; y = ((int)input[0]) << 16; u = input[1]; v = input[2]; YUV_TO_RGB(y, u, v, r, g, b); (*output)[2] = r; (*output)[1] = g; (*output)[0] = b; (*output) += 4; } static inline void transfer_YUV888_to_YUV420P_YUV422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column) { output_y[output_column] = input[0]; output_u[output_column / 2] = input[1]; output_v[output_column / 2] = input[2]; } static inline void transfer_YUV888_to_YUV422(unsigned char *(*output), unsigned char *input, int j) { // Store U and V for even pixels only if(!(j & 1)) { (*output)[1] = input[1]; (*output)[3] = input[2]; (*output)[0] = input[0]; } else // Store Y and advance output for odd pixels only { (*output)[2] = input[0]; (*output) += 4; } } static inline void transfer_YUV420P_to_RGB8(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { int y, u, v; int r, g, b; y = (int)(*input_y) << 16; u = *input_u; v = *input_v; YUV_TO_RGB(y, u, v, r, g, b) *(*output) = (unsigned char)((r & 0xc0) + ((g & 0xe0) >> 2) + ((b & 0xe0) >> 5)); (*output)++; } static inline void transfer_YUV420P_to_RGB565(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { int y, u, v; int r, g, b; y = (int)(*input_y) << 16; u = *input_u; v = *input_v; YUV_TO_RGB(y, u, v, r, g, b) *(u_int16_t*)(*output) = ((r & 0xf8) << 8) + ((g & 0xfc) << 3) + ((b & 0xf8) >> 3); (*output) += 2; } static inline void transfer_YUV420P_to_BGR888(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { int y, u, v; int r, g, b; y = (int)(*input_y) << 16; u = *input_u; v = *input_v; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 3; } static inline void transfer_YUV420P_to_RGB888(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { int y, u, v; int r, g, b; y = (int)(*input_y) << 16; u = *input_u; v = *input_v; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = r; (*output)[1] = g; (*output)[2] = b; (*output) += 3; } static inline void transfer_YUV420P_to_BGR8888(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { int y, u, v; int r, g, b; y = (int)(*input_y) << 16; u = *input_u; v = *input_v; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 4; } static inline void transfer_YUV422P_to_YUV888(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v) { (*output)[0] = *input_y; (*output)[1] = *input_u; (*output)[2] = *input_v; (*output) += 3; } static inline void transfer_YUV422P_to_YUV420P(unsigned char *input_y, unsigned char *input_u, unsigned char *input_v, unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, int j) { output_y[j] = *input_y; output_u[j / 2] = *input_u; output_v[j / 2] = *input_v; } static inline void transfer_YUV422P_to_YUV422(unsigned char *(*output), unsigned char *input_y, unsigned char *input_u, unsigned char *input_v, int j) { // Store U and V for even pixels only if(!(j & 1)) { (*output)[1] = *input_u; (*output)[3] = *input_v; (*output)[0] = *input_y; } else // Store Y and advance output for odd pixels only { (*output)[2] = *input_y; (*output) += 4; } } static inline void transfer_YUV422_to_RGB8(unsigned char *(*output), unsigned char *input, int column) { int y, u, v; int r, g, b; // Even pixel if(!(column & 1)) y = (int)(input[0]) << 16; else // Odd pixel y = (int)(input[2]) << 16; u = input[1]; v = input[3]; YUV_TO_RGB(y, u, v, r, g, b) *(*output) = (unsigned char)((r & 0xc0) + ((g & 0xe0) >> 2) + ((b & 0xe0) >> 5)); (*output)++; } static inline void transfer_YUV422_to_RGB565(unsigned char *(*output), unsigned char *input, int column) { int y, u, v; int r, g, b; // Even pixel if(!(column & 1)) y = (int)(input[0]) << 16; else // Odd pixel y = (int)(input[2]) << 16; u = input[1]; v = input[3]; YUV_TO_RGB(y, u, v, r, g, b) *(u_int16_t*)(*output) = ((r & 0xf8) << 8) + ((g & 0xfc) << 3) + ((b & 0xf8) >> 3); (*output) += 2; } static inline void transfer_YUV422_to_BGR888(unsigned char *(*output), unsigned char *input, int column) { int y, u, v; int r, g, b; // Even pixel if(!(column & 1)) y = (int)(input[0]) << 16; else // Odd pixel y = (int)(input[2]) << 16; u = input[1]; v = input[3]; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 3; } static inline void transfer_YUV422_to_RGB888(unsigned char *(*output), unsigned char *input, int column) { int y, u, v; int r, g, b; // Even pixel if(!(column & 1)) y = (int)(input[0]) << 16; else // Odd pixel y = (int)(input[2]) << 16; u = input[1]; v = input[3]; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = r; (*output)[1] = g; (*output)[2] = b; (*output) += 3; } static inline void transfer_YUV422_to_YUV888(unsigned char *(*output), unsigned char *input, int column) { // Even pixel if(!(column & 1)) (*output)[0] = input[0]; else // Odd pixel (*output)[0] = input[2]; (*output)[1] = input[1]; (*output)[2] = input[3]; (*output) += 3; } static inline void transfer_YUV422_to_BGR8888(unsigned char *(*output), unsigned char *input, int column) { int y, u, v; int r, g, b; // Even pixel if(!(column & 1)) y = (int)(input[0]) << 16; else // Odd pixel y = (int)(input[2]) << 16; u = input[1]; v = input[3]; YUV_TO_RGB(y, u, v, r, g, b) (*output)[0] = b; (*output)[1] = g; (*output)[2] = r; (*output) += 4; } static inline void transfer_YUV422_to_YUV422P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column) { // Store U and V for even pixels only if(!(output_column & 1)) { output_y[output_column] = input[0]; output_u[output_column / 2] = input[1]; output_v[output_column / 2] = input[3]; } else // Store Y and advance output for odd pixels only { output_y[output_column] = input[2]; } } static inline void transfer_YUV422_to_YUV420P(unsigned char *output_y, unsigned char *output_u, unsigned char *output_v, unsigned char *input, int output_column, int output_row) { // Store U and V for even pixels only if(!(output_column & 1) && !(output_row & 1)) { output_y[output_column] = input[0]; output_u[output_column / 2] = input[1]; output_v[output_column / 2] = input[3]; } else // Store Y and advance output for odd pixels only { output_y[output_column] = input[2]; } } static inline void transfer_YUV422_to_YUV422(unsigned char *(*output), unsigned char *input, int j) { // Store U and V for even pixels only if(!(j & 1)) { (*output)[0] = input[0]; (*output)[1] = input[1]; (*output)[3] = input[3]; } else // Store Y and advance output for odd pixels only { (*output)[2] = input[2]; (*output) += 4; } } #define TRANSFER_FRAME_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_row = output_rows[i + out_y] + out_x * out_pixelsize; \ unsigned char *input_row = input_rows[row_table[i]]; \ int bit_counter = 7; \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_FRAME_TAIL \ } \ } #define TRANSFER_YUV420P_OUT_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *input_row = input_rows[row_table[i]]; \ unsigned char *output_y = out_y_plane + row_table[i] * total_out_w + out_x; \ unsigned char *output_u = out_u_plane + i / 2 * total_out_w / 2 + out_x / 2; \ unsigned char *output_v = out_v_plane + i / 2 * total_out_w / 2 + out_x / 2; \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_YUV422P_OUT_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *input_row = input_rows[row_table[i]]; \ unsigned char *output_y = out_y_plane + row_table[i] * total_out_w + out_x; \ unsigned char *output_u = out_u_plane + i * total_out_w / 2 + out_x / 2; \ unsigned char *output_v = out_v_plane + i * total_out_w / 2 + out_x / 2; \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_YUV420P_IN_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_row = output_rows[i + out_y] + out_x * out_pixelsize; \ unsigned char *input_y = in_y_plane + row_table[i] * total_in_w; \ unsigned char *input_u = in_u_plane + (row_table[i] / 2) * (total_in_w / 2); \ unsigned char *input_v = in_v_plane + (row_table[i] / 2) * (total_in_w / 2); \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_YUV422P_IN_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_row = output_rows[i + out_y] + out_x * out_pixelsize; \ unsigned char *input_y = in_y_plane + row_table[i] * total_in_w; \ unsigned char *input_u = in_u_plane + row_table[i] * (total_in_w / 2); \ unsigned char *input_v = in_v_plane + row_table[i] * (total_in_w / 2); \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_YUV422_IN_HEAD \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_row = output_rows[i + out_y] + ((out_x * out_pixelsize) & 0xfffffffc); \ unsigned char *input_y = in_y_plane + row_table[i] * total_in_w; \ unsigned char *input_u = in_u_plane + row_table[i] * (total_in_w / 2); \ unsigned char *input_v = in_v_plane + row_table[i] * (total_in_w / 2); \ for(j = 0; j < out_w; j++) \ { #define TRANSFER_FRAME_PERMUTATION2(output, \ input, \ y_in_offset, \ u_in_offset, \ v_in_offset, \ input_column) \ { \ register int i, j; \ switch(in_colormodel) \ { \ case BC_YUV420P: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV420P_to_RGB8((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV420P_to_RGB565((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_RGB888: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV420P_to_RGB888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV420P_to_BGR888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV420P_to_BGR8888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV888: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV422P_to_YUV888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV420P: \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_y = out_y_plane + i * total_in_w; \ unsigned char *output_u = out_u_plane + i / 2 * total_in_w / 2; \ unsigned char *output_v = out_v_plane + i / 2 * total_in_w / 2; \ unsigned char *input_y = in_y_plane + row_table[i] * total_in_w; \ unsigned char *input_u = in_u_plane + row_table[i] / 2 * total_in_w / 2; \ unsigned char *input_v = in_v_plane + row_table[i] / 2 * total_in_w / 2; \ for(j = 0; j < out_w; j++) \ { \ transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset), \ output_y, \ output_u, \ output_v, \ j); \ } \ } \ break; \ case BC_YUV422: \ TRANSFER_YUV420P_IN_HEAD \ transfer_YUV422P_to_YUV422((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset), \ j); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_YUV422P: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV420P_to_RGB8((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV420P_to_RGB565((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_RGB888: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV420P_to_RGB888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV420P_to_BGR888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV420P_to_BGR8888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV888: \ TRANSFER_YUV422P_IN_HEAD \ transfer_YUV422P_to_YUV888((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV420P: \ for(i = 0; i < out_h; i++) \ { \ unsigned char *output_y = out_y_plane + i * total_in_w; \ unsigned char *output_u = out_u_plane + i / 2 * total_in_w / 2; \ unsigned char *output_v = out_v_plane + i / 2 * total_in_w / 2; \ unsigned char *input_y = in_y_plane + row_table[i] * total_in_w; \ unsigned char *input_u = in_u_plane + row_table[i] * total_in_w / 2; \ unsigned char *input_v = in_v_plane + row_table[i] * total_in_w / 2; \ for(j = 0; j < out_w; j++) \ { \ transfer_YUV422P_to_YUV420P(input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset), \ output_y, \ output_u, \ output_v, \ j); \ } \ } \ break; \ case BC_YUV422: \ TRANSFER_YUV422_IN_HEAD \ transfer_YUV422P_to_YUV422((output), \ input_y + (y_in_offset), \ input_u + (u_in_offset), \ input_v + (v_in_offset), \ j); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_YUV422: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_RGB8((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_RGB565((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_RGB888: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_RGB888((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV888: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_YUV888((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_BGR888((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_BGR8888((output), (input), (input_column)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV422P: \ TRANSFER_YUV422P_OUT_HEAD \ transfer_YUV422_to_YUV422P(output_y, \ output_u, \ output_v, \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV422: \ TRANSFER_FRAME_HEAD \ transfer_YUV422_to_YUV422((output), \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV420P: \ TRANSFER_YUV420P_OUT_HEAD \ transfer_YUV422_to_YUV420P(output_y, \ output_u, \ output_v, \ (input), \ j, \ i); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_YUV888: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_FRAME_HEAD \ transfer_YUV888_to_RGB8((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_FRAME_HEAD \ transfer_YUV888_to_RGB565((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_FRAME_HEAD \ transfer_YUV888_to_BGR888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_FRAME_HEAD \ transfer_YUV888_to_BGR8888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV420P: \ TRANSFER_YUV420P_OUT_HEAD \ transfer_YUV888_to_YUV420P_YUV422P(output_y, \ output_u, \ output_v, \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV422P: \ TRANSFER_YUV422P_OUT_HEAD \ transfer_YUV888_to_YUV420P_YUV422P(output_y, \ output_u, \ output_v, \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV422: \ TRANSFER_FRAME_HEAD \ transfer_YUV888_to_YUV422((output), \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_RGBA16161616: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_FRAME_HEAD \ transfer_RGBA16161616_to_RGB8((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_FRAME_HEAD \ transfer_RGBA16161616_to_RGB565((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_FRAME_HEAD \ transfer_RGBA16161616_to_BGR888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_FRAME_HEAD \ transfer_RGBA16161616_to_BGR8888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_RGBA8888: \ switch(out_colormodel) \ { \ case BC_TRANSPARENCY: \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_TRANSPARENCY((output), (input), &bit_counter); \ TRANSFER_FRAME_TAIL \ break; \ case BC_RGB8: \ if(bg_color > 0) \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_RGB8bg((output), (input), bg_r, bg_g, bg_b); \ TRANSFER_FRAME_TAIL \ else \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_RGB8((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ if(bg_color > 0) \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_RGB565bg((output), (input), bg_r, bg_g, bg_b); \ TRANSFER_FRAME_TAIL \ else \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_RGB565((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ if(bg_color > 0) \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_BGR888bg((output), (input), bg_r, bg_g, bg_b); \ TRANSFER_FRAME_TAIL \ else \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_BGR888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ if(bg_color > 0) \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_BGR8888bg((output), (input), bg_r, bg_g, bg_b); \ TRANSFER_FRAME_TAIL \ else \ TRANSFER_FRAME_HEAD \ transfer_RGBA8888_to_BGR8888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_RGB888: \ switch(out_colormodel) \ { \ case BC_RGB8: \ TRANSFER_FRAME_HEAD \ transfer_RGB888_to_RGB8((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR565: \ case BC_RGB565: \ TRANSFER_FRAME_HEAD \ transfer_RGB888_to_RGB565((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR888: \ TRANSFER_FRAME_HEAD \ transfer_RGB888_to_BGR888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_BGR8888: \ TRANSFER_FRAME_HEAD \ transfer_RGB888_to_BGR8888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV420P: \ TRANSFER_YUV420P_OUT_HEAD \ transfer_RGB888_to_YUV420P_YUV422P(output_y, \ output_u, \ output_v, \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ case BC_YUV422P: \ TRANSFER_YUV422P_OUT_HEAD \ transfer_RGB888_to_YUV420P_YUV422P(output_y, \ output_u, \ output_v, \ (input), \ j); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_BGR8888: \ switch(out_colormodel) \ { \ case BC_RGB888: \ TRANSFER_FRAME_HEAD \ transfer_BGR8888_to_RGB888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ \ case BC_BGR888: \ switch(out_colormodel) \ { \ case BC_RGB888: \ TRANSFER_FRAME_HEAD \ transfer_BGR888_to_RGB888((output), (input)); \ TRANSFER_FRAME_TAIL \ break; \ } \ break; \ } \ } #define PERMUTATION_ARGS \ unsigned char **output_rows, \ unsigned char **input_rows, \ unsigned char *out_y_plane, \ unsigned char *out_u_plane, \ unsigned char *out_v_plane, \ unsigned char *in_y_plane, \ unsigned char *in_u_plane, \ unsigned char *in_v_plane, \ int in_x, \ int in_y, \ int in_w, \ int in_h, \ int out_x, \ int out_y, \ int out_w, \ int out_h, \ int in_colormodel, \ int out_colormodel, \ int bg_color, \ int total_in_w, \ int total_out_w, \ int scale, \ int out_pixelsize, \ int in_pixelsize, \ int *row_table, \ int *column_table, \ int bg_r, \ int bg_g, \ int bg_b