package util import ( "image" "unsafe" ) // https://stackoverflow.com/questions/9465815/rgb-to-yuv420-algorithm-efficiency /* void rgba2yuv(void *destination, void *source, int width, int height, int stride) { const int image_size = width * height; unsigned char *rgba = source; unsigned char *dst_y = destination; unsigned char *dst_u = destination + image_size; unsigned char *dst_v = destination + image_size + image_size/4; // Y plane for( int y=0; y> 8 ) + 16; } } // U plane for( int y=0; y> 8 ) + 128; } } // V plane for( int y=0; y> 8 ) + 128; } } } */ import "C" // RgbaToYuv convert to yuv from rgba func RgbaToYuv(rgba *image.RGBA) []byte { w := rgba.Rect.Max.X h := rgba.Rect.Max.Y size := int(float32(w*h) * 1.5) stride := rgba.Stride - w*4 yuv := make([]byte, size, size) C.rgba2yuv(unsafe.Pointer(&yuv[0]), unsafe.Pointer(&rgba.Pix[0]), C.int(w), C.int(h), C.int(stride)) return yuv }