annotate faxcompr.c @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents b579b143bbd4
children 18737839ed27
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
1 /*
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
2 * CCITT Fax Group 3 and 4 decompression
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
3 * Copyright (c) 2008 Konstantin Shishkov
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
4 *
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
6 *
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
11 *
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
16 *
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
20 */
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
21
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
22 /**
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
23 * CCITT Fax Group 3 and 4 decompression
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
24 * @file faxcompr.c
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
25 * @author Konstantin Shishkov
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
26 */
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
27 #include "avcodec.h"
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
28 #include "bitstream.h"
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
29 #include "faxcompr.h"
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
30
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
31 #define CCITT_SYMS 104
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
32
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
33 static const uint16_t ccitt_syms[CCITT_SYMS] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
34 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
35 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
36 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
37 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
38 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
39 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
40 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
41 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
42 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
43
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
44 static const uint8_t ccitt_codes_bits[2][CCITT_SYMS] =
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
45 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
46 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
47 0x35, 0x07, 0x07, 0x08, 0x0B, 0x0C, 0x0E, 0x0F, 0x13, 0x14, 0x07, 0x08, 0x08,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
48 0x03, 0x34, 0x35, 0x2A, 0x2B, 0x27, 0x0C, 0x08, 0x17, 0x03, 0x04, 0x28, 0x2B,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
49 0x13, 0x24, 0x18, 0x02, 0x03, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
50 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x04, 0x05, 0x0A, 0x0B, 0x52, 0x53, 0x54,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
51 0x55, 0x24, 0x25, 0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34, 0x1B,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
52 0x12, 0x17, 0x37, 0x36, 0x37, 0x64, 0x65, 0x68, 0x67, 0xCC, 0xCD, 0xD2, 0xD3,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
53 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98, 0x99, 0x9A, 0x18, 0x9B,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
54 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
55 },
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
56 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
57 0x37, 0x02, 0x03, 0x02, 0x03, 0x03, 0x02, 0x03, 0x05, 0x04, 0x04, 0x05, 0x07,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
58 0x04, 0x07, 0x18, 0x17, 0x18, 0x08, 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
59 0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
60 0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
61 0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67, 0x0F,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
62 0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35, 0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
63 0x73, 0x74, 0x75, 0x76, 0x77, 0x52, 0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
64 0x08, 0x0C, 0x0D, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
65 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
66 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
67
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
68 static const uint8_t ccitt_codes_lens[2][CCITT_SYMS] =
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
69 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
70 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
71 8, 6, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
72 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
73 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
74 8, 8, 8, 8, 5, 5, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
75 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 11, 11, 11, 12, 12, 12, 12, 12, 12,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
76 12, 12, 12, 12
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
77 },
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
78 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
79 10, 3, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 11,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
80 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
81 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
82 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
83 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 11, 11, 12, 12, 12, 12, 12, 12,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
84 12, 12, 12, 12
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
85 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
86 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
87
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
88 static const uint8_t ccitt_group3_2d_bits[11] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
89 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, 1
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
90 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
91
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
92 static const uint8_t ccitt_group3_2d_lens[11] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
93 4, 3, 7, 6, 3, 1, 3, 6, 7, 7, 9
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
94 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
95
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
96 static VLC ccitt_vlc[2], ccitt_group3_2d_vlc;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
97
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
98 av_cold void ff_ccitt_unpack_init()
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
99 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
100 static VLC_TYPE code_table1[528][2];
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
101 static VLC_TYPE code_table2[648][2];
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
102 int i;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
103 static int initialized = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
104
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
105 if(initialized)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
106 return;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
107 ccitt_vlc[0].table = code_table1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
108 ccitt_vlc[0].table_allocated = 528;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
109 ccitt_vlc[1].table = code_table2;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
110 ccitt_vlc[1].table_allocated = 648;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
111 for(i = 0; i < 2; i++){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
112 init_vlc_sparse(&ccitt_vlc[i], 9, CCITT_SYMS,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
113 ccitt_codes_lens[i], 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
114 ccitt_codes_bits[i], 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
115 ccitt_syms, 2, 2,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
116 INIT_VLC_USE_NEW_STATIC);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
117 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
118 INIT_VLC_STATIC(&ccitt_group3_2d_vlc, 9, 11,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
119 ccitt_group3_2d_lens, 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
120 ccitt_group3_2d_bits, 1, 1, 512);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
121 initialized = 1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
122 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
123
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
124
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
125 static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb,
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
126 unsigned int pix_left, int *runs, const int *runend)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
127 {
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
128 int mode = 0;
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
129 unsigned int run=0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
130 unsigned int t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
131 for(;;){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
132 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
133 run += t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
134 if(t < 64){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
135 *runs++ = run;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
136 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
137 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
138 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
139 }
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
140 if(pix_left <= run){
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
141 if(pix_left == run)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
142 break;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
143 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
144 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
145 }
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
146 pix_left -= run;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
147 run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
148 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
149 }else if((int)t == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
150 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
151 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
152 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
153 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
154 *runs++ = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
155 return 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
156 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
157
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
158 static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
159 unsigned int width, int *runs, const int *runend, const int *ref)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
160 {
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
161 int mode = 0, saved_run = 0, t;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
162 int run_off = *ref++;
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
163 unsigned int offs=0, run= 0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
164
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
165 runend--; // for the last written 0
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
166
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
167 while(offs < width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
168 int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
169 if(cmode == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
170 av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
171 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
172 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
173 if(!cmode){//pass mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
174 run_off += *ref++;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
175 run = run_off - offs;
8485
0ac984513c91 Minor simplification.
michael
parents: 8484
diff changeset
176 offs= run_off;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
177 run_off += *ref++;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
178 if(offs > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
179 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
180 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
181 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
182 saved_run += run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
183 }else if(cmode == 1){//horizontal mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
184 int k;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
185 for(k = 0; k < 2; k++){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
186 run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
187 for(;;){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
188 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
189 if(t == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
190 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
191 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
192 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
193 run += t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
194 if(t < 64)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
195 break;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
196 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
197 *runs++ = run + saved_run;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
198 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
199 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
200 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
201 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
202 saved_run = 0;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
203 offs += run;
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
204 if(offs > width || run > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
205 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
206 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
207 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
208 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
209 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
210 }else if(cmode == 9 || cmode == 10){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
211 av_log(avctx, AV_LOG_ERROR, "Special modes are not supported (yet)\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
212 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
213 }else{//vertical mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
214 run = run_off - offs + (cmode - 5);
8490
michael
parents: 8489
diff changeset
215 run_off -= *--ref;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
216 offs += run;
8488
f2590c8d5e9b And another sechole ...
michael
parents: 8487
diff changeset
217 if(offs > width || run > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
218 av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
219 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
220 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
221 *runs++ = run + saved_run;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
222 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
223 av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
224 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
225 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
226 saved_run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
227 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
228 }
8483
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
229 //sync line pointers
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
230 while(run_off <= offs){
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
231 run_off += *ref++;
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
232 run_off += *ref++;
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
233 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
234 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
235 *runs++ = saved_run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
236 *runs++ = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
237 return 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
238 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
239
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
240 static void put_line(uint8_t *dst, int size, int width, const int *runs)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
241 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
242 PutBitContext pb;
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
243 int run, mode = ~0, pix_left = width, run_idx = 0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
244
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
245 init_put_bits(&pb, dst, size*8);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
246 while(pix_left > 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
247 run = runs[run_idx++];
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
248 mode = ~mode;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
249 pix_left -= run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
250 for(; run > 16; run -= 16)
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
251 put_sbits(&pb, 16, mode);
8470
e765aa020de9 Simplify zero run handling in put_line().
michael
parents: 8469
diff changeset
252 if(run)
8471
michael
parents: 8470
diff changeset
253 put_sbits(&pb, run, mode);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
254 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
255 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
256
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
257 static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
258 {
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
259 unsigned int state = -1;
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
260 srcsize -= get_bits_count(gb);
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
261 while(srcsize-- > 0){
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
262 state+= state + get_bits1(gb);
8472
771f97593234 10l != vs. == (yes, my fault not kostya's).
michael
parents: 8471
diff changeset
263 if((state & 0xFFF) == 1)
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
264 return 0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
265 }
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
266 return -1;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
267 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
268
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
269 int ff_ccitt_unpack(AVCodecContext *avctx,
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
270 const uint8_t *src, int srcsize,
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
271 uint8_t *dst, int height, int stride, enum TiffCompr compr)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
272 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
273 int j;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
274 GetBitContext gb;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
275 int *runs, *ref, *runend;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
276 int ret;
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
277 int runsize= avctx->width + 2;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
278
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
279 runs = av_malloc(runsize * sizeof(runs[0]));
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
280 ref = av_malloc(runsize * sizeof(ref[0]));
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
281 ref[0] = avctx->width;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
282 ref[1] = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
283 ref[2] = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
284 init_get_bits(&gb, src, srcsize*8);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
285 for(j = 0; j < height; j++){
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
286 runend = runs + runsize;
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
287 if(compr == TIFF_G4){
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
288 ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend, ref);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
289 if(ret < 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
290 av_free(runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
291 av_free(ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
292 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
293 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
294 }else{
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
295 if(find_group3_syncmarker(&gb, srcsize*8) < 0)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
296 break;
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
297 if(compr==TIFF_CCITT_RLE || get_bits1(&gb))
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
298 ret = decode_group3_1d_line(avctx, &gb, avctx->width, runs, runend);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
299 else
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
300 ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend, ref);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
301 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
302 if(ret < 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
303 put_line(dst, stride, avctx->width, ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
304 }else{
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
305 put_line(dst, stride, avctx->width, runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
306 FFSWAP(int*, runs, ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
307 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
308 dst += stride;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
309 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
310 av_free(runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
311 av_free(ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
312 return 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
313 }