Add 4:1:1 subsampling support in the TurboJPEG Java API
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1017 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
@@ -45,11 +45,11 @@ class TJBench {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static final String[] subNameLong = {
|
static final String[] subNameLong = {
|
||||||
"4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0"
|
"4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0", "4:1:1"
|
||||||
};
|
};
|
||||||
|
|
||||||
static final String[] subName = {
|
static final String[] subName = {
|
||||||
"444", "422", "420", "GRAY", "440"
|
"444", "422", "420", "GRAY", "440", "411"
|
||||||
};
|
};
|
||||||
|
|
||||||
static TJScalingFactor sf;
|
static TJScalingFactor sf;
|
||||||
@@ -601,6 +601,7 @@ class TJBench {
|
|||||||
System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the");
|
System.out.println("-accuratedct = Use the most accurate DCT/IDCT algorithms available in the");
|
||||||
System.out.println(" underlying codec");
|
System.out.println(" underlying codec");
|
||||||
System.out.println("-440 = Test 4:4:0 chrominance subsampling instead of 4:2:2");
|
System.out.println("-440 = Test 4:4:0 chrominance subsampling instead of 4:2:2");
|
||||||
|
System.out.println("-411 = Test 4:1:1 chrominance subsampling instead of 4:2:0");
|
||||||
System.out.println("-quiet = Output results in tabular rather than verbose format");
|
System.out.println("-quiet = Output results in tabular rather than verbose format");
|
||||||
System.out.println("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG");
|
System.out.println("-yuvencode = Encode RGB input as planar YUV rather than compressing as JPEG");
|
||||||
System.out.println("-yuvdecode = Decode JPEG image to planar YUV rather than RGB");
|
System.out.println("-yuvdecode = Decode JPEG image to planar YUV rather than RGB");
|
||||||
@@ -637,7 +638,7 @@ class TJBench {
|
|||||||
byte[] srcBuf = null; int w = 0, h = 0;
|
byte[] srcBuf = null; int w = 0, h = 0;
|
||||||
int minQual = -1, maxQual = -1;
|
int minQual = -1, maxQual = -1;
|
||||||
int minArg = 1; int retval = 0;
|
int minArg = 1; int retval = 0;
|
||||||
boolean do440 = false;
|
boolean do440 = false, do411 = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -717,6 +718,8 @@ class TJBench {
|
|||||||
}
|
}
|
||||||
if (argv[i].equals("-440"))
|
if (argv[i].equals("-440"))
|
||||||
do440 = true;
|
do440 = true;
|
||||||
|
if (argv[i].equals("-411"))
|
||||||
|
do411 = true;
|
||||||
if (argv[i].equalsIgnoreCase("-rgb"))
|
if (argv[i].equalsIgnoreCase("-rgb"))
|
||||||
pf = TJ.PF_RGB;
|
pf = TJ.PF_RGB;
|
||||||
if (argv[i].equalsIgnoreCase("-rgbx"))
|
if (argv[i].equalsIgnoreCase("-rgbx"))
|
||||||
@@ -834,7 +837,7 @@ class TJBench {
|
|||||||
System.out.println("");
|
System.out.println("");
|
||||||
System.gc();
|
System.gc();
|
||||||
for (int i = maxQual; i >= minQual; i--)
|
for (int i = maxQual; i >= minQual; i--)
|
||||||
doTest(srcBuf, w, h, TJ.SAMP_420, i, argv[0]);
|
doTest(srcBuf, w, h, do411 ? TJ.SAMP_411 : TJ.SAMP_420, i, argv[0]);
|
||||||
System.out.println("");
|
System.out.println("");
|
||||||
System.gc();
|
System.gc();
|
||||||
for (int i = maxQual; i >= minQual; i--)
|
for (int i = maxQual; i >= minQual; i--)
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ public class TJUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final String[] subNameLong = {
|
private static final String[] subNameLong = {
|
||||||
"4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0"
|
"4:4:4", "4:2:2", "4:2:0", "GRAY", "4:4:0", "4:1:1"
|
||||||
};
|
};
|
||||||
private static final String[] subName = {
|
private static final String[] subName = {
|
||||||
"444", "422", "420", "GRAY", "440"
|
"444", "422", "420", "GRAY", "440", "411"
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] pixFormatStr = {
|
private static final String[] pixFormatStr = {
|
||||||
@@ -762,7 +762,10 @@ public class TJUnitTest {
|
|||||||
int num = sf[i].getNum();
|
int num = sf[i].getNum();
|
||||||
int denom = sf[i].getDenom();
|
int denom = sf[i].getDenom();
|
||||||
if (subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY ||
|
if (subsamp == TJ.SAMP_444 || subsamp == TJ.SAMP_GRAY ||
|
||||||
(num == 1 && (denom == 4 || denom == 2 || denom == 1)))
|
(subsamp == TJ.SAMP_411 && num == 1 &&
|
||||||
|
(denom == 2 || denom == 1)) ||
|
||||||
|
(subsamp != TJ.SAMP_411 && num == 1 &&
|
||||||
|
(denom == 4 || denom == 2 || denom == 1)))
|
||||||
decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp,
|
decompTest(tjd, jpegBuf, jpegSize, w, h, pf, baseName, subsamp,
|
||||||
flags, sf[i]);
|
flags, sf[i]);
|
||||||
}
|
}
|
||||||
@@ -788,7 +791,7 @@ public class TJUnitTest {
|
|||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 ||
|
if (subsamp == TJ.SAMP_422 || subsamp == TJ.SAMP_420 ||
|
||||||
subsamp == TJ.SAMP_440)
|
subsamp == TJ.SAMP_440 || subsamp == TJ.SAMP_411)
|
||||||
flags |= TJ.FLAG_FASTUPSAMPLE;
|
flags |= TJ.FLAG_FASTUPSAMPLE;
|
||||||
if (i == 1) {
|
if (i == 1) {
|
||||||
if (yuv == YUVDECODE) {
|
if (yuv == YUVDECODE) {
|
||||||
@@ -894,10 +897,14 @@ public class TJUnitTest {
|
|||||||
testName);
|
testName);
|
||||||
doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_440,
|
doTest(39, 41, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_440,
|
||||||
testName);
|
testName);
|
||||||
doTest(35, 39, bi ? onlyGrayBI : onlyGray, TJ.SAMP_GRAY, testName);
|
doTest(41, 35, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_411,
|
||||||
doTest(39, 41, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_GRAY,
|
|
||||||
testName);
|
testName);
|
||||||
doTest(41, 35, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY,
|
doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_411,
|
||||||
|
testName);
|
||||||
|
doTest(39, 41, bi ? onlyGrayBI : onlyGray, TJ.SAMP_GRAY, testName);
|
||||||
|
doTest(41, 35, bi ? _3byteFormatsBI : _3byteFormats, TJ.SAMP_GRAY,
|
||||||
|
testName);
|
||||||
|
doTest(35, 39, bi ? _4byteFormatsBI : _4byteFormats, TJ.SAMP_GRAY,
|
||||||
testName);
|
testName);
|
||||||
if (!doyuv && !bi)
|
if (!doyuv && !bi)
|
||||||
bufSizeTest();
|
bufSizeTest();
|
||||||
@@ -911,10 +918,12 @@ public class TJUnitTest {
|
|||||||
doTest(41, 35, onlyRGB, TJ.SAMP_420, "javatest_yuv1");
|
doTest(41, 35, onlyRGB, TJ.SAMP_420, "javatest_yuv1");
|
||||||
doTest(48, 48, onlyRGB, TJ.SAMP_440, "javatest_yuv0");
|
doTest(48, 48, onlyRGB, TJ.SAMP_440, "javatest_yuv0");
|
||||||
doTest(35, 39, onlyRGB, TJ.SAMP_440, "javatest_yuv1");
|
doTest(35, 39, onlyRGB, TJ.SAMP_440, "javatest_yuv1");
|
||||||
|
doTest(48, 48, onlyRGB, TJ.SAMP_411, "javatest_yuv0");
|
||||||
|
doTest(39, 41, onlyRGB, TJ.SAMP_411, "javatest_yuv1");
|
||||||
doTest(48, 48, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv0");
|
doTest(48, 48, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv0");
|
||||||
doTest(35, 39, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv1");
|
doTest(41, 35, onlyRGB, TJ.SAMP_GRAY, "javatest_yuv1");
|
||||||
doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0");
|
doTest(48, 48, onlyGray, TJ.SAMP_GRAY, "javatest_yuv0");
|
||||||
doTest(39, 41, onlyGray, TJ.SAMP_GRAY, "javatest_yuv1");
|
doTest(35, 39, onlyGray, TJ.SAMP_GRAY, "javatest_yuv1");
|
||||||
}
|
}
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ org.libjpegturbo.*</FONT></TH>
|
|||||||
<A NAME="org.libjpegturbo.turbojpeg.TJ.NUMSAMP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
<A NAME="org.libjpegturbo.turbojpeg.TJ.NUMSAMP"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
||||||
<CODE>public static final int</CODE></FONT></TD>
|
<CODE>public static final int</CODE></FONT></TD>
|
||||||
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#NUMSAMP">NUMSAMP</A></CODE></TD>
|
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#NUMSAMP">NUMSAMP</A></CODE></TD>
|
||||||
<TD ALIGN="right"><CODE>5</CODE></TD>
|
<TD ALIGN="right"><CODE>6</CODE></TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR BGCOLOR="white" CLASS="TableRowColor">
|
<TR BGCOLOR="white" CLASS="TableRowColor">
|
||||||
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_ABGR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
<A NAME="org.libjpegturbo.turbojpeg.TJ.PF_ABGR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
||||||
@@ -225,6 +225,12 @@ org.libjpegturbo.*</FONT></TH>
|
|||||||
<TD ALIGN="right"><CODE>5</CODE></TD>
|
<TD ALIGN="right"><CODE>5</CODE></TD>
|
||||||
</TR>
|
</TR>
|
||||||
<TR BGCOLOR="white" CLASS="TableRowColor">
|
<TR BGCOLOR="white" CLASS="TableRowColor">
|
||||||
|
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_411"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
||||||
|
<CODE>public static final int</CODE></FONT></TD>
|
||||||
|
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_411">SAMP_411</A></CODE></TD>
|
||||||
|
<TD ALIGN="right"><CODE>5</CODE></TD>
|
||||||
|
</TR>
|
||||||
|
<TR BGCOLOR="white" CLASS="TableRowColor">
|
||||||
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_420"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
<A NAME="org.libjpegturbo.turbojpeg.TJ.SAMP_420"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
|
||||||
<CODE>public static final int</CODE></FONT></TD>
|
<CODE>public static final int</CODE></FONT></TD>
|
||||||
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</A></CODE></TD>
|
<TD ALIGN="left"><CODE><A HREF="org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</A></CODE></TD>
|
||||||
|
|||||||
@@ -465,6 +465,9 @@ Static variable in class org.libjpegturbo.turbojpeg.<A HREF="./org/libjpegturbo/
|
|||||||
<A NAME="_S_"><!-- --></A><H2>
|
<A NAME="_S_"><!-- --></A><H2>
|
||||||
<B>S</B></H2>
|
<B>S</B></H2>
|
||||||
<DL>
|
<DL>
|
||||||
|
<DT><A HREF="./org/libjpegturbo/turbojpeg/TJ.html#SAMP_411"><B>SAMP_411</B></A> -
|
||||||
|
Static variable in class org.libjpegturbo.turbojpeg.<A HREF="./org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A>
|
||||||
|
<DD>4:1:1 chrominance subsampling.
|
||||||
<DT><A HREF="./org/libjpegturbo/turbojpeg/TJ.html#SAMP_420"><B>SAMP_420</B></A> -
|
<DT><A HREF="./org/libjpegturbo/turbojpeg/TJ.html#SAMP_420"><B>SAMP_420</B></A> -
|
||||||
Static variable in class org.libjpegturbo.turbojpeg.<A HREF="./org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A>
|
Static variable in class org.libjpegturbo.turbojpeg.<A HREF="./org/libjpegturbo/turbojpeg/TJ.html" title="class in org.libjpegturbo.turbojpeg">TJ</A>
|
||||||
<DD>4:2:0 chrominance subsampling.
|
<DD>4:2:0 chrominance subsampling.
|
||||||
|
|||||||
@@ -291,6 +291,14 @@ TurboJPEG utility class (cannot be instantiated)
|
|||||||
<TR BGCOLOR="white" CLASS="TableRowColor">
|
<TR BGCOLOR="white" CLASS="TableRowColor">
|
||||||
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
|
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
|
||||||
<CODE>static int</CODE></FONT></TD>
|
<CODE>static int</CODE></FONT></TD>
|
||||||
|
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_411">SAMP_411</A></B></CODE>
|
||||||
|
|
||||||
|
<BR>
|
||||||
|
4:1:1 chrominance subsampling.</TD>
|
||||||
|
</TR>
|
||||||
|
<TR BGCOLOR="white" CLASS="TableRowColor">
|
||||||
|
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
|
||||||
|
<CODE>static int</CODE></FONT></TD>
|
||||||
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</A></B></CODE>
|
<TD><CODE><B><A HREF="../../../org/libjpegturbo/turbojpeg/TJ.html#SAMP_420">SAMP_420</A></B></CODE>
|
||||||
|
|
||||||
<BR>
|
<BR>
|
||||||
@@ -550,6 +558,25 @@ public static final int <B>SAMP_440</B></PRE>
|
|||||||
</DL>
|
</DL>
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
|
<A NAME="SAMP_411"><!-- --></A><H3>
|
||||||
|
SAMP_411</H3>
|
||||||
|
<PRE>
|
||||||
|
public static final int <B>SAMP_411</B></PRE>
|
||||||
|
<DL>
|
||||||
|
<DD>4:1:1 chrominance subsampling. The JPEG or YUV image will contain one
|
||||||
|
chrominance component for every 4x1 block of pixels in the source image.
|
||||||
|
JPEG images compressed with 4:1:1 subsampling will be almost exactly the
|
||||||
|
same size as those compressed with 4:2:0 subsampling, and in the
|
||||||
|
aggregate, both subsampling methods produce approximately the same
|
||||||
|
perceptual quality. However, 4:1:1 is better able to reproduce sharp
|
||||||
|
horizontal features. Note that 4:1:1 subsampling is not fully accelerated
|
||||||
|
in libjpeg-turbo.
|
||||||
|
<P>
|
||||||
|
<DL>
|
||||||
|
<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.libjpegturbo.turbojpeg.TJ.SAMP_411">Constant Field Values</A></DL>
|
||||||
|
</DL>
|
||||||
|
<HR>
|
||||||
|
|
||||||
<A NAME="NUMPF"><!-- --></A><H3>
|
<A NAME="NUMPF"><!-- --></A><H3>
|
||||||
NUMPF</H3>
|
NUMPF</H3>
|
||||||
<PRE>
|
<PRE>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public final class TJ {
|
|||||||
/**
|
/**
|
||||||
* The number of chrominance subsampling options
|
* The number of chrominance subsampling options
|
||||||
*/
|
*/
|
||||||
public static final int NUMSAMP = 5;
|
public static final int NUMSAMP = 6;
|
||||||
/**
|
/**
|
||||||
* 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG
|
* 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG
|
||||||
* or YUV image will contain one chrominance component for every pixel in the
|
* or YUV image will contain one chrominance component for every pixel in the
|
||||||
@@ -64,6 +64,17 @@ public final class TJ {
|
|||||||
* Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.
|
* Note that 4:4:0 subsampling is not fully accelerated in libjpeg-turbo.
|
||||||
*/
|
*/
|
||||||
public static final int SAMP_440 = 4;
|
public static final int SAMP_440 = 4;
|
||||||
|
/**
|
||||||
|
* 4:1:1 chrominance subsampling. The JPEG or YUV image will contain one
|
||||||
|
* chrominance component for every 4x1 block of pixels in the source image.
|
||||||
|
* JPEG images compressed with 4:1:1 subsampling will be almost exactly the
|
||||||
|
* same size as those compressed with 4:2:0 subsampling, and in the
|
||||||
|
* aggregate, both subsampling methods produce approximately the same
|
||||||
|
* perceptual quality. However, 4:1:1 is better able to reproduce sharp
|
||||||
|
* horizontal features. Note that 4:1:1 subsampling is not fully accelerated
|
||||||
|
* in libjpeg-turbo.
|
||||||
|
*/
|
||||||
|
public static final int SAMP_411 = 5;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,7 +93,7 @@ public final class TJ {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final int[] mcuWidth = {
|
private static final int[] mcuWidth = {
|
||||||
8, 16, 16, 8, 8
|
8, 16, 16, 8, 8, 32
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +114,7 @@ public final class TJ {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final int[] mcuHeight = {
|
private static final int[] mcuHeight = {
|
||||||
8, 8, 16, 8, 16
|
8, 8, 16, 8, 16, 8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user