]> git.pld-linux.org Git - packages/libjpeg-turbo.git/commitdiff
remove rh639672 patch dropped from spec in 8d95c87 auto/th/libjpeg-turbo-2.1.3-1
authorJan Palus <atler@pld-linux.org>
Sun, 6 Mar 2022 17:48:40 +0000 (18:48 +0100)
committerJan Palus <atler@pld-linux.org>
Sun, 6 Mar 2022 17:48:40 +0000 (18:48 +0100)
libjpeg-turbo10-rh639672.patch [deleted file]

diff --git a/libjpeg-turbo10-rh639672.patch b/libjpeg-turbo10-rh639672.patch
deleted file mode 100644 (file)
index e862d0d..0000000
+++ /dev/null
@@ -1,1283 +0,0 @@
-From 195345e454d3df7ff9c07c3d36881ec52e789af2 Mon Sep 17 00:00:00 2001
-From: Mukund Sivaraman <muks@banu.com>
-Date: Sun, 3 Oct 2010 12:23:41 +0530
-Subject: [PATCH] Add support for decoding arithmetic coded content
-
-This is based on a patch by Guido Vollbeding <guivol@esc.de>, which
-included code to both encode and decode arithmetic coded content.
-
-This patch only adds the decoding portion. No new arithmetic coded
-content can be produced, but existing arithmetic coded content can
-be decoded.
-
-libjpeg-turbo with this patch has been tested with some arithmetic
-coded images (digital photographs).
----
- Makefile.am       |   17 +-
- README.arithmetic |  215 +++++++++++++++
- jaricom.c         |  149 +++++++++++
- jdarith.c         |  762 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- jdmaster.c        |    2 +-
- jdtrans.c         |    2 +-
- jerror.h          |    2 +
- jmorecfg.h        |    2 +-
- jpegint.h         |    2 +
- 9 files changed, 1142 insertions(+), 11 deletions(-)
- create mode 100644 README.arithmetic
- create mode 100644 jaricom.c
- create mode 100644 jdarith.c
-
-diff --git a/Makefile.am b/Makefile.am
-index f8552ea..1eee598 100644
---- a/Makefile.am
-+++ b/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 \
-       jpegint.h jpeglib.h jversion.h jsimd.h jsimddct.h
--libjpeg_la_SOURCES = $(HDRS) jcapimin.c jcapistd.c jccoefct.c jccolor.c \
--      jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
--      jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \
--      jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
--      jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
--      jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \
--      jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \
--      jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c
-+libjpeg_la_SOURCES = $(HDRS) jaricom.c jcapimin.c jcapistd.c          \
-+      jccoefct.c jccolor.c jcdctmgr.c jchuff.c jcinit.c jcmainct.c    \
-+      jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c jcprepct.c  \
-+      jcsample.c jctrans.c jdapimin.c jdapistd.c jdarith.c            \
-+      jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c  \
-+      jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c  \
-+      jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.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 \
-       turbojpeg-mapfile
-diff --git a/README.arithmetic b/README.arithmetic
-new file mode 100644
-index 0000000..0dd3b9a
---- /dev/null
-+++ b/README.arithmetic
-@@ -0,0 +1,215 @@
-+JPEG arithmetic encoding and decoding portable software implementation
-+======================================================================
-+
-+Release of 28-Mar-98 by Guido Vollbeding <guido@jpegclub.org>
-+=============================================================
-+
-+Primary URLs:
-+
-+      http://sylvana.net/jpeg-ari/
-+      (directory containing the actual archive files:)
-+
-+      http://sylvana.net/jpeg-ari/jpeg-ari-28mar98.tar.gz
-+
-+      http://sylvana.net/jpeg-ari/jpeg-ari.zip
-+
-+
-+DISCLAIMER
-+==========
-+
-+This package is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-+
-+It is possible that certain products which can be built using this
-+software modules might form inventions protected by patent rights in
-+some countries (e.g. by patents about arithmetic coding algorithms
-+owned by IBM and AT&T in the USA). Provision of this software by the
-+author does NOT include any licenses for any patents.
-+In those countries where a patent license is required for certain
-+applications of this software modules, you will have to obtain such
-+a license yourself.
-+
-+See Annex L in the JPEG spec for further information
-+and a list of relevant patents.
-+
-+
-+What is it?
-+===========
-+
-+This is my implementation of the arithmetic encoding and decoding
-+back-end for JPEG as specified in the
-+
-+  ISO/IEC International Standard 10918-1 and CCITT Recommendation
-+  ITU-T T.81, "Information Technology - Digital Compression and
-+  Coding of Continuous-tone Still Images, Part 1: Requirements
-+  and Guidelines".
-+
-+Arithmetic coding is a state-of-the-art lossless entropy data
-+compression method which offers better compression performance
-+than the well-established Huffman entropy coding process.
-+
-+The JPEG standard specifies a particular arithmetic coding scheme
-+to be used optionally as alternative to Huffman coding.
-+
-+
-+Who needs it?
-+=============
-+
-+This package might be of interest for people who are looking for
-+enhanced state-of-the-art image compression technologies.
-+
-+It is intended to provide a reasonable tool for experimental,
-+comparison and evaluation purposes.
-+
-+See the Disclaimer above for restricted conditions of usage.
-+
-+
-+How does it work?
-+=================
-+
-+This distribution is organized as add-on to the widespread
-+Independent JPEG Group's JPEG software.
-+
-+Thus, once you managed to install the IJG software distribution
-+successfully, there should be no additional problems (portability
-+issues etc.) to incorporate this package into the library,
-+and usage is straightforward.
-+
-+Transcode given JPEG files simply with a command like
-+
-+  jpegtran -arithmetic [-progressive] < orig.jpg > arit.jpg
-+
-+into an arithmetic coded version LOSSLESSLY! Since there are
-+practically no applications in existence which can handle such
-+files, you can only transform it back with the same tool
-+
-+  jpegtran [-optimize] [-progressive] < arit.jpg > orig2.jpg
-+
-+to verify correct operation.
-+
-+Thus, you can easily verify the enhanced compression performance
-+of the arithmetic coding version compared to the Huffman (with
-+fixed or custom tables) version.
-+
-+The claim to evaluate was that arithmetic coding gives an average
-+5-10% compression improvement against Huffman.
-+Early tests with this implementation support this claim, and you
-+can perform tests with own material.
-+
-+Here are some actual results:
-+
-+% ./jpegtran -optimize < testorig.jpg > testopt.jpg
-+% ./jpegtran -arithmetic < testorig.jpg > testarit.jpg
-+% ./jpegtran < testarit.jpg > testorig2.jpg
-+% ./jpegtran -arithmetic -progressive < testorig.jpg > testaritp.jpg
-+% ./jpegtran < testaritp.jpg > testorig3.jpg
-+% ./jpegtran -optimize < ../butterfly.jpg > ../buttopt.jpg
-+% ./jpegtran -progressive < ../butterfly.jpg > ../buttprog.jpg
-+% ./jpegtran -arithmetic < ../butterfly.jpg > ../buttarit.jpg
-+% ./jpegtran < ../buttarit.jpg > ../butterfly2.jpg
-+% ./jpegtran -arithmetic -progressive < ../butterfly.jpg > ../buttaritp.jpg
-+% ./jpegtran < ../buttaritp.jpg > ../butterfly3.jpg
-+% ls -l test*.jpg
-+-rw-r--r--  1 guivol       5153 Apr 13 18:51 testarit.jpg
-+-rw-r--r--  1 guivol       5186 Apr 13 18:51 testaritp.jpg
-+-rw-r--r--  1 guivol       5756 Apr  2 15:10 testimg.jpg
-+-rw-r--r--  1 guivol       5645 Apr  2 15:10 testimgp.jpg
-+-rw-r--r--  1 guivol       5463 Apr 13 18:51 testopt.jpg
-+-rw-r--r--  1 guivol       5770 Apr  2 15:10 testorig.jpg
-+-rw-r--r--  1 guivol       5770 Apr 13 18:51 testorig2.jpg
-+-rw-r--r--  1 guivol       5770 Apr 13 18:51 testorig3.jpg
-+-rw-r--r--  1 guivol       5655 Apr  2 15:10 testprog.jpg
-+% ls -l ../butt*.jpg
-+-rw-r--r--  1 guivol     460091 Apr 13 18:52 ../buttarit.jpg
-+-rw-r--r--  1 guivol     453703 Apr 13 18:52 ../buttaritp.jpg
-+-rw-r--r--  1 guivol     527823 Nov 19 18:41 ../butterfly.jpg
-+-rw-r--r--  1 guivol     527823 Apr 13 18:52 ../butterfly2.jpg
-+-rw-r--r--  1 guivol     527823 Apr 13 18:52 ../butterfly3.jpg
-+-rw-r--r--  1 guivol     511834 Apr 13 18:52 ../buttopt.jpg
-+-rw-r--r--  1 guivol     492237 Apr 13 18:52 ../buttprog.jpg
-+% 
-+
-+Note that arithmetic coding requires only a single processing
-+pass due to its fully-adaptive nature, and compared to one-pass
-+(fixed tables) Huffman the arithmetic coded version consistently
-+achieves 10% compression improvement.
-+Compared with two-pass (custom tables) Huffman the improvement
-+is 5-10%.
-+
-+Note that I wasn't able yet to cross-check interoperability of
-+the produced files with other implementations.
-+Thus, I can't be sure that the files are compliant to the spec,
-+but I hope so and the tests support it.
-+The encoding and decoding processes should be correct anyway,
-+however, in the sense that they are complementary to each other
-+and thus retain data integrity.
-+
-+I would appreciate any indications for compliance or interoperability
-+with other implementations from somebody.
-+Please let me know if you are able to cross-check something.
-+
-+
-+Installation
-+============
-+
-+The installation is a 2-stage procedure:
-+
-+1. Preparing the IJG package for potential incorporation
-+   of the arithmetic coding feature.
-+
-+2. Incorporation of the actual arithmetic coding modules
-+   and enabling the feature for usage.
-+
-+The reason for this 2-stage process is the hope to make
-+step 1 obsolete in future IJG releases.
-+The actual implementation should remain separate IMHO due
-+to the different usage conditions.
-+
-+Step 1:
-+
-+1.1. Copy all files from the subdirectory 'patchv6b' into
-+     the IJG software's v6b source directory.
-+     This includes minor patches to some files and 3 extra
-+     files which hold place for the actual implementation.
-+
-+1.2. Update your Makefile/Projectfile for the inclusion of
-+     the 3 extra files. This will be done automatically
-+     if you use a configure-generated makefile and type
-+     './configure' (reconfigure).
-+
-+1.3. Recompile ('make').
-+
-+See the file 'PATCHES' in 'patchv6b' for details.
-+
-+Step 2:
-+
-+2.1. Replace the 3 placeholder files by the actual implementation
-+     modules.
-+
-+2.2. Enable application support of the new features by #defining
-+     C_ARITH_CODING_SUPPORTED and D_ARITH_CODING_SUPPORTED
-+     in 'jmorecfg.h'.
-+
-+2.3. Recompile ('make').
-+
-+Note that I suggest to add 3 placeholder files to the IJG
-+distribution. This would remove the need for system-dependent
-+changes (Makefiles) and thus considerably simplify the actual
-+installation for systems without a configure-generated makefile.
-+
-+
-+References
-+==========
-+
-+- The Independent JPEG Group's software
-+
-+- JBIG-KIT lossless image compression library by Markus Kuhn
-+
-+- William B. Pennebaker, Joan L. Mitchell:
-+  "JPEG Still Image Data Compression Standard",
-+  Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
-+
-+- jpeg-faq (http://www.faqs.org/faqs/jpeg-faq/)
-+
-+- compression-faq (http://www.faqs.org/faqs/compression-faq/)
-diff --git a/jaricom.c b/jaricom.c
-new file mode 100644
-index 0000000..e4292b0
---- /dev/null
-+++ b/jaricom.c
-@@ -0,0 +1,149 @@
-+/*
-+ * jaricom.c
-+ *
-+ * Copyright (C) 1997, Guido Vollbeding <guivol@esc.de>.
-+ * This file is NOT part of the Independent JPEG Group's software
-+ * for legal reasons.
-+ * See the accompanying README file for conditions of distribution and use.
-+ *
-+ * 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 organisation is leaned on Markus Kuhn's JBIG
-+ * implementation (jbig_tab.c).
-+ */
-+
-+#define V(a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)
-+
-+const INT32 jaritab[113] = {
-+/*
-+ * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS
-+ */
-+/*   0 */  V( 0x5a1d,   1,   1, 1 ),
-+/*   1 */  V( 0x2586,  14,   2, 0 ),
-+/*   2 */  V( 0x1114,  16,   3, 0 ),
-+/*   3 */  V( 0x080b,  18,   4, 0 ),
-+/*   4 */  V( 0x03d8,  20,   5, 0 ),
-+/*   5 */  V( 0x01da,  23,   6, 0 ),
-+/*   6 */  V( 0x00e5,  25,   7, 0 ),
-+/*   7 */  V( 0x006f,  28,   8, 0 ),
-+/*   8 */  V( 0x0036,  30,   9, 0 ),
-+/*   9 */  V( 0x001a,  33,  10, 0 ),
-+/*  10 */  V( 0x000d,  35,  11, 0 ),
-+/*  11 */  V( 0x0006,   9,  12, 0 ),
-+/*  12 */  V( 0x0003,  10,  13, 0 ),
-+/*  13 */  V( 0x0001,  12,  13, 0 ),
-+/*  14 */  V( 0x5a7f,  15,  15, 1 ),
-+/*  15 */  V( 0x3f25,  36,  16, 0 ),
-+/*  16 */  V( 0x2cf2,  38,  17, 0 ),
-+/*  17 */  V( 0x207c,  39,  18, 0 ),
-+/*  18 */  V( 0x17b9,  40,  19, 0 ),
-+/*  19 */  V( 0x1182,  42,  20, 0 ),
-+/*  20 */  V( 0x0cef,  43,  21, 0 ),
-+/*  21 */  V( 0x09a1,  45,  22, 0 ),
-+/*  22 */  V( 0x072f,  46,  23, 0 ),
-+/*  23 */  V( 0x055c,  48,  24, 0 ),
-+/*  24 */  V( 0x0406,  49,  25, 0 ),
-+/*  25 */  V( 0x0303,  51,  26, 0 ),
-+/*  26 */  V( 0x0240,  52,  27, 0 ),
-+/*  27 */  V( 0x01b1,  54,  28, 0 ),
-+/*  28 */  V( 0x0144,  56,  29, 0 ),
-+/*  29 */  V( 0x00f5,  57,  30, 0 ),
-+/*  30 */  V( 0x00b7,  59,  31, 0 ),
-+/*  31 */  V( 0x008a,  60,  32, 0 ),
-+/*  32 */  V( 0x0068,  62,  33, 0 ),
-+/*  33 */  V( 0x004e,  63,  34, 0 ),
-+/*  34 */  V( 0x003b,  32,  35, 0 ),
-+/*  35 */  V( 0x002c,  33,   9, 0 ),
-+/*  36 */  V( 0x5ae1,  37,  37, 1 ),
-+/*  37 */  V( 0x484c,  64,  38, 0 ),
-+/*  38 */  V( 0x3a0d,  65,  39, 0 ),
-+/*  39 */  V( 0x2ef1,  67,  40, 0 ),
-+/*  40 */  V( 0x261f,  68,  41, 0 ),
-+/*  41 */  V( 0x1f33,  69,  42, 0 ),
-+/*  42 */  V( 0x19a8,  70,  43, 0 ),
-+/*  43 */  V( 0x1518,  72,  44, 0 ),
-+/*  44 */  V( 0x1177,  73,  45, 0 ),
-+/*  45 */  V( 0x0e74,  74,  46, 0 ),
-+/*  46 */  V( 0x0bfb,  75,  47, 0 ),
-+/*  47 */  V( 0x09f8,  77,  48, 0 ),
-+/*  48 */  V( 0x0861,  78,  49, 0 ),
-+/*  49 */  V( 0x0706,  79,  50, 0 ),
-+/*  50 */  V( 0x05cd,  48,  51, 0 ),
-+/*  51 */  V( 0x04de,  50,  52, 0 ),
-+/*  52 */  V( 0x040f,  50,  53, 0 ),
-+/*  53 */  V( 0x0363,  51,  54, 0 ),
-+/*  54 */  V( 0x02d4,  52,  55, 0 ),
-+/*  55 */  V( 0x025c,  53,  56, 0 ),
-+/*  56 */  V( 0x01f8,  54,  57, 0 ),
-+/*  57 */  V( 0x01a4,  55,  58, 0 ),
-+/*  58 */  V( 0x0160,  56,  59, 0 ),
-+/*  59 */  V( 0x0125,  57,  60, 0 ),
-+/*  60 */  V( 0x00f6,  58,  61, 0 ),
-+/*  61 */  V( 0x00cb,  59,  62, 0 ),
-+/*  62 */  V( 0x00ab,  61,  63, 0 ),
-+/*  63 */  V( 0x008f,  61,  32, 0 ),
-+/*  64 */  V( 0x5b12,  65,  65, 1 ),
-+/*  65 */  V( 0x4d04,  80,  66, 0 ),
-+/*  66 */  V( 0x412c,  81,  67, 0 ),
-+/*  67 */  V( 0x37d8,  82,  68, 0 ),
-+/*  68 */  V( 0x2fe8,  83,  69, 0 ),
-+/*  69 */  V( 0x293c,  84,  70, 0 ),
-+/*  70 */  V( 0x2379,  86,  71, 0 ),
-+/*  71 */  V( 0x1edf,  87,  72, 0 ),
-+/*  72 */  V( 0x1aa9,  87,  73, 0 ),
-+/*  73 */  V( 0x174e,  72,  74, 0 ),
-+/*  74 */  V( 0x1424,  72,  75, 0 ),
-+/*  75 */  V( 0x119c,  74,  76, 0 ),
-+/*  76 */  V( 0x0f6b,  74,  77, 0 ),
-+/*  77 */  V( 0x0d51,  75,  78, 0 ),
-+/*  78 */  V( 0x0bb6,  77,  79, 0 ),
-+/*  79 */  V( 0x0a40,  77,  48, 0 ),
-+/*  80 */  V( 0x5832,  80,  81, 1 ),
-+/*  81 */  V( 0x4d1c,  88,  82, 0 ),
-+/*  82 */  V( 0x438e,  89,  83, 0 ),
-+/*  83 */  V( 0x3bdd,  90,  84, 0 ),
-+/*  84 */  V( 0x34ee,  91,  85, 0 ),
-+/*  85 */  V( 0x2eae,  92,  86, 0 ),
-+/*  86 */  V( 0x299a,  93,  87, 0 ),
-+/*  87 */  V( 0x2516,  86,  71, 0 ),
-+/*  88 */  V( 0x5570,  88,  89, 1 ),
-+/*  89 */  V( 0x4ca9,  95,  90, 0 ),
-+/*  90 */  V( 0x44d9,  96,  91, 0 ),
-+/*  91 */  V( 0x3e22,  97,  92, 0 ),
-+/*  92 */  V( 0x3824,  99,  93, 0 ),
-+/*  93 */  V( 0x32b4,  99,  94, 0 ),
-+/*  94 */  V( 0x2e17,  93,  86, 0 ),
-+/*  95 */  V( 0x56a8,  95,  96, 1 ),
-+/*  96 */  V( 0x4f46, 101,  97, 0 ),
-+/*  97 */  V( 0x47e5, 102,  98, 0 ),
-+/*  98 */  V( 0x41cf, 103,  99, 0 ),
-+/*  99 */  V( 0x3c3d, 104, 100, 0 ),
-+/* 100 */  V( 0x375e,  99,  93, 0 ),
-+/* 101 */  V( 0x5231, 105, 102, 0 ),
-+/* 102 */  V( 0x4c0f, 106, 103, 0 ),
-+/* 103 */  V( 0x4639, 107, 104, 0 ),
-+/* 104 */  V( 0x415e, 103,  99, 0 ),
-+/* 105 */  V( 0x5627, 105, 106, 1 ),
-+/* 106 */  V( 0x50e7, 108, 107, 0 ),
-+/* 107 */  V( 0x4b85, 109, 103, 0 ),
-+/* 108 */  V( 0x5597, 110, 109, 0 ),
-+/* 109 */  V( 0x504f, 111, 107, 0 ),
-+/* 110 */  V( 0x5a10, 110, 111, 1 ),
-+/* 111 */  V( 0x5522, 112, 109, 0 ),
-+/* 112 */  V( 0x59eb, 112, 111, 1 )
-+};
-diff --git a/jdarith.c b/jdarith.c
-new file mode 100644
-index 0000000..1ef513e
---- /dev/null
-+++ b/jdarith.c
-@@ -0,0 +1,762 @@
-+/*
-+ * jdarith.c
-+ *
-+ * Copyright (C) 1997, Guido Vollbeding <guivol@esc.de>.
-+ * This file is NOT part of the Independent JPEG Group's software
-+ * for legal reasons.
-+ * See the accompanying README file for conditions of distribution and use.
-+ *
-+ * 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];
-+} 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.
-+ * Note that we use one additional AC bin for codings with fixed
-+ * probability (0.5), thus the minimum number for AC is 246.
-+ *
-+ * 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)
-+{
-+  extern const INT32 jaritab[];
-+  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 = jaritab[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);
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Re-initialize statistics areas */
-+    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;
-+    }
-+    if (cinfo->progressive_mode == 0 || 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) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;               /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << 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 */
-+    entropy->ac_stats[tbl][245] = 0;
-+    sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
-+    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[4];
-+  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--;
-+  }
-+
-+  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++) {
-+    st[0] = 0;        /* use fixed probability estimation */
-+    /* 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 + 1; kex > 1; kex--)
-+    if ((*block)[jpeg_natural_order[kex - 1]]) 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 */
-+      entropy->ac_stats[tbl][245] = 0;
-+      if (arith_decode(cinfo, entropy->ac_stats[tbl] + 245))
-+        *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) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;               /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << 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; 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) {
-+        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 */
-+      entropy->ac_stats[tbl][245] = 0;
-+      sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
-+      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)
-+      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 because
-+     * there are some baseline files out there with all zeroes in these bytes.
-+     */
-+    if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
-+      cinfo->Ah != 0 || cinfo->Al != 0)
-+      WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
-+    /* Select MCU decoding routine */
-+    entropy->pub.decode_mcu = decode_mcu;
-+  }
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Allocate & initialize requested statistics areas */
-+    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;
-+    }
-+    if (cinfo->progressive_mode == 0 || 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;
-+  }
-+
-+  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;
-+  }
-+}
-diff --git a/jdmaster.c b/jdmaster.c
-index 8314b67..537abc7 100644
---- a/jdmaster.c
-+++ b/jdmaster.c
-@@ -384,7 +384,7 @@ master_selection (j_decompress_ptr cinfo)
-   jinit_inverse_dct(cinfo);
-   /* Entropy decoding: either Huffman or arithmetic coding. */
-   if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-+    jinit_arith_decoder(cinfo);
-   } else {
-     if (cinfo->progressive_mode) {
- #ifdef D_PROGRESSIVE_SUPPORTED
-diff --git a/jdtrans.c b/jdtrans.c
-index 6c0ab71..fcc9ae9 100644
---- a/jdtrans.c
-+++ b/jdtrans.c
-@@ -101,7 +101,7 @@ transdecode_master_selection (j_decompress_ptr cinfo)
-   /* Entropy decoding: either Huffman or arithmetic coding. */
-   if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-+    jinit_arith_decoder(cinfo);
-   } else {
-     if (cinfo->progressive_mode) {
- #ifdef D_PROGRESSIVE_SUPPORTED
-diff --git a/jerror.h b/jerror.h
-index fc2fffe..109e3d3 100644
---- a/jerror.h
-+++ b/jerror.h
-@@ -93,6 +93,7 @@ JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
- JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
- JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
- 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_HUFF_TABLE, "Huffman table 0x%02x was not defined")
- JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
-@@ -170,6 +171,7 @@ JMESSAGE(JTRC_UNKNOWN_IDS,
- JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
- JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
- 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,
-        "Inconsistent progression sequence for component %d coefficient %d")
- JMESSAGE(JWRN_EXTRANEOUS_DATA,
-diff --git a/jmorecfg.h b/jmorecfg.h
-index 0e7fb72..4d66335 100644
---- a/jmorecfg.h
-+++ b/jmorecfg.h
-@@ -283,7 +283,7 @@ typedef int boolean;
- /* 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_PROGRESSIVE_SUPPORTED           /* Progressive JPEG? (Requires MULTISCAN)*/
- #define SAVE_MARKERS_SUPPORTED            /* jpeg_save_markers() needed? */
-diff --git a/jpegint.h b/jpegint.h
-index 7a31f51..78bb1cf 100644
---- a/jpegint.h
-+++ b/jpegint.h
-@@ -313,6 +313,7 @@ struct jpeg_color_quantizer {
- #define jinit_marker_reader   jIMReader
- #define jinit_huff_decoder    jIHDecoder
- #define jinit_phuff_decoder   jIPHDecoder
-+#define jinit_arith_decoder   jIADecoder
- #define jinit_inverse_dct     jIIDCT
- #define jinit_upsampler               jIUpsampler
- #define jinit_color_deconverter       jIDColor
-@@ -358,6 +359,7 @@ EXTERN(void) jinit_input_controller 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_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_upsampler JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
--- 
-1.7.2.3
-
This page took 0.082252 seconds and 4 git commands to generate.