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

@@ -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]);

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;
}; };

View File

@@ -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,

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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;