A complete 3D game development suite written purely in Java.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
jmonkeyengine/engine/src/jheora/com/jme3/newvideo/YUVConv.java

143 lines
5.4 KiB

/*
* Copyright (c) 2009-2012 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.newvideo;
import com.fluendo.jheora.YUVBuffer;
@Deprecated
public final class YUVConv {
private int[] pixels;
private static final int VAL_RANGE = 256;
private static final int SHIFT = 16;
private static final int CR_FAC = (int) (1.402 * (1 << SHIFT));
private static final int CB_FAC = (int) (1.772 * (1 << SHIFT));
private static final int CR_DIFF_FAC = (int) (0.71414 * (1 << SHIFT));
private static final int CB_DIFF_FAC = (int) (0.34414 * (1 << SHIFT));
private static int[] r_tab = new int[VAL_RANGE * 3];
private static int[] g_tab = new int[VAL_RANGE * 3];
private static int[] b_tab = new int[VAL_RANGE * 3];
static {
setupRgbYuvAccelerators();
}
private static final short clamp255(int val) {
val -= 255;
val = -(255 + ((val >> (31)) & val));
return (short) -((val >> 31) & val);
}
private static void setupRgbYuvAccelerators() {
for (int i = 0; i < VAL_RANGE * 3; i++) {
r_tab[i] = clamp255(i - VAL_RANGE);
g_tab[i] = clamp255(i - VAL_RANGE) << 8;
b_tab[i] = clamp255(i - VAL_RANGE) << 16;
}
}
public YUVConv(){
}
public int[] getRGBData(){
return pixels;
}
public void convert(YUVBuffer yuv, int xOff, int yOff, int width, int height) {
if (pixels == null){
pixels = new int[width*height];
}
// Set up starting values for YUV pointers
int YPtr = yuv.y_offset + xOff + yOff * (yuv.y_stride);
int YPtr2 = YPtr + yuv.y_stride;
int UPtr = yuv.u_offset + xOff/2 + (yOff/2)*(yuv.uv_stride);
int VPtr = yuv.v_offset + xOff/2 + (yOff/2)*(yuv.uv_stride);
int RGBPtr = 0;
int RGBPtr2 = width;
int width2 = width / 2;
int height2 = height / 2;
// Set the line step for the Y and UV planes and YPtr2
int YStep = yuv.y_stride * 2 - (width2) * 2;
int UVStep = yuv.uv_stride - (width2);
int RGBStep = width;
for (int i = 0; i < height2; i++) {
for (int j = 0; j < width2; j++) {
// groups of four pixels
int UFactor = yuv.data[UPtr++] - 128;
int VFactor = yuv.data[VPtr++] - 128;
int GFactor = UFactor * CR_DIFF_FAC + VFactor * CB_DIFF_FAC - (VAL_RANGE<<SHIFT);
UFactor = UFactor * CR_FAC + (VAL_RANGE<<SHIFT);
VFactor = VFactor * CB_FAC + (VAL_RANGE<<SHIFT);
int YVal = yuv.data[YPtr] << SHIFT;
pixels[RGBPtr] = r_tab[(YVal + VFactor)>>SHIFT] |
b_tab[(YVal + UFactor)>>SHIFT] |
g_tab[(YVal - GFactor)>>SHIFT];
YVal = yuv.data[YPtr+1] << SHIFT;
pixels[RGBPtr+1] = r_tab[(YVal + VFactor)>>SHIFT] |
b_tab[(YVal + UFactor)>>SHIFT] |
g_tab[(YVal - GFactor)>>SHIFT];
YVal = yuv.data[YPtr2] << SHIFT;
pixels[RGBPtr2] = r_tab[(YVal + VFactor)>>SHIFT] |
b_tab[(YVal + UFactor)>>SHIFT] |
g_tab[(YVal - GFactor)>>SHIFT];
YVal = yuv.data[YPtr2+1] << SHIFT;
pixels[RGBPtr2+1] = r_tab[(YVal + VFactor)>>SHIFT] |
b_tab[(YVal + UFactor)>>SHIFT] |
g_tab[(YVal - GFactor)>>SHIFT];
YPtr += 2;
YPtr2 += 2;
RGBPtr += 2;
RGBPtr2 += 2;
}
// Increment the various pointers
YPtr += YStep;
YPtr2 += YStep;
UPtr += UVStep;
VPtr += UVStep;
RGBPtr += RGBStep;
RGBPtr2 += RGBStep;
}
}
}