#include "bccmodels.h" #include "bcresources.h" #include "condition.h" #include "linklist.h" #include "mutex.h" #include "thread.h" #include "clip.h" static inline float clp(const int n, float v) { v *= ((float)(n*(1-1./0x1000000))); return v < 0 ? 0 : v >= n ? n-1 : v; } static inline float fclp(float v, const int n) { v /= ((float)(n*(1-1./0x1000000))); return v < 0 ? 0 : v > 1 ? 1 : v; } #include #define ZTYP(ty) typedef ty z_##ty __attribute__ ((__unused__)) ZTYP(int); ZTYP(float); // All variables are unsigned // y -> 24 bits u, v, -> 8 bits r, g, b -> 8 bits #define YUV_TO_RGB(y, u, v, r, g, b) \ { \ (r) = ((y + vtor_tab[v]) >> 16); \ (g) = ((y + utog_tab[u] + vtog_tab[v]) >> 16); \ (b) = ((y + utob_tab[u]) >> 16); \ CLAMP(r, 0, 0xff); CLAMP(g, 0, 0xff); CLAMP(b, 0, 0xff); \ } // y -> 0 - 1 float // u, v, -> 8 bits // r, g, b -> float #define YUV_TO_FLOAT(y, u, v, r, g, b) \ { \ (r) = y + vtor_float_tab[v]; \ (g) = y + utog_float_tab[u] + vtog_float_tab[v]; \ (b) = y + utob_float_tab[u]; \ } // y -> 0 - 1 float // u, v, -> 16 bits // r, g, b -> float #define YUV16_TO_RGB_FLOAT(y, u, v, r, g, b) \ { \ (r) = y + v16tor_float_tab[v]; \ (g) = y + u16tog_float_tab[u] + v16tog_float_tab[v]; \ (b) = y + u16tob_float_tab[u]; \ } // y -> 24 bits u, v-> 16 bits #define YUV_TO_RGB16(y, u, v, r, g, b) \ { \ (r) = ((y + vtor_tab16[v]) >> 8); \ (g) = ((y + utog_tab16[u] + vtog_tab16[v]) >> 8); \ (b) = ((y + utob_tab16[u]) >> 8); \ CLAMP(r, 0, 0xffff); CLAMP(g, 0, 0xffff); CLAMP(b, 0, 0xffff); \ } #define RGB_TO_YUV(y, u, v, r, g, b) \ { \ y = ((rtoy_tab[r] + gtoy_tab[g] + btoy_tab[b]) >> 16); \ u = ((rtou_tab[r] + gtou_tab[g] + btou_tab[b]) >> 16); \ v = ((rtov_tab[r] + gtov_tab[g] + btov_tab[b]) >> 16); \ CLAMP(y, 0, 0xff); CLAMP(u, 0, 0xff); CLAMP(v, 0, 0xff); \ } // r, g, b -> 16 bits #define RGB_TO_YUV16(y, u, v, r, g, b) \ { \ y = ((rtoy_tab16[r] + gtoy_tab16[g] + btoy_tab16[b]) >> 8); \ u = ((rtou_tab16[r] + gtou_tab16[g] + btou_tab16[b]) >> 8); \ v = ((rtov_tab16[r] + gtov_tab16[g] + btov_tab16[b]) >> 8); \ CLAMP(y, 0, 0xffff); CLAMP(u, 0, 0xffff); CLAMP(v, 0, 0xffff); \ } #define xfer_flat_row_out(oty_t) \ for( unsigned i=y0; i, public Thread { public: Condition *init, *complete; Slicer(BC_Xfer *xp); ~Slicer(); void slice(BC_Xfer *xp, unsigned y0, unsigned y1); void run(); BC_Xfer *xp; int done, y0, y1; }; class SlicerList : public List, public Mutex { public: int count; Slicer *get_slicer(BC_Xfer *xp); void reset(); SlicerList(); ~SlicerList(); }; static SlicerList slicers; static void init(); static class Tables { public: Tables() { init(); } } tables; static int rtoy_tab[0x100], gtoy_tab[0x100], btoy_tab[0x100]; static int rtou_tab[0x100], gtou_tab[0x100], btou_tab[0x100]; static int rtov_tab[0x100], gtov_tab[0x100], btov_tab[0x100]; static int vtor_tab[0x100], vtog_tab[0x100]; static int utog_tab[0x100], utob_tab[0x100]; static float vtor_float_tab[0x100], vtog_float_tab[0x100]; static float utog_float_tab[0x100], utob_float_tab[0x100]; static int rtoy_tab16[0x10000], gtoy_tab16[0x10000], btoy_tab16[0x10000]; static int rtou_tab16[0x10000], gtou_tab16[0x10000], btou_tab16[0x10000]; static int rtov_tab16[0x10000], gtov_tab16[0x10000], btov_tab16[0x10000]; static int vtor_tab16[0x10000], vtog_tab16[0x10000]; static int utog_tab16[0x10000], utob_tab16[0x10000]; static float v16tor_float_tab[0x10000], v16tog_float_tab[0x10000]; static float u16tog_float_tab[0x10000], u16tob_float_tab[0x10000]; void init( uint8_t **output_rows, int out_colormodel, int out_x, int out_y, int out_w, int out_h, uint8_t *out_yp, uint8_t *out_up, uint8_t *out_vp, uint8_t *out_ap, int out_rowspan, uint8_t **input_rows, int in_colormodel, int in_x, int in_y, int in_w, int in_h, uint8_t *in_yp, uint8_t *in_up, uint8_t *in_vp, uint8_t *in_ap, int in_rowspan, int bg_color); // generated code concatentated here