Implement YUV encode/decode methods at the Java level; Remove some of the arguments from the Java API and replace with get/set methods; General API cleanup; Fix BufferedImage grayscale tests in TJUnitTest

git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@451 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
DRC
2011-02-25 06:11:03 +00:00
parent 0a192aca50
commit 4f1580cc0e
10 changed files with 657 additions and 345 deletions

View File

@@ -55,18 +55,40 @@ public class TJCompressor {
bitmapPixelFormat = pixelFormat;
}
public int compress(byte [] dstBuf, int jpegSubsamp, int jpegQual,
int flags) throws Exception {
return compress(bitmapBuf, bitmapWidth, bitmapPitch, bitmapHeight,
TJ.getPixelSize(bitmapPixelFormat), dstBuf, jpegSubsamp, jpegQual,
flags | TJ.getFlags(bitmapPixelFormat));
public void setSubsamp(int newSubsamp) throws Exception {
if(newSubsamp < 0 || newSubsamp >= TJ.NUMSAMPOPT)
throw new Exception ("Invalid argument in setSubsamp()");
subsamp = newSubsamp;
}
public int compress(BufferedImage srcImage, byte [] dstBuf, int jpegSubsamp,
int jpegQual, int flags) throws Exception {
if(srcImage == null || flags < 0)
throw new Exception("Invalid argument in decompress()");
flags &= ~(TJ.YUV);
public void setJPEGQuality(int quality) throws Exception {
if(quality < 1 || quality > 100)
throw new Exception ("Invalid argument in setJPEGQuality()");
jpegQuality = quality;
}
public void compress(byte [] dstBuf, int flags) throws Exception {
if(dstBuf == null || flags < 0)
throw new Exception("Invalid argument in compress()");
if(bitmapBuf == null) throw new Exception("Bitmap buffer not initialized");
if(jpegQuality < 0) throw new Exception("JPEG Quality not set");
if(subsamp < 0) throw new Exception("Subsampling level not set");
compressedSize = compress(bitmapBuf, bitmapWidth, bitmapPitch,
bitmapHeight, bitmapPixelFormat, dstBuf, subsamp, jpegQuality, flags);
}
public byte [] compress(int flags) throws Exception {
if(bitmapWidth < 1 || bitmapHeight < 1)
throw new Exception("Bitmap buffer not initialized");
byte [] buf = new byte[TJ.bufSize(bitmapWidth, bitmapHeight)];
compress(buf, flags);
return buf;
}
public void compress(BufferedImage srcImage, byte [] dstBuf, int flags)
throws Exception {
if(srcImage == null || dstBuf == null || flags < 0)
throw new Exception("Invalid argument in compress()");
int width = srcImage.getWidth();
int height = srcImage.getHeight();
int pixelFormat; boolean intPixels=false;
@@ -83,29 +105,117 @@ public class TJCompressor {
throw new Exception("Unsupported BufferedImage format");
}
WritableRaster wr = srcImage.getRaster();
if(jpegQuality < 0) throw new Exception("JPEG Quality not set");
if(subsamp < 0) throw new Exception("Subsampling level not set");
if(intPixels) {
SinglePixelPackedSampleModel sm =
(SinglePixelPackedSampleModel)srcImage.getSampleModel();
int pitch = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int [] buf = db.getData();
return compress(buf, width, pitch, height, dstBuf, jpegSubsamp, jpegQual,
flags | TJ.getFlags(pixelFormat));
compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf,
subsamp, jpegQuality, flags);
}
else {
ComponentSampleModel sm =
(ComponentSampleModel)srcImage.getSampleModel();
int pixelSize = sm.getPixelStride();
if(pixelSize != TJ.pixelSize[pixelFormat])
if(pixelSize != TJ.getPixelSize(pixelFormat))
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
int pitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte [] buf = db.getData();
return compress(buf, width, pitch, height, TJ.getPixelSize(pixelFormat),
dstBuf, jpegSubsamp, jpegQual, flags | TJ.getFlags(pixelFormat));
compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf,
subsamp, jpegQuality, flags);
}
}
public byte [] compress(BufferedImage srcImage, int flags) throws Exception {
int width = srcImage.getWidth();
int height = srcImage.getHeight();
byte [] buf = new byte[TJ.bufSize(width, height)];
compress(srcImage, buf, flags);
return buf;
}
public void encodeYUV(byte [] dstBuf, int flags) throws Exception {
if(dstBuf == null || flags < 0)
throw new Exception("Invalid argument in compress()");
if(bitmapBuf == null) throw new Exception("Bitmap buffer not initialized");
if(subsamp < 0) throw new Exception("Subsampling level not set");
encodeYUV(bitmapBuf, bitmapWidth, bitmapPitch, bitmapHeight,
bitmapPixelFormat, dstBuf, subsamp, flags);
compressedSize = TJ.bufSizeYUV(bitmapWidth, bitmapHeight, subsamp);
}
public byte [] encodeYUV(int flags) throws Exception {
if(bitmapWidth < 1 || bitmapHeight < 1)
throw new Exception("Bitmap buffer not initialized");
if(subsamp < 0) throw new Exception("Subsampling level not set");
byte [] buf = new byte[TJ.bufSizeYUV(bitmapWidth, bitmapHeight, subsamp)];
encodeYUV(buf, flags);
return buf;
}
public void encodeYUV(BufferedImage srcImage, byte [] dstBuf, int flags)
throws Exception {
if(srcImage == null || dstBuf == null || flags < 0)
throw new Exception("Invalid argument in encodeYUV()");
int width = srcImage.getWidth();
int height = srcImage.getHeight();
int pixelFormat; boolean intPixels=false;
switch(srcImage.getType()) {
case BufferedImage.TYPE_3BYTE_BGR:
pixelFormat=TJ.PF_BGR; break;
case BufferedImage.TYPE_BYTE_GRAY:
pixelFormat=TJ.PF_GRAY; break;
case BufferedImage.TYPE_INT_BGR:
pixelFormat=TJ.PF_RGBX; intPixels=true; break;
case BufferedImage.TYPE_INT_RGB:
pixelFormat=TJ.PF_BGRX; intPixels=true; break;
default:
throw new Exception("Unsupported BufferedImage format");
}
WritableRaster wr = srcImage.getRaster();
if(subsamp < 0) throw new Exception("Subsampling level not set");
if(intPixels) {
SinglePixelPackedSampleModel sm =
(SinglePixelPackedSampleModel)srcImage.getSampleModel();
int pitch = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int [] buf = db.getData();
encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp,
flags);
}
else {
ComponentSampleModel sm =
(ComponentSampleModel)srcImage.getSampleModel();
int pixelSize = sm.getPixelStride();
if(pixelSize != TJ.getPixelSize(pixelFormat))
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
int pitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte [] buf = db.getData();
encodeYUV(buf, width, pitch, height, pixelFormat, dstBuf, subsamp,
flags);
}
compressedSize = TJ.bufSizeYUV(width, height, subsamp);
}
public byte [] encodeYUV(BufferedImage srcImage, int flags)
throws Exception {
if(subsamp < 0) throw new Exception("Subsampling level not set");
int width = srcImage.getWidth();
int height = srcImage.getHeight();
byte [] buf = new byte[TJ.bufSizeYUV(width, height, subsamp)];
encodeYUV(srcImage, buf, flags);
return buf;
}
public int getCompressedSize() {
return compressedSize;
}
public void close() throws Exception {
destroy();
}
@@ -126,11 +236,19 @@ public class TJCompressor {
// JPEG size in bytes is returned
private native int compress(byte [] srcBuf, int width, int pitch,
int height, int pixelSize, byte [] dstbuf, int jpegSubsamp, int jpegQual,
int height, int pixelFormat, byte [] dstbuf, int jpegSubsamp, int jpegQual,
int flags) throws Exception;
private native int compress(int [] srcBuf, int width, int pitch,
int height, byte [] dstbuf, int jpegSubsamp, int jpegQual, int flags)
int height, int pixelFormat, byte [] dstbuf, int jpegSubsamp, int jpegQual,
int flags) throws Exception;
private native void encodeYUV(byte [] srcBuf, int width, int pitch,
int height, int pixelFormat, byte [] dstbuf, int subsamp, int flags)
throws Exception;
private native void encodeYUV(int [] srcBuf, int width, int pitch,
int height, int pixelFormat, byte [] dstbuf, int subsamp, int flags)
throws Exception;
static {
@@ -143,4 +261,7 @@ public class TJCompressor {
private int bitmapHeight = 0;
private int bitmapPitch = 0;
private int bitmapPixelFormat = -1;
private int subsamp = -1;
private int jpegQuality = -1;
private int compressedSize = 0;
};