2 * CCITT Fax Group 3 and 4 decompression
3 * Copyright (c) 2008 Konstantin Shishkov
5 * This file is part of FFmpeg.
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.
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.
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
24 * CCITT Fax Group 3 and 4 decompression
25 * @author Konstantin Shishkov
32 #define CCITT_SYMS 104
34 static const uint16_t ccitt_syms[CCITT_SYMS] = {
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
45 static const uint8_t ccitt_codes_bits[2][CCITT_SYMS] =
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
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
69 static const uint8_t ccitt_codes_lens[2][CCITT_SYMS] =
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,
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,
89 static const uint8_t ccitt_group3_2d_bits[11] = {
90 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
93 static const uint8_t ccitt_group3_2d_lens[11] = {
94 4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
97 static VLC ccitt_vlc[2], ccitt_group3_2d_vlc;
99 av_cold void ff_ccitt_unpack_init(void)
101 static VLC_TYPE code_table1[528][2];
102 static VLC_TYPE code_table2[648][2];
104 static int initialized = 0;
108 ccitt_vlc[0].table = code_table1;
109 ccitt_vlc[0].table_allocated = 528;
110 ccitt_vlc[1].table = code_table2;
111 ccitt_vlc[1].table_allocated = 648;
112 for (i = 0; i < 2; i++) {
113 ff_init_vlc_sparse(&ccitt_vlc[i], 9, CCITT_SYMS,
114 ccitt_codes_lens[i], 1, 1,
115 ccitt_codes_bits[i], 1, 1,
117 INIT_VLC_USE_NEW_STATIC);
119 INIT_VLC_STATIC(&ccitt_group3_2d_vlc, 9, 11,
120 ccitt_group3_2d_lens, 1, 1,
121 ccitt_group3_2d_bits, 1, 1, 512);
125 static int decode_uncompressed(AVCodecContext *avctx, GetBitContext *gb,
126 unsigned int *pix_left, int **runs,
127 const int *runend, int *mode)
138 cwi = show_bits(gb, 11);
140 av_log(avctx, AV_LOG_ERROR, "Invalid uncompressed codeword\n");
141 return AVERROR_INVALIDDATA;
143 cwi = 10 - av_log2(cwi);
144 skip_bits(gb, cwi + 1);
146 newmode = get_bits1(gb);
156 for (k = 0; k < 2; k++) {
159 *(*runs)++ = saved_run;
160 if (*runs >= runend) {
161 av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
162 return AVERROR_INVALIDDATA;
164 if (*pix_left <= saved_run) {
165 av_log(avctx, AV_LOG_ERROR, "uncompressed run went out of bounds\n");
166 return AVERROR_INVALIDDATA;
168 *pix_left -= saved_run;
172 saved_run += codes[k];
176 *(*runs)++ = saved_run;
177 if (*runs >= runend) {
178 av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
179 return AVERROR_INVALIDDATA;
181 if (*pix_left <= saved_run) {
182 if (*pix_left == saved_run)
184 av_log(avctx, AV_LOG_ERROR, "uncompressed run went out of boundsE\n");
185 return AVERROR_INVALIDDATA;
187 *pix_left -= saved_run;
190 if (newmode != *mode) { //FIXME CHECK
192 if (*runs >= runend) {
193 av_log(avctx, AV_LOG_ERROR, "uncompressed run overrun\n");
194 return AVERROR_INVALIDDATA;
201 static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb,
202 unsigned int pix_left, int *runs,
206 unsigned int run = 0;
209 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
213 if (runs >= runend) {
214 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
215 return AVERROR_INVALIDDATA;
217 if (pix_left <= run) {
220 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
221 return AVERROR_INVALIDDATA;
226 } else if ((int)t == -1) {
227 if (show_bits(gb, 12) == 15) {
230 ret = decode_uncompressed(avctx, gb, &pix_left, &runs, runend, &mode);
236 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
237 return AVERROR_INVALIDDATA;
245 static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
246 unsigned int width, int *runs,
247 const int *runend, const int *ref)
249 int mode = 0, saved_run = 0, t;
250 int run_off = *ref++;
251 unsigned int offs = 0, run = 0;
253 while (offs < width) {
254 int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);
256 av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");
257 return AVERROR_INVALIDDATA;
259 if (!cmode) { //pass mode
262 run = run_off - offs;
267 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
268 return AVERROR_INVALIDDATA;
271 } else if (cmode == 1) { //horizontal mode
273 for (k = 0; k < 2; k++) {
276 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
278 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
279 return AVERROR_INVALIDDATA;
285 *runs++ = run + saved_run;
286 if (runs >= runend) {
287 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
288 return AVERROR_INVALIDDATA;
292 if (offs > width || run > width) {
293 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
294 return AVERROR_INVALIDDATA;
298 } else if (cmode == 9 || cmode == 10) {
299 int xxx = get_bits(gb, 3);
300 if (cmode == 9 && xxx == 7) {
302 int pix_left = width - offs;
305 av_log(avctx, AV_LOG_ERROR, "saved run %d on entering uncompressed mode\n", saved_run);
306 return AVERROR_INVALIDDATA;
308 ret = decode_uncompressed(avctx, gb, &pix_left, &runs, runend, &mode);
309 offs = width - pix_left;
315 avpriv_report_missing_feature(avctx, "Special mode %d xxx=%d support", cmode, xxx);
316 return AVERROR_PATCHWELCOME;
318 } else { //vertical mode
319 run = run_off - offs + (cmode - 5);
322 if (offs > width || run > width) {
323 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
324 return AVERROR_INVALIDDATA;
326 *runs++ = run + saved_run;
327 if (runs >= runend) {
328 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
329 return AVERROR_INVALIDDATA;
335 while (offs < width && run_off <= offs) {
342 if (runs >= runend) {
343 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
351 static void put_line(uint8_t *dst, int size, int width, const int *runs)
354 int run, mode = ~0, pix_left = width, run_idx = 0;
356 init_put_bits(&pb, dst, size);
357 while (pix_left > 0) {
358 run = runs[run_idx++];
361 for (; run > 16; run -= 16)
362 put_sbits(&pb, 16, mode);
364 put_sbits(&pb, run, mode);
369 static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
371 unsigned int state = -1;
372 srcsize -= get_bits_count(gb);
373 while (srcsize-- > 0) {
374 state += state + get_bits1(gb);
375 if ((state & 0xFFF) == 1)
381 int ff_ccitt_unpack(AVCodecContext *avctx, const uint8_t *src, int srcsize,
382 uint8_t *dst, int height, int stride,
383 enum TiffCompr compr, int opts)
387 int *runs, *ref = NULL, *runend;
389 int runsize = avctx->width + 2;
392 runs = av_malloc_array(runsize, sizeof(runs[0]));
393 ref = av_malloc_array(runsize, sizeof(ref[0]));
395 ret = AVERROR(ENOMEM);
398 ref[0] = avctx->width;
401 if ((ret = init_get_bits8(&gb, src, srcsize)) < 0)
403 has_eol = show_bits(&gb, 12) == 1 || show_bits(&gb, 16) == 1;
405 for (j = 0; j < height; j++) {
406 runend = runs + runsize;
407 if (compr == TIFF_G4) {
408 ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend,
413 int g3d1 = (compr == TIFF_G3) && !(opts & 1);
414 if (compr != TIFF_CCITT_RLE &&
416 find_group3_syncmarker(&gb, srcsize * 8) < 0)
418 if (compr == TIFF_CCITT_RLE || g3d1 || get_bits1(&gb))
419 ret = decode_group3_1d_line(avctx, &gb, avctx->width, runs,
422 ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs,
424 if (compr == TIFF_CCITT_RLE)
427 if (avctx->err_recognition & AV_EF_EXPLODE && ret < 0)
431 put_line(dst, stride, avctx->width, ref);
433 put_line(dst, stride, avctx->width, runs);
434 FFSWAP(int *, runs, ref);