1 /*
2 * CCITT Fax Group 3 and 4 decompression
3 * Copyright (c) 2008 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * CCITT Fax Group 3 and 4 decompression
25 * @author Konstantin Shishkov
26 */
31
32 #define CCITT_SYMS 104
33
35 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
36 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
37 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
38 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
39 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
40 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896,
41 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728,
42 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560
43 };
44
46 {
47 {
48 0x35, 0x07, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, 0x13, 0x14, 0x07, 0x08, 0x08,
49 0x03, 0x34, 0x35, 0x2A, 0x2B, 0x27, 0x0C, 0x08, 0x17, 0x03, 0x04, 0x28, 0x2B,
50 0x13, 0x24, 0x18, 0x02, 0x03, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
51 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x04, 0x05, 0x0A, 0x0B, 0x52, 0x53, 0x54,
52 0x55, 0x24, 0x25, 0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34, 0x1B,
53 0x12, 0x17, 0x37, 0x36, 0x37, 0x64, 0x65, 0x68, 0x67, 0xCC, 0xCD, 0xD2, 0xD3,
54 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98, 0x99, 0x9A, 0x18, 0x9B,
55 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
56 },
57 {
58 0x37, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x05, 0x04, 0x04, 0x05, 0x07,
59 0x04, 0x07, 0x18, 0x17, 0x18, 0x08, 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18,
60 0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
61 0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
62 0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67, 0x0F,
63 0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35, 0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72,
64 0x73, 0x74, 0x75, 0x76, 0x77, 0x52, 0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65,
65 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
66 }
67 };
68
70 {
71 {
72 8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7,
73 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75 8, 8, 8, 8, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
76 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 11, 11, 11, 12, 12, 12, 12, 12, 12,
77 12, 12, 12, 12
78 },
79 {
80 10, 3, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11,
81 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
82 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
83 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
84 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 11, 12, 12, 12, 12, 12, 12,
85 12, 12, 12, 12
86 }
87 };
88
90 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
91 };
92
94 4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
95 };
96
98
100 {
101 static VLC_TYPE code_table1[528][2];
102 static VLC_TYPE code_table2[648][2];
103 int i;
104 static int initialized = 0;
105
106 if (initialized)
107 return;
108 ccitt_vlc[0].
table = code_table1;
110 ccitt_vlc[1].
table = code_table2;
112 for (i = 0; i < 2; i++) {
118 }
122 initialized = 1;
123 }
124
125
127 unsigned int pix_left, int *runs,
128 const int *runend)
129 {
131 unsigned int run = 0;
133 for (;;) {
136 if (t < 64) {
138 if (runs >= runend) {
141 }
142 if (pix_left <= run) {
143 if (pix_left == run)
144 break;
147 }
149 run = 0;
151 } else if ((int)t == -1) {
154 }
155 }
156 *runs++ = 0;
157 return 0;
158 }
159
161 unsigned int width,
int *runs,
162 const int *runend, const int *ref)
163 {
164 int mode = 0, saved_run = 0,
t;
165 int run_off = *ref++;
166 unsigned int offs = 0,
run = 0;
167
168 while (offs < width) {
170 if (cmode == -1) {
173 }
174 if (!cmode) { //pass mode
175 if (run_off < width)
176 run_off += *ref++;
177 run = run_off - offs;
178 offs = run_off;
179 if (run_off < width)
180 run_off += *ref++;
181 if (offs > width) {
184 }
186 } else if (cmode == 1) { //horizontal mode
187 int k;
188 for (k = 0; k < 2; k++) {
190 for (;;) {
195 }
198 break;
199 }
200 *runs++ =
run + saved_run;
201 if (runs >= runend) {
204 }
205 saved_run = 0;
207 if (offs > width ||
run > width) {
210 }
212 }
213 } else if (cmode == 9 || cmode == 10) {
216 } else { //vertical mode
217 run = run_off - offs + (cmode - 5);
218 run_off -= *--ref;
220 if (offs > width ||
run > width) {
223 }
224 *runs++ =
run + saved_run;
225 if (runs >= runend) {
228 }
229 saved_run = 0;
231 }
232 //sync line pointers
233 while (offs < width && run_off <= offs) {
234 run_off += *ref++;
235 run_off += *ref++;
236 }
237 }
238 *runs++ = saved_run;
239 if (saved_run) {
240 if (runs >= runend) {
242 return -1;
243 }
244 *runs++ = 0;
245 }
246 return 0;
247 }
248
250 {
253
255 while (pix_left > 0) {
256 run = runs[run_idx++];
257 mode = ~mode;
259 for (; run > 16; run -= 16)
261 if (run)
263 }
265 }
266
268 {
269 unsigned int state = -1;
271 while (srcsize-- > 0) {
273 if ((state & 0xFFF) == 1)
274 return 0;
275 }
276 return -1;
277 }
278
282 {
283 int j;
285 int *runs, *ref = NULL, *runend;
287 int runsize = avctx->
width + 2;
288 int has_eol;
289
290 runs =
av_malloc(runsize *
sizeof(runs[0]));
291 ref =
av_malloc(runsize *
sizeof(ref[0]));
292 if (!runs || !ref) {
294 goto fail;
295 }
296 ref[0] = avctx->
width;
297 ref[1] = 0;
298 ref[2] = 0;
301
302 for (j = 0; j <
height; j++) {
303 runend = runs + runsize;
306 ref);
307 if (ret < 0)
308 goto fail;
309 } else {
310 int g3d1 = (compr ==
TIFF_G3) && !(opts & 1);
312 has_eol &&
314 break;
317 runend);
318 else
320 runend, ref);
323 }
325 goto fail;
326
327 if (ret < 0) {
329 } else {
332 }
334 }
335 ret = 0;
336 fail:
340 }