- | DLLEXPORT int tjDecompressHeader3 |
+ DLLEXPORT int tjDecompressHeader4 |
( |
tjhandle |
handle, |
@@ -1785,7 +1785,13 @@ If you choose option 1, *jpegSize should be set to the size of your
|
|
int * |
- jpegColorspace |
+ jpegColorspace, |
+
+
+ |
+ |
+ int * |
+ jpegFlags |
|
@@ -1805,6 +1811,7 @@ If you choose option 1, *jpegSize should be set to the size of your
| height | pointer to an integer variable that will receive the height (in pixels) of the JPEG image. If jpegBuf points to a tables-only datastream, then height is ignored. |
| jpegSubsamp | pointer to an integer variable that will receive the level of chrominance subsampling used when the JPEG image was compressed (see Chrominance subsampling options.) If jpegBuf points to a tables-only datastream, then jpegSubsamp is ignored. |
| jpegColorspace | pointer to an integer variable that will receive one of the JPEG colorspace constants, indicating the colorspace of the JPEG image (see JPEG colorspaces.) If jpegBuf points to a tables-only datastream, then jpegColorspace is ignored. |
+ | jpegFlags | pointer to an integer variable that will receive the bitwise OR of one or more of the flags, such as TJFLAG_PROGRESSIVE and TJFLAG_LOSSLESS, that describe the JPEG image. If jpegBuf points to a tables-only datastream, then jpegFlags is ignored. |
diff --git a/doc/html/index.html b/doc/html/index.html
index a6f272a3..8d06e0bc 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -23,7 +23,7 @@
|
TurboJPEG
- 2.1.4
+ 2.2
|
diff --git a/doc/html/modules.html b/doc/html/modules.html
index d48980a4..f0d4eb56 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -23,7 +23,7 @@
|
TurboJPEG
- 2.1.4
+ 2.2
|
diff --git a/doc/html/search/all_6.js b/doc/html/search/all_6.js
index 2ac83e75..76dc418b 100644
--- a/doc/html/search/all_6.js
+++ b/doc/html/search/all_6.js
@@ -22,7 +22,7 @@ var searchData=
['tjdecodeyuv_27',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga70abbf38f77a26fd6da8813bef96f695',1,'turbojpeg.h']]],
['tjdecodeyuvplanes_28',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga10e837c07fa9d25770565b237d3898d9',1,'turbojpeg.h']]],
['tjdecompress2_29',['tjDecompress2',['../group___turbo_j_p_e_g.html#gae9eccef8b682a48f43a9117c231ed013',1,'turbojpeg.h']]],
- ['tjdecompressheader3_30',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga0595681096bba7199cc6f3533cb25f77',1,'turbojpeg.h']]],
+ ['tjdecompressheader4_30',['tjDecompressHeader4',['../group___turbo_j_p_e_g.html#gac104e6e729f57f195009405949d198dc',1,'turbojpeg.h']]],
['tjdecompresstoyuv2_31',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga04d1e839ff9a0860dd1475cff78d3364',1,'turbojpeg.h']]],
['tjdecompresstoyuvplanes_32',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#gaa59f901a5258ada5bd0185ad59368540',1,'turbojpeg.h']]],
['tjdestroy_33',['tjDestroy',['../group___turbo_j_p_e_g.html#ga75f355fa27225ba1a4ee392c852394d2',1,'turbojpeg.h']]],
@@ -84,7 +84,7 @@ var searchData=
['tjsaveimage_89',['tjSaveImage',['../group___turbo_j_p_e_g.html#ga6f445b22d8933ae4815b3370a538d879',1,'turbojpeg.h']]],
['tjscaled_90',['TJSCALED',['../group___turbo_j_p_e_g.html#ga84878bb65404204743aa18cac02781df',1,'turbojpeg.h']]],
['tjscalingfactor_91',['tjscalingfactor',['../structtjscalingfactor.html',1,'']]],
- ['tjtransform_92',['tjtransform',['../structtjtransform.html',1,'tjtransform'],['../group___turbo_j_p_e_g.html#ga9cb8abf4cc91881e04a0329b2270be25',1,'tjTransform(tjhandle handle, const unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags): turbojpeg.h'],['../group___turbo_j_p_e_g.html#ga504805ec0161f1b505397ca0118bf8fd',1,'tjtransform(): turbojpeg.h']]],
+ ['tjtransform_92',['tjtransform',['../structtjtransform.html',1,'tjtransform'],['../group___turbo_j_p_e_g.html#ga504805ec0161f1b505397ca0118bf8fd',1,'tjtransform(): turbojpeg.h'],['../group___turbo_j_p_e_g.html#ga9cb8abf4cc91881e04a0329b2270be25',1,'tjTransform(tjhandle handle, const unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags): turbojpeg.h']]],
['tjxop_93',['TJXOP',['../group___turbo_j_p_e_g.html#ga2de531af4e7e6c4f124908376b354866',1,'turbojpeg.h']]],
['tjxop_5fhflip_94',['TJXOP_HFLIP',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aa0df69776caa30f0fa28e26332d311ce',1,'turbojpeg.h']]],
['tjxop_5fnone_95',['TJXOP_NONE',['../group___turbo_j_p_e_g.html#gga2de531af4e7e6c4f124908376b354866aad88c0366cd3f7d0eac9d7a3fa1c2c27',1,'turbojpeg.h']]],
diff --git a/doc/html/search/functions_0.js b/doc/html/search/functions_0.js
index 44071600..e752acb3 100644
--- a/doc/html/search/functions_0.js
+++ b/doc/html/search/functions_0.js
@@ -9,7 +9,7 @@ var searchData=
['tjdecodeyuv_123',['tjDecodeYUV',['../group___turbo_j_p_e_g.html#ga70abbf38f77a26fd6da8813bef96f695',1,'turbojpeg.h']]],
['tjdecodeyuvplanes_124',['tjDecodeYUVPlanes',['../group___turbo_j_p_e_g.html#ga10e837c07fa9d25770565b237d3898d9',1,'turbojpeg.h']]],
['tjdecompress2_125',['tjDecompress2',['../group___turbo_j_p_e_g.html#gae9eccef8b682a48f43a9117c231ed013',1,'turbojpeg.h']]],
- ['tjdecompressheader3_126',['tjDecompressHeader3',['../group___turbo_j_p_e_g.html#ga0595681096bba7199cc6f3533cb25f77',1,'turbojpeg.h']]],
+ ['tjdecompressheader4_126',['tjDecompressHeader4',['../group___turbo_j_p_e_g.html#gac104e6e729f57f195009405949d198dc',1,'turbojpeg.h']]],
['tjdecompresstoyuv2_127',['tjDecompressToYUV2',['../group___turbo_j_p_e_g.html#ga04d1e839ff9a0860dd1475cff78d3364',1,'turbojpeg.h']]],
['tjdecompresstoyuvplanes_128',['tjDecompressToYUVPlanes',['../group___turbo_j_p_e_g.html#gaa59f901a5258ada5bd0185ad59368540',1,'turbojpeg.h']]],
['tjdestroy_129',['tjDestroy',['../group___turbo_j_p_e_g.html#ga75f355fa27225ba1a4ee392c852394d2',1,'turbojpeg.h']]],
diff --git a/doc/html/structtjregion.html b/doc/html/structtjregion.html
index 72d49d27..fc398900 100644
--- a/doc/html/structtjregion.html
+++ b/doc/html/structtjregion.html
@@ -23,7 +23,7 @@
|
TurboJPEG
- 2.1.4
+ 2.2
|
diff --git a/doc/html/structtjscalingfactor.html b/doc/html/structtjscalingfactor.html
index 1606a02c..6b8b1ffd 100644
--- a/doc/html/structtjscalingfactor.html
+++ b/doc/html/structtjscalingfactor.html
@@ -23,7 +23,7 @@
|
TurboJPEG
- 2.1.4
+ 2.2
|
diff --git a/doc/html/structtjtransform.html b/doc/html/structtjtransform.html
index ba78980e..c8f10a52 100644
--- a/doc/html/structtjtransform.html
+++ b/doc/html/structtjtransform.html
@@ -23,7 +23,7 @@
|
TurboJPEG
- 2.1.4
+ 2.2
|
diff --git a/doxygen.config b/doxygen.config
index 16708b03..b051aa4c 100644
--- a/doxygen.config
+++ b/doxygen.config
@@ -1,5 +1,5 @@
PROJECT_NAME = TurboJPEG
-PROJECT_NUMBER = 2.1.4
+PROJECT_NUMBER = 2.2
OUTPUT_DIRECTORY = doc/
USE_WINDOWS_ENCODING = NO
OPTIMIZE_OUTPUT_FOR_C = YES
diff --git a/fuzz/decompress.cc b/fuzz/decompress.cc
index c7fcb500..b6604224 100644
--- a/fuzz/decompress.cc
+++ b/fuzz/decompress.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (C)2021 D. R. Commander. All Rights Reserved.
+ * Copyright (C)2021-2022 D. R. Commander. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -38,7 +38,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
tjhandle handle = NULL;
unsigned char *dstBuf = NULL;
- int width = 0, height = 0, jpegSubsamp, jpegColorspace, pfi;
+ int width = 0, height = 0, jpegSubsamp, jpegColorspace, jpegFlags, pfi;
/* TJPF_RGB-TJPF_BGR share the same code paths, as do TJPF_RGBX-TJPF_XRGB and
TJPF_RGBA-TJPF_ARGB. Thus, the pixel formats below should be the minimum
necessary to achieve full coverage. */
@@ -58,8 +58,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
/* We ignore the return value of tjDecompressHeader3(), because some JPEG
images may have unusual subsampling configurations that the TurboJPEG API
cannot identify but can still decompress. */
- tjDecompressHeader3(handle, data, size, &width, &height, &jpegSubsamp,
- &jpegColorspace);
+ tjDecompressHeader4(handle, data, size, &width, &height, &jpegSubsamp,
+ &jpegColorspace, &jpegFlags);
/* Ignore 0-pixel images and images larger than 1 Megapixel, as Google's
OSS-Fuzz target for libjpeg-turbo did. Casting width to (uint64_t)
@@ -75,7 +75,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (pfi == 0)
flags |= TJFLAG_BOTTOMUP | TJFLAG_FASTUPSAMPLE | TJFLAG_FASTDCT;
/* Test IDCT scaling on the second iteration. */
- else if (pfi == 1) {
+ else if (pfi == 1 && !(jpegFlags & TJFLAG_LOSSLESS)) {
w = (width + 1) / 2;
h = (height + 1) / 2;
}
diff --git a/fuzz/decompress_yuv.cc b/fuzz/decompress_yuv.cc
index d603fd81..4b2c89de 100644
--- a/fuzz/decompress_yuv.cc
+++ b/fuzz/decompress_yuv.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (C)2021 D. R. Commander. All Rights Reserved.
+ * Copyright (C)2021-2022 D. R. Commander. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -38,7 +38,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
tjhandle handle = NULL;
unsigned char *dstBuf = NULL, *yuvBuf = NULL;
- int width = 0, height = 0, jpegSubsamp, jpegColorspace, pfi;
+ int width = 0, height = 0, jpegSubsamp, jpegColorspace, jpegFlags, pfi;
/* TJPF_RGB-TJPF_BGR share the same code paths, as do TJPF_RGBX-TJPF_XRGB and
TJPF_RGBA-TJPF_ARGB. Thus, the pixel formats below should be the minimum
necessary to achieve full coverage. */
@@ -55,8 +55,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if ((handle = tjInitDecompress()) == NULL)
goto bailout;
- if (tjDecompressHeader3(handle, data, size, &width, &height, &jpegSubsamp,
- &jpegColorspace) < 0)
+ if (tjDecompressHeader4(handle, data, size, &width, &height, &jpegSubsamp,
+ &jpegColorspace, &jpegFlags) < 0)
goto bailout;
/* Ignore 0-pixel images and images larger than 1 Megapixel. Casting width
@@ -72,7 +72,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (pfi == 0)
flags |= TJFLAG_BOTTOMUP | TJFLAG_FASTUPSAMPLE | TJFLAG_FASTDCT;
/* Test IDCT scaling on the second iteration. */
- else if (pfi == 1) {
+ else if (pfi == 1 && !(jpegFlags & TJFLAG_LOSSLESS)) {
w = (width + 3) / 4;
h = (height + 3) / 4;
}
diff --git a/java/TJBench.java b/java/TJBench.java
index 4084ea54..0cc0f886 100644
--- a/java/TJBench.java
+++ b/java/TJBench.java
@@ -168,11 +168,16 @@ final class TJBench {
TJDecompressor tjd;
double elapsed, elapsedDecode;
int ps = TJ.getPixelSize(pf), i, iter = 0;
- int scaledw = sf.getScaled(w);
- int scaledh = sf.getScaled(h);
- int pitch = scaledw * ps;
+ int scaledw, scaledh, pitch;
YUVImage yuvImage = null;
+ if ((flags & TJ.FLAG_LOSSLESS) != 0)
+ sf = new TJScalingFactor(1, 1);
+
+ scaledw = sf.getScaled(w);
+ scaledh = sf.getScaled(h);
+ pitch = scaledw * ps;
+
if (jpegQual > 0)
qualStr = new String("_Q" + jpegQual);
@@ -498,7 +503,7 @@ final class TJBench {
// Original image
int w = 0, h = 0, ntilesw = 1, ntilesh = 1, subsamp = -1, cs = -1;
// Transformed image
- int tw, th, ttilew, ttileh, tntilesw, tntilesh, tsubsamp;
+ int tw, th, ttilew, ttileh, tntilesw, tntilesh, tsubsamp, jpegFlags;
FileInputStream fis = new FileInputStream(fileName);
if (fis.getChannel().size() > (long)Integer.MAX_VALUE)
@@ -521,6 +526,10 @@ final class TJBench {
h = tjt.getHeight();
subsamp = tjt.getSubsamp();
cs = tjt.getColorspace();
+ jpegFlags = tjt.getFlags();
+
+ if ((jpegFlags & TJ.FLAG_LOSSLESS) != 0)
+ sf = new TJScalingFactor(1, 1);
if (quiet == 1) {
System.out.println("All performance values in Mpixels/sec\n");
diff --git a/java/TJExample.java b/java/TJExample.java
index 78598869..9e6edd25 100644
--- a/java/TJExample.java
+++ b/java/TJExample.java
@@ -1,6 +1,6 @@
/*
- * Copyright (C)2011-2012, 2014-2015, 2017-2018 D. R. Commander.
- * All Rights Reserved.
+ * Copyright (C)2011-2012, 2014-2015, 2017-2018, 2022 D. R. Commander.
+ * All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -304,6 +304,10 @@ class TJExample implements TJCustomFilter {
height = tjd.getHeight();
int inSubsamp = tjd.getSubsamp();
int inColorspace = tjd.getColorspace();
+ int inFlags = tjd.getFlags();
+
+ if ((inFlags & TJ.FLAG_LOSSLESS) != 0)
+ scalingFactor = new TJScalingFactor(1, 1);
System.out.println((doTransform ? "Transformed" : "Input") +
" Image (jpg): " + width + " x " + height +
diff --git a/java/doc/index-all.html b/java/doc/index-all.html
index eddddc92..54f5807f 100644
--- a/java/doc/index-all.html
+++ b/java/doc/index-all.html
@@ -316,6 +316,13 @@
Returns a code (one of
TJ.ERR_*) indicating the severity of the
last error.
+
getFlags() - Method in class org.libjpegturbo.turbojpeg.TJDecompressor
+
+
+
getGreenOffset(int) - Static method in class org.libjpegturbo.turbojpeg.TJ
For the given pixel format, returns the number of bytes that the green
@@ -462,6 +469,8 @@
jpegColorspace - Variable in class org.libjpegturbo.turbojpeg.TJDecompressor
+
jpegFlags - Variable in class org.libjpegturbo.turbojpeg.TJDecompressor
+
jpegHeight - Variable in class org.libjpegturbo.turbojpeg.TJDecompressor
jpegSubsamp - Variable in class org.libjpegturbo.turbojpeg.TJDecompressor
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html b/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html
index 0a0d100c..c27a8abf 100644
--- a/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html
+++ b/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html
@@ -144,17 +144,21 @@ implements java.io.Closeable
protected int |
-jpegHeight |
+jpegFlags |
protected int |
-jpegSubsamp |
+jpegHeight |
protected int |
-jpegWidth |
+jpegSubsamp |
+protected int |
+jpegWidth |
+
+
protected YUVImage |
yuvImage |
@@ -324,25 +328,34 @@ implements java.io.Closeable
int |
+getFlags()
+
+ |
+
+
+int |
getHeight()
Returns the height of the source image (JPEG or YUV) associated with this
decompressor instance.
|
-
+
byte[] |
getJPEGBuf()
Returns the JPEG image buffer associated with this decompressor instance.
|
-
+
int |
getJPEGSize()
Returns the size of the JPEG image (in bytes) associated with this
decompressor instance.
|
-
+
int |
getScaledHeight(int desiredWidth,
int desiredHeight)
@@ -351,7 +364,7 @@ implements java.io.Closeable
height.
|
-
+
int |
getScaledWidth(int desiredWidth,
int desiredHeight)
@@ -360,21 +373,21 @@ implements java.io.Closeable
height.
|
-
+
int |
getSubsamp()
Returns the level of chrominance subsampling used in the source image
(JPEG or YUV) associated with this decompressor instance.
|
-
+
int |
getWidth()
Returns the width of the source image (JPEG or YUV) associated with this
decompressor instance.
|
-
+
void |
setSourceImage(byte[] jpegImage,
int imageSize)
@@ -383,7 +396,7 @@ implements java.io.Closeable
jpegImage with this decompressor instance.
|
-
+
void |
setSourceImage(YUVImage srcImage)
Associate the specified YUV planar source image with this decompressor
@@ -478,12 +491,21 @@ implements java.io.Closeable
-
+
+
+
+
+
+-
+
jpegFlags
+protected int jpegFlags
+
+
@@ -657,6 +679,21 @@ implements java.io.Closeable
with this decompressor instance.
+
+
+
+
+-
+
getFlags
+public int getFlags()
+
+- Returns:
- the bitwise OR of one or more of the
+
flags that describe the JPEG image.
+
+
diff --git a/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html b/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html
index 8bad93f5..69923f33 100644
--- a/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html
+++ b/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html
@@ -125,7 +125,7 @@ extends
Fields inherited from class org.libjpegturbo.turbojpeg.TJDecompressor
- handle, jpegBuf, jpegBufSize, jpegColorspace, jpegHeight, jpegSubsamp, jpegWidth, yuvImage
+ handle, jpegBuf, jpegBufSize, jpegColorspace, jpegFlags, jpegHeight, jpegSubsamp, jpegWidth, yuvImage
@@ -206,7 +206,7 @@ extends
Methods inherited from class org.libjpegturbo.turbojpeg.TJDecompressor
- close, decompress, decompress, decompress, decompress, decompress, decompressToYUV, decompressToYUV, decompressToYUV, finalize, getColorspace, getHeight, getJPEGBuf, getJPEGSize, getScaledHeight, getScaledWidth, getSubsamp, getWidth, setSourceImage, setSourceImage
+ close, decompress, decompress, decompress, decompress, decompress, decompressToYUV, decompressToYUV, decompressToYUV, finalize, getColorspace, getFlags, getHeight, getJPEGBuf, getJPEGSize, getScaledHeight, getScaledWidth, getSubsamp, getWidth, setSourceImage, setSourceImage
-
diff --git a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java
index afeb051b..c115d47e 100644
--- a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java
+++ b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java
@@ -199,6 +199,21 @@ public class TJDecompressor implements Closeable {
return jpegColorspace;
}
+ /**
+ * Returns the bitwise OR of one or more of the
+ * {@link TJ#FLAG_BOTTOMUP flags}, such as
+ * {@link TJ#FLAG_PROGRESSIVE TJ.FLAG_PROGRESSIVE} and
+ * {@link TJ#FLAG_LOSSLESS TJ.FLAG_LOSSLESS}, that describe the JPEG image.
+ *
+ * @return the bitwise OR of one or more of the
+ * {@link TJ#FLAG_BOTTOMUP flags} that describe the JPEG image.
+ */
+ public int getFlags() {
+ if (jpegFlags < 0)
+ throw new IllegalStateException(NO_ASSOC_ERROR);
+ return jpegFlags;
+ }
+
/**
* Returns the JPEG image buffer associated with this decompressor instance.
*
@@ -873,5 +888,6 @@ public class TJDecompressor implements Closeable {
protected int jpegHeight = 0;
protected int jpegSubsamp = -1;
protected int jpegColorspace = -1;
+ protected int jpegFlags = -1;
private ByteOrder byteOrder = null;
}
diff --git a/tjbench.c b/tjbench.c
index b26c8f2f..cfda0dc0 100644
--- a/tjbench.c
+++ b/tjbench.c
@@ -153,12 +153,17 @@ static int decomp(unsigned char *srcBuf, unsigned char **jpegBuf,
int row, col, iter = 0, dstBufAlloc = 0, retval = 0;
double elapsed, elapsedDecode;
int ps = tjPixelSize[pf];
- int scaledw = TJSCALED(w, sf);
- int scaledh = TJSCALED(h, sf);
- int pitch = scaledw * ps;
+ int scaledw, scaledh, pitch;
int ntilesw = (w + tilew - 1) / tilew, ntilesh = (h + tileh - 1) / tileh;
unsigned char *dstPtr, *dstPtr2, *yuvBuf = NULL;
+ if (flags & TJFLAG_LOSSLESS)
+ sf.num = sf.denom = 1;
+
+ scaledw = TJSCALED(w, sf);
+ scaledh = TJSCALED(h, sf);
+ pitch = scaledw * ps;
+
if (jpegQual > 0) {
SNPRINTF(qualStr, 13, "_Q%d", jpegQual);
qualStr[12] = 0;
@@ -537,7 +542,7 @@ static int decompTest(char *fileName)
int w = 0, h = 0, tilew, tileh, ntilesw = 1, ntilesh = 1, subsamp = -1,
cs = -1;
/* Transformed image */
- int tw, th, ttilew, ttileh, tntilesw, tntilesh, tsubsamp;
+ int tw, th, ttilew, ttileh, tntilesw, tntilesh, tsubsamp, jpegFlags;
if ((file = fopen(fileName, "rb")) == NULL)
THROW_UNIX("opening file");
@@ -557,14 +562,16 @@ static int decompTest(char *fileName)
if ((handle = tjInitTransform()) == NULL)
THROW_TJ("executing tjInitTransform()");
- if (tjDecompressHeader3(handle, srcBuf, srcSize, &w, &h, &subsamp,
- &cs) == -1)
- THROW_TJ("executing tjDecompressHeader3()");
+ if (tjDecompressHeader4(handle, srcBuf, srcSize, &w, &h, &subsamp, &cs,
+ &jpegFlags) == -1)
+ THROW_TJ("executing tjDecompressHeader4()");
if (w < 1 || h < 1)
THROW("reading JPEG header", "Invalid image dimensions");
if (cs == TJCS_YCCK || cs == TJCS_CMYK) {
pf = TJPF_CMYK; ps = tjPixelSize[pf];
}
+ if (jpegFlags & TJFLAG_LOSSLESS)
+ sf.num = sf.denom = 1;
if (quiet == 1) {
printf("All performance values in Mpixels/sec\n\n");
diff --git a/tjbenchtest.in b/tjbenchtest.in
index d8aa208a..9b847cd0 100755
--- a/tjbenchtest.in
+++ b/tjbenchtest.in
@@ -31,6 +31,12 @@ ALLOC=0
ALLOCARG=
PROGARG=
ARIARG=
+LOSSLSARG=
+LOSSLSPSV=
+TJQUAL=95
+h1SUBSAMP="GRAY 444"
+h2SUBSAMP="420 422"
+ALLSUBSAMP="GRAY 420 422 444"
if [ "$EXT" = "bmp" ]; then BMPARG=-bmp; fi
if [ -d $OUTDIR ]; then
@@ -72,31 +78,39 @@ while [ $# -gt 0 ]; do
-arithmetic)
ARIARG=-arithmetic
;;
+ -lossless)
+ LOSSLSARG="-lossless"
+ LOSSLSPSV=4
+ TJQUAL=40
+ h1SUBSAMP=444
+ h2SUBSAMP=444
+ ALLSUBSAMP=444
+ ;;
esac
shift
done
-exec >$EXEDIR/tjbenchtest$YUVARG$ALLOCARG$PROGARG$ARIARG.log
+exec >$EXEDIR/tjbenchtest$YUVARG$ALLOCARG$PROGARG$ARIARG$LOSSLSARG.log
# Standard tests
for image in $IMAGES; do
cp $IMGDIR/$image $OUTDIR
basename=`basename $image .${EXT}`
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -grayscale -outfile $OUTDIR/${basename}_GRAY_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 2x2 -outfile $OUTDIR/${basename}_420_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 2x1 -outfile $OUTDIR/${basename}_422_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 1x1 -outfile $OUTDIR/${basename}_444_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -grayscale -outfile $OUTDIR/${basename}_GRAY_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 2x2 -outfile $OUTDIR/${basename}_420_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 2x1 -outfile $OUTDIR/${basename}_422_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 1x1 -outfile $OUTDIR/${basename}_444_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
- for samp in GRAY 420 422 444; do
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -grayscale -outfile $OUTDIR/${basename}_GRAY_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x2 -outfile $OUTDIR/${basename}_420_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x1 -outfile $OUTDIR/${basename}_422_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 1x1 -outfile $OUTDIR/${basename}_444_fast_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -grayscale -outfile $OUTDIR/${basename}_GRAY_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x2 -outfile $OUTDIR/${basename}_420_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x1 -outfile $OUTDIR/${basename}_422_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 1x1 -outfile $OUTDIR/${basename}_444_accurate_cjpeg.jpg $IMGDIR/${basename}.${EXT}
+ for samp in $ALLSUBSAMP; do
runme $EXEDIR/djpeg -rgb $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_default_djpeg.${EXT} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct fast -rgb $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_fast_djpeg.${EXT} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct int -rgb $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_accurate_djpeg.${EXT} $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg
done
- for samp in 420 422; do
+ for samp in $h2SUBSAMP; do
runme $EXEDIR/djpeg -nosmooth $BMPARG -outfile $OUTDIR/${basename}_${samp}_default_nosmooth_djpeg.${EXT} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct fast -nosmooth $BMPARG -outfile $OUTDIR/${basename}_${samp}_fast_nosmooth_djpeg.${EXT} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct int -nosmooth $BMPARG -outfile $OUTDIR/${basename}_${samp}_accurate_nosmooth_djpeg.${EXT} $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg
@@ -104,9 +118,9 @@ for image in $IMAGES; do
# Compression
for dct in accurate fast; do
- runme $EXEDIR/tjbench $OUTDIR/$image 95 -rgb -quiet -benchtime 0.01 -warmup 0 -${dct}dct $YUVARG $ALLOCARG $PROGARG $ARIARG
- for samp in GRAY 420 422 444; do
- runme cmp $OUTDIR/${basename}_${samp}_Q95.jpg $OUTDIR/${basename}_${samp}_${dct}_cjpeg.jpg
+ runme $EXEDIR/tjbench $OUTDIR/$image $TJQUAL -rgb -quiet -benchtime 0.01 -warmup 0 -${dct}dct $YUVARG $ALLOCARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $ALLSUBSAMP; do
+ runme cmp $OUTDIR/${basename}_${samp}_Q${TJQUAL}.jpg $OUTDIR/${basename}_${samp}_${dct}_cjpeg.jpg
done
done
@@ -117,27 +131,27 @@ for image in $IMAGES; do
fi
# Tiled compression & decompression
- runme $EXEDIR/tjbench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
- for samp in GRAY 444; do
+ runme $EXEDIR/tjbench $OUTDIR/$image $TJQUAL -rgb -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $h1SUBSAMP; do
if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ runme cmp $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT}
else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ for i in $OUTDIR/${basename}_${samp}_Q${TJQUAL}_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT}; do
runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
rm $i
done
fi
done
- runme $EXEDIR/tjbench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
- for samp in 420 422; do
+ runme $EXEDIR/tjbench $OUTDIR/$image $TJQUAL -rgb -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $h2SUBSAMP; do
if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ runme cmp $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT}
else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ for i in $OUTDIR/${basename}_${samp}_Q${TJQUAL}_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.${EXT}; do
runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
rm $i
done
@@ -145,115 +159,123 @@ for image in $IMAGES; do
done
# Tiled decompression
- for samp in GRAY 444; do
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
- if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
- else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
- runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
- rm $i
- done
- fi
- done
- for samp in 420 422; do
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
- if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
- else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
- runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
- rm $i
- done
- fi
- done
+ if [ "$LOSSLSARG" != "-lossless" ]; then
+ for samp in GRAY 444; do
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
+ if [ $ALLOC = 1 ]; then
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ else
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.${EXT}
+ rm $i
+ done
+ fi
+ done
+ for samp in 420 422; do
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $ALLOCARG $PROGARG $ARIARG
+ if [ $ALLOC = 1 ]; then
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ else
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ runme cmp $i $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.${EXT}
+ rm $i
+ done
+ fi
+ done
+ fi
done
# Scaled decompression
for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
scalearg=`echo $scale | sed 's/\_/\//g'`
- for samp in GRAY 420 422 444; do
+ SCALE=$scale
+ if [ "$LOSSLSARG" = "-lossless" ]; then
+ SCALE=full
+ fi
+ for samp in $ALLSUBSAMP; do
runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_${scale}_djpeg.${EXT} $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG
- runme cmp $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${scale}_djpeg.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT}
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q${TJQUAL}.jpg $BMPARG -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG $LOSSLSARG
+ runme cmp $OUTDIR/${basename}_${samp}_Q${TJQUAL}_${SCALE}.${EXT} $OUTDIR/${basename}_${samp}_${scale}_djpeg.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q${TJQUAL}_${SCALE}.${EXT}
done
done
# Transforms
- for samp in GRAY 420 422 444; do
- runme $EXEDIR/jpegtran -flip horizontal -trim -outfile $OUTDIR/${basename}_${samp}_hflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -flip vertical -trim -outfile $OUTDIR/${basename}_${samp}_vflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -transpose -trim -outfile $OUTDIR/${basename}_${samp}_transpose_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -transverse -trim -outfile $OUTDIR/${basename}_${samp}_transverse_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 90 -trim -outfile $OUTDIR/${basename}_${samp}_rot90_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 180 -trim -outfile $OUTDIR/${basename}_${samp}_rot180_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 270 -trim -outfile $OUTDIR/${basename}_${samp}_rot270_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- done
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444; do
- runme $EXEDIR/djpeg -rgb $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG
- if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
- else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
- runme cmp $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
- rm $i
- done
- fi
+ if [ "$LOSSLSARG" != "-lossless" ]; then
+ for samp in GRAY 420 422 444; do
+ runme $EXEDIR/jpegtran -flip horizontal -trim -outfile $OUTDIR/${basename}_${samp}_hflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -flip vertical -trim -outfile $OUTDIR/${basename}_${samp}_vflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -transpose -trim -outfile $OUTDIR/${basename}_${samp}_transpose_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -transverse -trim -outfile $OUTDIR/${basename}_${samp}_transverse_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 90 -trim -outfile $OUTDIR/${basename}_${samp}_rot90_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 180 -trim -outfile $OUTDIR/${basename}_${samp}_rot180_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 270 -trim -outfile $OUTDIR/${basename}_${samp}_rot270_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
done
- for samp in 420 422; do
- runme $EXEDIR/djpeg -nosmooth -rgb $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample $YUVARG $ALLOCARG $PROGARG $ARIARG
- if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
- else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
- runme cmp $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
- rm $i
- done
- fi
- done
- done
-
- # Grayscale transform
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444 422 420; do
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 -grayscale $YUVARG $ALLOCARG $PROGARG $ARIARG
- if [ $ALLOC = 1 ]; then
- runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_GRAY_${xform}_jpegtran.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
- else
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
- $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
- runme cmp $i $OUTDIR/${basename}_GRAY_${xform}_jpegtran.${EXT}
- rm $i
- done
- fi
- done
- done
-
- # Transforms with scaling
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444 422 420; do
- for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
- scalearg=`echo $scale | sed 's/\_/\//g'`
- runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG
- runme cmp $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT}
- rm $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT}
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444; do
+ runme $EXEDIR/djpeg -rgb $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG
+ if [ $ALLOC = 1 ]; then
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ else
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ runme cmp $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
+ rm $i
+ done
+ fi
+ done
+ for samp in 420 422; do
+ runme $EXEDIR/djpeg -nosmooth -rgb $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample $YUVARG $ALLOCARG $PROGARG $ARIARG
+ if [ $ALLOC = 1 ]; then
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ else
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ runme cmp $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.${EXT}
+ rm $i
+ done
+ fi
done
done
- done
+
+ # Grayscale transform
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444 422 420; do
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -tile -quiet -benchtime 0.01 -warmup 0 -grayscale $YUVARG $ALLOCARG $PROGARG $ARIARG
+ if [ $ALLOC = 1 ]; then
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_full.${EXT} $OUTDIR/${basename}_GRAY_${xform}_jpegtran.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_full.${EXT}
+ else
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].${EXT} \
+ $OUTDIR/${basename}_${samp}_Q95_full.${EXT}; do
+ runme cmp $i $OUTDIR/${basename}_GRAY_${xform}_jpegtran.${EXT}
+ rm $i
+ done
+ fi
+ done
+ done
+
+ # Transforms with scaling
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444 422 420; do
+ for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
+ scalearg=`echo $scale | sed 's/\_/\//g'`
+ runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG $BMPARG -outfile $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT} $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme $EXEDIR/tjbench $OUTDIR/${basename}_${samp}_Q95.jpg $BMPARG -$xform -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $ALLOCARG $PROGARG $ARIARG
+ runme cmp $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT} $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.${EXT}
+ rm $OUTDIR/${basename}_${samp}_Q95_${scale}.${EXT}
+ done
+ done
+ done
+ fi
done
diff --git a/tjbenchtest.java.in b/tjbenchtest.java.in
index a392b373..f99c5ce7 100755
--- a/tjbenchtest.java.in
+++ b/tjbenchtest.java.in
@@ -30,6 +30,12 @@ NSARG=
YUVARG=
PROGARG=
ARIARG=
+LOSSLSARG=
+LOSSLSPSV=
+TJQUAL=95
+h1SUBSAMP="GRAY 444"
+h2SUBSAMP="420 422"
+ALLSUBSAMP="GRAY 420 422 444"
if [ -d $OUTDIR ]; then
rm -rf $OUTDIR
@@ -66,31 +72,39 @@ while [ $# -gt 0 ]; do
-arithmetic)
ARIARG=-arithmetic
;;
+ -lossless)
+ LOSSLSARG="-lossless"
+ LOSSLSPSV=4
+ TJQUAL=40
+ h1SUBSAMP=444
+ h2SUBSAMP=444
+ ALLSUBSAMP=444
+ ;;
esac
shift
done
-exec >$EXEDIR/tjbenchtest-java$YUVARG$PROGARG$ARIARG.log
+exec >$EXEDIR/tjbenchtest-java$YUVARG$PROGARG$ARIARG$LOSSLSARG.log
# Standard tests
for image in $IMAGES; do
cp $IMGDIR/$image $OUTDIR
basename=`basename $image .bmp`
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -grayscale -outfile $OUTDIR/${basename}_GRAY_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 2x2 -outfile $OUTDIR/${basename}_420_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 2x1 -outfile $OUTDIR/${basename}_422_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG -sample 1x1 -outfile $OUTDIR/${basename}_444_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -grayscale -outfile $OUTDIR/${basename}_GRAY_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 2x2 -outfile $OUTDIR/${basename}_420_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 2x1 -outfile $OUTDIR/${basename}_422_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
- runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG -sample 1x1 -outfile $OUTDIR/${basename}_444_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
- for samp in GRAY 420 422 444; do
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -grayscale -outfile $OUTDIR/${basename}_GRAY_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x2 -outfile $OUTDIR/${basename}_420_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x1 -outfile $OUTDIR/${basename}_422_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct fast $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 1x1 -outfile $OUTDIR/${basename}_444_fast_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -grayscale -outfile $OUTDIR/${basename}_GRAY_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x2 -outfile $OUTDIR/${basename}_420_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 2x1 -outfile $OUTDIR/${basename}_422_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
+ runme $EXEDIR/cjpeg -quality 95 -dct int $PROGARG $ARIARG $LOSSLSARG $LOSSLSPSV -sample 1x1 -outfile $OUTDIR/${basename}_444_accurate_cjpeg.jpg $IMGDIR/${basename}.bmp
+ for samp in $ALLSUBSAMP; do
runme $EXEDIR/djpeg -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_default_djpeg.bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct fast -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_fast_djpeg.bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct int -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_accurate_djpeg.bmp $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg
done
- for samp in 420 422; do
+ for samp in $h2SUBSAMP; do
runme $EXEDIR/djpeg -nosmooth -bmp -outfile $OUTDIR/${basename}_${samp}_default_nosmooth_djpeg.bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct fast -nosmooth -bmp -outfile $OUTDIR/${basename}_${samp}_fast_nosmooth_djpeg.bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
runme $EXEDIR/djpeg -dct int -nosmooth -bmp -outfile $OUTDIR/${basename}_${samp}_accurate_nosmooth_djpeg.bmp $OUTDIR/${basename}_${samp}_accurate_cjpeg.jpg
@@ -98,9 +112,9 @@ for image in $IMAGES; do
# Compression
for dct in accurate fast; do
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image 95 -rgb -quiet -benchtime 0.01 -warmup 0 -${dct}dct $YUVARG $PROGARG $ARIARG
- for samp in GRAY 420 422 444; do
- runme cmp $OUTDIR/${basename}_${samp}_Q95.jpg $OUTDIR/${basename}_${samp}_${dct}_cjpeg.jpg
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image $TJQUAL -rgb -quiet -benchtime 0.01 -warmup 0 -${dct}dct $YUVARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $ALLSUBSAMP; do
+ runme cmp $OUTDIR/${basename}_${samp}_Q${TJQUAL}.jpg $OUTDIR/${basename}_${samp}_${dct}_cjpeg.jpg
done
done
@@ -111,108 +125,116 @@ for image in $IMAGES; do
fi
# Tiled compression & decompression
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $PROGARG $ARIARG
- for samp in GRAY 444; do
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image $TJQUAL -rgb -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $h1SUBSAMP; do
+ for i in $OUTDIR/${basename}_${samp}_Q${TJQUAL}_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.bmp; do
runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.bmp
rm $i
done
done
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image 95 -rgb -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $PROGARG $ARIARG
- for samp in 420 422; do
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/$image $TJQUAL -rgb -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $PROGARG $ARIARG $LOSSLSARG
+ for samp in $h2SUBSAMP; do
+ for i in $OUTDIR/${basename}_${samp}_Q${TJQUAL}_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q${TJQUAL}_full.bmp; do
runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.bmp
rm $i
done
done
# Tiled decompression
- for samp in GRAY 444; do
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $PROGARG $ARIARG
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
- runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.bmp
- rm $i
+ if [ "$LOSSLSARG" != "-lossless" ]; then
+ for samp in GRAY 444; do
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 -warmup 0 ${dctarg} $YUVARG $PROGARG $ARIARG
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${dct}_djpeg.bmp
+ rm $i
+ done
done
- done
- for samp in 420 422; do
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $PROGARG $ARIARG
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
- runme cmp $i -i 54:54 $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.bmp
- rm $i
+ for samp in 420 422; do
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample ${dctarg} $YUVARG $PROGARG $ARIARG
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme cmp $i -i 54:54 $OUTDIR/${basename}_${samp}_${dct}_nosmooth_djpeg.bmp
+ rm $i
+ done
done
- done
+ fi
done
# Scaled decompression
for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
scalearg=`echo $scale | sed 's/\_/\//g'`
- for samp in GRAY 420 422 444; do
+ SCALE=$scale
+ if [ "$LOSSLSARG" = "-lossless" ]; then
+ SCALE=full
+ fi
+ for samp in $ALLSUBSAMP; do
runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG -bmp -outfile $OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp $OUTDIR/${basename}_${samp}_fast_cjpeg.jpg
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG
- runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp $OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp
- rm $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q${TJQUAL}.jpg -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG $LOSSLSARG
+ runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q${TJQUAL}_${SCALE}.bmp $OUTDIR/${basename}_${samp}_${scale}_djpeg.bmp
+ rm $OUTDIR/${basename}_${samp}_Q${TJQUAL}_${SCALE}.bmp
done
done
# Transforms
- for samp in GRAY 420 422 444; do
- runme $EXEDIR/jpegtran -flip horizontal -trim -outfile $OUTDIR/${basename}_${samp}_hflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -flip vertical -trim -outfile $OUTDIR/${basename}_${samp}_vflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -transpose -trim -outfile $OUTDIR/${basename}_${samp}_transpose_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -transverse -trim -outfile $OUTDIR/${basename}_${samp}_transverse_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 90 -trim -outfile $OUTDIR/${basename}_${samp}_rot90_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 180 -trim -outfile $OUTDIR/${basename}_${samp}_rot180_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- runme $EXEDIR/jpegtran -rotate 270 -trim -outfile $OUTDIR/${basename}_${samp}_rot270_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
- done
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444; do
- runme $EXEDIR/djpeg -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
- runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp
- rm $i
+ if [ "$LOSSLSARG" != "-lossless" ]; then
+ for samp in GRAY 420 422 444; do
+ runme $EXEDIR/jpegtran -flip horizontal -trim -outfile $OUTDIR/${basename}_${samp}_hflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -flip vertical -trim -outfile $OUTDIR/${basename}_${samp}_vflip_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -transpose -trim -outfile $OUTDIR/${basename}_${samp}_transpose_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -transverse -trim -outfile $OUTDIR/${basename}_${samp}_transverse_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 90 -trim -outfile $OUTDIR/${basename}_${samp}_rot90_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 180 -trim -outfile $OUTDIR/${basename}_${samp}_rot180_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ runme $EXEDIR/jpegtran -rotate 270 -trim -outfile $OUTDIR/${basename}_${samp}_rot270_jpegtran.jpg $OUTDIR/${basename}_${samp}_Q95.jpg
+ done
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444; do
+ runme $EXEDIR/djpeg -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp
+ rm $i
+ done
+ done
+ for samp in 420 422; do
+ runme $EXEDIR/djpeg -nosmooth -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample $YUVARG $PROGARG $ARIARG
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp
+ rm $i
+ done
done
done
- for samp in 420 422; do
- runme $EXEDIR/djpeg -nosmooth -rgb -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 -fastupsample $YUVARG $PROGARG $ARIARG
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
- runme cmp -i 54:54 $i $OUTDIR/${basename}_${samp}_${xform}_jpegtran.bmp
- rm $i
- done
- done
- done
- # Grayscale transform
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444 422 420; do
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 -grayscale $YUVARG $PROGARG $ARIARG
- for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
- $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
- runme cmp -i 54:54 $i $OUTDIR/${basename}_GRAY_${xform}_jpegtran.bmp
- rm $i
+ # Grayscale transform
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444 422 420; do
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -tile -quiet -benchtime 0.01 -warmup 0 -grayscale $YUVARG $PROGARG $ARIARG
+ for i in $OUTDIR/${basename}_${samp}_Q95_[0-9]*[0-9]x[0-9]*[0-9].bmp \
+ $OUTDIR/${basename}_${samp}_Q95_full.bmp; do
+ runme cmp -i 54:54 $i $OUTDIR/${basename}_GRAY_${xform}_jpegtran.bmp
+ rm $i
+ done
done
done
- done
- # Transforms with scaling
- for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
- for samp in GRAY 444 422 420; do
- for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
- scalearg=`echo $scale | sed 's/\_/\//g'`
- runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
- runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG
- runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp
- rm $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp
+ # Transforms with scaling
+ for xform in hflip vflip transpose transverse rot90 rot180 rot270; do
+ for samp in GRAY 444 422 420; do
+ for scale in 2_1 15_8 7_4 13_8 3_2 11_8 5_4 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8; do
+ scalearg=`echo $scale | sed 's/\_/\//g'`
+ runme $EXEDIR/djpeg -rgb -scale ${scalearg} $NSARG -bmp -outfile $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp $OUTDIR/${basename}_${samp}_${xform}_jpegtran.jpg
+ runme "$JAVA" $JAVAARGS TJBench $OUTDIR/${basename}_${samp}_Q95.jpg -$xform -scale ${scalearg} -quiet -benchtime 0.01 -warmup 0 $YUVARG $PROGARG $ARIARG
+ runme cmp -i 54:54 $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp $OUTDIR/${basename}_${samp}_${xform}_${scale}_jpegtran.bmp
+ rm $OUTDIR/${basename}_${samp}_Q95_${scale}.bmp
+ done
done
done
- done
+ fi
done
diff --git a/tjexample.c b/tjexample.c
index 505c9dd4..2142024e 100644
--- a/tjexample.c
+++ b/tjexample.c
@@ -263,7 +263,7 @@ int main(int argc, char **argv)
if (!strcasecmp(inFormat, "jpg")) {
/* Input image is a JPEG image. Decompress and/or transform it. */
long size;
- int inSubsamp, inColorspace;
+ int inSubsamp, inColorspace, inFlags;
int doTransform = (xform.op != TJXOP_NONE || xform.options != 0 ||
xform.customFilter != NULL);
unsigned long jpegSize;
@@ -304,10 +304,13 @@ int main(int argc, char **argv)
THROW_TJ("initializing decompressor");
}
- if (tjDecompressHeader3(tjInstance, jpegBuf, jpegSize, &width, &height,
- &inSubsamp, &inColorspace) < 0)
+ if (tjDecompressHeader4(tjInstance, jpegBuf, jpegSize, &width, &height,
+ &inSubsamp, &inColorspace, &inFlags) < 0)
THROW_TJ("reading JPEG header");
+ if (inFlags & TJFLAG_LOSSLESS)
+ scalingFactor.num = scalingFactor.denom = 1;
+
printf("%s Image: %d x %d pixels, %s subsampling, %s colorspace\n",
(doTransform ? "Transformed" : "Input"), width, height,
subsampName[inSubsamp], colorspaceName[inColorspace]);
diff --git a/turbojpeg-jni.c b/turbojpeg-jni.c
index 660a5baa..ec59bb80 100644
--- a/turbojpeg-jni.c
+++ b/turbojpeg-jni.c
@@ -555,7 +555,8 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
{
tjhandle handle = 0;
unsigned char *jpegBuf = NULL;
- int width = 0, height = 0, jpegSubsamp = -1, jpegColorspace = -1;
+ int width = 0, height = 0, jpegSubsamp = -1, jpegColorspace = -1,
+ jpegFlags = -1;
GET_HANDLE();
@@ -564,8 +565,9 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
BAILIF0NOEC(jpegBuf = (*env)->GetPrimitiveArrayCritical(env, src, 0));
- if (tjDecompressHeader3(handle, jpegBuf, (unsigned long)jpegSize, &width,
- &height, &jpegSubsamp, &jpegColorspace) == -1) {
+ if (tjDecompressHeader4(handle, jpegBuf, (unsigned long)jpegSize, &width,
+ &height, &jpegSubsamp, &jpegColorspace,
+ &jpegFlags) == -1) {
SAFE_RELEASE(src, jpegBuf);
THROW_TJ();
}
@@ -578,6 +580,10 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
(*env)->ExceptionClear(env);
else
(*env)->SetIntField(env, obj, _fid, jpegColorspace);
+ if ((_fid = (*env)->GetFieldID(env, _cls, "jpegFlags", "I")) == 0)
+ (*env)->ExceptionClear(env);
+ else
+ (*env)->SetIntField(env, obj, _fid, jpegFlags);
BAILIF0(_fid = (*env)->GetFieldID(env, _cls, "jpegWidth", "I"));
(*env)->SetIntField(env, obj, _fid, width);
BAILIF0(_fid = (*env)->GetFieldID(env, _cls, "jpegHeight", "I"));
diff --git a/turbojpeg-mapfile b/turbojpeg-mapfile
index 5477fed2..34995b12 100644
--- a/turbojpeg-mapfile
+++ b/turbojpeg-mapfile
@@ -63,3 +63,9 @@ TURBOJPEG_2.0
tjLoadImage;
tjSaveImage;
} TURBOJPEG_1.4;
+
+TURBOJPEG_2.2
+{
+ global:
+ tjDecompressHeader4;
+} TURBOJPEG_2.0;
diff --git a/turbojpeg-mapfile.jni b/turbojpeg-mapfile.jni
index 44327912..f86209d1 100644
--- a/turbojpeg-mapfile.jni
+++ b/turbojpeg-mapfile.jni
@@ -99,3 +99,9 @@ TURBOJPEG_2.0
tjLoadImage;
tjSaveImage;
} TURBOJPEG_1.4;
+
+TURBOJPEG_2.2
+{
+ global:
+ tjDecompressHeader4;
+} TURBOJPEG_2.0;
diff --git a/turbojpeg.c b/turbojpeg.c
index cb8abe1a..355ad658 100644
--- a/turbojpeg.c
+++ b/turbojpeg.c
@@ -1223,21 +1223,21 @@ DLLEXPORT tjhandle tjInitDecompress(void)
}
-DLLEXPORT int tjDecompressHeader3(tjhandle handle,
+DLLEXPORT int tjDecompressHeader4(tjhandle handle,
const unsigned char *jpegBuf,
unsigned long jpegSize, int *width,
int *height, int *jpegSubsamp,
- int *jpegColorspace)
+ int *jpegColorspace, int *jpegFlags)
{
int retval = 0;
GET_DINSTANCE(handle);
if ((this->init & DECOMPRESS) == 0)
- THROW("tjDecompressHeader3(): Instance has not been initialized for decompression");
+ THROW("tjDecompressHeader4(): Instance has not been initialized for decompression");
if (jpegBuf == NULL || jpegSize <= 0 || width == NULL || height == NULL ||
- jpegSubsamp == NULL || jpegColorspace == NULL)
- THROW("tjDecompressHeader3(): Invalid argument");
+ jpegSubsamp == NULL || jpegColorspace == NULL || jpegFlags == NULL)
+ THROW("tjDecompressHeader4(): Invalid argument");
if (setjmp(this->jerr.setjmp_buffer)) {
/* If we get here, the JPEG code has signaled an error. */
@@ -1264,21 +1264,37 @@ DLLEXPORT int tjDecompressHeader3(tjhandle handle,
case JCS_YCCK: *jpegColorspace = TJCS_YCCK; break;
default: *jpegColorspace = -1; break;
}
+ *jpegFlags = 0;
+ if (dinfo->progressive_mode) *jpegFlags |= TJFLAG_PROGRESSIVE;
+ if (dinfo->arith_code) *jpegFlags |= TJFLAG_ARITHMETIC;
+ if (dinfo->master->lossless) *jpegFlags |= TJFLAG_LOSSLESS;
jpeg_abort_decompress(dinfo);
if (*jpegSubsamp < 0)
- THROW("tjDecompressHeader3(): Could not determine subsampling type for JPEG image");
+ THROW("tjDecompressHeader4(): Could not determine subsampling type for JPEG image");
if (*jpegColorspace < 0)
- THROW("tjDecompressHeader3(): Could not determine colorspace of JPEG image");
+ THROW("tjDecompressHeader4(): Could not determine colorspace of JPEG image");
if (*width < 1 || *height < 1)
- THROW("tjDecompressHeader3(): Invalid data returned in header");
+ THROW("tjDecompressHeader4(): Invalid data returned in header");
bailout:
if (this->jerr.warning) retval = -1;
return retval;
}
+DLLEXPORT int tjDecompressHeader3(tjhandle handle,
+ const unsigned char *jpegBuf,
+ unsigned long jpegSize, int *width,
+ int *height, int *jpegSubsamp,
+ int *jpegColorspace)
+{
+ int flags;
+
+ return tjDecompressHeader4(handle, jpegBuf, jpegSize, width, height,
+ jpegSubsamp, jpegColorspace, &flags);
+}
+
DLLEXPORT int tjDecompressHeader2(tjhandle handle, unsigned char *jpegBuf,
unsigned long jpegSize, int *width,
int *height, int *jpegSubsamp)
diff --git a/turbojpeg.h b/turbojpeg.h
index 77a90b5f..adac92c6 100644
--- a/turbojpeg.h
+++ b/turbojpeg.h
@@ -1201,14 +1201,20 @@ DLLEXPORT tjhandle tjInitDecompress(void);
* image (see @ref TJCS "JPEG colorspaces".) If jpegBuf
* points to a tables-only datastream, then jpegColorspace is ignored.
*
+ * @param jpegFlags pointer to an integer variable that will receive the
+ * bitwise OR of one or more of the @ref TJFLAG_ACCURATEDCT "flags", such as
+ * #TJFLAG_PROGRESSIVE and #TJFLAG_LOSSLESS, that describe the JPEG image. If
+ * jpegBuf points to a tables-only datastream, then jpegFlags
+ * is ignored.
+ *
* @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr2()
* and #tjGetErrorCode().)
*/
-DLLEXPORT int tjDecompressHeader3(tjhandle handle,
+DLLEXPORT int tjDecompressHeader4(tjhandle handle,
const unsigned char *jpegBuf,
unsigned long jpegSize, int *width,
int *height, int *jpegSubsamp,
- int *jpegColorspace);
+ int *jpegColorspace, int *jpegFlags);
/**
@@ -1783,6 +1789,12 @@ DLLEXPORT int tjDecompressHeader2(tjhandle handle, unsigned char *jpegBuf,
unsigned long jpegSize, int *width,
int *height, int *jpegSubsamp);
+DLLEXPORT int tjDecompressHeader3(tjhandle handle,
+ const unsigned char *jpegBuf,
+ unsigned long jpegSize, int *width,
+ int *height, int *jpegSubsamp,
+ int *jpegColorspace);
+
DLLEXPORT int tjDecompress(tjhandle handle, unsigned char *jpegBuf,
unsigned long jpegSize, unsigned char *dstBuf,
int width, int pitch, int height, int pixelSize,
|