faxcompr.c
Go to the documentation of this file.
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  */
27 #include "avcodec.h"
28 #include "get_bits.h"
29 #include "put_bits.h"
30 #include "faxcompr.h"
31 
32 #define CCITT_SYMS 104
33 
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
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 
89 static const uint8_t ccitt_group3_2d_bits[11] = {
90  1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
91 };
92 
93 static const uint8_t ccitt_group3_2d_lens[11] = {
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;
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,
116  ccitt_syms, 2, 2,
118  }
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);
122  initialized = 1;
123 }
124 
125 
127  unsigned int pix_left, int *runs, const int *runend)
128 {
129  int mode = 0;
130  unsigned int run=0;
131  unsigned int t;
132  for(;;){
133  t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
134  run += t;
135  if(t < 64){
136  *runs++ = run;
137  if(runs >= runend){
138  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
139  return -1;
140  }
141  if(pix_left <= run){
142  if(pix_left == run)
143  break;
144  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
145  return -1;
146  }
147  pix_left -= run;
148  run = 0;
149  mode = !mode;
150  }else if((int)t == -1){
151  av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
152  return -1;
153  }
154  }
155  *runs++ = 0;
156  return 0;
157 }
158 
160  unsigned int width, int *runs, const int *runend, const int *ref)
161 {
162  int mode = 0, saved_run = 0, t;
163  int run_off = *ref++;
164  unsigned int offs=0, run= 0;
165 
166  while(offs < width){
167  int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);
168  if(cmode == -1){
169  av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");
170  return -1;
171  }
172  if(!cmode){//pass mode
173  if(run_off < width)
174  run_off += *ref++;
175  run = run_off - offs;
176  offs= run_off;
177  if(run_off < width)
178  run_off += *ref++;
179  if(offs > width){
180  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
181  return -1;
182  }
183  saved_run += run;
184  }else if(cmode == 1){//horizontal mode
185  int k;
186  for(k = 0; k < 2; k++){
187  run = 0;
188  for(;;){
189  t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
190  if(t == -1){
191  av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
192  return -1;
193  }
194  run += t;
195  if(t < 64)
196  break;
197  }
198  *runs++ = run + saved_run;
199  if(runs >= runend){
200  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
201  return -1;
202  }
203  saved_run = 0;
204  offs += run;
205  if(offs > width || run > width){
206  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
207  return -1;
208  }
209  mode = !mode;
210  }
211  }else if(cmode == 9 || cmode == 10){
212  av_log(avctx, AV_LOG_ERROR, "Special modes are not supported (yet)\n");
213  return -1;
214  }else{//vertical mode
215  run = run_off - offs + (cmode - 5);
216  run_off -= *--ref;
217  offs += run;
218  if(offs > width || run > width){
219  av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
220  return -1;
221  }
222  *runs++ = run + saved_run;
223  if(runs >= runend){
224  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
225  return -1;
226  }
227  saved_run = 0;
228  mode = !mode;
229  }
230  //sync line pointers
231  while(offs < width && run_off <= offs){
232  run_off += *ref++;
233  run_off += *ref++;
234  }
235  }
236  *runs++ = saved_run;
237  if (saved_run) {
238  if(runs >= runend){
239  av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
240  return -1;
241  }
242  *runs++ = 0;
243  }
244  return 0;
245 }
246 
247 static void put_line(uint8_t *dst, int size, int width, const int *runs)
248 {
249  PutBitContext pb;
250  int run, mode = ~0, pix_left = width, run_idx = 0;
251 
252  init_put_bits(&pb, dst, size*8);
253  while(pix_left > 0){
254  run = runs[run_idx++];
255  mode = ~mode;
256  pix_left -= run;
257  for(; run > 16; run -= 16)
258  put_sbits(&pb, 16, mode);
259  if(run)
260  put_sbits(&pb, run, mode);
261  }
262  flush_put_bits(&pb);
263 }
264 
265 static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
266 {
267  unsigned int state = -1;
268  srcsize -= get_bits_count(gb);
269  while(srcsize-- > 0){
270  state+= state + get_bits1(gb);
271  if((state & 0xFFF) == 1)
272  return 0;
273  }
274  return -1;
275 }
276 
278  const uint8_t *src, int srcsize,
279  uint8_t *dst, int height, int stride,
280  enum TiffCompr compr, int opts)
281 {
282  int j;
283  GetBitContext gb;
284  int *runs, *ref = NULL, *runend;
285  int ret;
286  int runsize= avctx->width + 2;
287  int err = 0;
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) {
293  err = AVERROR(ENOMEM);
294  goto fail;
295  }
296  ref[0] = avctx->width;
297  ref[1] = 0;
298  ref[2] = 0;
299  init_get_bits(&gb, src, srcsize*8);
300  has_eol = show_bits(&gb, 12) == 1 || show_bits(&gb, 16) == 1;
301 
302  for(j = 0; j < height; j++){
303  runend = runs + runsize;
304  if(compr == TIFF_G4){
305  ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend, ref);
306  if(ret < 0){
307  err = -1;
308  goto fail;
309  }
310  }else{
311  int g3d1 = (compr == TIFF_G3) && !(opts & 1);
312  if(compr!=TIFF_CCITT_RLE && has_eol && find_group3_syncmarker(&gb, srcsize*8) < 0)
313  break;
314  if(compr==TIFF_CCITT_RLE || g3d1 || get_bits1(&gb))
315  ret = decode_group3_1d_line(avctx, &gb, avctx->width, runs, runend);
316  else
317  ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend, ref);
318  if(compr==TIFF_CCITT_RLE)
319  align_get_bits(&gb);
320  }
321  if(ret < 0){
322  put_line(dst, stride, avctx->width, ref);
323  }else{
324  put_line(dst, stride, avctx->width, runs);
325  FFSWAP(int*, runs, ref);
326  }
327  dst += stride;
328  }
329 fail:
330  av_free(runs);
331  av_free(ref);
332  return err;
333 }
#define CCITT_SYMS
Definition: faxcompr.c:32
static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
Definition: faxcompr.c:265
FIXME Range Coding of cr are ref
Definition: snow.txt:367
static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb, unsigned int pix_left, int *runs, const int *runend)
Definition: faxcompr.c:126
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:172
static void put_line(uint8_t *dst, int size, int width, const int *runs)
Definition: faxcompr.c:247
#define VLC_TYPE
Definition: get_bits.h:61
uint8_t run
Definition: svq3.c:136
static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb, unsigned int width, int *runs, const int *runend, const int *ref)
Definition: faxcompr.c:159
int stride
Definition: mace.c:144
Definition: tiff.h:91
static const uint8_t ccitt_group3_2d_bits[11]
Definition: faxcompr.c:89
av_cold void ff_ccitt_unpack_init(void)
initialize upacker code
Definition: faxcompr.c:99
int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Definition: bitstream.c:262
uint8_t
#define av_cold
Definition: attributes.h:78
mode
Definition: f_perms.c:27
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
Definition: get_bits.h:445
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
bitstream reader API header.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const uint16_t ccitt_syms[CCITT_SYMS]
Definition: faxcompr.c:34
static const struct endianess table[]
static const uint8_t ccitt_codes_bits[2][CCITT_SYMS]
Definition: faxcompr.c:45
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int ff_ccitt_unpack(AVCodecContext *avctx, const uint8_t *src, int srcsize, uint8_t *dst, int height, int stride, enum TiffCompr compr, int opts)
unpack data compressed with CCITT Group 3 1/2-D or Group 4 method
Definition: faxcompr.c:277
external API header
int size
Definition: get_bits.h:63
ret
Definition: avfilter.c:821
int width
picture width / height.
t
Definition: genspecsines3.m:6
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
Definition: get_bits.h:255
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
#define INIT_VLC_USE_NEW_STATIC
Definition: get_bits.h:443
static VLC ccitt_group3_2d_vlc
Definition: faxcompr.c:97
int table_allocated
Definition: get_bits.h:66
for k
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
TiffCompr
list of TIFF compression types
Definition: tiff.h:87
AVS_Value src
Definition: avisynth_c.h:523
main external API structure.
Definition: tiff.h:90
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
static const uint8_t ccitt_group3_2d_lens[11]
Definition: faxcompr.c:93
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static uint32_t state
Definition: trasher.c:27
static VLC ccitt_vlc[2]
Definition: faxcompr.c:97
static const uint8_t ccitt_codes_lens[2][CCITT_SYMS]
Definition: faxcompr.c:69
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
static const uint8_t * align_get_bits(GetBitContext *s)
Definition: get_bits.h:418
#define FFSWAP(type, a, b)
Definition: common.h:61
CCITT Fax Group 3 and 4 decompression.
bitstream writer API