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:
@@ -150,10 +150,8 @@ public class TJExample {
|
|||||||
height = (height + scaleFactor - 1)/scaleFactor;
|
height = (height + scaleFactor - 1)/scaleFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!outFormat.equalsIgnoreCase("jpg")) {
|
if(!outFormat.equalsIgnoreCase("jpg"))
|
||||||
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
img = tjd.decompress(width, height, BufferedImage.TYPE_INT_RGB, 0);
|
||||||
tjd.decompress(img, 0);
|
|
||||||
}
|
|
||||||
else bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, 0);
|
else bmpBuf = tjd.decompress(width, 0, height, TJ.PF_BGRX, 0);
|
||||||
tjd.close();
|
tjd.close();
|
||||||
}
|
}
|
||||||
@@ -175,14 +173,17 @@ public class TJExample {
|
|||||||
+ " subsampling, quality = " + outQual);
|
+ " subsampling, quality = " + outQual);
|
||||||
TJCompressor tjc = new TJCompressor();
|
TJCompressor tjc = new TJCompressor();
|
||||||
int jpegSize;
|
int jpegSize;
|
||||||
byte [] jpegBuf = new byte[TJ.bufSize(width, height)];
|
byte [] jpegBuf;
|
||||||
|
|
||||||
|
tjc.setSubsamp(outSubsamp);
|
||||||
|
tjc.setJPEGQuality(outQual);
|
||||||
if(img != null)
|
if(img != null)
|
||||||
jpegSize = tjc.compress(img, jpegBuf, outSubsamp, outQual, 0);
|
jpegBuf = tjc.compress(img, 0);
|
||||||
else {
|
else {
|
||||||
tjc.setBitmapBuffer(bmpBuf, width, 0, height, TJ.PF_BGRX);
|
tjc.setBitmapBuffer(bmpBuf, width, 0, height, TJ.PF_BGRX);
|
||||||
jpegSize = tjc.compress(jpegBuf, outSubsamp, outQual, 0);
|
jpegBuf = tjc.compress(0);
|
||||||
}
|
}
|
||||||
|
jpegSize = tjc.getCompressedSize();
|
||||||
tjc.close();
|
tjc.close();
|
||||||
|
|
||||||
file = new File(argv[1]);
|
file = new File(argv[1]);
|
||||||
|
|||||||
@@ -57,12 +57,6 @@ public class TJUnitTest {
|
|||||||
|
|
||||||
private final static String _pixformatstr[]=
|
private final static String _pixformatstr[]=
|
||||||
{"RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale"};
|
{"RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale"};
|
||||||
private final static int _roffset[]=
|
|
||||||
{0, 2, 0, 2, 3, 1, 0};
|
|
||||||
private final static int _goffset[]=
|
|
||||||
{1, 1, 1, 1, 2, 2, 0};
|
|
||||||
private final static int _boffset[]=
|
|
||||||
{2, 0, 2, 0, 1, 3, 0};
|
|
||||||
private final static int biType[]=
|
private final static int biType[]=
|
||||||
{0, BufferedImage.TYPE_3BYTE_BGR, BufferedImage.TYPE_INT_BGR,
|
{0, BufferedImage.TYPE_3BYTE_BGR, BufferedImage.TYPE_INT_BGR,
|
||||||
BufferedImage.TYPE_INT_RGB, 0, 0, BufferedImage.TYPE_BYTE_GRAY};
|
BufferedImage.TYPE_INT_RGB, 0, 0, BufferedImage.TYPE_BYTE_GRAY};
|
||||||
@@ -104,10 +98,13 @@ public class TJUnitTest {
|
|||||||
{(byte)255, 0, 0}
|
{(byte)255, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
private static void initbuf(byte [] buf, int w, int h, int pf, int flags)
|
private static void initbuf(byte [] buf, int w, int pitch, int h, int pf,
|
||||||
|
int flags) throws Exception
|
||||||
{
|
{
|
||||||
int roffset=_roffset[pf], goffset=_goffset[pf], boffset=_boffset[pf];
|
int roffset=TJ.getRedShift(pf)/8;
|
||||||
int ps=TJ.pixelSize[pf];
|
int goffset=TJ.getGreenShift(pf)/8;
|
||||||
|
int boffset=TJ.getBlueShift(pf)/8;
|
||||||
|
int ps=TJ.getPixelSize(pf);
|
||||||
int i, _i, j;
|
int i, _i, j;
|
||||||
|
|
||||||
Arrays.fill(buf, (byte)0);
|
Arrays.fill(buf, (byte)0);
|
||||||
@@ -118,8 +115,8 @@ public class TJUnitTest {
|
|||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
for(j=0; j<w; j++)
|
for(j=0; j<w; j++)
|
||||||
{
|
{
|
||||||
if(((_i/8)+(j/8))%2==0) buf[w*i+j]=(byte)255;
|
if(((_i/8)+(j/8))%2==0) buf[pitch*i+j]=(byte)255;
|
||||||
else buf[w*i+j]=76;
|
else buf[pitch*i+j]=76;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(_i=16; _i<h; _i++)
|
for(_i=16; _i<h; _i++)
|
||||||
@@ -127,8 +124,8 @@ public class TJUnitTest {
|
|||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
for(j=0; j<w; j++)
|
for(j=0; j<w; j++)
|
||||||
{
|
{
|
||||||
if(((_i/8)+(j/8))%2==0) buf[w*i+j]=0;
|
if(((_i/8)+(j/8))%2==0) buf[pitch*i+j]=0;
|
||||||
else buf[w*i+j]=(byte)226;
|
else buf[pitch*i+j]=(byte)226;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -138,11 +135,11 @@ public class TJUnitTest {
|
|||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
for(j=0; j<w; j++)
|
for(j=0; j<w; j++)
|
||||||
{
|
{
|
||||||
buf[(w*i+j)*ps+roffset]=(byte)255;
|
buf[pitch*i+j*ps+roffset]=(byte)255;
|
||||||
if(((_i/8)+(j/8))%2==0)
|
if(((_i/8)+(j/8))%2==0)
|
||||||
{
|
{
|
||||||
buf[(w*i+j)*ps+goffset]=(byte)255;
|
buf[pitch*i+j*ps+goffset]=(byte)255;
|
||||||
buf[(w*i+j)*ps+boffset]=(byte)255;
|
buf[pitch*i+j*ps+boffset]=(byte)255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -153,82 +150,72 @@ public class TJUnitTest {
|
|||||||
{
|
{
|
||||||
if(((_i/8)+(j/8))%2!=0)
|
if(((_i/8)+(j/8))%2!=0)
|
||||||
{
|
{
|
||||||
buf[(w*i+j)*ps+roffset]=(byte)255;
|
buf[pitch*i+j*ps+roffset]=(byte)255;
|
||||||
buf[(w*i+j)*ps+goffset]=(byte)255;
|
buf[pitch*i+j*ps+goffset]=(byte)255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void initintbuf(int [] buf, int w, int pitch, int h, int pf,
|
||||||
|
int flags) throws Exception
|
||||||
|
{
|
||||||
|
int rshift=TJ.getRedShift(pf);
|
||||||
|
int gshift=TJ.getGreenShift(pf);
|
||||||
|
int bshift=TJ.getBlueShift(pf);
|
||||||
|
int i, _i, j;
|
||||||
|
|
||||||
|
Arrays.fill(buf, 0);
|
||||||
|
for(_i=0; _i<16; _i++)
|
||||||
|
{
|
||||||
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
buf[pitch*i+j]=(255 << rshift);
|
||||||
|
if(((_i/8)+(j/8))%2==0)
|
||||||
|
{
|
||||||
|
buf[pitch*i+j]|=(255 << gshift);
|
||||||
|
buf[pitch*i+j]|=(255 << bshift);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(_i=16; _i<h; _i++)
|
||||||
|
{
|
||||||
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
if(((_i/8)+(j/8))%2!=0)
|
||||||
|
{
|
||||||
|
buf[pitch*i+j]=(255 << rshift);
|
||||||
|
buf[pitch*i+j]|=(255 << gshift);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initimg(BufferedImage img, int pf, int flags)
|
private static void initimg(BufferedImage img, int pf, int flags)
|
||||||
|
throws Exception
|
||||||
{
|
{
|
||||||
int i, _i, j, w=img.getWidth(), h=img.getHeight(), pixel;
|
WritableRaster wr=img.getRaster();
|
||||||
|
int imgtype=img.getType();
|
||||||
if(pf==TJ.PF_GRAY)
|
if(imgtype==BufferedImage.TYPE_INT_RGB
|
||||||
|
|| imgtype==BufferedImage.TYPE_INT_BGR)
|
||||||
{
|
{
|
||||||
for(_i=0; _i<16; _i++)
|
SinglePixelPackedSampleModel sm=
|
||||||
{
|
(SinglePixelPackedSampleModel)img.getSampleModel();
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
int pitch=sm.getScanlineStride();
|
||||||
for(j=0; j<w; j++)
|
DataBufferInt db=(DataBufferInt)wr.getDataBuffer();
|
||||||
{
|
int [] buf = db.getData();
|
||||||
if(((_i/8)+(j/8))%2==0) pixel=0xFFFFFFFF;
|
initintbuf(buf, img.getWidth(), pitch, img.getHeight(), pf, flags);
|
||||||
else pixel=0xFF4C4C4C;
|
|
||||||
img.setRGB(j, i, pixel);
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
for(_i=16; _i<h; _i++)
|
|
||||||
{
|
{
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
ComponentSampleModel sm=
|
||||||
for(j=0; j<w; j++)
|
(ComponentSampleModel)img.getSampleModel();
|
||||||
{
|
int pitch=sm.getScanlineStride();
|
||||||
if(((_i/8)+(j/8))%2==0) pixel=0xFF000000;
|
DataBufferByte db=(DataBufferByte)wr.getDataBuffer();
|
||||||
else pixel=0xFFE2E2E2;
|
byte [] buf = db.getData();
|
||||||
img.setRGB(j, i, pixel);
|
initbuf(buf, img.getWidth(), pitch, img.getHeight(), pf, flags);
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(_i=0; _i<16; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
pixel=0xFFFF0000;
|
|
||||||
if(((_i/8)+(j/8))%2==0) pixel|=0x0000FFFF;
|
|
||||||
img.setRGB(j, i, pixel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(_i=16; _i<h; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
pixel=0;
|
|
||||||
if(((_i/8)+(j/8))%2!=0) pixel=0xFFFFFF00;
|
|
||||||
img.setRGB(j, i, pixel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void dumpbuf(byte [] buf, int w, int h, int pf,
|
|
||||||
int scalefactor, int flags)
|
|
||||||
{
|
|
||||||
int ps=TJ.pixelSize[pf];
|
|
||||||
int roffset=_roffset[pf], goffset=_goffset[pf], boffset=_boffset[pf];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
System.out.print("\n");
|
|
||||||
for(i=0; i<h; i++)
|
|
||||||
{
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
int r=buf[(w*i+j)*ps+roffset];
|
|
||||||
int g=buf[(w*i+j)*ps+goffset];
|
|
||||||
int b=buf[(w*i+j)*ps+boffset];
|
|
||||||
if(r<0) r+=256; if(g<0) g+=256; if(b<0) b+=256;
|
|
||||||
System.out.format("%3d/%3d/%3d ", r, g, b);
|
|
||||||
}
|
|
||||||
System.out.print("\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,26 +252,25 @@ public class TJUnitTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int checkbuf(byte [] buf, int w, int h, int pf, int subsamp,
|
private static int checkbuf(byte [] buf, int w, int pitch, int h, int pf,
|
||||||
int scalefactor, int flags) throws Exception
|
int subsamp, int scalefactor, int flags) throws Exception
|
||||||
{
|
{
|
||||||
int roffset=_roffset[pf], goffset=_goffset[pf], boffset=_boffset[pf];
|
int roffset=TJ.getRedShift(pf)/8;
|
||||||
int ps=TJ.pixelSize[pf];
|
int goffset=TJ.getGreenShift(pf)/8;
|
||||||
|
int boffset=TJ.getBlueShift(pf)/8;
|
||||||
|
int ps=TJ.getPixelSize(pf);
|
||||||
int i, _i, j, retval=1;
|
int i, _i, j, retval=1;
|
||||||
int halfway=16/scalefactor, blocksize=8/scalefactor;
|
int halfway=16/scalefactor, blocksize=8/scalefactor;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
|
||||||
if(subsamp==TJ.SAMP_GRAY)
|
|
||||||
{
|
{
|
||||||
for(_i=0; _i<halfway; _i++)
|
for(_i=0; _i<halfway; _i++)
|
||||||
{
|
{
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
for(j=0; j<w; j++)
|
for(j=0; j<w; j++)
|
||||||
{
|
{
|
||||||
byte r=buf[(w*i+j)*ps+roffset],
|
byte r=buf[pitch*i+j*ps+roffset], g=buf[pitch*i+j*ps+goffset],
|
||||||
g=buf[(w*i+j)*ps+goffset],
|
b=buf[pitch*i+j*ps+boffset];
|
||||||
b=buf[(w*i+j)*ps+boffset];
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
if(((_i/blocksize)+(j/blocksize))%2==0)
|
||||||
{
|
{
|
||||||
checkval255(_i, j, r, "R");
|
checkval255(_i, j, r, "R");
|
||||||
@@ -292,11 +278,20 @@ public class TJUnitTest {
|
|||||||
checkval255(_i, j, b, "B");
|
checkval255(_i, j, b, "B");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if(subsamp==TJ.SAMP_GRAY)
|
||||||
{
|
{
|
||||||
checkval(_i, j, r, "R", 76);
|
checkval(_i, j, r, "R", 76);
|
||||||
checkval(_i, j, g, "G", 76);
|
checkval(_i, j, g, "G", 76);
|
||||||
checkval(_i, j, b, "B", 76);
|
checkval(_i, j, b, "B", 76);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
checkval255(_i, j, r, "R");
|
||||||
|
checkval0(_i, j, g, "G");
|
||||||
|
checkval0(_i, j, b, "B");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(_i=halfway; _i<h; _i++)
|
for(_i=halfway; _i<h; _i++)
|
||||||
@@ -304,59 +299,26 @@ public class TJUnitTest {
|
|||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
for(j=0; j<w; j++)
|
for(j=0; j<w; j++)
|
||||||
{
|
{
|
||||||
byte r=buf[(w*i+j)*ps+roffset],
|
byte r=buf[pitch*i+j*ps+roffset], g=buf[pitch*i+j*ps+goffset],
|
||||||
g=buf[(w*i+j)*ps+goffset],
|
b=buf[pitch*i+j*ps+boffset];
|
||||||
b=buf[(w*i+j)*ps+boffset];
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
if(((_i/blocksize)+(j/blocksize))%2==0)
|
||||||
{
|
{
|
||||||
checkval0(_i, j, r, "R");
|
checkval0(_i, j, r, "R");
|
||||||
checkval0(_i, j, g, "G");
|
checkval0(_i, j, g, "G");
|
||||||
checkval0(_i, j, b, "B");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if(subsamp==TJ.SAMP_GRAY)
|
||||||
{
|
{
|
||||||
checkval(_i, j, r, "R", 226);
|
checkval(_i, j, r, "R", 226);
|
||||||
checkval(_i, j, g, "G", 226);
|
checkval(_i, j, g, "G", 226);
|
||||||
checkval(_i, j, b, "B", 226);
|
checkval(_i, j, b, "B", 226);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(_i=0; _i<halfway; _i++)
|
checkval255(_i, j, r, "R");
|
||||||
{
|
checkval255(_i, j, g, "G");
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
checkval0(_i, j, b, "B");
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
checkval255(_i, j, buf[(w*i+j)*ps+roffset], "R");
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval255(_i, j, buf[(w*i+j)*ps+goffset], "G");
|
|
||||||
checkval255(_i, j, buf[(w*i+j)*ps+boffset], "B");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
checkval0(_i, j, buf[(w*i+j)*ps+goffset], "G");
|
|
||||||
checkval0(_i, j, buf[(w*i+j)*ps+boffset], "B");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(_i=halfway; _i<h; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
checkval0(_i, j, buf[(w*i+j)*ps+boffset], "B");
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval0(_i, j, buf[(w*i+j)*ps+roffset], "R");
|
|
||||||
checkval0(_i, j, buf[(w*i+j)*ps+goffset], "G");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
checkval255(_i, j, buf[(w*i+j)*ps+roffset], "R");
|
|
||||||
checkval255(_i, j, buf[(w*i+j)*ps+goffset], "G");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,117 +329,151 @@ public class TJUnitTest {
|
|||||||
System.out.println(e);
|
System.out.println(e);
|
||||||
retval=0;
|
retval=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(retval==0)
|
||||||
|
{
|
||||||
|
System.out.print("\n");
|
||||||
|
for(i=0; i<h; i++)
|
||||||
|
{
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
int r=buf[pitch*i+j*ps+roffset];
|
||||||
|
int g=buf[pitch*i+j*ps+goffset];
|
||||||
|
int b=buf[pitch*i+j*ps+boffset];
|
||||||
|
if(r<0) r+=256; if(g<0) g+=256; if(b<0) b+=256;
|
||||||
|
System.out.format("%3d/%3d/%3d ", r, g, b);
|
||||||
|
}
|
||||||
|
System.out.print("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int checkintbuf(int [] buf, int w, int pitch, int h, int pf,
|
||||||
|
int subsamp, int scalefactor, int flags) throws Exception
|
||||||
|
{
|
||||||
|
int rshift=TJ.getRedShift(pf);
|
||||||
|
int gshift=TJ.getGreenShift(pf);
|
||||||
|
int bshift=TJ.getBlueShift(pf);
|
||||||
|
int i, _i, j, retval=1;
|
||||||
|
int halfway=16/scalefactor, blocksize=8/scalefactor;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for(_i=0; _i<halfway; _i++)
|
||||||
|
{
|
||||||
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
int r=(buf[pitch*i+j] >> rshift) & 0xFF;
|
||||||
|
int g=(buf[pitch*i+j] >> gshift) & 0xFF;
|
||||||
|
int b=(buf[pitch*i+j] >> bshift) & 0xFF;
|
||||||
|
if(((_i/blocksize)+(j/blocksize))%2==0)
|
||||||
|
{
|
||||||
|
checkval255(_i, j, r, "R");
|
||||||
|
checkval255(_i, j, g, "G");
|
||||||
|
checkval255(_i, j, b, "B");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(subsamp==TJ.SAMP_GRAY)
|
||||||
|
{
|
||||||
|
checkval(_i, j, r, "R", 76);
|
||||||
|
checkval(_i, j, g, "G", 76);
|
||||||
|
checkval(_i, j, b, "B", 76);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
checkval255(_i, j, r, "R");
|
||||||
|
checkval0(_i, j, g, "G");
|
||||||
|
checkval0(_i, j, b, "B");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(_i=halfway; _i<h; _i++)
|
||||||
|
{
|
||||||
|
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
int r=(buf[pitch*i+j] >> rshift) & 0xFF;
|
||||||
|
int g=(buf[pitch*i+j] >> gshift) & 0xFF;
|
||||||
|
int b=(buf[pitch*i+j] >> bshift) & 0xFF;
|
||||||
|
if(((_i/blocksize)+(j/blocksize))%2==0)
|
||||||
|
{
|
||||||
|
checkval0(_i, j, r, "R");
|
||||||
|
checkval0(_i, j, g, "G");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(subsamp==TJ.SAMP_GRAY)
|
||||||
|
{
|
||||||
|
checkval(_i, j, r, "R", 226);
|
||||||
|
checkval(_i, j, g, "G", 226);
|
||||||
|
checkval(_i, j, b, "B", 226);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
checkval255(_i, j, r, "R");
|
||||||
|
checkval255(_i, j, g, "G");
|
||||||
|
checkval0(_i, j, b, "B");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
System.out.println(e);
|
||||||
|
retval=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(retval==0)
|
||||||
|
{
|
||||||
|
System.out.print("\n");
|
||||||
|
for(i=0; i<h; i++)
|
||||||
|
{
|
||||||
|
for(j=0; j<w; j++)
|
||||||
|
{
|
||||||
|
int r=(buf[pitch*i+j] >> rshift) & 0xFF;
|
||||||
|
int g=(buf[pitch*i+j] >> gshift) & 0xFF;
|
||||||
|
int b=(buf[pitch*i+j] >> bshift) & 0xFF;
|
||||||
|
if(r<0) r+=256; if(g<0) g+=256; if(b<0) b+=256;
|
||||||
|
System.out.format("%3d/%3d/%3d ", r, g, b);
|
||||||
|
}
|
||||||
|
System.out.print("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int checkimg(BufferedImage img, int pf,
|
private static int checkimg(BufferedImage img, int pf,
|
||||||
int subsamp, int scalefactor, int flags) throws Exception
|
int subsamp, int scalefactor, int flags) throws Exception
|
||||||
{
|
{
|
||||||
int i, _i, j, retval=1, w=img.getWidth(), h=img.getHeight();
|
WritableRaster wr=img.getRaster();
|
||||||
int halfway=16/scalefactor, blocksize=8/scalefactor;
|
int imgtype=img.getType();
|
||||||
|
if(imgtype==BufferedImage.TYPE_INT_RGB
|
||||||
try
|
|| imgtype==BufferedImage.TYPE_INT_BGR)
|
||||||
{
|
{
|
||||||
if(subsamp==TJ.SAMP_GRAY)
|
SinglePixelPackedSampleModel sm=
|
||||||
{
|
(SinglePixelPackedSampleModel)img.getSampleModel();
|
||||||
for(_i=0; _i<halfway; _i++)
|
int pitch=sm.getScanlineStride();
|
||||||
{
|
DataBufferInt db=(DataBufferInt)wr.getDataBuffer();
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
int [] buf = db.getData();
|
||||||
for(j=0; j<w; j++)
|
return checkintbuf(buf, img.getWidth(), pitch, img.getHeight(), pf,
|
||||||
{
|
subsamp, scalefactor, flags);
|
||||||
int r=(img.getRGB(j, i)>>16) & 0xFF;
|
|
||||||
int g=(img.getRGB(j, i)>>8) & 0xFF;
|
|
||||||
int b=img.getRGB(j, i) & 0xFF;
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval255(_i, j, r, "R");
|
|
||||||
checkval255(_i, j, g, "G");
|
|
||||||
checkval255(_i, j, b, "B");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
checkval(_i, j, r, "R", 76);
|
ComponentSampleModel sm=
|
||||||
checkval(_i, j, g, "G", 76);
|
(ComponentSampleModel)img.getSampleModel();
|
||||||
checkval(_i, j, b, "B", 76);
|
int pitch=sm.getScanlineStride();
|
||||||
|
DataBufferByte db=(DataBufferByte)wr.getDataBuffer();
|
||||||
|
byte [] buf = db.getData();
|
||||||
|
return checkbuf(buf, img.getWidth(), pitch, img.getHeight(), pf, subsamp,
|
||||||
|
scalefactor, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
for(_i=halfway; _i<h; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
int r=(img.getRGB(j, i)>>16) & 0xFF;
|
|
||||||
int g=(img.getRGB(j, i)>>8) & 0xFF;
|
|
||||||
int b=img.getRGB(j, i) & 0xFF;
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval0(_i, j, r, "R");
|
|
||||||
checkval0(_i, j, g, "G");
|
|
||||||
checkval0(_i, j, b, "B");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
checkval(_i, j, r, "R", 226);
|
|
||||||
checkval(_i, j, g, "G", 226);
|
|
||||||
checkval(_i, j, b, "B", 226);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(_i=0; _i<halfway; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
int r=(img.getRGB(j, i)>>16) & 0xFF;
|
|
||||||
int g=(img.getRGB(j, i)>>8) & 0xFF;
|
|
||||||
int b=img.getRGB(j, i) & 0xFF;
|
|
||||||
checkval255(_i, j, r, "R");
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval255(_i, j, g, "G");
|
|
||||||
checkval255(_i, j, b, "B");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
checkval0(_i, j, g, "G");
|
|
||||||
checkval0(_i, j, b, "B");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(_i=halfway; _i<h; _i++)
|
|
||||||
{
|
|
||||||
if((flags&TJ.BOTTOMUP)!=0) i=h-_i-1; else i=_i;
|
|
||||||
for(j=0; j<w; j++)
|
|
||||||
{
|
|
||||||
int r=(img.getRGB(j, i)>>16) & 0xFF;
|
|
||||||
int g=(img.getRGB(j, i)>>8) & 0xFF;
|
|
||||||
int b=img.getRGB(j, i) & 0xFF;
|
|
||||||
checkval0(_i, j, b, "B");
|
|
||||||
if(((_i/blocksize)+(j/blocksize))%2==0)
|
|
||||||
{
|
|
||||||
checkval0(_i, j, r, "R");
|
|
||||||
checkval0(_i, j, g, "G");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
checkval255(_i, j, r, "R");
|
|
||||||
checkval255(_i, j, g, "G");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
System.out.println(e);
|
|
||||||
retval=0;
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int PAD(int v, int p)
|
private static int PAD(int v, int p)
|
||||||
{
|
{
|
||||||
@@ -616,9 +612,7 @@ public class TJUnitTest {
|
|||||||
{
|
{
|
||||||
String tempstr; byte [] bmpbuf=null; BufferedImage img=null;
|
String tempstr; byte [] bmpbuf=null; BufferedImage img=null;
|
||||||
String pixformat; double t;
|
String pixformat; double t;
|
||||||
int size=0, ps=TJ.pixelSize[pf];
|
int size=0, ps=TJ.getPixelSize(pf);
|
||||||
|
|
||||||
if(yuv==YUVENCODE) flags|=TJ.YUV;
|
|
||||||
|
|
||||||
pixformat=_pixformatstr[pf];
|
pixformat=_pixformatstr[pf];
|
||||||
|
|
||||||
@@ -642,18 +636,25 @@ public class TJUnitTest {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
bmpbuf=new byte[w*h*ps+1];
|
bmpbuf=new byte[w*h*ps+1];
|
||||||
initbuf(bmpbuf, w, h, pf, flags);
|
initbuf(bmpbuf, w, w*ps, h, pf, flags);
|
||||||
}
|
}
|
||||||
Arrays.fill(jpegbuf, (byte)0);
|
Arrays.fill(jpegbuf, (byte)0);
|
||||||
|
|
||||||
t=gettime();
|
t=gettime();
|
||||||
|
tjc.setSubsamp(subsamp);
|
||||||
|
tjc.setJPEGQuality(qual);
|
||||||
if(bi)
|
if(bi)
|
||||||
size=tjc.compress(img, jpegbuf, subsamp, qual, flags);
|
{
|
||||||
|
if(yuv==YUVENCODE) tjc.encodeYUV(img, jpegbuf, flags);
|
||||||
|
else tjc.compress(img, jpegbuf, flags);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tjc.setBitmapBuffer(bmpbuf, w, 0, h, pf);
|
tjc.setBitmapBuffer(bmpbuf, w, 0, h, pf);
|
||||||
size=tjc.compress(jpegbuf, subsamp, qual, flags);
|
if(yuv==YUVENCODE) tjc.encodeYUV(jpegbuf, flags);
|
||||||
|
else tjc.compress(jpegbuf, flags);
|
||||||
}
|
}
|
||||||
|
size=tjc.getCompressedSize();
|
||||||
t=gettime()-t;
|
t=gettime()-t;
|
||||||
|
|
||||||
if(yuv==YUVENCODE)
|
if(yuv==YUVENCODE)
|
||||||
@@ -689,8 +690,7 @@ public class TJUnitTest {
|
|||||||
int temp1, temp2;
|
int temp1, temp2;
|
||||||
BufferedImage img=null; byte [] bmpbuf=null;
|
BufferedImage img=null; byte [] bmpbuf=null;
|
||||||
|
|
||||||
if(yuv==YUVDECODE) flags|=TJ.YUV;
|
if(yuv==YUVENCODE) return;
|
||||||
else if(yuv==YUVENCODE) return;
|
|
||||||
|
|
||||||
pixformat=_pixformatstr[pf];
|
pixformat=_pixformatstr[pf];
|
||||||
System.out.print("JPEG -> ");
|
System.out.print("JPEG -> ");
|
||||||
@@ -716,13 +716,12 @@ public class TJUnitTest {
|
|||||||
if(temp1!=scaledw || temp2!=scaledh)
|
if(temp1!=scaledw || temp2!=scaledh)
|
||||||
throw new Exception("Scaled size mismatch");
|
throw new Exception("Scaled size mismatch");
|
||||||
|
|
||||||
if(bi)
|
if(yuv==YUVDECODE) bmpbuf=tjd.decompressToYUV(flags);
|
||||||
{
|
|
||||||
img=new BufferedImage(scaledw, scaledh, biType[pf]);
|
|
||||||
tjd.decompress(img, flags);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
bmpbuf=tjd.decompress(scaledw, 0, scaledh, pf, flags);
|
{
|
||||||
|
if(bi) img=tjd.decompress(scaledw, scaledh, biType[pf], flags);
|
||||||
|
else bmpbuf=tjd.decompress(scaledw, 0, scaledh, pf, flags);
|
||||||
|
}
|
||||||
t=gettime()-t;
|
t=gettime()-t;
|
||||||
|
|
||||||
if(bi)
|
if(bi)
|
||||||
@@ -743,14 +742,12 @@ public class TJUnitTest {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if((bi && checkimg(img, pf, subsamp, scalefactor, flags)==1)
|
if((bi && checkimg(img, pf, subsamp, scalefactor, flags)==1)
|
||||||
|| (!bi && checkbuf(bmpbuf, scaledw, scaledh, pf, subsamp, scalefactor,
|
|| (!bi && checkbuf(bmpbuf, scaledw, scaledw*TJ.getPixelSize(pf),
|
||||||
flags)==1))
|
scaledh, pf, subsamp, scalefactor, flags)==1))
|
||||||
System.out.print("Passed.");
|
System.out.print("Passed.");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
System.out.print("FAILED!"); exitstatus=-1;
|
System.out.print("FAILED!"); exitstatus=-1;
|
||||||
if(bmpbuf!=null)
|
|
||||||
dumpbuf(bmpbuf, scaledw, scaledh, pf, scalefactor, flags);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.format(" %.6f ms\n", t*1000.);
|
System.out.format(" %.6f ms\n", t*1000.);
|
||||||
@@ -778,8 +775,10 @@ public class TJUnitTest {
|
|||||||
{
|
{
|
||||||
TJCompressor tjc=null; TJDecompressor tjd=null;
|
TJCompressor tjc=null; TJDecompressor tjd=null;
|
||||||
int size; int pfstart, pfend;
|
int size; int pfstart, pfend;
|
||||||
|
byte [] jpegbuf;
|
||||||
|
|
||||||
byte [] jpegbuf=new byte[TJ.bufSize(w, h)];
|
if(yuv==YUVENCODE) jpegbuf=new byte[TJ.bufSizeYUV(w, h, subsamp)];
|
||||||
|
else jpegbuf=new byte[TJ.bufSize(w, h)];
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -821,7 +820,7 @@ public class TJUnitTest {
|
|||||||
private static void dotest1() throws Exception
|
private static void dotest1() throws Exception
|
||||||
{
|
{
|
||||||
int i, j, i2; byte [] bmpbuf, jpgbuf;
|
int i, j, i2; byte [] bmpbuf, jpgbuf;
|
||||||
TJCompressor tjc=null; int size;
|
TJCompressor tjc=null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -843,7 +842,9 @@ public class TJUnitTest {
|
|||||||
bmpbuf[i2*4+2]=pixels[i2%9][0];
|
bmpbuf[i2*4+2]=pixels[i2%9][0];
|
||||||
}
|
}
|
||||||
tjc.setBitmapBuffer(bmpbuf, i, 0, j, TJ.PF_BGRX);
|
tjc.setBitmapBuffer(bmpbuf, i, 0, j, TJ.PF_BGRX);
|
||||||
size=tjc.compress(jpgbuf, TJ.SAMP_444, 100, 0);
|
tjc.setSubsamp(TJ.SAMP_444);
|
||||||
|
tjc.setJPEGQuality(100);
|
||||||
|
tjc.compress(jpgbuf, 0);
|
||||||
|
|
||||||
bmpbuf=new byte[j*i*4];
|
bmpbuf=new byte[j*i*4];
|
||||||
jpgbuf=new byte[TJ.bufSize(j, i)];
|
jpgbuf=new byte[TJ.bufSize(j, i)];
|
||||||
@@ -853,7 +854,7 @@ public class TJUnitTest {
|
|||||||
else bmpbuf[i2*4]=bmpbuf[i2*4+1]=bmpbuf[i2*4+2]=0;
|
else bmpbuf[i2*4]=bmpbuf[i2*4+1]=bmpbuf[i2*4+2]=0;
|
||||||
}
|
}
|
||||||
tjc.setBitmapBuffer(bmpbuf, j, 0, i, TJ.PF_BGRX);
|
tjc.setBitmapBuffer(bmpbuf, j, 0, i, TJ.PF_BGRX);
|
||||||
size=tjc.compress(jpgbuf, TJ.SAMP_444, 100, 0);
|
tjc.compress(jpgbuf, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("Done. ");
|
System.out.println("Done. ");
|
||||||
@@ -879,23 +880,21 @@ public class TJUnitTest {
|
|||||||
usage();
|
usage();
|
||||||
if(argv[i].equalsIgnoreCase("-bi")) bi=true;
|
if(argv[i].equalsIgnoreCase("-bi")) bi=true;
|
||||||
}
|
}
|
||||||
if(bi && doyuv)
|
|
||||||
throw new Exception("-bi and -yuv cannot be used together.");
|
|
||||||
if(doyuv) yuv=YUVENCODE;
|
if(doyuv) yuv=YUVENCODE;
|
||||||
dotest(35, 39, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_444, "test");
|
dotest(35, 39, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_444, "test");
|
||||||
dotest(39, 41, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_444, "test");
|
dotest(39, 41, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_444, "test");
|
||||||
if(doyuv)
|
if(doyuv)
|
||||||
{
|
{
|
||||||
dotest(41, 35, _3byteFormats, TJ.SAMP_422, "test");
|
dotest(41, 35, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_422, "test");
|
||||||
dotest(35, 39, _4byteFormats, TJ.SAMP_422, "test");
|
dotest(35, 39, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_422, "test");
|
||||||
dotest(39, 41, _3byteFormats, TJ.SAMP_420, "test");
|
dotest(39, 41, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_420, "test");
|
||||||
dotest(41, 35, _4byteFormats, TJ.SAMP_420, "test");
|
dotest(41, 35, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_420, "test");
|
||||||
}
|
}
|
||||||
dotest(35, 39, _onlyGray, TJ.SAMP_GRAY, "test");
|
dotest(35, 39, _onlyGray, TJ.SAMP_GRAY, "test");
|
||||||
dotest(39, 41, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_GRAY, "test");
|
dotest(39, 41, bi? _3byteFormatsBI:_3byteFormats, TJ.SAMP_GRAY, "test");
|
||||||
dotest(41, 35, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_GRAY, "test");
|
dotest(41, 35, bi? _4byteFormatsBI:_4byteFormats, TJ.SAMP_GRAY, "test");
|
||||||
if(!doyuv && !bi) dotest1();
|
if(!doyuv && !bi) dotest1();
|
||||||
if(doyuv)
|
if(doyuv && !bi)
|
||||||
{
|
{
|
||||||
yuv=YUVDECODE;
|
yuv=YUVDECODE;
|
||||||
dotest(48, 48, _onlyRGB, TJ.SAMP_444, "test");
|
dotest(48, 48, _onlyRGB, TJ.SAMP_444, "test");
|
||||||
@@ -904,8 +903,10 @@ public class TJUnitTest {
|
|||||||
dotest(39, 41, _onlyRGB, TJ.SAMP_422, "test");
|
dotest(39, 41, _onlyRGB, TJ.SAMP_422, "test");
|
||||||
dotest(48, 48, _onlyRGB, TJ.SAMP_420, "test");
|
dotest(48, 48, _onlyRGB, TJ.SAMP_420, "test");
|
||||||
dotest(41, 35, _onlyRGB, TJ.SAMP_420, "test");
|
dotest(41, 35, _onlyRGB, TJ.SAMP_420, "test");
|
||||||
|
dotest(48, 48, _onlyRGB, TJ.SAMP_GRAY, "test");
|
||||||
|
dotest(35, 39, _onlyRGB, TJ.SAMP_GRAY, "test");
|
||||||
dotest(48, 48, _onlyGray, TJ.SAMP_GRAY, "test");
|
dotest(48, 48, _onlyGray, TJ.SAMP_GRAY, "test");
|
||||||
dotest(35, 39, _onlyGray, TJ.SAMP_GRAY, "test");
|
dotest(39, 41, _onlyGray, TJ.SAMP_GRAY, "test");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ final public class TJ {
|
|||||||
PF_XRGB = 5,
|
PF_XRGB = 5,
|
||||||
PF_GRAY = 6;
|
PF_GRAY = 6;
|
||||||
|
|
||||||
final public static int pixelSize[] = {
|
final private static int pixelSize[] = {
|
||||||
3, 3, 4, 4, 4, 4, 1
|
3, 3, 4, 4, 4, 4, 1
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -59,6 +59,36 @@ final public class TJ {
|
|||||||
return pixelSize[pixelFormat];
|
return pixelSize[pixelFormat];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final private static int redShift[] = {
|
||||||
|
0, 16, 0, 16, 24, 8, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
final public static int getRedShift(int pixelFormat) throws Exception {
|
||||||
|
if(pixelFormat < 0 || pixelFormat >= NUMPFOPT)
|
||||||
|
throw new Exception("Invalid pixel format");
|
||||||
|
return redShift[pixelFormat];
|
||||||
|
}
|
||||||
|
|
||||||
|
final private static int greenShift[] = {
|
||||||
|
8, 8, 8, 8, 16, 16, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
final public static int getGreenShift(int pixelFormat) throws Exception {
|
||||||
|
if(pixelFormat < 0 || pixelFormat >= NUMPFOPT)
|
||||||
|
throw new Exception("Invalid pixel format");
|
||||||
|
return greenShift[pixelFormat];
|
||||||
|
}
|
||||||
|
|
||||||
|
final private static int blueShift[] = {
|
||||||
|
16, 0, 16, 0, 8, 24, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
final public static int getBlueShift(int pixelFormat) throws Exception {
|
||||||
|
if(pixelFormat < 0 || pixelFormat >= NUMPFOPT)
|
||||||
|
throw new Exception("Invalid pixel format");
|
||||||
|
return blueShift[pixelFormat];
|
||||||
|
}
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
final public static int
|
final public static int
|
||||||
BOTTOMUP = 2,
|
BOTTOMUP = 2,
|
||||||
@@ -66,22 +96,7 @@ final public class TJ {
|
|||||||
FORCESSE = 16,
|
FORCESSE = 16,
|
||||||
FORCESSE2 = 32,
|
FORCESSE2 = 32,
|
||||||
FORCESSE3 = 128,
|
FORCESSE3 = 128,
|
||||||
FASTUPSAMPLE = 256,
|
FASTUPSAMPLE = 256;
|
||||||
YUV = 512;
|
|
||||||
|
|
||||||
final private static int
|
|
||||||
TJ_BGR = 1,
|
|
||||||
TJ_ALPHAFIRST = 64;
|
|
||||||
|
|
||||||
final private static int flags[] = {
|
|
||||||
0, TJ_BGR, 0, TJ_BGR, TJ_BGR|TJ_ALPHAFIRST, TJ_ALPHAFIRST, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
final public static int getFlags(int pixelFormat) throws Exception {
|
|
||||||
if(pixelFormat < 0 || pixelFormat >= NUMPFOPT)
|
|
||||||
throw new Exception("Invalid pixel format");
|
|
||||||
return flags[pixelFormat];
|
|
||||||
}
|
|
||||||
|
|
||||||
public native final static int bufSize(int width, int height)
|
public native final static int bufSize(int width, int height)
|
||||||
throws Exception;
|
throws Exception;
|
||||||
|
|||||||
@@ -55,18 +55,40 @@ public class TJCompressor {
|
|||||||
bitmapPixelFormat = pixelFormat;
|
bitmapPixelFormat = pixelFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compress(byte [] dstBuf, int jpegSubsamp, int jpegQual,
|
public void setSubsamp(int newSubsamp) throws Exception {
|
||||||
int flags) throws Exception {
|
if(newSubsamp < 0 || newSubsamp >= TJ.NUMSAMPOPT)
|
||||||
return compress(bitmapBuf, bitmapWidth, bitmapPitch, bitmapHeight,
|
throw new Exception ("Invalid argument in setSubsamp()");
|
||||||
TJ.getPixelSize(bitmapPixelFormat), dstBuf, jpegSubsamp, jpegQual,
|
subsamp = newSubsamp;
|
||||||
flags | TJ.getFlags(bitmapPixelFormat));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compress(BufferedImage srcImage, byte [] dstBuf, int jpegSubsamp,
|
public void setJPEGQuality(int quality) throws Exception {
|
||||||
int jpegQual, int flags) throws Exception {
|
if(quality < 1 || quality > 100)
|
||||||
if(srcImage == null || flags < 0)
|
throw new Exception ("Invalid argument in setJPEGQuality()");
|
||||||
throw new Exception("Invalid argument in decompress()");
|
jpegQuality = quality;
|
||||||
flags &= ~(TJ.YUV);
|
}
|
||||||
|
|
||||||
|
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 width = srcImage.getWidth();
|
||||||
int height = srcImage.getHeight();
|
int height = srcImage.getHeight();
|
||||||
int pixelFormat; boolean intPixels=false;
|
int pixelFormat; boolean intPixels=false;
|
||||||
@@ -83,29 +105,117 @@ public class TJCompressor {
|
|||||||
throw new Exception("Unsupported BufferedImage format");
|
throw new Exception("Unsupported BufferedImage format");
|
||||||
}
|
}
|
||||||
WritableRaster wr = srcImage.getRaster();
|
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) {
|
if(intPixels) {
|
||||||
SinglePixelPackedSampleModel sm =
|
SinglePixelPackedSampleModel sm =
|
||||||
(SinglePixelPackedSampleModel)srcImage.getSampleModel();
|
(SinglePixelPackedSampleModel)srcImage.getSampleModel();
|
||||||
int pitch = sm.getScanlineStride();
|
int pitch = sm.getScanlineStride();
|
||||||
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
|
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
|
||||||
int [] buf = db.getData();
|
int [] buf = db.getData();
|
||||||
return compress(buf, width, pitch, height, dstBuf, jpegSubsamp, jpegQual,
|
compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf,
|
||||||
flags | TJ.getFlags(pixelFormat));
|
subsamp, jpegQuality, flags);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ComponentSampleModel sm =
|
ComponentSampleModel sm =
|
||||||
(ComponentSampleModel)srcImage.getSampleModel();
|
(ComponentSampleModel)srcImage.getSampleModel();
|
||||||
int pixelSize = sm.getPixelStride();
|
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");
|
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
|
||||||
int pitch = sm.getScanlineStride();
|
int pitch = sm.getScanlineStride();
|
||||||
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
|
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
|
||||||
byte [] buf = db.getData();
|
byte [] buf = db.getData();
|
||||||
return compress(buf, width, pitch, height, TJ.getPixelSize(pixelFormat),
|
compressedSize = compress(buf, width, pitch, height, pixelFormat, dstBuf,
|
||||||
dstBuf, jpegSubsamp, jpegQual, flags | TJ.getFlags(pixelFormat));
|
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 {
|
public void close() throws Exception {
|
||||||
destroy();
|
destroy();
|
||||||
}
|
}
|
||||||
@@ -126,11 +236,19 @@ public class TJCompressor {
|
|||||||
|
|
||||||
// JPEG size in bytes is returned
|
// JPEG size in bytes is returned
|
||||||
private native int compress(byte [] srcBuf, int width, int pitch,
|
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;
|
int flags) throws Exception;
|
||||||
|
|
||||||
private native int compress(int [] srcBuf, int width, int pitch,
|
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;
|
throws Exception;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -143,4 +261,7 @@ public class TJCompressor {
|
|||||||
private int bitmapHeight = 0;
|
private int bitmapHeight = 0;
|
||||||
private int bitmapPitch = 0;
|
private int bitmapPitch = 0;
|
||||||
private int bitmapPixelFormat = -1;
|
private int bitmapPixelFormat = -1;
|
||||||
|
private int subsamp = -1;
|
||||||
|
private int jpegQuality = -1;
|
||||||
|
private int compressedSize = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ public class TJDecompressor {
|
|||||||
throws Exception {
|
throws Exception {
|
||||||
if(jpegWidth < 1 || jpegHeight < 1)
|
if(jpegWidth < 1 || jpegHeight < 1)
|
||||||
throw new Exception("JPEG buffer not initialized");
|
throw new Exception("JPEG buffer not initialized");
|
||||||
|
if(desiredWidth < 0 || desiredHeight < 0)
|
||||||
|
throw new Exception("Invalid argument in getScaledWidth()");
|
||||||
return getScaledWidth(jpegWidth, jpegHeight, desiredWidth,
|
return getScaledWidth(jpegWidth, jpegHeight, desiredWidth,
|
||||||
desiredHeight);
|
desiredHeight);
|
||||||
}
|
}
|
||||||
@@ -82,6 +84,8 @@ public class TJDecompressor {
|
|||||||
throws Exception {
|
throws Exception {
|
||||||
if(jpegWidth < 1 || jpegHeight < 1)
|
if(jpegWidth < 1 || jpegHeight < 1)
|
||||||
throw new Exception("JPEG buffer not initialized");
|
throw new Exception("JPEG buffer not initialized");
|
||||||
|
if(desiredWidth < 0 || desiredHeight < 0)
|
||||||
|
throw new Exception("Invalid argument in getScaledHeight()");
|
||||||
return getScaledHeight(jpegWidth, jpegHeight, desiredWidth,
|
return getScaledHeight(jpegWidth, jpegHeight, desiredWidth,
|
||||||
desiredHeight);
|
desiredHeight);
|
||||||
}
|
}
|
||||||
@@ -89,35 +93,49 @@ public class TJDecompressor {
|
|||||||
public void decompress(byte [] dstBuf, int desiredWidth, int pitch,
|
public void decompress(byte [] dstBuf, int desiredWidth, int pitch,
|
||||||
int desiredHeight, int pixelFormat, int flags) throws Exception {
|
int desiredHeight, int pixelFormat, int flags) throws Exception {
|
||||||
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
||||||
|
if(dstBuf == null || desiredWidth < 0 || pitch < 0 || desiredHeight < 0
|
||||||
|
|| pixelFormat < 0 || pixelFormat >= TJ.NUMPFOPT || flags < 0)
|
||||||
|
throw new Exception("Invalid argument in decompress()");
|
||||||
decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch,
|
decompress(jpegBuf, jpegBufSize, dstBuf, desiredWidth, pitch,
|
||||||
desiredHeight, TJ.getPixelSize(pixelFormat),
|
desiredHeight, pixelFormat, flags);
|
||||||
flags | TJ.getFlags(pixelFormat));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte [] decompress(int desiredWidth, int pitch, int desiredHeight,
|
public byte [] decompress(int desiredWidth, int pitch, int desiredHeight,
|
||||||
int pixelFormat, int flags) throws Exception {
|
int pixelFormat, int flags) throws Exception {
|
||||||
if(desiredWidth < 0 || desiredHeight < 0 || pitch < 0 || pixelFormat < 0
|
if(desiredWidth < 0 || pitch < 0 || desiredHeight < 0
|
||||||
|| pixelFormat >= TJ.NUMPFOPT || flags < 0)
|
|| pixelFormat < 0 || pixelFormat >= TJ.NUMPFOPT || flags < 0)
|
||||||
throw new Exception("Invalid argument in decompress()");
|
throw new Exception("Invalid argument in decompress()");
|
||||||
int pixelSize = TJ.getPixelSize(pixelFormat);
|
int pixelSize = TJ.getPixelSize(pixelFormat);
|
||||||
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
|
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
|
||||||
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
|
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
|
||||||
if(pitch == 0) pitch = scaledWidth * pixelSize;
|
if(pitch == 0) pitch = scaledWidth * pixelSize;
|
||||||
int bufSize;
|
byte [] buf = new byte[pitch * scaledHeight];
|
||||||
if((flags&TJ.YUV)!=0)
|
decompress(buf, desiredWidth, pitch, desiredHeight, pixelFormat, flags);
|
||||||
bufSize = TJ.bufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp);
|
return buf;
|
||||||
else bufSize = pitch * scaledHeight;
|
}
|
||||||
byte [] buf = new byte[bufSize];
|
|
||||||
|
public void decompressToYUV(byte [] dstBuf, int flags) throws Exception {
|
||||||
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
||||||
decompress(jpegBuf, jpegBufSize, buf, desiredWidth, pitch, desiredHeight,
|
if(dstBuf == null || flags < 0)
|
||||||
TJ.getPixelSize(pixelFormat), flags | TJ.getFlags(pixelFormat));
|
throw new Exception("Invalid argument in decompressToYUV()");
|
||||||
|
decompressToYUV(jpegBuf, jpegBufSize, dstBuf, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte [] decompressToYUV(int flags) throws Exception {
|
||||||
|
if(flags < 0)
|
||||||
|
throw new Exception("Invalid argument in decompressToYUV()");
|
||||||
|
if(jpegWidth < 1 || jpegHeight < 1 || jpegSubsamp < 0)
|
||||||
|
throw new Exception("JPEG buffer not initialized");
|
||||||
|
if(jpegSubsamp >= TJ.NUMSAMPOPT)
|
||||||
|
throw new Exception("JPEG header information is invalid");
|
||||||
|
byte [] buf = new byte[TJ.bufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp)];
|
||||||
|
decompressToYUV(buf, flags);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void decompress(BufferedImage dstImage, int flags) throws Exception {
|
public void decompress(BufferedImage dstImage, int flags) throws Exception {
|
||||||
if(dstImage == null || flags < 0)
|
if(dstImage == null || flags < 0)
|
||||||
throw new Exception("Invalid argument in decompress()");
|
throw new Exception("Invalid argument in decompress()");
|
||||||
flags &= ~(TJ.YUV);
|
|
||||||
int desiredWidth = dstImage.getWidth();
|
int desiredWidth = dstImage.getWidth();
|
||||||
int desiredHeight = dstImage.getHeight();
|
int desiredHeight = dstImage.getHeight();
|
||||||
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
|
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
|
||||||
@@ -144,14 +162,15 @@ public class TJDecompressor {
|
|||||||
int pitch = sm.getScanlineStride();
|
int pitch = sm.getScanlineStride();
|
||||||
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
|
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
|
||||||
int [] buf = db.getData();
|
int [] buf = db.getData();
|
||||||
|
if(jpegBuf == null) throw new Exception("JPEG buffer not initialized");
|
||||||
decompress(jpegBuf, jpegBufSize, buf, scaledWidth, pitch, scaledHeight,
|
decompress(jpegBuf, jpegBufSize, buf, scaledWidth, pitch, scaledHeight,
|
||||||
flags | TJ.getFlags(pixelFormat));
|
pixelFormat, flags);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ComponentSampleModel sm =
|
ComponentSampleModel sm =
|
||||||
(ComponentSampleModel)dstImage.getSampleModel();
|
(ComponentSampleModel)dstImage.getSampleModel();
|
||||||
int pixelSize = sm.getPixelStride();
|
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");
|
throw new Exception("Inconsistency between pixel format and pixel size in BufferedImage");
|
||||||
int pitch = sm.getScanlineStride();
|
int pitch = sm.getScanlineStride();
|
||||||
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
|
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
|
||||||
@@ -160,6 +179,18 @@ public class TJDecompressor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BufferedImage decompress(int desiredWidth, int desiredHeight,
|
||||||
|
int bufferedImageType, int flags) throws Exception {
|
||||||
|
if(desiredWidth < 0 || desiredHeight < 0 || flags < 0)
|
||||||
|
throw new Exception("Invalid argument in decompress()");
|
||||||
|
int scaledWidth = getScaledWidth(desiredWidth, desiredHeight);
|
||||||
|
int scaledHeight = getScaledHeight(desiredWidth, desiredHeight);
|
||||||
|
BufferedImage img = new BufferedImage(scaledWidth, scaledHeight,
|
||||||
|
bufferedImageType);
|
||||||
|
decompress(img, flags);
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
public void close() throws Exception {
|
public void close() throws Exception {
|
||||||
destroy();
|
destroy();
|
||||||
}
|
}
|
||||||
@@ -182,11 +213,15 @@ public class TJDecompressor {
|
|||||||
throws Exception;
|
throws Exception;
|
||||||
|
|
||||||
private native void decompress(byte [] srcBuf, int size, byte [] dstBuf,
|
private native void decompress(byte [] srcBuf, int size, byte [] dstBuf,
|
||||||
int desiredWidth, int pitch, int desiredHeight, int pixelSize, int flags)
|
int desiredWidth, int pitch, int desiredHeight, int pixelFormat, int flags)
|
||||||
throws Exception;
|
throws Exception;
|
||||||
|
|
||||||
private native void decompress(byte [] srcBuf, int size, int [] dstBuf,
|
private native void decompress(byte [] srcBuf, int size, int [] dstBuf,
|
||||||
int desiredWidth, int pitch, int desiredHeight, int flags)
|
int desiredWidth, int pitch, int desiredHeight, int pixelFormat, int flags)
|
||||||
|
throws Exception;
|
||||||
|
|
||||||
|
private native void decompressToYUV(byte [] srcBuf, int size, byte [] dstBuf,
|
||||||
|
int flags)
|
||||||
throws Exception;
|
throws Exception;
|
||||||
|
|
||||||
private native int getScaledWidth(int jpegWidth, int jpegHeight,
|
private native int getScaledWidth(int jpegWidth, int jpegHeight,
|
||||||
|
|||||||
@@ -45,12 +45,6 @@ extern "C" {
|
|||||||
#define org_libjpegturbo_turbojpeg_TJ_FORCESSE3 128L
|
#define org_libjpegturbo_turbojpeg_TJ_FORCESSE3 128L
|
||||||
#undef org_libjpegturbo_turbojpeg_TJ_FASTUPSAMPLE
|
#undef org_libjpegturbo_turbojpeg_TJ_FASTUPSAMPLE
|
||||||
#define org_libjpegturbo_turbojpeg_TJ_FASTUPSAMPLE 256L
|
#define org_libjpegturbo_turbojpeg_TJ_FASTUPSAMPLE 256L
|
||||||
#undef org_libjpegturbo_turbojpeg_TJ_YUV
|
|
||||||
#define org_libjpegturbo_turbojpeg_TJ_YUV 512L
|
|
||||||
#undef org_libjpegturbo_turbojpeg_TJ_TJ_BGR
|
|
||||||
#define org_libjpegturbo_turbojpeg_TJ_TJ_BGR 1L
|
|
||||||
#undef org_libjpegturbo_turbojpeg_TJ_TJ_ALPHAFIRST
|
|
||||||
#define org_libjpegturbo_turbojpeg_TJ_TJ_ALPHAFIRST 64L
|
|
||||||
/*
|
/*
|
||||||
* Class: org_libjpegturbo_turbojpeg_TJ
|
* Class: org_libjpegturbo_turbojpeg_TJ
|
||||||
* Method: bufSize
|
* Method: bufSize
|
||||||
|
|||||||
@@ -34,10 +34,26 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
|
|||||||
/*
|
/*
|
||||||
* Class: org_libjpegturbo_turbojpeg_TJCompressor
|
* Class: org_libjpegturbo_turbojpeg_TJCompressor
|
||||||
* Method: compress
|
* Method: compress
|
||||||
* Signature: ([IIII[BIII)I
|
* Signature: ([IIIII[BIII)I
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIII_3BIII
|
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII
|
||||||
(JNIEnv *, jobject, jintArray, jint, jint, jint, jbyteArray, jint, jint, jint);
|
(JNIEnv *, jobject, jintArray, jint, jint, jint, jint, jbyteArray, jint, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_libjpegturbo_turbojpeg_TJCompressor
|
||||||
|
* Method: encodeYUV
|
||||||
|
* Signature: ([BIIII[BII)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BII
|
||||||
|
(JNIEnv *, jobject, jbyteArray, jint, jint, jint, jint, jbyteArray, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_libjpegturbo_turbojpeg_TJCompressor
|
||||||
|
* Method: encodeYUV
|
||||||
|
* Signature: ([IIIII[BII)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BII
|
||||||
|
(JNIEnv *, jobject, jintArray, jint, jint, jint, jint, jbyteArray, jint, jint);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,10 +42,18 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
|
|||||||
/*
|
/*
|
||||||
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
|
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
|
||||||
* Method: decompress
|
* Method: decompress
|
||||||
* Signature: ([BI[IIIII)V
|
* Signature: ([BI[IIIIII)V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIII
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII
|
||||||
(JNIEnv *, jobject, jbyteArray, jint, jintArray, jint, jint, jint, jint);
|
(JNIEnv *, jobject, jbyteArray, jint, jintArray, jint, jint, jint, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
|
||||||
|
* Method: decompressToYUV
|
||||||
|
* Signature: ([BI[BI)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV
|
||||||
|
(JNIEnv *, jobject, jbyteArray, jint, jbyteArray, jint);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
|
* Class: org_libjpegturbo_turbojpeg_TJDecompressor
|
||||||
|
|||||||
138
turbojpeg-jni.c
138
turbojpeg-jni.c
@@ -32,6 +32,12 @@
|
|||||||
#include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h"
|
#include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h"
|
||||||
#include "java/org_libjpegturbo_turbojpeg_TJ.h"
|
#include "java/org_libjpegturbo_turbojpeg_TJ.h"
|
||||||
|
|
||||||
|
static const int _pixelsize[org_libjpegturbo_turbojpeg_TJ_NUMPFOPT]=
|
||||||
|
{3, 3, 4, 4, 4, 4, 1};
|
||||||
|
|
||||||
|
static const int _flags[org_libjpegturbo_turbojpeg_TJ_NUMPFOPT]=
|
||||||
|
{0, TJ_BGR, 0, TJ_BGR, TJ_BGR|TJ_ALPHAFIRST, TJ_ALPHAFIRST, 0};
|
||||||
|
|
||||||
#define _throw(msg) { \
|
#define _throw(msg) { \
|
||||||
jclass _exccls=(*env)->FindClass(env, "java/lang/Exception"); \
|
jclass _exccls=(*env)->FindClass(env, "java/lang/Exception"); \
|
||||||
if(!_exccls) goto bailout; \
|
if(!_exccls) goto bailout; \
|
||||||
@@ -88,15 +94,20 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_init
|
|||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII
|
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII
|
||||||
(JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch,
|
(JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch,
|
||||||
jint height, jint pixelsize, jbyteArray dst, jint jpegsubsamp,
|
jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint jpegqual,
|
||||||
jint jpegqual, jint flags)
|
jint flags)
|
||||||
{
|
{
|
||||||
tjhandle handle=0;
|
tjhandle handle=0; int pixelsize;
|
||||||
unsigned long size=0;
|
unsigned long size=0;
|
||||||
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
gethandle();
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in compress()");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
pixelsize=_pixelsize[pf];
|
||||||
|
|
||||||
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
@@ -114,9 +125,10 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
|
|||||||
return (jint)size;
|
return (jint)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIII_3BIII
|
JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII
|
||||||
(JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch,
|
(JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch,
|
||||||
jint height, jbyteArray dst, jint jpegsubsamp, jint jpegqual, jint flags)
|
jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint jpegqual,
|
||||||
|
jint flags)
|
||||||
{
|
{
|
||||||
tjhandle handle=0;
|
tjhandle handle=0;
|
||||||
unsigned long size=0;
|
unsigned long size=0;
|
||||||
@@ -124,6 +136,12 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
|
|||||||
|
|
||||||
gethandle();
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in compress()");
|
||||||
|
if(_pixelsize[pf]!=sizeof(jint))
|
||||||
|
_throw("Pixel format must be 32-bit when compressing from an integer buffer.");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
|
||||||
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
@@ -141,6 +159,71 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
|
|||||||
return (jint)size;
|
return (jint)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BII
|
||||||
|
(JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch,
|
||||||
|
jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint flags)
|
||||||
|
{
|
||||||
|
tjhandle handle=0; int pixelsize;
|
||||||
|
unsigned long size=0;
|
||||||
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in encodeYUV()");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
pixelsize=_pixelsize[pf];
|
||||||
|
|
||||||
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
|
if(tjEncodeYUV(handle, srcbuf, width, pitch, height, pixelsize, dstbuf,
|
||||||
|
jpegsubsamp, flags)==-1)
|
||||||
|
{
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
_throw(tjGetErrorStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
bailout:
|
||||||
|
if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BII
|
||||||
|
(JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch,
|
||||||
|
jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint flags)
|
||||||
|
{
|
||||||
|
tjhandle handle=0;
|
||||||
|
unsigned long size=0;
|
||||||
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in compress()");
|
||||||
|
if(_pixelsize[pf]!=sizeof(jint))
|
||||||
|
_throw("Pixel format must be 32-bit when encoding from an integer buffer.");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
|
||||||
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
|
if(tjEncodeYUV(handle, srcbuf, width, pitch*sizeof(jint), height,
|
||||||
|
sizeof(jint), dstbuf, jpegsubsamp, flags)==-1)
|
||||||
|
{
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
_throw(tjGetErrorStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
bailout:
|
||||||
|
if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy
|
||||||
(JNIEnv *env, jobject obj)
|
(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
@@ -228,13 +311,18 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII
|
||||||
(JNIEnv *env, jobject obj, jbyteArray src, jint size, jbyteArray dst,
|
(JNIEnv *env, jobject obj, jbyteArray src, jint size, jbyteArray dst,
|
||||||
jint width, jint pitch, jint height, jint pixelsize, jint flags)
|
jint width, jint pitch, jint height, jint pf, jint flags)
|
||||||
{
|
{
|
||||||
tjhandle handle=0;
|
tjhandle handle=0; int pixelsize;
|
||||||
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
gethandle();
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in decompress()");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
pixelsize=_pixelsize[pf];
|
||||||
|
|
||||||
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
@@ -252,15 +340,21 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIII
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII
|
||||||
(JNIEnv *env, jobject obj, jbyteArray src, jint size, jintArray dst,
|
(JNIEnv *env, jobject obj, jbyteArray src, jint size, jintArray dst,
|
||||||
jint width, jint pitch, jint height, jint flags)
|
jint width, jint pitch, jint height, jint pf, jint flags)
|
||||||
{
|
{
|
||||||
tjhandle handle=0;
|
tjhandle handle=0; int ps;
|
||||||
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
gethandle();
|
gethandle();
|
||||||
|
|
||||||
|
if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
|
||||||
|
_throw("Invalid argument in decompress()");
|
||||||
|
if(_pixelsize[pf]!=sizeof(jint))
|
||||||
|
_throw("Pixel format must be 32-bit when decompressing to an integer buffer.");
|
||||||
|
flags|=_flags[pf];
|
||||||
|
|
||||||
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
@@ -276,7 +370,31 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
|
|||||||
if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV
|
||||||
|
(JNIEnv *env, jobject obj, jbyteArray src, jint size, jbyteArray dst,
|
||||||
|
jint flags)
|
||||||
|
{
|
||||||
|
tjhandle handle=0;
|
||||||
|
unsigned char *srcbuf=NULL, *dstbuf=NULL;
|
||||||
|
|
||||||
|
gethandle();
|
||||||
|
|
||||||
|
bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
|
||||||
|
bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
|
||||||
|
|
||||||
|
if(tjDecompressToYUV(handle, srcbuf, (unsigned long)size, dstbuf, flags)==-1)
|
||||||
|
{
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
(*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
_throw(tjGetErrorStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
bailout:
|
||||||
|
if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
|
||||||
|
if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy
|
JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy
|
||||||
|
|||||||
@@ -30,12 +30,15 @@ TURBOJPEG_1.2
|
|||||||
Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV;
|
Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJCompressor_init;
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_init;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII;
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIII_3BIII;
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy;
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy;
|
||||||
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BII;
|
||||||
|
Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BII;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_init;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_init;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressHeader;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressHeader;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIII;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII;
|
||||||
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledHeight;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledHeight;
|
||||||
Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledWidth;
|
Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledWidth;
|
||||||
|
|||||||
Reference in New Issue
Block a user