X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_frame.c;h=9c6922b19f3c3ba1388c8dbb11aaa6320017a2ad;hb=a2c29b04aabe82b14851b905fca993f9f471bc6b;hp=f072bdd1e4e461b47ff6b32472f0ca32f0413e80;hpb=eabc3498604fc7983bbd805d40dad2e7df135f17;p=melted diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index f072bdd..9c6922b 100644 --- a/src/framework/mlt_frame.c +++ b/src/framework/mlt_frame.c @@ -529,6 +529,41 @@ void mlt_frame_close( mlt_frame this ) /***** convenience functions *****/ +int mlt_convert_yuv422_to_rgb24a( uint8_t *yuv, uint8_t *rgba, unsigned int total ) +{ + int ret = 0; + int yy, uu, vv, ug_plus_vg, ub, vr; + int r,g,b; + total /= 2; + while (total--) + { + yy = yuv[0] << 8; + uu = yuv[1] - 128; + vv = yuv[3] - 128; + ug_plus_vg = uu * 88 + vv * 183; + ub = uu * 454; + vr = vv * 359; + r = (yy + vr) >> 8; + g = (yy - ug_plus_vg) >> 8; + b = (yy + ub) >> 8; + rgba[0] = r < 0 ? 0 : (r > 255 ? 255 : (unsigned char)r); + rgba[1] = g < 0 ? 0 : (g > 255 ? 255 : (unsigned char)g); + rgba[2] = b < 0 ? 0 : (b > 255 ? 255 : (unsigned char)b); + rgba[3] = 255; + yy = yuv[2] << 8; + r = (yy + vr) >> 8; + g = (yy - ug_plus_vg) >> 8; + b = (yy + ub) >> 8; + rgba[4] = r < 0 ? 0 : (r > 255 ? 255 : (unsigned char)r); + rgba[5] = g < 0 ? 0 : (g > 255 ? 255 : (unsigned char)g); + rgba[6] = b < 0 ? 0 : (b > 255 ? 255 : (unsigned char)b); + rgba[7] = 255; + yuv += 4; + rgba += 8; + } + return ret; +} + int mlt_convert_rgb24a_to_yuv422( uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha ) { int ret = 0; @@ -610,6 +645,129 @@ int mlt_convert_rgb24_to_yuv422( uint8_t *rgb, int width, int height, int stride return ret; } +int mlt_convert_bgr24a_to_yuv422( uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha ) +{ + int ret = 0; + register int y0, y1, u0, u1, v0, v1; + register int r, g, b; + register uint8_t *d = yuv; + register int i, j; + + for ( i = 0; i < height; i++ ) + { + register uint8_t *s = rgba + ( stride * i ); + for ( j = 0; j < ( width / 2 ); j++ ) + { + b = *s++; + g = *s++; + r = *s++; + *alpha++ = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + b = *s++; + g = *s++; + r = *s++; + *alpha++ = *s++; + RGB2YUV (r, g, b, y1, u1 , v1); + *d++ = y0; + *d++ = (u0+u1) >> 1; + *d++ = y1; + *d++ = (v0+v1) >> 1; + } + if ( width % 2 ) + { + b = *s++; + g = *s++; + r = *s++; + *alpha++ = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + *d++ = y0; + *d++ = u0; + } + } + return ret; +} + +int mlt_convert_bgr24_to_yuv422( uint8_t *rgb, int width, int height, int stride, uint8_t *yuv ) +{ + int ret = 0; + register int y0, y1, u0, u1, v0, v1; + register int r, g, b; + register uint8_t *d = yuv; + register int i, j; + + for ( i = 0; i < height; i++ ) + { + register uint8_t *s = rgb + ( stride * i ); + for ( j = 0; j < ( width / 2 ); j++ ) + { + b = *s++; + g = *s++; + r = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + b = *s++; + g = *s++; + r = *s++; + RGB2YUV (r, g, b, y1, u1 , v1); + *d++ = y0; + *d++ = (u0+u1) >> 1; + *d++ = y1; + *d++ = (v0+v1) >> 1; + } + if ( width % 2 ) + { + b = *s++; + g = *s++; + r = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + *d++ = y0; + *d++ = u0; + } + } + return ret; +} + +int mlt_convert_argb_to_yuv422( uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha ) +{ + int ret = 0; + register int y0, y1, u0, u1, v0, v1; + register int r, g, b; + register uint8_t *d = yuv; + register int i, j; + + for ( i = 0; i < height; i++ ) + { + register uint8_t *s = rgba + ( stride * i ); + for ( j = 0; j < ( width / 2 ); j++ ) + { + *alpha++ = *s++; + r = *s++; + g = *s++; + b = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + *alpha++ = *s++; + r = *s++; + g = *s++; + b = *s++; + RGB2YUV (r, g, b, y1, u1 , v1); + *d++ = y0; + *d++ = (u0+u1) >> 1; + *d++ = y1; + *d++ = (v0+v1) >> 1; + } + if ( width % 2 ) + { + *alpha++ = *s++; + r = *s++; + g = *s++; + b = *s++; + RGB2YUV (r, g, b, y0, u0 , v0); + *d++ = y0; + *d++ = u0; + } + } + return ret; +} + int mlt_convert_yuv420p_to_yuv422( uint8_t *yuv420p, int width, int height, int stride, uint8_t *yuv ) { int ret = 0;