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
23 * CCITT Fax Group 3 and 4 decompression
25 * @author Konstantin Shishkov
28 #include "bitstream.h"
31 #define CCITT_SYMS 104
33 static const uint16_t ccitt_syms
[CCITT_SYMS
] = {
34 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
35 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
36 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
37 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
38 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
39 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896,
40 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728,
41 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560
44 static const uint8_t ccitt_codes_bits
[2][CCITT_SYMS
] =
47 0x35, 0x07, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, 0x13, 0x14, 0x07, 0x08, 0x08,
48 0x03, 0x34, 0x35, 0x2A, 0x2B, 0x27, 0x0C, 0x08, 0x17, 0x03, 0x04, 0x28, 0x2B,
49 0x13, 0x24, 0x18, 0x02, 0x03, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
50 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x04, 0x05, 0x0A, 0x0B, 0x52, 0x53, 0x54,
51 0x55, 0x24, 0x25, 0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34, 0x1B,
52 0x12, 0x17, 0x37, 0x36, 0x37, 0x64, 0x65, 0x68, 0x67, 0xCC, 0xCD, 0xD2, 0xD3,
53 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98, 0x99, 0x9A, 0x18, 0x9B,
54 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
57 0x37, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x05, 0x04, 0x04, 0x05, 0x07,
58 0x04, 0x07, 0x18, 0x17, 0x18, 0x08, 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18,
59 0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
60 0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
61 0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67, 0x0F,
62 0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35, 0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72,
63 0x73, 0x74, 0x75, 0x76, 0x77, 0x52, 0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65,
64 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
68 static const uint8_t ccitt_codes_lens
[2][CCITT_SYMS
] =
71 8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7,
72 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
73 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74 8, 8, 8, 8, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
75 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 11, 11, 11, 12, 12, 12, 12, 12, 12,
79 10, 3, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11,
80 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
81 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
82 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
83 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 11, 12, 12, 12, 12, 12, 12,
88 static const uint8_t ccitt_group3_2d_bits
[11] = {
89 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
92 static const uint8_t ccitt_group3_2d_lens
[11] = {
93 4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
96 static VLC ccitt_vlc
[2], ccitt_group3_2d_vlc
;
98 av_cold
void ff_ccitt_unpack_init()
100 static VLC_TYPE code_table1
[528][2];
101 static VLC_TYPE code_table2
[648][2];
103 static int initialized
= 0;
107 ccitt_vlc
[0].table
= code_table1
;
108 ccitt_vlc
[0].table_allocated
= 528;
109 ccitt_vlc
[1].table
= code_table2
;
110 ccitt_vlc
[1].table_allocated
= 648;
111 for(i
= 0; i
< 2; i
++){
112 init_vlc_sparse(&ccitt_vlc
[i
], 9, CCITT_SYMS
,
113 ccitt_codes_lens
[i
], 1, 1,
114 ccitt_codes_bits
[i
], 1, 1,
116 INIT_VLC_USE_NEW_STATIC
);
118 INIT_VLC_STATIC(&ccitt_group3_2d_vlc
, 9, 11,
119 ccitt_group3_2d_lens
, 1, 1,
120 ccitt_group3_2d_bits
, 1, 1, 512);
125 static int decode_group3_1d_line(AVCodecContext
*avctx
, GetBitContext
*gb
,
126 int pix_left
, int *runs
)
128 int mode
= 0, run
= 0;
131 t
= get_vlc2(gb
, ccitt_vlc
[mode
].table
, 9, 2);
140 av_log(avctx
, AV_LOG_ERROR
, "Run went out of bounds\n");
145 }else if((int)t
== -1){
146 av_log(avctx
, AV_LOG_ERROR
, "Incorrect code\n");
154 static int decode_group3_2d_line(AVCodecContext
*avctx
, GetBitContext
*gb
,
155 int pix_left
, int *runs
, const int *ref
)
157 int mode
= 0, offs
= 0, run
= 0, saved_run
= 0, t
;
158 int run_off
= *ref
++;
159 int *run_start
= runs
;
162 int cmode
= get_vlc2(gb
, ccitt_group3_2d_vlc
.table
, 9, 1);
164 av_log(avctx
, AV_LOG_ERROR
, "Incorrect mode VLC\n");
168 if(runs
!= run_start
)while(run_off
<= offs
&& run_off
< avctx
->width
){
172 if(!cmode
){//pass mode
174 run
= run_off
- offs
;
178 av_log(avctx
, AV_LOG_ERROR
, "Run went out of bounds\n");
183 }else if(cmode
== 1){//horizontal mode
185 for(k
= 0; k
< 2; k
++){
188 t
= get_vlc2(gb
, ccitt_vlc
[mode
].table
, 9, 2);
190 av_log(avctx
, AV_LOG_ERROR
, "Incorrect code\n");
197 *runs
++ = run
+ saved_run
;
200 av_log(avctx
, AV_LOG_ERROR
, "Run went out of bounds\n");
207 }else if(cmode
== 9 || cmode
== 10){
208 av_log(avctx
, AV_LOG_ERROR
, "Special modes are not supported (yet)\n");
210 }else{//vertical mode
211 run
= run_off
- offs
+ (cmode
- 5);
218 av_log(avctx
, AV_LOG_ERROR
, "Run went out of bounds\n");
222 *runs
++ = run
+ saved_run
;
232 static void put_line(uint8_t *dst
, int size
, int width
, const int *runs
)
235 int run
, mode
= 0, pix_left
= width
, run_idx
= 0;
237 init_put_bits(&pb
, dst
, size
*8);
239 run
= runs
[run_idx
++];
245 for(; run
> 16; run
-= 16)
246 put_sbits(&pb
, 16, -mode
);
247 put_sbits(&pb
, run
, -mode
);
252 static int find_group3_syncmarker(GetBitContext
*gb
, int srcsize
)
254 int state
= get_bits(gb
, 12);
255 int rem
= srcsize
- get_bits_count(gb
);
256 while((state
& 0xFFF) != 1){
257 state
= (state
<< 1) | get_bits1(gb
);
264 int ff_ccitt_unpack_1d(AVCodecContext
*avctx
,
265 const uint8_t *src
, int srcsize
,
266 uint8_t *dst
, int height
, int stride
)
272 runs
= av_malloc(avctx
->width
* sizeof(runs
[0]));
273 last
= av_malloc(avctx
->width
* sizeof(last
[0]));
274 init_get_bits(&gb
, src
, srcsize
*8);
275 for(j
= 0; j
< height
; j
++){
276 if(find_group3_syncmarker(&gb
, srcsize
*8) < 0)
278 if(decode_group3_1d_line(avctx
, &gb
, avctx
->width
, runs
) < 0){
279 put_line(dst
, stride
, avctx
->width
, last
);
281 put_line(dst
, stride
, avctx
->width
, runs
);
282 FFSWAP(int*, last
, runs
);
291 int ff_ccitt_unpack_2d(AVCodecContext
*avctx
,
292 const uint8_t *src
, int srcsize
,
293 uint8_t *dst
, int height
, int stride
, int g4
)
300 runs
= av_malloc((avctx
->width
+ 2) * sizeof(runs
[0]));
301 ref
= av_malloc((avctx
->width
+ 2) * sizeof(ref
[0]));
302 ref
[0] = avctx
->width
;
305 init_get_bits(&gb
, src
, srcsize
*8);
306 for(j
= 0; j
< height
; j
++){
308 ret
= decode_group3_2d_line(avctx
, &gb
, avctx
->width
, runs
, ref
);
315 if(find_group3_syncmarker(&gb
, srcsize
*8) < 0)
318 ret
= decode_group3_1d_line(avctx
, &gb
, avctx
->width
, runs
);
320 ret
= decode_group3_2d_line(avctx
, &gb
, avctx
->width
, runs
, ref
);
323 put_line(dst
, stride
, avctx
->width
, ref
);
325 put_line(dst
, stride
, avctx
->width
, runs
);
326 FFSWAP(int*, runs
, ref
);