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 */
32
33 #define CCITT_SYMS 104
34
36 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
37 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
38 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
40 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
41 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896,
42 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728,
43 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560
44 };
45
47 {
48 {
49 0x35, 0x07, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, 0x13, 0x14, 0x07, 0x08, 0x08,
50 0x03, 0x34, 0x35, 0x2A, 0x2B, 0x27, 0x0C, 0x08, 0x17, 0x03, 0x04, 0x28, 0x2B,
51 0x13, 0x24, 0x18, 0x02, 0x03, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
52 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x04, 0x05, 0x0A, 0x0B, 0x52, 0x53, 0x54,
53 0x55, 0x24, 0x25, 0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34, 0x1B,
54 0x12, 0x17, 0x37, 0x36, 0x37, 0x64, 0x65, 0x68, 0x67, 0xCC, 0xCD, 0xD2, 0xD3,
55 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98, 0x99, 0x9A, 0x18, 0x9B,
56 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
57 },
58 {
59 0x37, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x05, 0x04, 0x04, 0x05, 0x07,
60 0x04, 0x07, 0x18, 0x17, 0x18, 0x08, 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18,
61 0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
62 0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
63 0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67, 0x0F,
64 0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35, 0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72,
65 0x73, 0x74, 0x75, 0x76, 0x77, 0x52, 0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65,
66 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
67 }
68 };
69
71 {
72 {
73 8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7,
74 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
76 8, 8, 8, 8, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
77 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 11, 11, 11, 12, 12, 12, 12, 12, 12,
78 12, 12, 12, 12
79 },
80 {
81 10, 3, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11,
82 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
83 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
84 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
85 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 11, 12, 12, 12, 12, 12, 12,
86 12, 12, 12, 12
87 }
88 };
89
91 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
92 };
93
95 4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
96 };
97
99
101 {
102 static VLC_TYPE code_table1[528][2];
103 static VLC_TYPE code_table2[648][2];
105
110 for (
i = 0;
i < 2;
i++) {
116 }
120 }
121
123 {
126 }
127
129 unsigned int *pix_left, int **runs,
130 const int *runend,
int *
mode)
131 {
132 int eob = 0;
133 int newmode;
134 int saved_run = 0;
135
136 do {
137 int cwi, k;
138 int cw = 0;
139 int codes[2];
140 do {
142 if (!cwi) {
145 }
150 if (cwi > 5) {
152 eob = 1;
153 cwi -= 6;
154 }
155 cw += cwi;
156 } while(cwi == 5);
157
158 codes[0] = cw;
159 codes[1] = !eob;
160
161 for (k = 0; k < 2; k++) {
162 if (codes[k]) {
164 *(*runs)++ = saved_run;
165 if (*runs >= runend) {
168 }
169 if (*pix_left <= saved_run) {
172 }
173 *pix_left -= saved_run;
174 saved_run = 0;
176 }
177 saved_run += codes[k];
178 }
179 }
180 } while (!eob);
181 *(*runs)++ = saved_run;
182 if (*runs >= runend) {
185 }
186 if (*pix_left <= saved_run) {
187 if (*pix_left == saved_run)
188 return 1;
191 }
192 *pix_left -= saved_run;
193 saved_run = 0;
195 if (newmode != *
mode) {
//FIXME CHECK
196 *(*runs)++ = 0;
197 if (*runs >= runend) {
200 }
202 }
203 return 0;
204 }
205
207 unsigned int pix_left, int *runs,
208 const int *runend)
209 {
211 unsigned int run = 0;
212 unsigned int t;
213 for (;;) {
218 if (t < 64) {
220 if (runs >= runend) {
223 }
224 if (pix_left <=
run) {
226 break;
229 }
233 } else if ((int)t == -1) {
241 break;
242 } else {
245 }
246 }
247 }
248 *runs++ = 0;
249 return 0;
250 }
251
253 unsigned int width,
int *runs,
254 const int *runend,
const int *
ref)
255 {
256 int mode = 0, saved_run = 0, t;
257 int run_off = *
ref++;
258 unsigned int offs = 0,
run = 0;
259
260 while (offs <
width) {
261 int cmode;
265 if (cmode == -1) {
268 }
269 if (!cmode) { //pass mode
272 run = run_off - offs;
273 offs = run_off;
279 }
281 } else if (cmode == 1) { //horizontal mode
282 int k;
283 for (k = 0; k < 2; k++) {
285 for (;;) {
289 if (t == -1) {
292 }
294 if (t < 64)
295 break;
296 }
297 *runs++ =
run + saved_run;
298 if (runs >= runend) {
301 }
302 saved_run = 0;
307 }
309 }
310 } else if (cmode == 9 || cmode == 10) {
311 int xxx;
315 if (cmode == 9 && xxx == 7) {
317 int pix_left =
width - offs;
318
319 if (saved_run) {
320 av_log(avctx,
AV_LOG_ERROR,
"saved run %d on entering uncompressed mode\n", saved_run);
322 }
324 offs =
width - pix_left;
328 break;
329 } else {
332 }
333 } else { //vertical mode
334 run = run_off - offs + (cmode - 5);
340 }
341 *runs++ =
run + saved_run;
342 if (runs >= runend) {
345 }
346 saved_run = 0;
348 }
349 //sync line pointers
350 while (offs <
width && run_off <= offs) {
353 }
354 }
355 *runs++ = saved_run;
356 if (saved_run) {
357 if (runs >= runend) {
359 return -1;
360 }
361 *runs++ = 0;
362 }
363 return 0;
364 }
365
367 {
370
372 while (pix_left > 0) {
373 run = runs[run_idx++];
376 for (;
run > 16;
run -= 16)
380 }
382 }
383
385 {
386 unsigned int state = -1;
388 while (srcsize-- > 0) {
390 if ((
state & 0xFFF) == 1)
391 return 0;
392 }
393 return -1;
394 }
395
399 {
400 int j;
402 int *runs, *
ref =
NULL, *runend;
404 int runsize = avctx->
width + 2;
405 int has_eol;
406
412 }
419
420 for (j = 0; j <
height; j++) {
421 runend = runs + runsize;
427 } else {
430 has_eol &&
432 break;
435 runend);
436 else
441 }
444
447 } else {
450 }
452 }
458 }