"yuyv8888": {
"i8": {
- "r": " int32_t iy = inp[(i&1)<<1], y = iy*0x010101u, u = inp[1], v = inp[3];",
+ "r": " int32_t iy = inp[(j&1)<<1], y = iy*0x010101u, u = inp[1], v = inp[3];",
"w": " if( !(j&1) ) { *out++ = y; *out = u; out[2] = v; }\n" +
" else { *out++ = u; *out++= y; *out++ = v; }",
},
"i16": {
- "r": " int32_t iy = inp[(i&1)<<1], y = iy*0x010101u, u = inp[1]<<8, v = inp[3]<<8;",
+ "r": " int32_t iy = inp[(j&1)<<1], y = iy*0x010101u, u = inp[1]<<8, v = inp[3]<<8;",
"w": " if( !(j&1) ) { *out++ = y>>8; *out = u>>8; out[2] = v>>8; }\n" +
" else { *out++ = u>>8; *out++= y>>8; *out++ = v>>8; }",
},
"uyvy8888": {
"i8": {
- "r": " int32_t u = inp[0], iy = inp[((i&1)<<1)+1], y = iy*0x010101u, v = inp[2];",
+ "r": " int32_t u = inp[0], iy = inp[((j&1)<<1)+1], y = iy*0x010101u, v = inp[2];",
"w": " if( !(j&1) ) { *out++ = u; *out++ = y; *out++ = v; *out = y; }\n" +
" else { *out++= y; }",
},
"i16": {
- "r": " int32_t u = inp[0]<<8, iy = inp[((i&1)<<1)+1], y = iy*0x010101u, v = inp[2]<<8;",
+ "r": " int32_t u = inp[0]<<8, iy = inp[((j&1)<<1)+1], y = iy*0x010101u, v = inp[2]<<8;",
"w": " if( !(j&1) ) { *out++ = u>>8; *out++ = y>>8; *out++ = v>>8; *out = y>>8; }\n" +
" else { *out++= y>>8; }",
},
"w": " yop[j] = y>>8; uop[j/2] = u>>8; vop[j/2] = v>>8;",
},
},
+ "yuv420pi": {
+ "i8": {
+ "r": " int32_t y = *yip*0x010101u, u = *uip, v = *vip;",
+ "w": " yop[j] = y; uop[j/2] = u; vop[j/2] = v;",
+ },
+ "i16": {
+ "r": " int32_t y = *yip*0x010101u, u = *uip<<8, v = *vip<<8;",
+ "w": " yop[j] = y>>8; uop[j/2] = u>>8; vop[j/2] = v>>8;",
+ },
+ },
"yuv422p": {
"i8": {
},
},
+ "grey8": {
+ "i8": {
+ "r": " int32_t iy = *inp++, y = iy * 0x010101u, u = 0x80, v = 0x80;",
+ "w": " *out++ = y; (void)u; (void)v;",
+ },
+ "i16": {
+ "r": " int32_t iy = *inp++, y = iy * 0x010101u, u = 0x8000, v = 0x8000;",
+ "w": " *out++ = y>>8; (void)u; (void)v;",
+ },
+ },
+
+ "grey16": {
+ "i8": {
+ "r": " int32_t iy = *inp++, y = (iy<<8) | (iy>>8), u = 0x80, v = 0x80;",
+ "w": " *out++ = y<<8; (void)u; (void)v;",
+ },
+ "i16": {
+ "r": " int32_t iy = *inp++, y = (iy<<8) | (iy>>8), u = 0x8000, v = 0x8000;",
+ "w": " *out++ = y; (void)u; (void)v;",
+ },
+ },
+
# alpha component
"a8": {
"i8": {
}
cmodels = []
+bcmodels = {}
layout = {}
-dtype = {}
+dtype = { None: None }
special = {}
+mx_bcmdl = -1
-def add_cmodel(nm, typ=None, *args):
- global cmodels, layout, dtype
+def add_cmodel(n, nm, typ=None, *args):
+ global cmodels, bcmodels, layout, dtype, mx_bcmdl
cmodels += [nm,]
+ bcmodels[n] = nm
+ if( n > mx_bcmdl ): mx_bcmdl = n
dtype[nm] = typ
layout[nm] = args
global special
special[(fr_cmdl, to_cmdl)] = fn
-add_cmodel("bc_transparency")
-add_cmodel("bc_compressed")
-
-add_cmodel("bc_rgb8", "i8", "rgb8")
-add_cmodel("bc_rgb565", "i8", "rgb565")
-add_cmodel("bc_bgr565", "i8", "bgr565")
-add_cmodel("bc_bgr888", "i8", "bgr888")
-add_cmodel("bc_bgr8888", "i8", "bgr8888")
-
-add_cmodel("bc_rgb888", "i8", "rgb888")
-add_cmodel("bc_rgba8888", "i8", "rgb888", "a8")
-add_cmodel("bc_argb8888", "i8", "a8", "rgb888")
-add_cmodel("bc_abgr8888", "i8", "a8", "bgr888")
-add_cmodel("bc_rgb161616", "i16", "rgb161616")
-add_cmodel("bc_rgba16161616", "i16", "rgb161616", "a16")
-add_cmodel("bc_yuv888", "i8", "yuv888")
-add_cmodel("bc_yuva8888", "i8", "yuv888", "a8")
-add_cmodel("bc_yuv161616", "i16", "yuv161616")
-add_cmodel("bc_yuva16161616", "i16", "yuv161616", "a16")
-
-add_cmodel("bc_yuv422", "i8", "yuyv8888")
-add_cmodel("bc_uvy422", "i8", "uyvy8888")
-add_cmodel("bc_a8")
-add_cmodel("bc_a16")
-add_cmodel("bc_a_float")
-add_cmodel("bc_yuv101010", "i16", "yuv10101010")
-add_cmodel("bc_vyu888", "i8", "vyu888")
-add_cmodel("bc_uyva8888", "i8", "uyv888", "a8")
-add_cmodel("bc_rgb_float", "fp", "rgbfloat")
-add_cmodel("bc_rgba_float", "fp", "rgbfloat", "afp")
-
-add_cmodel("bc_yuv420p", "i8", "yuv420p")
-add_cmodel("bc_yuv422p", "i8", "yuv422p")
-add_cmodel("bc_yuv444p", "i8", "yuv444p")
-add_cmodel("bc_yuv411p", "i8", "yuv411p")
-add_cmodel("bc_yuv410p", "i8", "yuv410p")
-add_cmodel("bc_rgb_floatp", "fp", "rgbfltp")
-add_cmodel("bc_rgba_floatp", "fp", "rgbfltp", "afpp")
+add_cmodel( 0, "bc_transparency")
+add_cmodel( 1, "bc_compressed")
+
+add_cmodel( 2, "bc_rgb8", "i8", "rgb8")
+add_cmodel( 3, "bc_rgb565", "i8", "rgb565")
+add_cmodel( 4, "bc_bgr565", "i8", "bgr565")
+add_cmodel( 5, "bc_bgr888", "i8", "bgr888")
+add_cmodel( 6, "bc_bgr8888", "i8", "bgr8888")
+
+add_cmodel( 9, "bc_rgb888", "i8", "rgb888")
+add_cmodel(10, "bc_rgba8888", "i8", "rgb888", "a8")
+add_cmodel(20, "bc_argb8888", "i8", "a8", "rgb888")
+add_cmodel(21, "bc_abgr8888", "i8", "a8", "bgr888")
+add_cmodel(11, "bc_rgb161616", "i16", "rgb161616")
+add_cmodel(12, "bc_rgba16161616", "i16", "rgb161616", "a16")
+add_cmodel(13, "bc_yuv888", "i8", "yuv888")
+add_cmodel(14, "bc_yuva8888", "i8", "yuv888", "a8")
+add_cmodel(15, "bc_yuv161616", "i16", "yuv161616")
+add_cmodel(16, "bc_yuva16161616", "i16", "yuv161616", "a16")
+add_cmodel(35, "bc_ayuv16161616", "i16", "a16", "yuv161616")
+
+add_cmodel(18, "bc_uvy422", "i8", "uyvy8888")
+add_cmodel(19, "bc_yuv422", "i8", "yuyv8888")
+add_cmodel(22, "bc_a8")
+add_cmodel(23, "bc_a16")
+add_cmodel(31, "bc_a_float")
+add_cmodel(24, "bc_yuv101010", "i16", "yuv10101010")
+add_cmodel(25, "bc_vyu888", "i8", "vyu888")
+add_cmodel(26, "bc_uyva8888", "i8", "uyv888", "a8")
+add_cmodel(29, "bc_rgb_float", "fp", "rgbfloat")
+add_cmodel(30, "bc_rgba_float", "fp", "rgbfloat", "afp")
+
+add_cmodel( 7, "bc_yuv420p", "i8", "yuv420p")
+add_cmodel( 8, "bc_yuv422p", "i8", "yuv422p")
+add_cmodel(27, "bc_yuv444p", "i8", "yuv444p")
+add_cmodel(17, "bc_yuv411p", "i8", "yuv411p")
+add_cmodel(28, "bc_yuv410p", "i8", "yuv410p")
+add_cmodel(32, "bc_rgb_floatp", "fp", "rgbfltp")
+add_cmodel(33, "bc_rgba_floatp", "fp", "rgbfltp", "afpp")
+add_cmodel(34, "bc_yuv420pi", "i8", "yuv420pi")
+
+add_cmodel(36, "bc_grey8", "i8", "grey8")
+add_cmodel(37, "bc_grey16", "i16", "grey16")
specialize("bc_rgba8888", "bc_transparency", "XFER_rgba8888_to_transparency")
def has_alpha(nm):
return nm in ["bc_rgba8888", "bc_argb8888", "bc_abgr8888", \
- "bc_rgba16161616", "bc_yuva8888", "bc_yuva16161616", \
+ "bc_rgba16161616", "bc_yuva8888", "bc_yuva16161616", "bc_ayuv16161616", \
"bc_uyva8888", "bc_rgba_float", "bc_rgba_floatp",]
def has_bgcolor(fr_cmdl,to_cmdl):
def is_yuv(nm):
return nm in [ "bc_yuv888", "bc_yuva8888", "bc_yuv161616", \
- "bc_yuva16161616", "bc_yuv422", "bc_uvy422", "bc_yuv101010", \
- "bc_vyu888", "bc_uyva8888", "bc_yuv420p", "bc_yuv422p", \
- "bc_yuv444p", "bc_yuv411p", "bc_yuv410p", ]
+ "bc_yuva16161616", "bc_ayuv16161616", "bc_yuv422", "bc_uvy422", "bc_yuv101010", \
+ "bc_vyu888", "bc_uyva8888", "bc_yuv420p", "bc_yuv420pi", "bc_yuv422p", \
+ "bc_yuv444p", "bc_yuv411p", "bc_yuv410p", "bc_grey8", "bc_grey16" ]
def is_planar(nm):
- return nm in [ "bc_yuv420p", "bc_yuv422p", "bc_yuv444p", \
+ return nm in [ "bc_yuv420p", "bc_yuv420pi", "bc_yuv422p", "bc_yuv444p", \
"bc_yuv411p", "bc_yuv410p", "bc_rgb_floatp", "bc_rgba_floatp", ]
def is_float(nm):
print "%svoid %sxfer_%s_to_%s" % (pfx, cls, fr_cmdl[3:], to_cmdl[3:]),
ityp = dtype[fr_cmdl]; fr_typ = ctype[ityp];
otyp = dtype[to_cmdl]; to_typ = ctype[otyp];
- print "()",
+ print "(unsigned y0, unsigned y1)",
def gen_xfer_fn(fr_cmdl, to_cmdl):
global layout, dtype, adata
for to_cmdl in cmodels:
otyp = dtype[to_cmdl]
if( is_specialized(fr_cmdl, to_cmdl) ):
- print " void %s();" % (special[(fr_cmdl, to_cmdl)])
+ print " void %s(unsigned y0, unsigned y1);" % (special[(fr_cmdl, to_cmdl)])
continue
if( ityp is None or otyp is None ): continue
gen_xfer_proto(" ", "", fr_cmdl, to_cmdl);
print ""
print "void %sxfer()" % class_qual
print "{"
-print " switch(in_colormodel) {"
-for fr_cmdl in cmodels:
+mx_no = mx_bcmdl + 1
+print " static xfer_fn xfns[%d][%d] = {" % (mx_no, mx_no)
+for fr_no in range(mx_no):
+ fr_cmdl = bcmodels.get(fr_no)
ityp = dtype[fr_cmdl]
- if( ityp is None ):
- if( not fr_cmdl in [it[0] for it in special] ): continue
- print " case %s:" % (fr_cmdl.upper())
- print " switch(out_colormodel) {"
- for to_cmdl in cmodels:
- if( is_specialized(fr_cmdl, to_cmdl) ):
- print " case %s: %s(); break;" % (to_cmdl.upper(), special[(fr_cmdl, to_cmdl)])
- continue
+ print " { // %s" % (fr_cmdl.upper() if ityp else "None")
+ n = 0
+ for to_no in range(mx_no):
+ to_cmdl = bcmodels.get(to_no)
otyp = dtype[to_cmdl]
- if( ityp is None or otyp is None ): continue
- print " case %s:" % (to_cmdl.upper()),
- print "xfer_%s_to_%s(); break;" % (fr_cmdl[3:], to_cmdl[3:])
- print " }"
- print " break;"
-print " }"
+ xfn = special[(fr_cmdl, to_cmdl)] if( is_specialized(fr_cmdl, to_cmdl) ) else \
+ "xfer_%s_to_%s" % (fr_cmdl[3:], to_cmdl[3:]) if ( ityp and otyp ) else None
+ if( n > 72 ): print ""; n = 0
+ if( n == 0 ): print " ",; n += 4
+ fn = "&%s%s" % (class_qual, xfn) if( xfn ) else "0"
+ print "%s, " % (fn),
+ n += len(fn) + 3
+ print "}, "
+print " }; "
+print " xfn = xfns[in_colormodel][out_colormodel];"
+print " xfer_slices(out_w*out_h/0x80000+1);"
print "}"
print ""
print "#include \"xfer.C\""