// VirtualDub - Video processing and capture application // Graphics support library // Copyright (C) 1998-2009 Avery Lee // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include #include "uberblit_ycbcr_x86.h" extern "C" void vdasm_pixblt_XRGB8888_to_YUV444Planar_scan_SSE2(void *dstY, void *dstCb, void *dstCr, const void *srcRGB, uint32 count, const void *coeffs); void VDPixmapGenRGB32ToYCbCr601_SSE2::Compute(void *dst0, sint32 y) { uint8 *dstCb = (uint8 *)dst0; uint8 *dstY = dstCb + mWindowPitch; uint8 *dstCr = dstY + mWindowPitch; const uint8 *srcRGB = (const uint8 *)mpSrc->GetRow(y, mSrcIndex); static const __declspec(align(16)) struct { sint16 rb_to_y[8]; sint16 rb_to_cb[8]; sint16 rb_to_cr[8]; sint16 g_to_y[8]; sint16 g_to_cb[8]; sint16 g_to_cr[8]; sint32 y_bias[4]; sint32 c_bias[4]; } kCoeffs={ // Cb = (28784*r - 24103*g - 4681*b + 8388608 + 32768) >> 16; // Y = (16829*r + 33039*g + 6416*b + 1048576 + 32768) >> 16; // Cr = (-9714*r - 19071*g + 28784*b + 8388608 + 32768) >> 16; { 3208, 8414, 3208, 8414, 3208, 8414, 3208, 8414, }, // rb to y { -2340, 14392, -2340, 14392, -2340, 14392, -2340, 14392, }, // rb to cb { 16519, 0, 16519, 0, 16519, 0, 16519, 0, }, // g to y { -12050, 0, -12050, 0, -12050, 0, -12050, 0, }, // g to cb { 14392, -4857, 14392, -4857, 14392, -4857, 14392, -4857, }, // rb to cr { -9535, 0, -9535, 0, -9535, 0, -9535, 0, }, // g to cr { 0x084000, 0x084000, 0x084000, 0x084000, }, // y bias { 0x404000, 0x404000, 0x404000, 0x404000, }, // c bias }; vdasm_pixblt_XRGB8888_to_YUV444Planar_scan_SSE2(dstY, dstCb, dstCr, srcRGB, mWidth, &kCoeffs); }