Support arithmetic encoding and decoding
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@299 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
@@ -90,13 +90,14 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
|
|||||||
# Targets
|
# Targets
|
||||||
#
|
#
|
||||||
|
|
||||||
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
|
set(JPEG_SOURCES jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c
|
||||||
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c
|
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c
|
||||||
jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c
|
jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c
|
||||||
jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c
|
jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c
|
||||||
jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c
|
jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c
|
||||||
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c
|
jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c
|
||||||
jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
|
jidctfst.c jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c
|
||||||
|
jmemnobs.c)
|
||||||
|
|
||||||
if(WITH_SIMD)
|
if(WITH_SIMD)
|
||||||
add_definitions(-DWITH_SIMD)
|
add_definitions(-DWITH_SIMD)
|
||||||
@@ -201,6 +202,14 @@ add_test(cjpeg-prog sharedlib/cjpeg -dct int -progressive -outfile testoutp.jpg
|
|||||||
add_test(cjpeg-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgp.jpg testoutp.jpg)
|
add_test(cjpeg-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgp.jpg testoutp.jpg)
|
||||||
add_test(jpegtran-prog sharedlib/jpegtran -outfile testoutt.jpg testoutp.jpg)
|
add_test(jpegtran-prog sharedlib/jpegtran -outfile testoutt.jpg testoutp.jpg)
|
||||||
add_test(jpegtran-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testoutt.jpg)
|
add_test(jpegtran-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testoutt.jpg)
|
||||||
|
add_test(cjpeg-ari sharedlib/cjpeg -dct int -arithmetic -outfile testoutari.jpg ${CMAKE_SOURCE_DIR}/testorig.ppm)
|
||||||
|
add_test(cjpeg-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.jpg testoutari.jpg)
|
||||||
|
add_test(djpeg-ari sharedlib/djpeg -dct int -fast -ppm -outfile testoutari.ppm ${CMAKE_SOURCE_DIR}/testimgari.jpg)
|
||||||
|
add_test(djpeg-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.ppm testoutari.ppm)
|
||||||
|
add_test(jpegtran-toari sharedlib/jpegtran -arithmetic -outfile testouta.jpg testoutint.jpg)
|
||||||
|
add_test(jpegtran-toari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.jpg testouta.jpg)
|
||||||
|
add_test(jpegtran-fromari sharedlib/jpegtran -outfile testouta.jpg testoutari.jpg)
|
||||||
|
add_test(jpegtran-fromari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testouta.jpg)
|
||||||
add_test(jpegtran-crop sharedlib/jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testorig.jpg)
|
add_test(jpegtran-crop sharedlib/jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testorig.jpg)
|
||||||
add_test(jpegtran-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgcrop.jpg testoutcrop.jpg)
|
add_test(jpegtran-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgcrop.jpg testoutcrop.jpg)
|
||||||
|
|
||||||
@@ -231,6 +240,14 @@ add_test(cjpeg-static-prog cjpeg-static -dct int -progressive -outfile testoutp.
|
|||||||
add_test(cjpeg-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgp.jpg testoutp.jpg)
|
add_test(cjpeg-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgp.jpg testoutp.jpg)
|
||||||
add_test(jpegtran-static-prog jpegtran-static -outfile testoutt.jpg testoutp.jpg)
|
add_test(jpegtran-static-prog jpegtran-static -outfile testoutt.jpg testoutp.jpg)
|
||||||
add_test(jpegtran-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testoutt.jpg)
|
add_test(jpegtran-static-prog-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testoutt.jpg)
|
||||||
|
add_test(cjpeg-static-ari cjpeg-static -dct int -arithmetic -outfile testoutari.jpg ${CMAKE_SOURCE_DIR}/testorig.ppm)
|
||||||
|
add_test(cjpeg-static-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.jpg testoutari.jpg)
|
||||||
|
add_test(djpeg-static-ari djpeg-static -dct int -fast -ppm -outfile testoutari.ppm ${CMAKE_SOURCE_DIR}/testimgari.jpg)
|
||||||
|
add_test(djpeg-static-ari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.ppm testoutari.ppm)
|
||||||
|
add_test(jpegtran-static-toari jpegtran-static -arithmetic -outfile testouta.jpg testoutint.jpg)
|
||||||
|
add_test(jpegtran-static-toari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgari.jpg testouta.jpg)
|
||||||
|
add_test(jpegtran-static-fromari jpegtran-static -outfile testouta.jpg testoutari.jpg)
|
||||||
|
add_test(jpegtran-static-fromari-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgint.jpg testouta.jpg)
|
||||||
add_test(jpegtran-static-crop jpegtran-static -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testorig.jpg)
|
add_test(jpegtran-static-crop jpegtran-static -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg ${CMAKE_SOURCE_DIR}/testorig.jpg)
|
||||||
add_test(jpegtran-static-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgcrop.jpg testoutcrop.jpg)
|
add_test(jpegtran-static-crop-cmp ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/testimgcrop.jpg testoutcrop.jpg)
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ packages.
|
|||||||
[6] All symbols in the libjpeg-turbo dynamic library are now versioned, even
|
[6] All symbols in the libjpeg-turbo dynamic library are now versioned, even
|
||||||
when the library is built with libjpeg v6b emulation.
|
when the library is built with libjpeg v6b emulation.
|
||||||
|
|
||||||
|
[7] Added arithmetic encoding and decoding support.
|
||||||
|
|
||||||
|
|
||||||
Significant changes since 1.0.0
|
Significant changes since 1.0.0
|
||||||
===============================
|
===============================
|
||||||
|
|||||||
73
Makefile.am
73
Makefile.am
@@ -7,14 +7,15 @@ nodist_include_HEADERS = jconfig.h
|
|||||||
HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \
|
HDRS = jchuff.h jdct.h jdhuff.h jerror.h jinclude.h jmemsys.h jmorecfg.h \
|
||||||
jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h
|
jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h jpegcomp.h
|
||||||
|
|
||||||
libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \
|
libjpeg_la_SOURCES = $(HDRS) jaricom.c jcapimin.c jcapistd.c jcarith.c \
|
||||||
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
|
jccoefct.c jccolor.c jcdctmgr.c jchuff.c jcinit.c jcmainct.c \
|
||||||
jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \
|
jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c jcprepct.c \
|
||||||
jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
|
jcsample.c jctrans.c jdapimin.c jdapistd.c jdarith.c \
|
||||||
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
|
jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c \
|
||||||
jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \
|
jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c \
|
||||||
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \
|
jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c \
|
||||||
jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
|
jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c \
|
||||||
|
jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
|
||||||
|
|
||||||
libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpegl.c turbojpeg.h \
|
libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpegl.c turbojpeg.h \
|
||||||
turbojpeg-mapfile
|
turbojpeg-mapfile
|
||||||
@@ -103,49 +104,38 @@ dist-hook:
|
|||||||
rm -rf `find $(distdir) -name .svn`
|
rm -rf `find $(distdir) -name .svn`
|
||||||
|
|
||||||
|
|
||||||
|
test: testclean all
|
||||||
|
./jpegut
|
||||||
|
./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testorig.ppm
|
||||||
|
cmp $(srcdir)/testimgint.jpg testoutint.jpg
|
||||||
|
./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testorig.ppm
|
||||||
|
cmp $(srcdir)/testimgfst.jpg testoutfst.jpg
|
||||||
|
./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testorig.ppm
|
||||||
if WITH_SIMD
|
if WITH_SIMD
|
||||||
|
|
||||||
test: testclean all
|
|
||||||
./jpegut
|
|
||||||
./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testorig.ppm
|
|
||||||
./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testorig.ppm
|
|
||||||
./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testorig.ppm
|
|
||||||
cmp $(srcdir)/testimgint.jpg testoutint.jpg
|
|
||||||
cmp $(srcdir)/testimgfst.jpg testoutfst.jpg
|
|
||||||
cmp $(srcdir)/testimgflt.jpg testoutflt.jpg
|
cmp $(srcdir)/testimgflt.jpg testoutflt.jpg
|
||||||
./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testorig.jpg
|
|
||||||
./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testorig.jpg
|
|
||||||
./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testorig.jpg
|
|
||||||
cmp $(srcdir)/testimgint.ppm testoutint.ppm
|
|
||||||
cmp $(srcdir)/testimgfst.ppm testoutfst.ppm
|
|
||||||
cmp $(srcdir)/testimgflt.ppm testoutflt.ppm
|
|
||||||
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
|
|
||||||
cmp $(srcdir)/testimg.bmp testout.bmp
|
|
||||||
./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testorig.ppm
|
|
||||||
cmp $(srcdir)/testimgp.jpg testoutp.jpg
|
|
||||||
./jpegtran -outfile testoutt.jpg testoutp.jpg
|
|
||||||
cmp $(srcdir)/testimgint.jpg testoutt.jpg
|
|
||||||
./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testorig.jpg
|
|
||||||
cmp $(srcdir)/testimgcrop.jpg testoutcrop.jpg
|
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
test: testclean all
|
|
||||||
./jpegut
|
|
||||||
./cjpeg -dct int -outfile testoutint.jpg $(srcdir)/testorig.ppm
|
|
||||||
./cjpeg -dct fast -opt -outfile testoutfst.jpg $(srcdir)/testorig.ppm
|
|
||||||
./cjpeg -dct float -outfile testoutflt.jpg $(srcdir)/testorig.ppm
|
|
||||||
cmp $(srcdir)/testimgint.jpg testoutint.jpg
|
|
||||||
cmp $(srcdir)/testimgfst.jpg testoutfst.jpg
|
|
||||||
cmp $(srcdir)/testimgflt-nosimd.jpg testoutflt.jpg
|
cmp $(srcdir)/testimgflt-nosimd.jpg testoutflt.jpg
|
||||||
|
endif
|
||||||
./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testorig.jpg
|
./djpeg -dct int -fast -ppm -outfile testoutint.ppm $(srcdir)/testorig.jpg
|
||||||
./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testorig.jpg
|
|
||||||
./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testorig.jpg
|
|
||||||
cmp $(srcdir)/testimgint.ppm testoutint.ppm
|
cmp $(srcdir)/testimgint.ppm testoutint.ppm
|
||||||
|
./djpeg -dct fast -ppm -outfile testoutfst.ppm $(srcdir)/testorig.jpg
|
||||||
cmp $(srcdir)/testimgfst.ppm testoutfst.ppm
|
cmp $(srcdir)/testimgfst.ppm testoutfst.ppm
|
||||||
|
./djpeg -dct float -ppm -outfile testoutflt.ppm $(srcdir)/testorig.jpg
|
||||||
|
if WITH_SIMD
|
||||||
|
cmp $(srcdir)/testimgflt.ppm testoutflt.ppm
|
||||||
|
else
|
||||||
cmp $(srcdir)/testorig.ppm testoutflt.ppm
|
cmp $(srcdir)/testorig.ppm testoutflt.ppm
|
||||||
|
endif
|
||||||
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
|
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
|
||||||
cmp $(srcdir)/testimg.bmp testout.bmp
|
cmp $(srcdir)/testimg.bmp testout.bmp
|
||||||
|
./cjpeg -dct int -arithmetic -outfile testoutari.jpg $(srcdir)/testorig.ppm
|
||||||
|
cmp $(srcdir)/testimgari.jpg testoutari.jpg
|
||||||
|
./djpeg -dct int -fast -ppm -outfile testoutari.ppm $(srcdir)/testimgari.jpg
|
||||||
|
cmp $(srcdir)/testimgari.ppm testoutari.ppm
|
||||||
|
./jpegtran -arithmetic -outfile testouta.jpg testoutint.jpg
|
||||||
|
cmp $(srcdir)/testimgari.jpg testouta.jpg
|
||||||
|
./jpegtran -outfile testouta.jpg testoutari.jpg
|
||||||
|
cmp $(srcdir)/testimgint.jpg testouta.jpg
|
||||||
./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testorig.ppm
|
./cjpeg -dct int -progressive -outfile testoutp.jpg $(srcdir)/testorig.ppm
|
||||||
cmp $(srcdir)/testimgp.jpg testoutp.jpg
|
cmp $(srcdir)/testimgp.jpg testoutp.jpg
|
||||||
./jpegtran -outfile testoutt.jpg testoutp.jpg
|
./jpegtran -outfile testoutt.jpg testoutp.jpg
|
||||||
@@ -153,7 +143,6 @@ test: testclean all
|
|||||||
./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testorig.jpg
|
./jpegtran -crop 120x90+20+50 -transpose -perfect -outfile testoutcrop.jpg $(srcdir)/testorig.jpg
|
||||||
cmp $(srcdir)/testimgcrop.jpg testoutcrop.jpg
|
cmp $(srcdir)/testimgcrop.jpg testoutcrop.jpg
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
testclean:
|
testclean:
|
||||||
rm -f testout*
|
rm -f testout*
|
||||||
|
|||||||
14
README
14
README
@@ -78,9 +78,8 @@ compressor.)
|
|||||||
This software implements JPEG baseline, extended-sequential, and progressive
|
This software implements JPEG baseline, extended-sequential, and progressive
|
||||||
compression processes. Provision is made for supporting all variants of these
|
compression processes. Provision is made for supporting all variants of these
|
||||||
processes, although some uncommon parameter settings aren't implemented yet.
|
processes, although some uncommon parameter settings aren't implemented yet.
|
||||||
For legal reasons, we are not distributing code for the arithmetic-coding
|
We have made no provision for supporting the hierarchical or lossless
|
||||||
variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting
|
processes defined in the standard.
|
||||||
the hierarchical or lossless processes defined in the standard.
|
|
||||||
|
|
||||||
We provide a set of library routines for reading and writing JPEG image files,
|
We provide a set of library routines for reading and writing JPEG image files,
|
||||||
plus two sample applications "cjpeg" and "djpeg", which use the library to
|
plus two sample applications "cjpeg" and "djpeg", which use the library to
|
||||||
@@ -175,15 +174,6 @@ The same holds for its supporting scripts (config.guess, config.sub,
|
|||||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
||||||
but is also freely distributable.
|
but is also freely distributable.
|
||||||
|
|
||||||
It appears that the arithmetic coding option of the JPEG spec is covered by
|
|
||||||
patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot
|
|
||||||
legally be used without obtaining one or more licenses. For this reason,
|
|
||||||
support for arithmetic coding has been removed from the free JPEG software.
|
|
||||||
(Since arithmetic coding provides only a marginal gain over the unpatented
|
|
||||||
Huffman mode, it is unlikely that very many implementations will support it.)
|
|
||||||
So far as we are aware, there are no patent restrictions on the remaining
|
|
||||||
code.
|
|
||||||
|
|
||||||
The IJG distribution formerly included code to read and write GIF files.
|
The IJG distribution formerly included code to read and write GIF files.
|
||||||
To avoid entanglement with the Unisys LZW patent, GIF reading support has
|
To avoid entanglement with the Unisys LZW patent, GIF reading support has
|
||||||
been removed altogether, and the GIF writer has been simplified to produce
|
been removed altogether, and the GIF writer has been simplified to produce
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ settings for luminance and chrominance (or in general, for every provided
|
|||||||
quantization table slot).
|
quantization table slot).
|
||||||
New API function jpeg_default_qtables() and q_scale_factor array in library.
|
New API function jpeg_default_qtables() and q_scale_factor array in library.
|
||||||
|
|
||||||
|
Support arithmetic entropy encoding and decoding.
|
||||||
|
Added files jaricom.c, jcarith.c, jdarith.c.
|
||||||
|
|
||||||
jpegtran has a new "lossless" cropping feature.
|
jpegtran has a new "lossless" cropping feature.
|
||||||
|
|
||||||
Implement -perfect option in jpegtran, new API function
|
Implement -perfect option in jpegtran, new API function
|
||||||
|
|||||||
8
cjpeg.1
8
cjpeg.1
@@ -214,6 +214,12 @@ visibly blur the image, however.
|
|||||||
.PP
|
.PP
|
||||||
Switches for wizards:
|
Switches for wizards:
|
||||||
.TP
|
.TP
|
||||||
|
.B \-arithmetic
|
||||||
|
Use arithmetic coding.
|
||||||
|
.B Caution:
|
||||||
|
arithmetic coded JPEG is not yet widely implemented, so many decoders will be
|
||||||
|
unable to view an arithmetic coded JPEG file at all.
|
||||||
|
.TP
|
||||||
.B \-baseline
|
.B \-baseline
|
||||||
Force baseline-compatible quantization tables to be generated. This clamps
|
Force baseline-compatible quantization tables to be generated. This clamps
|
||||||
quantization values to 8 bits even at low quality settings. (This switch is
|
quantization values to 8 bits even at low quality settings. (This switch is
|
||||||
@@ -303,8 +309,6 @@ Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
|||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Independent JPEG Group
|
Independent JPEG Group
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Arithmetic coding is not supported for legal reasons.
|
|
||||||
.PP
|
|
||||||
Support for GIF input files was removed in cjpeg v6b due to concerns over
|
Support for GIF input files was removed in cjpeg v6b due to concerns over
|
||||||
the Unisys LZW patent. Although this patent expired in 2006, cjpeg still
|
the Unisys LZW patent. Although this patent expired in 2006, cjpeg still
|
||||||
lacks GIF support, for these historical reasons. (Conversion of GIF files to
|
lacks GIF support, for these historical reasons. (Conversion of GIF files to
|
||||||
|
|||||||
2
djpeg.1
2
djpeg.1
@@ -243,8 +243,6 @@ Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
|||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Independent JPEG Group
|
Independent JPEG Group
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Arithmetic coding is not supported for legal reasons.
|
|
||||||
.PP
|
|
||||||
To avoid the Unisys LZW patent,
|
To avoid the Unisys LZW patent,
|
||||||
.B djpeg
|
.B djpeg
|
||||||
produces uncompressed GIF files. These are larger than they should be, but
|
produces uncompressed GIF files. These are larger than they should be, but
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ jfdctfst.c Forward DCT using faster, less accurate integer method.
|
|||||||
jfdctflt.c Forward DCT using floating-point arithmetic.
|
jfdctflt.c Forward DCT using floating-point arithmetic.
|
||||||
jchuff.c Huffman entropy coding for sequential JPEG.
|
jchuff.c Huffman entropy coding for sequential JPEG.
|
||||||
jcphuff.c Huffman entropy coding for progressive JPEG.
|
jcphuff.c Huffman entropy coding for progressive JPEG.
|
||||||
|
jcarith.c Arithmetic entropy coding.
|
||||||
jcmarker.c JPEG marker writing.
|
jcmarker.c JPEG marker writing.
|
||||||
jdatadst.c Data destination managers for memory and stdio output.
|
jdatadst.c Data destination managers for memory and stdio output.
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ jdpostct.c Postprocessor buffer controller.
|
|||||||
jdmarker.c JPEG marker reading.
|
jdmarker.c JPEG marker reading.
|
||||||
jdhuff.c Huffman entropy decoding for sequential JPEG.
|
jdhuff.c Huffman entropy decoding for sequential JPEG.
|
||||||
jdphuff.c Huffman entropy decoding for progressive JPEG.
|
jdphuff.c Huffman entropy decoding for progressive JPEG.
|
||||||
|
jdarith.c Arithmetic entropy decoding.
|
||||||
jddctmgr.c IDCT manager (IDCT implementation selection & control).
|
jddctmgr.c IDCT manager (IDCT implementation selection & control).
|
||||||
jidctint.c Inverse DCT using slow-but-accurate integer method.
|
jidctint.c Inverse DCT using slow-but-accurate integer method.
|
||||||
jidctfst.c Inverse DCT using faster, less accurate integer method.
|
jidctfst.c Inverse DCT using faster, less accurate integer method.
|
||||||
@@ -102,6 +104,8 @@ jdatasrc.c Data source managers for memory and stdio input.
|
|||||||
|
|
||||||
Support files for both compression and decompression:
|
Support files for both compression and decompression:
|
||||||
|
|
||||||
|
jaricom.c Tables for common use in arithmetic entropy encoding and
|
||||||
|
decoding routines.
|
||||||
jerror.c Standard error handling routines (application replaceable).
|
jerror.c Standard error handling routines (application replaceable).
|
||||||
jmemmgr.c System-independent (more or less) memory management code.
|
jmemmgr.c System-independent (more or less) memory management code.
|
||||||
jutils.c Miscellaneous utility routines.
|
jutils.c Miscellaneous utility routines.
|
||||||
|
|||||||
153
jaricom.c
Normal file
153
jaricom.c
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* jaricom.c
|
||||||
|
*
|
||||||
|
* Developed 1997-2009 by Guido Vollbeding.
|
||||||
|
* This file is part of the Independent JPEG Group's software.
|
||||||
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
|
*
|
||||||
|
* This file contains probability estimation tables for common use in
|
||||||
|
* arithmetic entropy encoding and decoding routines.
|
||||||
|
*
|
||||||
|
* This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1
|
||||||
|
* and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec
|
||||||
|
* (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "jinclude.h"
|
||||||
|
#include "jpeglib.h"
|
||||||
|
|
||||||
|
/* The following #define specifies the packing of the four components
|
||||||
|
* into the compact INT32 representation.
|
||||||
|
* Note that this formula must match the actual arithmetic encoder
|
||||||
|
* and decoder implementation. The implementation has to be changed
|
||||||
|
* if this formula is changed.
|
||||||
|
* The current organization is leaned on Markus Kuhn's JBIG
|
||||||
|
* implementation (jbig_tab.c).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)
|
||||||
|
|
||||||
|
const INT32 jpeg_aritab[113+1] = {
|
||||||
|
/*
|
||||||
|
* Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS
|
||||||
|
*/
|
||||||
|
V( 0, 0x5a1d, 1, 1, 1 ),
|
||||||
|
V( 1, 0x2586, 14, 2, 0 ),
|
||||||
|
V( 2, 0x1114, 16, 3, 0 ),
|
||||||
|
V( 3, 0x080b, 18, 4, 0 ),
|
||||||
|
V( 4, 0x03d8, 20, 5, 0 ),
|
||||||
|
V( 5, 0x01da, 23, 6, 0 ),
|
||||||
|
V( 6, 0x00e5, 25, 7, 0 ),
|
||||||
|
V( 7, 0x006f, 28, 8, 0 ),
|
||||||
|
V( 8, 0x0036, 30, 9, 0 ),
|
||||||
|
V( 9, 0x001a, 33, 10, 0 ),
|
||||||
|
V( 10, 0x000d, 35, 11, 0 ),
|
||||||
|
V( 11, 0x0006, 9, 12, 0 ),
|
||||||
|
V( 12, 0x0003, 10, 13, 0 ),
|
||||||
|
V( 13, 0x0001, 12, 13, 0 ),
|
||||||
|
V( 14, 0x5a7f, 15, 15, 1 ),
|
||||||
|
V( 15, 0x3f25, 36, 16, 0 ),
|
||||||
|
V( 16, 0x2cf2, 38, 17, 0 ),
|
||||||
|
V( 17, 0x207c, 39, 18, 0 ),
|
||||||
|
V( 18, 0x17b9, 40, 19, 0 ),
|
||||||
|
V( 19, 0x1182, 42, 20, 0 ),
|
||||||
|
V( 20, 0x0cef, 43, 21, 0 ),
|
||||||
|
V( 21, 0x09a1, 45, 22, 0 ),
|
||||||
|
V( 22, 0x072f, 46, 23, 0 ),
|
||||||
|
V( 23, 0x055c, 48, 24, 0 ),
|
||||||
|
V( 24, 0x0406, 49, 25, 0 ),
|
||||||
|
V( 25, 0x0303, 51, 26, 0 ),
|
||||||
|
V( 26, 0x0240, 52, 27, 0 ),
|
||||||
|
V( 27, 0x01b1, 54, 28, 0 ),
|
||||||
|
V( 28, 0x0144, 56, 29, 0 ),
|
||||||
|
V( 29, 0x00f5, 57, 30, 0 ),
|
||||||
|
V( 30, 0x00b7, 59, 31, 0 ),
|
||||||
|
V( 31, 0x008a, 60, 32, 0 ),
|
||||||
|
V( 32, 0x0068, 62, 33, 0 ),
|
||||||
|
V( 33, 0x004e, 63, 34, 0 ),
|
||||||
|
V( 34, 0x003b, 32, 35, 0 ),
|
||||||
|
V( 35, 0x002c, 33, 9, 0 ),
|
||||||
|
V( 36, 0x5ae1, 37, 37, 1 ),
|
||||||
|
V( 37, 0x484c, 64, 38, 0 ),
|
||||||
|
V( 38, 0x3a0d, 65, 39, 0 ),
|
||||||
|
V( 39, 0x2ef1, 67, 40, 0 ),
|
||||||
|
V( 40, 0x261f, 68, 41, 0 ),
|
||||||
|
V( 41, 0x1f33, 69, 42, 0 ),
|
||||||
|
V( 42, 0x19a8, 70, 43, 0 ),
|
||||||
|
V( 43, 0x1518, 72, 44, 0 ),
|
||||||
|
V( 44, 0x1177, 73, 45, 0 ),
|
||||||
|
V( 45, 0x0e74, 74, 46, 0 ),
|
||||||
|
V( 46, 0x0bfb, 75, 47, 0 ),
|
||||||
|
V( 47, 0x09f8, 77, 48, 0 ),
|
||||||
|
V( 48, 0x0861, 78, 49, 0 ),
|
||||||
|
V( 49, 0x0706, 79, 50, 0 ),
|
||||||
|
V( 50, 0x05cd, 48, 51, 0 ),
|
||||||
|
V( 51, 0x04de, 50, 52, 0 ),
|
||||||
|
V( 52, 0x040f, 50, 53, 0 ),
|
||||||
|
V( 53, 0x0363, 51, 54, 0 ),
|
||||||
|
V( 54, 0x02d4, 52, 55, 0 ),
|
||||||
|
V( 55, 0x025c, 53, 56, 0 ),
|
||||||
|
V( 56, 0x01f8, 54, 57, 0 ),
|
||||||
|
V( 57, 0x01a4, 55, 58, 0 ),
|
||||||
|
V( 58, 0x0160, 56, 59, 0 ),
|
||||||
|
V( 59, 0x0125, 57, 60, 0 ),
|
||||||
|
V( 60, 0x00f6, 58, 61, 0 ),
|
||||||
|
V( 61, 0x00cb, 59, 62, 0 ),
|
||||||
|
V( 62, 0x00ab, 61, 63, 0 ),
|
||||||
|
V( 63, 0x008f, 61, 32, 0 ),
|
||||||
|
V( 64, 0x5b12, 65, 65, 1 ),
|
||||||
|
V( 65, 0x4d04, 80, 66, 0 ),
|
||||||
|
V( 66, 0x412c, 81, 67, 0 ),
|
||||||
|
V( 67, 0x37d8, 82, 68, 0 ),
|
||||||
|
V( 68, 0x2fe8, 83, 69, 0 ),
|
||||||
|
V( 69, 0x293c, 84, 70, 0 ),
|
||||||
|
V( 70, 0x2379, 86, 71, 0 ),
|
||||||
|
V( 71, 0x1edf, 87, 72, 0 ),
|
||||||
|
V( 72, 0x1aa9, 87, 73, 0 ),
|
||||||
|
V( 73, 0x174e, 72, 74, 0 ),
|
||||||
|
V( 74, 0x1424, 72, 75, 0 ),
|
||||||
|
V( 75, 0x119c, 74, 76, 0 ),
|
||||||
|
V( 76, 0x0f6b, 74, 77, 0 ),
|
||||||
|
V( 77, 0x0d51, 75, 78, 0 ),
|
||||||
|
V( 78, 0x0bb6, 77, 79, 0 ),
|
||||||
|
V( 79, 0x0a40, 77, 48, 0 ),
|
||||||
|
V( 80, 0x5832, 80, 81, 1 ),
|
||||||
|
V( 81, 0x4d1c, 88, 82, 0 ),
|
||||||
|
V( 82, 0x438e, 89, 83, 0 ),
|
||||||
|
V( 83, 0x3bdd, 90, 84, 0 ),
|
||||||
|
V( 84, 0x34ee, 91, 85, 0 ),
|
||||||
|
V( 85, 0x2eae, 92, 86, 0 ),
|
||||||
|
V( 86, 0x299a, 93, 87, 0 ),
|
||||||
|
V( 87, 0x2516, 86, 71, 0 ),
|
||||||
|
V( 88, 0x5570, 88, 89, 1 ),
|
||||||
|
V( 89, 0x4ca9, 95, 90, 0 ),
|
||||||
|
V( 90, 0x44d9, 96, 91, 0 ),
|
||||||
|
V( 91, 0x3e22, 97, 92, 0 ),
|
||||||
|
V( 92, 0x3824, 99, 93, 0 ),
|
||||||
|
V( 93, 0x32b4, 99, 94, 0 ),
|
||||||
|
V( 94, 0x2e17, 93, 86, 0 ),
|
||||||
|
V( 95, 0x56a8, 95, 96, 1 ),
|
||||||
|
V( 96, 0x4f46, 101, 97, 0 ),
|
||||||
|
V( 97, 0x47e5, 102, 98, 0 ),
|
||||||
|
V( 98, 0x41cf, 103, 99, 0 ),
|
||||||
|
V( 99, 0x3c3d, 104, 100, 0 ),
|
||||||
|
V( 100, 0x375e, 99, 93, 0 ),
|
||||||
|
V( 101, 0x5231, 105, 102, 0 ),
|
||||||
|
V( 102, 0x4c0f, 106, 103, 0 ),
|
||||||
|
V( 103, 0x4639, 107, 104, 0 ),
|
||||||
|
V( 104, 0x415e, 103, 99, 0 ),
|
||||||
|
V( 105, 0x5627, 105, 106, 1 ),
|
||||||
|
V( 106, 0x50e7, 108, 107, 0 ),
|
||||||
|
V( 107, 0x4b85, 109, 103, 0 ),
|
||||||
|
V( 108, 0x5597, 110, 109, 0 ),
|
||||||
|
V( 109, 0x504f, 111, 107, 0 ),
|
||||||
|
V( 110, 0x5a10, 110, 111, 1 ),
|
||||||
|
V( 111, 0x5522, 112, 109, 0 ),
|
||||||
|
V( 112, 0x59eb, 112, 111, 1 ),
|
||||||
|
/*
|
||||||
|
* This last entry is used for fixed probability estimate of 0.5
|
||||||
|
* as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851.
|
||||||
|
*/
|
||||||
|
V( 113, 0x5a1d, 113, 113, 0 )
|
||||||
|
};
|
||||||
925
jcarith.c
Normal file
925
jcarith.c
Normal file
@@ -0,0 +1,925 @@
|
|||||||
|
/*
|
||||||
|
* jcarith.c
|
||||||
|
*
|
||||||
|
* Developed 1997-2009 by Guido Vollbeding.
|
||||||
|
* This file is part of the Independent JPEG Group's software.
|
||||||
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
|
*
|
||||||
|
* This file contains portable arithmetic entropy encoding routines for JPEG
|
||||||
|
* (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
|
||||||
|
*
|
||||||
|
* Both sequential and progressive modes are supported in this single module.
|
||||||
|
*
|
||||||
|
* Suspension is not currently supported in this module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "jinclude.h"
|
||||||
|
#include "jpeglib.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Expanded entropy encoder object for arithmetic encoding. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct jpeg_entropy_encoder pub; /* public fields */
|
||||||
|
|
||||||
|
INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */
|
||||||
|
INT32 a; /* A register, normalized size of coding interval */
|
||||||
|
INT32 sc; /* counter for stacked 0xFF values which might overflow */
|
||||||
|
INT32 zc; /* counter for pending 0x00 output values which might *
|
||||||
|
* be discarded at the end ("Pacman" termination) */
|
||||||
|
int ct; /* bit shift counter, determines when next byte will be written */
|
||||||
|
int buffer; /* buffer for most recent output byte != 0xFF */
|
||||||
|
|
||||||
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
||||||
|
int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
|
||||||
|
|
||||||
|
unsigned int restarts_to_go; /* MCUs left in this restart interval */
|
||||||
|
int next_restart_num; /* next restart number to write (0-7) */
|
||||||
|
|
||||||
|
/* Pointers to statistics areas (these workspaces have image lifespan) */
|
||||||
|
unsigned char * dc_stats[NUM_ARITH_TBLS];
|
||||||
|
unsigned char * ac_stats[NUM_ARITH_TBLS];
|
||||||
|
|
||||||
|
/* Statistics bin for coding with fixed probability 0.5 */
|
||||||
|
unsigned char fixed_bin[4];
|
||||||
|
} arith_entropy_encoder;
|
||||||
|
|
||||||
|
typedef arith_entropy_encoder * arith_entropy_ptr;
|
||||||
|
|
||||||
|
/* The following two definitions specify the allocation chunk size
|
||||||
|
* for the statistics area.
|
||||||
|
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
|
||||||
|
* 49 statistics bins for DC, and 245 statistics bins for AC coding.
|
||||||
|
*
|
||||||
|
* We use a compact representation with 1 byte per statistics bin,
|
||||||
|
* thus the numbers directly represent byte sizes.
|
||||||
|
* This 1 byte per statistics bin contains the meaning of the MPS
|
||||||
|
* (more probable symbol) in the highest bit (mask 0x80), and the
|
||||||
|
* index into the probability estimation state machine table
|
||||||
|
* in the lower bits (mask 0x7F).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DC_STAT_BINS 64
|
||||||
|
#define AC_STAT_BINS 256
|
||||||
|
|
||||||
|
/* NOTE: Uncomment the following #define if you want to use the
|
||||||
|
* given formula for calculating the AC conditioning parameter Kx
|
||||||
|
* for spectral selection progressive coding in section G.1.3.2
|
||||||
|
* of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
|
||||||
|
* Although the spec and P&M authors claim that this "has proven
|
||||||
|
* to give good results for 8 bit precision samples", I'm not
|
||||||
|
* convinced yet that this is really beneficial.
|
||||||
|
* Early tests gave only very marginal compression enhancements
|
||||||
|
* (a few - around 5 or so - bytes even for very large files),
|
||||||
|
* which would turn out rather negative if we'd suppress the
|
||||||
|
* DAC (Define Arithmetic Conditioning) marker segments for
|
||||||
|
* the default parameters in the future.
|
||||||
|
* Note that currently the marker writing module emits 12-byte
|
||||||
|
* DAC segments for a full-component scan in a color image.
|
||||||
|
* This is not worth worrying about IMHO. However, since the
|
||||||
|
* spec defines the default values to be used if the tables
|
||||||
|
* are omitted (unlike Huffman tables, which are required
|
||||||
|
* anyway), one might optimize this behaviour in the future,
|
||||||
|
* and then it would be disadvantageous to use custom tables if
|
||||||
|
* they don't provide sufficient gain to exceed the DAC size.
|
||||||
|
*
|
||||||
|
* On the other hand, I'd consider it as a reasonable result
|
||||||
|
* that the conditioning has no significant influence on the
|
||||||
|
* compression performance. This means that the basic
|
||||||
|
* statistical model is already rather stable.
|
||||||
|
*
|
||||||
|
* Thus, at the moment, we use the default conditioning values
|
||||||
|
* anyway, and do not use the custom formula.
|
||||||
|
*
|
||||||
|
#define CALCULATE_SPECTRAL_CONDITIONING
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
|
||||||
|
* We assume that int right shift is unsigned if INT32 right shift is,
|
||||||
|
* which should be safe.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef RIGHT_SHIFT_IS_UNSIGNED
|
||||||
|
#define ISHIFT_TEMPS int ishift_temp;
|
||||||
|
#define IRIGHT_SHIFT(x,shft) \
|
||||||
|
((ishift_temp = (x)) < 0 ? \
|
||||||
|
(ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
|
||||||
|
(ishift_temp >> (shft)))
|
||||||
|
#else
|
||||||
|
#define ISHIFT_TEMPS
|
||||||
|
#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
emit_byte (int val, j_compress_ptr cinfo)
|
||||||
|
/* Write next output byte; we do not support suspension in this module. */
|
||||||
|
{
|
||||||
|
struct jpeg_destination_mgr * dest = cinfo->dest;
|
||||||
|
|
||||||
|
*dest->next_output_byte++ = (JOCTET) val;
|
||||||
|
if (--dest->free_in_buffer == 0)
|
||||||
|
if (! (*dest->empty_output_buffer) (cinfo))
|
||||||
|
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finish up at the end of an arithmetic-compressed scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
finish_pass (j_compress_ptr cinfo)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
INT32 temp;
|
||||||
|
|
||||||
|
/* Section D.1.8: Termination of encoding */
|
||||||
|
|
||||||
|
/* Find the e->c in the coding interval with the largest
|
||||||
|
* number of trailing zero bits */
|
||||||
|
if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)
|
||||||
|
e->c = temp + 0x8000L;
|
||||||
|
else
|
||||||
|
e->c = temp;
|
||||||
|
/* Send remaining bytes to output */
|
||||||
|
e->c <<= e->ct;
|
||||||
|
if (e->c & 0xF8000000L) {
|
||||||
|
/* One final overflow has to be handled */
|
||||||
|
if (e->buffer >= 0) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
emit_byte(e->buffer + 1, cinfo);
|
||||||
|
if (e->buffer + 1 == 0xFF)
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
}
|
||||||
|
e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
|
||||||
|
e->sc = 0;
|
||||||
|
} else {
|
||||||
|
if (e->buffer == 0)
|
||||||
|
++e->zc;
|
||||||
|
else if (e->buffer >= 0) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
emit_byte(e->buffer, cinfo);
|
||||||
|
}
|
||||||
|
if (e->sc) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
do {
|
||||||
|
emit_byte(0xFF, cinfo);
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
} while (--e->sc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Output final bytes only if they are not 0x00 */
|
||||||
|
if (e->c & 0x7FFF800L) {
|
||||||
|
if (e->zc) /* output final pending zero bytes */
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
emit_byte((e->c >> 19) & 0xFF, cinfo);
|
||||||
|
if (((e->c >> 19) & 0xFF) == 0xFF)
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
if (e->c & 0x7F800L) {
|
||||||
|
emit_byte((e->c >> 11) & 0xFF, cinfo);
|
||||||
|
if (((e->c >> 11) & 0xFF) == 0xFF)
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The core arithmetic encoding routine (common in JPEG and JBIG).
|
||||||
|
* This needs to go as fast as possible.
|
||||||
|
* Machine-dependent optimization facilities
|
||||||
|
* are not utilized in this portable implementation.
|
||||||
|
* However, this code should be fairly efficient and
|
||||||
|
* may be a good base for further optimizations anyway.
|
||||||
|
*
|
||||||
|
* Parameter 'val' to be encoded may be 0 or 1 (binary decision).
|
||||||
|
*
|
||||||
|
* Note: I've added full "Pacman" termination support to the
|
||||||
|
* byte output routines, which is equivalent to the optional
|
||||||
|
* Discard_final_zeros procedure (Figure D.15) in the spec.
|
||||||
|
* Thus, we always produce the shortest possible output
|
||||||
|
* stream compliant to the spec (no trailing zero bytes,
|
||||||
|
* except for FF stuffing).
|
||||||
|
*
|
||||||
|
* I've also introduced a new scheme for accessing
|
||||||
|
* the probability estimation state machine table,
|
||||||
|
* derived from Markus Kuhn's JBIG implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
||||||
|
{
|
||||||
|
register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
register unsigned char nl, nm;
|
||||||
|
register INT32 qe, temp;
|
||||||
|
register int sv;
|
||||||
|
|
||||||
|
/* Fetch values from our compact representation of Table D.2:
|
||||||
|
* Qe values and probability estimation state machine
|
||||||
|
*/
|
||||||
|
sv = *st;
|
||||||
|
qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
|
||||||
|
nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
|
||||||
|
nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
|
||||||
|
|
||||||
|
/* Encode & estimation procedures per sections D.1.4 & D.1.5 */
|
||||||
|
e->a -= qe;
|
||||||
|
if (val != (sv >> 7)) {
|
||||||
|
/* Encode the less probable symbol */
|
||||||
|
if (e->a >= qe) {
|
||||||
|
/* If the interval size (qe) for the less probable symbol (LPS)
|
||||||
|
* is larger than the interval size for the MPS, then exchange
|
||||||
|
* the two symbols for coding efficiency, otherwise code the LPS
|
||||||
|
* as usual: */
|
||||||
|
e->c += e->a;
|
||||||
|
e->a = qe;
|
||||||
|
}
|
||||||
|
*st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
|
||||||
|
} else {
|
||||||
|
/* Encode the more probable symbol */
|
||||||
|
if (e->a >= 0x8000L)
|
||||||
|
return; /* A >= 0x8000 -> ready, no renormalization required */
|
||||||
|
if (e->a < qe) {
|
||||||
|
/* If the interval size (qe) for the less probable symbol (LPS)
|
||||||
|
* is larger than the interval size for the MPS, then exchange
|
||||||
|
* the two symbols for coding efficiency: */
|
||||||
|
e->c += e->a;
|
||||||
|
e->a = qe;
|
||||||
|
}
|
||||||
|
*st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Renormalization & data output per section D.1.6 */
|
||||||
|
do {
|
||||||
|
e->a <<= 1;
|
||||||
|
e->c <<= 1;
|
||||||
|
if (--e->ct == 0) {
|
||||||
|
/* Another byte is ready for output */
|
||||||
|
temp = e->c >> 19;
|
||||||
|
if (temp > 0xFF) {
|
||||||
|
/* Handle overflow over all stacked 0xFF bytes */
|
||||||
|
if (e->buffer >= 0) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
emit_byte(e->buffer + 1, cinfo);
|
||||||
|
if (e->buffer + 1 == 0xFF)
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
}
|
||||||
|
e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
|
||||||
|
e->sc = 0;
|
||||||
|
/* Note: The 3 spacer bits in the C register guarantee
|
||||||
|
* that the new buffer byte can't be 0xFF here
|
||||||
|
* (see page 160 in the P&M JPEG book). */
|
||||||
|
e->buffer = temp & 0xFF; /* new output byte, might overflow later */
|
||||||
|
} else if (temp == 0xFF) {
|
||||||
|
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
||||||
|
} else {
|
||||||
|
/* Output all stacked 0xFF bytes, they will not overflow any more */
|
||||||
|
if (e->buffer == 0)
|
||||||
|
++e->zc;
|
||||||
|
else if (e->buffer >= 0) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
emit_byte(e->buffer, cinfo);
|
||||||
|
}
|
||||||
|
if (e->sc) {
|
||||||
|
if (e->zc)
|
||||||
|
do emit_byte(0x00, cinfo);
|
||||||
|
while (--e->zc);
|
||||||
|
do {
|
||||||
|
emit_byte(0xFF, cinfo);
|
||||||
|
emit_byte(0x00, cinfo);
|
||||||
|
} while (--e->sc);
|
||||||
|
}
|
||||||
|
e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
|
||||||
|
}
|
||||||
|
e->c &= 0x7FFFFL;
|
||||||
|
e->ct += 8;
|
||||||
|
}
|
||||||
|
} while (e->a < 0x8000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Emit a restart marker & resynchronize predictions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
emit_restart (j_compress_ptr cinfo, int restart_num)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
int ci;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
|
||||||
|
finish_pass(cinfo);
|
||||||
|
|
||||||
|
emit_byte(0xFF, cinfo);
|
||||||
|
emit_byte(JPEG_RST0 + restart_num, cinfo);
|
||||||
|
|
||||||
|
/* Re-initialize statistics areas */
|
||||||
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
/* DC needs no table for refinement scan */
|
||||||
|
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
|
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
|
||||||
|
/* Reset DC predictions to 0 */
|
||||||
|
entropy->last_dc_val[ci] = 0;
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
}
|
||||||
|
/* AC needs no table when not present */
|
||||||
|
if (cinfo->progressive_mode == 0 || cinfo->Se) {
|
||||||
|
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset arithmetic encoding variables */
|
||||||
|
entropy->c = 0;
|
||||||
|
entropy->a = 0x10000L;
|
||||||
|
entropy->sc = 0;
|
||||||
|
entropy->zc = 0;
|
||||||
|
entropy->ct = 11;
|
||||||
|
entropy->buffer = -1; /* empty */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU encoding for DC initial scan (either spectral selection,
|
||||||
|
* or first pass of successive approximation).
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int blkn, ci, tbl;
|
||||||
|
int v, v2, m;
|
||||||
|
ISHIFT_TEMPS
|
||||||
|
|
||||||
|
/* Emit restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0) {
|
||||||
|
emit_restart(cinfo, entropy->next_restart_num);
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num++;
|
||||||
|
entropy->next_restart_num &= 7;
|
||||||
|
}
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode the MCU data blocks */
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
block = MCU_data[blkn];
|
||||||
|
ci = cinfo->MCU_membership[blkn];
|
||||||
|
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
||||||
|
|
||||||
|
/* Compute the DC value after the required point transform by Al.
|
||||||
|
* This is simply an arithmetic right shift.
|
||||||
|
*/
|
||||||
|
m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
|
||||||
|
|
||||||
|
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
||||||
|
|
||||||
|
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
||||||
|
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
||||||
|
|
||||||
|
/* Figure F.4: Encode_DC_DIFF */
|
||||||
|
if ((v = m - entropy->last_dc_val[ci]) == 0) {
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
} else {
|
||||||
|
entropy->last_dc_val[ci] = m;
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
/* Figure F.6: Encoding nonzero value v */
|
||||||
|
/* Figure F.7: Encoding the sign of v */
|
||||||
|
if (v > 0) {
|
||||||
|
arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
|
||||||
|
st += 2; /* Table F.4: SP = S0 + 2 */
|
||||||
|
entropy->dc_context[ci] = 4; /* small positive diff category */
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
|
||||||
|
st += 3; /* Table F.4: SN = S0 + 3 */
|
||||||
|
entropy->dc_context[ci] = 8; /* small negative diff category */
|
||||||
|
}
|
||||||
|
/* Figure F.8: Encoding the magnitude category of v */
|
||||||
|
m = 0;
|
||||||
|
if (v -= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m = 1;
|
||||||
|
v2 = v;
|
||||||
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
|
while (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
||||||
|
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] += 8; /* large diff category */
|
||||||
|
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU encoding for AC initial scan (either spectral selection,
|
||||||
|
* or first pass of successive approximation).
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int tbl, k, ke;
|
||||||
|
int v, v2, m;
|
||||||
|
|
||||||
|
/* Emit restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0) {
|
||||||
|
emit_restart(cinfo, entropy->next_restart_num);
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num++;
|
||||||
|
entropy->next_restart_num &= 7;
|
||||||
|
}
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode the MCU data block */
|
||||||
|
block = MCU_data[0];
|
||||||
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
|
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
||||||
|
|
||||||
|
/* Establish EOB (end-of-block) index */
|
||||||
|
for (ke = cinfo->Se; ke > 0; ke--)
|
||||||
|
/* We must apply the point transform by Al. For AC coefficients this
|
||||||
|
* is an integer division with rounding towards 0. To do this portably
|
||||||
|
* in C, we shift after obtaining the absolute value.
|
||||||
|
*/
|
||||||
|
if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
|
||||||
|
if (v >>= cinfo->Al) break;
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
if (v >>= cinfo->Al) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Figure F.5: Encode_AC_Coefficients */
|
||||||
|
for (k = cinfo->Ss; k <= ke; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
arith_encode(cinfo, st, 0); /* EOB decision */
|
||||||
|
for (;;) {
|
||||||
|
if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
|
||||||
|
if (v >>= cinfo->Al) {
|
||||||
|
arith_encode(cinfo, st + 1, 1);
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
if (v >>= cinfo->Al) {
|
||||||
|
arith_encode(cinfo, st + 1, 1);
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st + 1, 0); st += 3; k++;
|
||||||
|
}
|
||||||
|
st += 2;
|
||||||
|
/* Figure F.8: Encoding the magnitude category of v */
|
||||||
|
m = 0;
|
||||||
|
if (v -= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m = 1;
|
||||||
|
v2 = v;
|
||||||
|
if (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st = entropy->ac_stats[tbl] +
|
||||||
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
|
while (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
||||||
|
}
|
||||||
|
/* Encode EOB decision only if k <= cinfo->Se */
|
||||||
|
if (k <= cinfo->Se) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU encoding for DC successive approximation refinement scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
unsigned char *st;
|
||||||
|
int Al, blkn;
|
||||||
|
|
||||||
|
/* Emit restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0) {
|
||||||
|
emit_restart(cinfo, entropy->next_restart_num);
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num++;
|
||||||
|
entropy->next_restart_num &= 7;
|
||||||
|
}
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
st = entropy->fixed_bin; /* use fixed probability estimation */
|
||||||
|
Al = cinfo->Al;
|
||||||
|
|
||||||
|
/* Encode the MCU data blocks */
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
/* We simply emit the Al'th bit of the DC coefficient value. */
|
||||||
|
arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU encoding for AC successive approximation refinement scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int tbl, k, ke, kex;
|
||||||
|
int v;
|
||||||
|
|
||||||
|
/* Emit restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0) {
|
||||||
|
emit_restart(cinfo, entropy->next_restart_num);
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num++;
|
||||||
|
entropy->next_restart_num &= 7;
|
||||||
|
}
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode the MCU data block */
|
||||||
|
block = MCU_data[0];
|
||||||
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
|
/* Section G.1.3.3: Encoding of AC coefficients */
|
||||||
|
|
||||||
|
/* Establish EOB (end-of-block) index */
|
||||||
|
for (ke = cinfo->Se; ke > 0; ke--)
|
||||||
|
/* We must apply the point transform by Al. For AC coefficients this
|
||||||
|
* is an integer division with rounding towards 0. To do this portably
|
||||||
|
* in C, we shift after obtaining the absolute value.
|
||||||
|
*/
|
||||||
|
if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
|
||||||
|
if (v >>= cinfo->Al) break;
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
if (v >>= cinfo->Al) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
|
for (kex = ke; kex > 0; kex--)
|
||||||
|
if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) {
|
||||||
|
if (v >>= cinfo->Ah) break;
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
if (v >>= cinfo->Ah) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Figure G.10: Encode_AC_Coefficients_SA */
|
||||||
|
for (k = cinfo->Ss; k <= ke; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
if (k > kex)
|
||||||
|
arith_encode(cinfo, st, 0); /* EOB decision */
|
||||||
|
for (;;) {
|
||||||
|
if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
|
||||||
|
if (v >>= cinfo->Al) {
|
||||||
|
if (v >> 1) /* previously nonzero coef */
|
||||||
|
arith_encode(cinfo, st + 2, (v & 1));
|
||||||
|
else { /* newly nonzero coef */
|
||||||
|
arith_encode(cinfo, st + 1, 1);
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
if (v >>= cinfo->Al) {
|
||||||
|
if (v >> 1) /* previously nonzero coef */
|
||||||
|
arith_encode(cinfo, st + 2, (v & 1));
|
||||||
|
else { /* newly nonzero coef */
|
||||||
|
arith_encode(cinfo, st + 1, 1);
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st + 1, 0); st += 3; k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Encode EOB decision only if k <= cinfo->Se */
|
||||||
|
if (k <= cinfo->Se) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode and output one MCU's worth of arithmetic-compressed coefficients.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int blkn, ci, tbl, k, ke;
|
||||||
|
int v, v2, m;
|
||||||
|
|
||||||
|
/* Emit restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0) {
|
||||||
|
emit_restart(cinfo, entropy->next_restart_num);
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num++;
|
||||||
|
entropy->next_restart_num &= 7;
|
||||||
|
}
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Encode the MCU data blocks */
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
block = MCU_data[blkn];
|
||||||
|
ci = cinfo->MCU_membership[blkn];
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
|
||||||
|
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
||||||
|
|
||||||
|
tbl = compptr->dc_tbl_no;
|
||||||
|
|
||||||
|
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
||||||
|
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
||||||
|
|
||||||
|
/* Figure F.4: Encode_DC_DIFF */
|
||||||
|
if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
} else {
|
||||||
|
entropy->last_dc_val[ci] = (*block)[0];
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
/* Figure F.6: Encoding nonzero value v */
|
||||||
|
/* Figure F.7: Encoding the sign of v */
|
||||||
|
if (v > 0) {
|
||||||
|
arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
|
||||||
|
st += 2; /* Table F.4: SP = S0 + 2 */
|
||||||
|
entropy->dc_context[ci] = 4; /* small positive diff category */
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
|
||||||
|
st += 3; /* Table F.4: SN = S0 + 3 */
|
||||||
|
entropy->dc_context[ci] = 8; /* small negative diff category */
|
||||||
|
}
|
||||||
|
/* Figure F.8: Encoding the magnitude category of v */
|
||||||
|
m = 0;
|
||||||
|
if (v -= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m = 1;
|
||||||
|
v2 = v;
|
||||||
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
|
while (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
||||||
|
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] += 8; /* large diff category */
|
||||||
|
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
||||||
|
|
||||||
|
tbl = compptr->ac_tbl_no;
|
||||||
|
|
||||||
|
/* Establish EOB (end-of-block) index */
|
||||||
|
for (ke = DCTSIZE2 - 1; ke > 0; ke--)
|
||||||
|
if ((*block)[jpeg_natural_order[ke]]) break;
|
||||||
|
|
||||||
|
/* Figure F.5: Encode_AC_Coefficients */
|
||||||
|
for (k = 1; k <= ke; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
arith_encode(cinfo, st, 0); /* EOB decision */
|
||||||
|
while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
|
||||||
|
arith_encode(cinfo, st + 1, 0); st += 3; k++;
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st + 1, 1);
|
||||||
|
/* Figure F.6: Encoding nonzero value v */
|
||||||
|
/* Figure F.7: Encoding the sign of v */
|
||||||
|
if (v > 0) {
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 0);
|
||||||
|
} else {
|
||||||
|
v = -v;
|
||||||
|
arith_encode(cinfo, entropy->fixed_bin, 1);
|
||||||
|
}
|
||||||
|
st += 2;
|
||||||
|
/* Figure F.8: Encoding the magnitude category of v */
|
||||||
|
m = 0;
|
||||||
|
if (v -= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m = 1;
|
||||||
|
v2 = v;
|
||||||
|
if (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st = entropy->ac_stats[tbl] +
|
||||||
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
|
while (v2 >>= 1) {
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
m <<= 1;
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arith_encode(cinfo, st, 0);
|
||||||
|
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
||||||
|
}
|
||||||
|
/* Encode EOB decision only if k <= DCTSIZE2 - 1 */
|
||||||
|
if (k <= DCTSIZE2 - 1) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
arith_encode(cinfo, st, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize for an arithmetic-compressed scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
start_pass (j_compress_ptr cinfo, boolean gather_statistics)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
int ci, tbl;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
|
||||||
|
if (gather_statistics)
|
||||||
|
/* Make sure to avoid that in the master control logic!
|
||||||
|
* We are fully adaptive here and need no extra
|
||||||
|
* statistics gathering pass!
|
||||||
|
*/
|
||||||
|
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
||||||
|
|
||||||
|
/* We assume jcmaster.c already validated the progressive scan parameters. */
|
||||||
|
|
||||||
|
/* Select execution routines */
|
||||||
|
if (cinfo->progressive_mode) {
|
||||||
|
if (cinfo->Ah == 0) {
|
||||||
|
if (cinfo->Ss == 0)
|
||||||
|
entropy->pub.encode_mcu = encode_mcu_DC_first;
|
||||||
|
else
|
||||||
|
entropy->pub.encode_mcu = encode_mcu_AC_first;
|
||||||
|
} else {
|
||||||
|
if (cinfo->Ss == 0)
|
||||||
|
entropy->pub.encode_mcu = encode_mcu_DC_refine;
|
||||||
|
else
|
||||||
|
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
entropy->pub.encode_mcu = encode_mcu;
|
||||||
|
|
||||||
|
/* Allocate & initialize requested statistics areas */
|
||||||
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
/* DC needs no table for refinement scan */
|
||||||
|
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
|
tbl = compptr->dc_tbl_no;
|
||||||
|
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
||||||
|
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
||||||
|
if (entropy->dc_stats[tbl] == NULL)
|
||||||
|
entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
||||||
|
MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
|
||||||
|
/* Initialize DC predictions to 0 */
|
||||||
|
entropy->last_dc_val[ci] = 0;
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
}
|
||||||
|
/* AC needs no table when not present */
|
||||||
|
if (cinfo->progressive_mode == 0 || cinfo->Se) {
|
||||||
|
tbl = compptr->ac_tbl_no;
|
||||||
|
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
||||||
|
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
||||||
|
if (entropy->ac_stats[tbl] == NULL)
|
||||||
|
entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
||||||
|
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
|
||||||
|
#ifdef CALCULATE_SPECTRAL_CONDITIONING
|
||||||
|
if (cinfo->progressive_mode)
|
||||||
|
/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
|
||||||
|
cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize arithmetic encoding variables */
|
||||||
|
entropy->c = 0;
|
||||||
|
entropy->a = 0x10000L;
|
||||||
|
entropy->sc = 0;
|
||||||
|
entropy->zc = 0;
|
||||||
|
entropy->ct = 11;
|
||||||
|
entropy->buffer = -1; /* empty */
|
||||||
|
|
||||||
|
/* Initialize restart stuff */
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
entropy->next_restart_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Module initialization routine for arithmetic entropy encoding.
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jinit_arith_encoder (j_compress_ptr cinfo)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
entropy = (arith_entropy_ptr)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
SIZEOF(arith_entropy_encoder));
|
||||||
|
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
|
||||||
|
entropy->pub.start_pass = start_pass;
|
||||||
|
entropy->pub.finish_pass = finish_pass;
|
||||||
|
|
||||||
|
/* Mark tables unallocated */
|
||||||
|
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
||||||
|
entropy->dc_stats[i] = NULL;
|
||||||
|
entropy->ac_stats[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize index for fixed probability estimation */
|
||||||
|
entropy->fixed_bin[0] = 113;
|
||||||
|
}
|
||||||
4
jcinit.c
4
jcinit.c
@@ -42,7 +42,11 @@ jinit_compress_master (j_compress_ptr cinfo)
|
|||||||
jinit_forward_dct(cinfo);
|
jinit_forward_dct(cinfo);
|
||||||
/* Entropy encoding: either Huffman or arithmetic coding. */
|
/* Entropy encoding: either Huffman or arithmetic coding. */
|
||||||
if (cinfo->arith_code) {
|
if (cinfo->arith_code) {
|
||||||
|
#ifdef C_ARITH_CODING_SUPPORTED
|
||||||
|
jinit_arith_encoder(cinfo);
|
||||||
|
#else
|
||||||
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||||
|
|||||||
@@ -174,7 +174,11 @@ transencode_master_selection (j_compress_ptr cinfo,
|
|||||||
|
|
||||||
/* Entropy encoding: either Huffman or arithmetic coding. */
|
/* Entropy encoding: either Huffman or arithmetic coding. */
|
||||||
if (cinfo->arith_code) {
|
if (cinfo->arith_code) {
|
||||||
|
#ifdef C_ARITH_CODING_SUPPORTED
|
||||||
|
jinit_arith_encoder(cinfo);
|
||||||
|
#else
|
||||||
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||||
|
|||||||
761
jdarith.c
Normal file
761
jdarith.c
Normal file
@@ -0,0 +1,761 @@
|
|||||||
|
/*
|
||||||
|
* jdarith.c
|
||||||
|
*
|
||||||
|
* Developed 1997-2009 by Guido Vollbeding.
|
||||||
|
* This file is part of the Independent JPEG Group's software.
|
||||||
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
|
*
|
||||||
|
* This file contains portable arithmetic entropy decoding routines for JPEG
|
||||||
|
* (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
|
||||||
|
*
|
||||||
|
* Both sequential and progressive modes are supported in this single module.
|
||||||
|
*
|
||||||
|
* Suspension is not currently supported in this module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "jinclude.h"
|
||||||
|
#include "jpeglib.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Expanded entropy decoder object for arithmetic decoding. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct jpeg_entropy_decoder pub; /* public fields */
|
||||||
|
|
||||||
|
INT32 c; /* C register, base of coding interval + input bit buffer */
|
||||||
|
INT32 a; /* A register, normalized size of coding interval */
|
||||||
|
int ct; /* bit shift counter, # of bits left in bit buffer part of C */
|
||||||
|
/* init: ct = -16 */
|
||||||
|
/* run: ct = 0..7 */
|
||||||
|
/* error: ct = -1 */
|
||||||
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
||||||
|
int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
|
||||||
|
|
||||||
|
unsigned int restarts_to_go; /* MCUs left in this restart interval */
|
||||||
|
|
||||||
|
/* Pointers to statistics areas (these workspaces have image lifespan) */
|
||||||
|
unsigned char * dc_stats[NUM_ARITH_TBLS];
|
||||||
|
unsigned char * ac_stats[NUM_ARITH_TBLS];
|
||||||
|
|
||||||
|
/* Statistics bin for coding with fixed probability 0.5 */
|
||||||
|
unsigned char fixed_bin[4];
|
||||||
|
} arith_entropy_decoder;
|
||||||
|
|
||||||
|
typedef arith_entropy_decoder * arith_entropy_ptr;
|
||||||
|
|
||||||
|
/* The following two definitions specify the allocation chunk size
|
||||||
|
* for the statistics area.
|
||||||
|
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
|
||||||
|
* 49 statistics bins for DC, and 245 statistics bins for AC coding.
|
||||||
|
*
|
||||||
|
* We use a compact representation with 1 byte per statistics bin,
|
||||||
|
* thus the numbers directly represent byte sizes.
|
||||||
|
* This 1 byte per statistics bin contains the meaning of the MPS
|
||||||
|
* (more probable symbol) in the highest bit (mask 0x80), and the
|
||||||
|
* index into the probability estimation state machine table
|
||||||
|
* in the lower bits (mask 0x7F).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DC_STAT_BINS 64
|
||||||
|
#define AC_STAT_BINS 256
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL(int)
|
||||||
|
get_byte (j_decompress_ptr cinfo)
|
||||||
|
/* Read next input byte; we do not support suspension in this module. */
|
||||||
|
{
|
||||||
|
struct jpeg_source_mgr * src = cinfo->src;
|
||||||
|
|
||||||
|
if (src->bytes_in_buffer == 0)
|
||||||
|
if (! (*src->fill_input_buffer) (cinfo))
|
||||||
|
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
||||||
|
src->bytes_in_buffer--;
|
||||||
|
return GETJOCTET(*src->next_input_byte++);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The core arithmetic decoding routine (common in JPEG and JBIG).
|
||||||
|
* This needs to go as fast as possible.
|
||||||
|
* Machine-dependent optimization facilities
|
||||||
|
* are not utilized in this portable implementation.
|
||||||
|
* However, this code should be fairly efficient and
|
||||||
|
* may be a good base for further optimizations anyway.
|
||||||
|
*
|
||||||
|
* Return value is 0 or 1 (binary decision).
|
||||||
|
*
|
||||||
|
* Note: I've changed the handling of the code base & bit
|
||||||
|
* buffer register C compared to other implementations
|
||||||
|
* based on the standards layout & procedures.
|
||||||
|
* While it also contains both the actual base of the
|
||||||
|
* coding interval (16 bits) and the next-bits buffer,
|
||||||
|
* the cut-point between these two parts is floating
|
||||||
|
* (instead of fixed) with the bit shift counter CT.
|
||||||
|
* Thus, we also need only one (variable instead of
|
||||||
|
* fixed size) shift for the LPS/MPS decision, and
|
||||||
|
* we can get away with any renormalization update
|
||||||
|
* of C (except for new data insertion, of course).
|
||||||
|
*
|
||||||
|
* I've also introduced a new scheme for accessing
|
||||||
|
* the probability estimation state machine table,
|
||||||
|
* derived from Markus Kuhn's JBIG implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LOCAL(int)
|
||||||
|
arith_decode (j_decompress_ptr cinfo, unsigned char *st)
|
||||||
|
{
|
||||||
|
register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
register unsigned char nl, nm;
|
||||||
|
register INT32 qe, temp;
|
||||||
|
register int sv, data;
|
||||||
|
|
||||||
|
/* Renormalization & data input per section D.2.6 */
|
||||||
|
while (e->a < 0x8000L) {
|
||||||
|
if (--e->ct < 0) {
|
||||||
|
/* Need to fetch next data byte */
|
||||||
|
if (cinfo->unread_marker)
|
||||||
|
data = 0; /* stuff zero data */
|
||||||
|
else {
|
||||||
|
data = get_byte(cinfo); /* read next input byte */
|
||||||
|
if (data == 0xFF) { /* zero stuff or marker code */
|
||||||
|
do data = get_byte(cinfo);
|
||||||
|
while (data == 0xFF); /* swallow extra 0xFF bytes */
|
||||||
|
if (data == 0)
|
||||||
|
data = 0xFF; /* discard stuffed zero byte */
|
||||||
|
else {
|
||||||
|
/* Note: Different from the Huffman decoder, hitting
|
||||||
|
* a marker while processing the compressed data
|
||||||
|
* segment is legal in arithmetic coding.
|
||||||
|
* The convention is to supply zero data
|
||||||
|
* then until decoding is complete.
|
||||||
|
*/
|
||||||
|
cinfo->unread_marker = data;
|
||||||
|
data = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e->c = (e->c << 8) | data; /* insert data into C register */
|
||||||
|
if ((e->ct += 8) < 0) /* update bit shift counter */
|
||||||
|
/* Need more initial bytes */
|
||||||
|
if (++e->ct == 0)
|
||||||
|
/* Got 2 initial bytes -> re-init A and exit loop */
|
||||||
|
e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */
|
||||||
|
}
|
||||||
|
e->a <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fetch values from our compact representation of Table D.2:
|
||||||
|
* Qe values and probability estimation state machine
|
||||||
|
*/
|
||||||
|
sv = *st;
|
||||||
|
qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
|
||||||
|
nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
|
||||||
|
nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
|
||||||
|
|
||||||
|
/* Decode & estimation procedures per sections D.2.4 & D.2.5 */
|
||||||
|
temp = e->a - qe;
|
||||||
|
e->a = temp;
|
||||||
|
temp <<= e->ct;
|
||||||
|
if (e->c >= temp) {
|
||||||
|
e->c -= temp;
|
||||||
|
/* Conditional LPS (less probable symbol) exchange */
|
||||||
|
if (e->a < qe) {
|
||||||
|
e->a = qe;
|
||||||
|
*st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
|
||||||
|
} else {
|
||||||
|
e->a = qe;
|
||||||
|
*st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
|
||||||
|
sv ^= 0x80; /* Exchange LPS/MPS */
|
||||||
|
}
|
||||||
|
} else if (e->a < 0x8000L) {
|
||||||
|
/* Conditional MPS (more probable symbol) exchange */
|
||||||
|
if (e->a < qe) {
|
||||||
|
*st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
|
||||||
|
sv ^= 0x80; /* Exchange LPS/MPS */
|
||||||
|
} else {
|
||||||
|
*st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sv >> 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for a restart marker & resynchronize decoder.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LOCAL(void)
|
||||||
|
process_restart (j_decompress_ptr cinfo)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
int ci;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
|
||||||
|
/* Advance past the RSTn marker */
|
||||||
|
if (! (*cinfo->marker->read_restart_marker) (cinfo))
|
||||||
|
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
||||||
|
|
||||||
|
/* Re-initialize statistics areas */
|
||||||
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
|
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
|
||||||
|
/* Reset DC predictions to 0 */
|
||||||
|
entropy->last_dc_val[ci] = 0;
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
}
|
||||||
|
if (! cinfo->progressive_mode || cinfo->Ss) {
|
||||||
|
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset arithmetic decoding variables */
|
||||||
|
entropy->c = 0;
|
||||||
|
entropy->a = 0;
|
||||||
|
entropy->ct = -16; /* force reading 2 initial bytes to fill C */
|
||||||
|
|
||||||
|
/* Reset restart counter */
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arithmetic MCU decoding.
|
||||||
|
* Each of these routines decodes and returns one MCU's worth of
|
||||||
|
* arithmetic-compressed coefficients.
|
||||||
|
* The coefficients are reordered from zigzag order into natural array order,
|
||||||
|
* but are not dequantized.
|
||||||
|
*
|
||||||
|
* The i'th block of the MCU is stored into the block pointed to by
|
||||||
|
* MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU decoding for DC initial scan (either spectral selection,
|
||||||
|
* or first pass of successive approximation).
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int blkn, ci, tbl, sign;
|
||||||
|
int v, m;
|
||||||
|
|
||||||
|
/* Process restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0)
|
||||||
|
process_restart(cinfo);
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entropy->ct == -1) return TRUE; /* if error do nothing */
|
||||||
|
|
||||||
|
/* Outer loop handles each block in the MCU */
|
||||||
|
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
block = MCU_data[blkn];
|
||||||
|
ci = cinfo->MCU_membership[blkn];
|
||||||
|
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
||||||
|
|
||||||
|
/* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
|
||||||
|
|
||||||
|
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
||||||
|
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
||||||
|
|
||||||
|
/* Figure F.19: Decode_DC_DIFF */
|
||||||
|
if (arith_decode(cinfo, st) == 0)
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
else {
|
||||||
|
/* Figure F.21: Decoding nonzero value v */
|
||||||
|
/* Figure F.22: Decoding the sign of v */
|
||||||
|
sign = arith_decode(cinfo, st + 1);
|
||||||
|
st += 2; st += sign;
|
||||||
|
/* Figure F.23: Decoding the magnitude category of v */
|
||||||
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
|
while (arith_decode(cinfo, st)) {
|
||||||
|
if ((m <<= 1) == 0x8000) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
||||||
|
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
|
||||||
|
else
|
||||||
|
entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */
|
||||||
|
v = m;
|
||||||
|
/* Figure F.24: Decoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
if (arith_decode(cinfo, st)) v |= m;
|
||||||
|
v += 1; if (sign) v = -v;
|
||||||
|
entropy->last_dc_val[ci] += v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */
|
||||||
|
(*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU decoding for AC initial scan (either spectral selection,
|
||||||
|
* or first pass of successive approximation).
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int tbl, sign, k;
|
||||||
|
int v, m;
|
||||||
|
|
||||||
|
/* Process restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0)
|
||||||
|
process_restart(cinfo);
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entropy->ct == -1) return TRUE; /* if error do nothing */
|
||||||
|
|
||||||
|
/* There is always only one block per MCU */
|
||||||
|
block = MCU_data[0];
|
||||||
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
|
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
|
||||||
|
|
||||||
|
/* Figure F.20: Decode_AC_coefficients */
|
||||||
|
for (k = cinfo->Ss; k <= cinfo->Se; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
||||||
|
while (arith_decode(cinfo, st + 1) == 0) {
|
||||||
|
st += 3; k++;
|
||||||
|
if (k > cinfo->Se) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* spectral overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Figure F.21: Decoding nonzero value v */
|
||||||
|
/* Figure F.22: Decoding the sign of v */
|
||||||
|
sign = arith_decode(cinfo, entropy->fixed_bin);
|
||||||
|
st += 2;
|
||||||
|
/* Figure F.23: Decoding the magnitude category of v */
|
||||||
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
|
if (arith_decode(cinfo, st)) {
|
||||||
|
m <<= 1;
|
||||||
|
st = entropy->ac_stats[tbl] +
|
||||||
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
|
while (arith_decode(cinfo, st)) {
|
||||||
|
if ((m <<= 1) == 0x8000) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v = m;
|
||||||
|
/* Figure F.24: Decoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
if (arith_decode(cinfo, st)) v |= m;
|
||||||
|
v += 1; if (sign) v = -v;
|
||||||
|
/* Scale and output coefficient in natural (dezigzagged) order */
|
||||||
|
(*block)[jpeg_natural_order[k]] = (JCOEF) (v << cinfo->Al);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU decoding for DC successive approximation refinement scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
unsigned char *st;
|
||||||
|
int p1, blkn;
|
||||||
|
|
||||||
|
/* Process restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0)
|
||||||
|
process_restart(cinfo);
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
st = entropy->fixed_bin; /* use fixed probability estimation */
|
||||||
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
|
|
||||||
|
/* Outer loop handles each block in the MCU */
|
||||||
|
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
/* Encoded data is simply the next bit of the two's-complement DC value */
|
||||||
|
if (arith_decode(cinfo, st))
|
||||||
|
MCU_data[blkn][0][0] |= p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MCU decoding for AC successive approximation refinement scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
JBLOCKROW block;
|
||||||
|
JCOEFPTR thiscoef;
|
||||||
|
unsigned char *st;
|
||||||
|
int tbl, k, kex;
|
||||||
|
int p1, m1;
|
||||||
|
|
||||||
|
/* Process restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0)
|
||||||
|
process_restart(cinfo);
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entropy->ct == -1) return TRUE; /* if error do nothing */
|
||||||
|
|
||||||
|
/* There is always only one block per MCU */
|
||||||
|
block = MCU_data[0];
|
||||||
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
|
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
||||||
|
|
||||||
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
|
for (kex = cinfo->Se; kex > 0; kex--)
|
||||||
|
if ((*block)[jpeg_natural_order[kex]]) break;
|
||||||
|
|
||||||
|
for (k = cinfo->Ss; k <= cinfo->Se; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
if (k > kex)
|
||||||
|
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
||||||
|
for (;;) {
|
||||||
|
thiscoef = *block + jpeg_natural_order[k];
|
||||||
|
if (*thiscoef) { /* previously nonzero coef */
|
||||||
|
if (arith_decode(cinfo, st + 2)) {
|
||||||
|
if (*thiscoef < 0)
|
||||||
|
*thiscoef += m1;
|
||||||
|
else
|
||||||
|
*thiscoef += p1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */
|
||||||
|
if (arith_decode(cinfo, entropy->fixed_bin))
|
||||||
|
*thiscoef = m1;
|
||||||
|
else
|
||||||
|
*thiscoef = p1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
st += 3; k++;
|
||||||
|
if (k > cinfo->Se) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* spectral overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decode one MCU's worth of arithmetic-compressed coefficients.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(boolean)
|
||||||
|
decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
JBLOCKROW block;
|
||||||
|
unsigned char *st;
|
||||||
|
int blkn, ci, tbl, sign, k;
|
||||||
|
int v, m;
|
||||||
|
|
||||||
|
/* Process restart marker if needed */
|
||||||
|
if (cinfo->restart_interval) {
|
||||||
|
if (entropy->restarts_to_go == 0)
|
||||||
|
process_restart(cinfo);
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entropy->ct == -1) return TRUE; /* if error do nothing */
|
||||||
|
|
||||||
|
/* Outer loop handles each block in the MCU */
|
||||||
|
|
||||||
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
|
block = MCU_data[blkn];
|
||||||
|
ci = cinfo->MCU_membership[blkn];
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
|
||||||
|
/* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
|
||||||
|
|
||||||
|
tbl = compptr->dc_tbl_no;
|
||||||
|
|
||||||
|
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
||||||
|
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
||||||
|
|
||||||
|
/* Figure F.19: Decode_DC_DIFF */
|
||||||
|
if (arith_decode(cinfo, st) == 0)
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
else {
|
||||||
|
/* Figure F.21: Decoding nonzero value v */
|
||||||
|
/* Figure F.22: Decoding the sign of v */
|
||||||
|
sign = arith_decode(cinfo, st + 1);
|
||||||
|
st += 2; st += sign;
|
||||||
|
/* Figure F.23: Decoding the magnitude category of v */
|
||||||
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
|
while (arith_decode(cinfo, st)) {
|
||||||
|
if ((m <<= 1) == 0x8000) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
||||||
|
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 0; /* zero diff category */
|
||||||
|
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
||||||
|
entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
|
||||||
|
else
|
||||||
|
entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */
|
||||||
|
v = m;
|
||||||
|
/* Figure F.24: Decoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
if (arith_decode(cinfo, st)) v |= m;
|
||||||
|
v += 1; if (sign) v = -v;
|
||||||
|
entropy->last_dc_val[ci] += v;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*block)[0] = (JCOEF) entropy->last_dc_val[ci];
|
||||||
|
|
||||||
|
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
|
||||||
|
|
||||||
|
tbl = compptr->ac_tbl_no;
|
||||||
|
|
||||||
|
/* Figure F.20: Decode_AC_coefficients */
|
||||||
|
for (k = 1; k <= DCTSIZE2 - 1; k++) {
|
||||||
|
st = entropy->ac_stats[tbl] + 3 * (k - 1);
|
||||||
|
if (arith_decode(cinfo, st)) break; /* EOB flag */
|
||||||
|
while (arith_decode(cinfo, st + 1) == 0) {
|
||||||
|
st += 3; k++;
|
||||||
|
if (k > DCTSIZE2 - 1) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* spectral overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Figure F.21: Decoding nonzero value v */
|
||||||
|
/* Figure F.22: Decoding the sign of v */
|
||||||
|
sign = arith_decode(cinfo, entropy->fixed_bin);
|
||||||
|
st += 2;
|
||||||
|
/* Figure F.23: Decoding the magnitude category of v */
|
||||||
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
|
if (arith_decode(cinfo, st)) {
|
||||||
|
m <<= 1;
|
||||||
|
st = entropy->ac_stats[tbl] +
|
||||||
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
|
while (arith_decode(cinfo, st)) {
|
||||||
|
if ((m <<= 1) == 0x8000) {
|
||||||
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
st += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v = m;
|
||||||
|
/* Figure F.24: Decoding the magnitude bit pattern of v */
|
||||||
|
st += 14;
|
||||||
|
while (m >>= 1)
|
||||||
|
if (arith_decode(cinfo, st)) v |= m;
|
||||||
|
v += 1; if (sign) v = -v;
|
||||||
|
(*block)[jpeg_natural_order[k]] = (JCOEF) v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize for an arithmetic-compressed scan.
|
||||||
|
*/
|
||||||
|
|
||||||
|
METHODDEF(void)
|
||||||
|
start_pass (j_decompress_ptr cinfo)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
|
int ci, tbl;
|
||||||
|
jpeg_component_info * compptr;
|
||||||
|
|
||||||
|
if (cinfo->progressive_mode) {
|
||||||
|
/* Validate progressive scan parameters */
|
||||||
|
if (cinfo->Ss == 0) {
|
||||||
|
if (cinfo->Se != 0)
|
||||||
|
goto bad;
|
||||||
|
} else {
|
||||||
|
/* need not check Ss/Se < 0 since they came from unsigned bytes */
|
||||||
|
if (cinfo->Se < cinfo->Ss || cinfo->Se > DCTSIZE2 - 1)
|
||||||
|
goto bad;
|
||||||
|
/* AC scans may have only one component */
|
||||||
|
if (cinfo->comps_in_scan != 1)
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
if (cinfo->Ah != 0) {
|
||||||
|
/* Successive approximation refinement scan: must have Al = Ah-1. */
|
||||||
|
if (cinfo->Ah-1 != cinfo->Al)
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
if (cinfo->Al > 13) { /* need not check for < 0 */
|
||||||
|
bad:
|
||||||
|
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
||||||
|
cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
|
||||||
|
}
|
||||||
|
/* Update progression status, and verify that scan order is legal.
|
||||||
|
* Note that inter-scan inconsistencies are treated as warnings
|
||||||
|
* not fatal errors ... not clear if this is right way to behave.
|
||||||
|
*/
|
||||||
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
|
int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;
|
||||||
|
int *coef_bit_ptr = & cinfo->coef_bits[cindex][0];
|
||||||
|
if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
|
||||||
|
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
|
||||||
|
for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
|
||||||
|
int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
|
||||||
|
if (cinfo->Ah != expected)
|
||||||
|
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
|
||||||
|
coef_bit_ptr[coefi] = cinfo->Al;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Select MCU decoding routine */
|
||||||
|
if (cinfo->Ah == 0) {
|
||||||
|
if (cinfo->Ss == 0)
|
||||||
|
entropy->pub.decode_mcu = decode_mcu_DC_first;
|
||||||
|
else
|
||||||
|
entropy->pub.decode_mcu = decode_mcu_AC_first;
|
||||||
|
} else {
|
||||||
|
if (cinfo->Ss == 0)
|
||||||
|
entropy->pub.decode_mcu = decode_mcu_DC_refine;
|
||||||
|
else
|
||||||
|
entropy->pub.decode_mcu = decode_mcu_AC_refine;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
|
||||||
|
* This ought to be an error condition, but we make it a warning.
|
||||||
|
*/
|
||||||
|
if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||
|
||||||
|
(cinfo->Se < DCTSIZE2 && cinfo->Se != DCTSIZE2 - 1))
|
||||||
|
WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
|
||||||
|
/* Select MCU decoding routine */
|
||||||
|
entropy->pub.decode_mcu = decode_mcu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate & initialize requested statistics areas */
|
||||||
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
|
tbl = compptr->dc_tbl_no;
|
||||||
|
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
||||||
|
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
||||||
|
if (entropy->dc_stats[tbl] == NULL)
|
||||||
|
entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
||||||
|
MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
|
||||||
|
/* Initialize DC predictions to 0 */
|
||||||
|
entropy->last_dc_val[ci] = 0;
|
||||||
|
entropy->dc_context[ci] = 0;
|
||||||
|
}
|
||||||
|
if (! cinfo->progressive_mode || cinfo->Ss) {
|
||||||
|
tbl = compptr->ac_tbl_no;
|
||||||
|
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
||||||
|
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
||||||
|
if (entropy->ac_stats[tbl] == NULL)
|
||||||
|
entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
||||||
|
((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
||||||
|
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize arithmetic decoding variables */
|
||||||
|
entropy->c = 0;
|
||||||
|
entropy->a = 0;
|
||||||
|
entropy->ct = -16; /* force reading 2 initial bytes to fill C */
|
||||||
|
|
||||||
|
/* Initialize restart counter */
|
||||||
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Module initialization routine for arithmetic entropy decoding.
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jinit_arith_decoder (j_decompress_ptr cinfo)
|
||||||
|
{
|
||||||
|
arith_entropy_ptr entropy;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
entropy = (arith_entropy_ptr)
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
SIZEOF(arith_entropy_decoder));
|
||||||
|
cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
|
||||||
|
entropy->pub.start_pass = start_pass;
|
||||||
|
|
||||||
|
/* Mark tables unallocated */
|
||||||
|
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
||||||
|
entropy->dc_stats[i] = NULL;
|
||||||
|
entropy->ac_stats[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize index for fixed probability estimation */
|
||||||
|
entropy->fixed_bin[0] = 113;
|
||||||
|
|
||||||
|
if (cinfo->progressive_mode) {
|
||||||
|
/* Create progression status table */
|
||||||
|
int *coef_bit_ptr, ci;
|
||||||
|
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
||||||
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
|
cinfo->num_components*DCTSIZE2*SIZEOF(int));
|
||||||
|
coef_bit_ptr = & cinfo->coef_bits[0][0];
|
||||||
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
|
for (i = 0; i < DCTSIZE2; i++)
|
||||||
|
*coef_bit_ptr++ = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -405,7 +405,11 @@ master_selection (j_decompress_ptr cinfo)
|
|||||||
jinit_inverse_dct(cinfo);
|
jinit_inverse_dct(cinfo);
|
||||||
/* Entropy decoding: either Huffman or arithmetic coding. */
|
/* Entropy decoding: either Huffman or arithmetic coding. */
|
||||||
if (cinfo->arith_code) {
|
if (cinfo->arith_code) {
|
||||||
|
#ifdef D_ARITH_CODING_SUPPORTED
|
||||||
|
jinit_arith_decoder(cinfo);
|
||||||
|
#else
|
||||||
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
#ifdef D_PROGRESSIVE_SUPPORTED
|
#ifdef D_PROGRESSIVE_SUPPORTED
|
||||||
|
|||||||
@@ -101,7 +101,11 @@ transdecode_master_selection (j_decompress_ptr cinfo)
|
|||||||
|
|
||||||
/* Entropy decoding: either Huffman or arithmetic coding. */
|
/* Entropy decoding: either Huffman or arithmetic coding. */
|
||||||
if (cinfo->arith_code) {
|
if (cinfo->arith_code) {
|
||||||
|
#ifdef D_ARITH_CODING_SUPPORTED
|
||||||
|
jinit_arith_decoder(cinfo);
|
||||||
|
#else
|
||||||
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
#ifdef D_PROGRESSIVE_SUPPORTED
|
#ifdef D_PROGRESSIVE_SUPPORTED
|
||||||
|
|||||||
2
jerror.h
2
jerror.h
@@ -95,6 +95,7 @@ JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
|
|||||||
JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
|
JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
|
||||||
JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
|
JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
|
||||||
JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
|
JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
|
||||||
|
JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
|
||||||
JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
|
JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
|
||||||
JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
|
JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
|
||||||
JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
|
JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
|
||||||
@@ -172,6 +173,7 @@ JMESSAGE(JTRC_UNKNOWN_IDS,
|
|||||||
JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
|
JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
|
||||||
JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
|
JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
|
||||||
JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
|
JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
|
||||||
|
JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code")
|
||||||
JMESSAGE(JWRN_BOGUS_PROGRESSION,
|
JMESSAGE(JWRN_BOGUS_PROGRESSION,
|
||||||
"Inconsistent progression sequence for component %d coefficient %d")
|
"Inconsistent progression sequence for component %d coefficient %d")
|
||||||
JMESSAGE(JWRN_EXTRANEOUS_DATA,
|
JMESSAGE(JWRN_EXTRANEOUS_DATA,
|
||||||
|
|||||||
@@ -257,8 +257,6 @@ typedef int boolean;
|
|||||||
* (You may HAVE to do that if your compiler doesn't like null source files.)
|
* (You may HAVE to do that if your compiler doesn't like null source files.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
|
|
||||||
|
|
||||||
/* Capability options common to encoder and decoder: */
|
/* Capability options common to encoder and decoder: */
|
||||||
|
|
||||||
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
|
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
|
||||||
@@ -267,7 +265,7 @@ typedef int boolean;
|
|||||||
|
|
||||||
/* Encoder capability options: */
|
/* Encoder capability options: */
|
||||||
|
|
||||||
#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
||||||
#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
||||||
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
|
||||||
@@ -283,7 +281,7 @@ typedef int boolean;
|
|||||||
|
|
||||||
/* Decoder capability options: */
|
/* Decoder capability options: */
|
||||||
|
|
||||||
#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
|
||||||
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
|
||||||
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
|
||||||
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
* jpegint.h
|
* jpegint.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
|
* Modified 1997-2009 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -304,6 +305,7 @@ struct jpeg_color_quantizer {
|
|||||||
#define jinit_forward_dct jIFDCT
|
#define jinit_forward_dct jIFDCT
|
||||||
#define jinit_huff_encoder jIHEncoder
|
#define jinit_huff_encoder jIHEncoder
|
||||||
#define jinit_phuff_encoder jIPHEncoder
|
#define jinit_phuff_encoder jIPHEncoder
|
||||||
|
#define jinit_arith_encoder jIAEncoder
|
||||||
#define jinit_marker_writer jIMWriter
|
#define jinit_marker_writer jIMWriter
|
||||||
#define jinit_master_decompress jIDMaster
|
#define jinit_master_decompress jIDMaster
|
||||||
#define jinit_d_main_controller jIDMainC
|
#define jinit_d_main_controller jIDMainC
|
||||||
@@ -313,6 +315,7 @@ struct jpeg_color_quantizer {
|
|||||||
#define jinit_marker_reader jIMReader
|
#define jinit_marker_reader jIMReader
|
||||||
#define jinit_huff_decoder jIHDecoder
|
#define jinit_huff_decoder jIHDecoder
|
||||||
#define jinit_phuff_decoder jIPHDecoder
|
#define jinit_phuff_decoder jIPHDecoder
|
||||||
|
#define jinit_arith_decoder jIADecoder
|
||||||
#define jinit_inverse_dct jIIDCT
|
#define jinit_inverse_dct jIIDCT
|
||||||
#define jinit_upsampler jIUpsampler
|
#define jinit_upsampler jIUpsampler
|
||||||
#define jinit_color_deconverter jIDColor
|
#define jinit_color_deconverter jIDColor
|
||||||
@@ -327,6 +330,7 @@ struct jpeg_color_quantizer {
|
|||||||
#define jzero_far jZeroFar
|
#define jzero_far jZeroFar
|
||||||
#define jpeg_zigzag_order jZIGTable
|
#define jpeg_zigzag_order jZIGTable
|
||||||
#define jpeg_natural_order jZAGTable
|
#define jpeg_natural_order jZAGTable
|
||||||
|
#define jpeg_aritab jAriTab
|
||||||
#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||||
|
|
||||||
|
|
||||||
@@ -345,6 +349,7 @@ EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
|
|||||||
EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
|
EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
|
EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
|
EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
|
||||||
|
EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo));
|
||||||
EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
|
EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
|
||||||
/* Decompression module initialization routines */
|
/* Decompression module initialization routines */
|
||||||
EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
|
||||||
@@ -358,6 +363,7 @@ EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
|
|||||||
EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
|
||||||
|
EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
|
||||||
EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
|
EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
|
||||||
@@ -382,6 +388,9 @@ extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
|
|||||||
#endif
|
#endif
|
||||||
extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
|
extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
|
||||||
|
|
||||||
|
/* Arithmetic coding probability estimation tables in jaricom.c */
|
||||||
|
extern const INT32 jpeg_aritab[];
|
||||||
|
|
||||||
/* Suppress undefined-structure complaints if necessary. */
|
/* Suppress undefined-structure complaints if necessary. */
|
||||||
|
|
||||||
#ifdef INCOMPLETE_TYPES_BROKEN
|
#ifdef INCOMPLETE_TYPES_BROKEN
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ Create progressive JPEG file.
|
|||||||
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
|
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
|
||||||
attached to the number.
|
attached to the number.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-arithmetic
|
||||||
|
Use arithmetic coding.
|
||||||
|
.TP
|
||||||
.BI \-scans " file"
|
.BI \-scans " file"
|
||||||
Use the scan script given in the specified text file.
|
Use the scan script given in the specified text file.
|
||||||
.PP
|
.PP
|
||||||
@@ -249,8 +252,6 @@ Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
|||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Independent JPEG Group
|
Independent JPEG Group
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Arithmetic coding is not supported for legal reasons.
|
|
||||||
.PP
|
|
||||||
The transform options can't transform odd-size images perfectly. Use
|
The transform options can't transform odd-size images perfectly. Use
|
||||||
.B \-trim
|
.B \-trim
|
||||||
or
|
or
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ JPEG processes are supported. (Our subset includes all features now in common
|
|||||||
use.) Unsupported ISO options include:
|
use.) Unsupported ISO options include:
|
||||||
* Hierarchical storage
|
* Hierarchical storage
|
||||||
* Lossless JPEG
|
* Lossless JPEG
|
||||||
* Arithmetic entropy coding (unsupported for legal reasons)
|
|
||||||
* DNL marker
|
* DNL marker
|
||||||
* Nonintegral subsampling ratios
|
* Nonintegral subsampling ratios
|
||||||
We support both 8- and 12-bit data precision, but this is a compile-time
|
We support both 8- and 12-bit data precision, but this is a compile-time
|
||||||
@@ -1023,11 +1022,6 @@ JDIMENSION jpeg_width Actual dimensions of output image.
|
|||||||
JDIMENSION jpeg_height
|
JDIMENSION jpeg_height
|
||||||
|
|
||||||
|
|
||||||
There are some additional cinfo fields which are not documented here
|
|
||||||
because you currently can't change them; for example, you can't set
|
|
||||||
arith_code TRUE because arithmetic coding is unsupported.
|
|
||||||
|
|
||||||
|
|
||||||
Per-component parameters are stored in the struct cinfo.comp_info[i] for
|
Per-component parameters are stored in the struct cinfo.comp_info[i] for
|
||||||
component number i. Note that components here refer to components of the
|
component number i. Note that components here refer to components of the
|
||||||
JPEG color space, *not* the source image color space. A suitably large
|
JPEG color space, *not* the source image color space. A suitably large
|
||||||
|
|||||||
@@ -60,9 +60,6 @@ we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a
|
|||||||
run-time option, because most machines can store 8-bit pixels much more
|
run-time option, because most machines can store 8-bit pixels much more
|
||||||
compactly than 12-bit.
|
compactly than 12-bit.
|
||||||
|
|
||||||
For legal reasons, JPEG arithmetic coding is not currently supported, but
|
|
||||||
extending the library to include it would be straightforward.
|
|
||||||
|
|
||||||
By itself, the library handles only interchange JPEG datastreams --- in
|
By itself, the library handles only interchange JPEG datastreams --- in
|
||||||
particular the widely used JFIF file format. The library can be used by
|
particular the widely used JFIF file format. The library can be used by
|
||||||
surrounding code to process interchange or abbreviated JPEG datastreams that
|
surrounding code to process interchange or abbreviated JPEG datastreams that
|
||||||
|
|||||||
BIN
testimgari.jpg
Normal file
BIN
testimgari.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
4
testimgari.ppm
Normal file
4
testimgari.ppm
Normal file
File diff suppressed because one or more lines are too long
@@ -201,6 +201,11 @@ factor will visibly blur the image, however.
|
|||||||
|
|
||||||
Switches for wizards:
|
Switches for wizards:
|
||||||
|
|
||||||
|
-arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG
|
||||||
|
is not yet widely implemented, so many decoders will
|
||||||
|
be unable to view an arithmetic coded JPEG file at
|
||||||
|
all.
|
||||||
|
|
||||||
-baseline Force baseline-compatible quantization tables to be
|
-baseline Force baseline-compatible quantization tables to be
|
||||||
generated. This clamps quantization values to 8 bits
|
generated. This clamps quantization values to 8 bits
|
||||||
even at low quality settings. (This switch is poorly
|
even at low quality settings. (This switch is poorly
|
||||||
@@ -444,6 +449,7 @@ jpegtran accepts a subset of the switches recognized by cjpeg:
|
|||||||
-progressive Create progressive JPEG file.
|
-progressive Create progressive JPEG file.
|
||||||
-restart N Emit a JPEG restart marker every N MCU rows, or every
|
-restart N Emit a JPEG restart marker every N MCU rows, or every
|
||||||
N MCU blocks if "B" is attached to the number.
|
N MCU blocks if "B" is attached to the number.
|
||||||
|
-arithmetic Use arithmetic coding.
|
||||||
-scans file Use the scan script given in the specified text file.
|
-scans file Use the scan script given in the specified text file.
|
||||||
See the previous discussion of cjpeg for more details about these switches.
|
See the previous discussion of cjpeg for more details about these switches.
|
||||||
If you specify none of these switches, you get a plain baseline-JPEG output
|
If you specify none of these switches, you get a plain baseline-JPEG output
|
||||||
|
|||||||
Reference in New Issue
Block a user