annotate faxcompr.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents 7dd2a45249a9
children
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
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 10315
diff changeset
24 * @file
8466
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"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9411
diff changeset
28 #include "get_bits.h"
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents: 8718
diff changeset
29 #include "put_bits.h"
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
30 #include "faxcompr.h"
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
31
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
32 #define CCITT_SYMS 104
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
33
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
34 static const uint16_t ccitt_syms[CCITT_SYMS] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
44
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
45 static const uint8_t ccitt_codes_bits[2][CCITT_SYMS] =
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 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
48 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
49 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
50 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
51 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
52 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
53 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
54 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
55 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
56 },
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
57 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
58 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
59 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
60 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
61 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
62 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
63 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
64 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
65 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
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
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
69 static const uint8_t ccitt_codes_lens[2][CCITT_SYMS] =
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 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
72 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
73 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
74 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
75 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
76 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
77 12, 12, 12, 12
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 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
80 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
81 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
82 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
83 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
84 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
85 12, 12, 12, 12
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
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
89 static const uint8_t ccitt_group3_2d_bits[11] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
90 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
91 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
92
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
93 static const uint8_t ccitt_group3_2d_lens[11] = {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
94 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
95 };
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
96
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
97 static VLC ccitt_vlc[2], ccitt_group3_2d_vlc;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
98
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8490
diff changeset
99 av_cold void ff_ccitt_unpack_init(void)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
100 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
101 static VLC_TYPE code_table1[528][2];
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
102 static VLC_TYPE code_table2[648][2];
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
103 int i;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
104 static int initialized = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
105
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
106 if(initialized)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
107 return;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
108 ccitt_vlc[0].table = code_table1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
109 ccitt_vlc[0].table_allocated = 528;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
110 ccitt_vlc[1].table = code_table2;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
111 ccitt_vlc[1].table_allocated = 648;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
112 for(i = 0; i < 2; i++){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
113 init_vlc_sparse(&ccitt_vlc[i], 9, CCITT_SYMS,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
114 ccitt_codes_lens[i], 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
115 ccitt_codes_bits[i], 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
116 ccitt_syms, 2, 2,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
117 INIT_VLC_USE_NEW_STATIC);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
118 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
119 INIT_VLC_STATIC(&ccitt_group3_2d_vlc, 9, 11,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
120 ccitt_group3_2d_lens, 1, 1,
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
121 ccitt_group3_2d_bits, 1, 1, 512);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
122 initialized = 1;
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
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
126 static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb,
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
127 unsigned int pix_left, int *runs, const int *runend)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
128 {
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
129 int mode = 0;
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
130 unsigned int run=0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
131 unsigned int t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
132 for(;;){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
133 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
134 run += t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
135 if(t < 64){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
136 *runs++ = run;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
137 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
138 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
139 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
140 }
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
141 if(pix_left <= run){
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
142 if(pix_left == run)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
143 break;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
144 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
145 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
146 }
8486
87284151c592 Fix another sechole.
michael
parents: 8485
diff changeset
147 pix_left -= run;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
148 run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
149 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
150 }else if((int)t == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
151 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
152 return -1;
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 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
155 *runs++ = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
156 return 0;
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
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
159 static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
160 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
161 {
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
162 int mode = 0, saved_run = 0, t;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
163 int run_off = *ref++;
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
164 unsigned int offs=0, run= 0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
165
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
166 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
167
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
168 while(offs < width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
169 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
170 if(cmode == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
171 av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
172 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
173 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
174 if(!cmode){//pass mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
175 run_off += *ref++;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
176 run = run_off - offs;
8485
0ac984513c91 Minor simplification.
michael
parents: 8484
diff changeset
177 offs= run_off;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
178 run_off += *ref++;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
179 if(offs > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
180 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
181 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
182 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
183 saved_run += run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
184 }else if(cmode == 1){//horizontal mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
185 int k;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
186 for(k = 0; k < 2; k++){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
187 run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
188 for(;;){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
189 t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
190 if(t == -1){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
191 av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
192 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
193 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
194 run += t;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
195 if(t < 64)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
196 break;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
197 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
198 *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
199 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
200 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
201 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
202 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
203 saved_run = 0;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
204 offs += run;
8487
88e8b4f81275 Fix yet another sechole.
michael
parents: 8486
diff changeset
205 if(offs > width || run > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
206 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
207 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
208 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
209 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
210 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
211 }else if(cmode == 9 || cmode == 10){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
212 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
213 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
214 }else{//vertical mode
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
215 run = run_off - offs + (cmode - 5);
8490
michael
parents: 8489
diff changeset
216 run_off -= *--ref;
8481
f456c3aebe1c Get rid of pix_left in the 2d code, it is simpler that way.
michael
parents: 8478
diff changeset
217 offs += run;
8488
f2590c8d5e9b And another sechole ...
michael
parents: 8487
diff changeset
218 if(offs > width || run > width){
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
219 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
220 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
221 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
222 *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
223 if(runs >= runend){
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
224 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
225 return -1;
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
226 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
227 saved_run = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
228 mode = !mode;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
229 }
8483
c8113e1e91c0 Move sync line pointers code to the end of the loop, it is simpler that way.
michael
parents: 8482
diff changeset
230 //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
231 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
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 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
234 }
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
235 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
236 *runs++ = saved_run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
237 *runs++ = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
238 return 0;
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
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
241 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
242 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
243 PutBitContext pb;
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
244 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
245
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
246 init_put_bits(&pb, dst, size*8);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
247 while(pix_left > 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
248 run = runs[run_idx++];
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
249 mode = ~mode;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
250 pix_left -= run;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
251 for(; run > 16; run -= 16)
8469
5b63a9da46f4 Avoid negation in put_line().
michael
parents: 8468
diff changeset
252 put_sbits(&pb, 16, mode);
8470
e765aa020de9 Simplify zero run handling in put_line().
michael
parents: 8469
diff changeset
253 if(run)
8471
michael
parents: 8470
diff changeset
254 put_sbits(&pb, run, mode);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
255 }
10311
943b63f364ca Make sure all the bits are written to output in fax data decoder.
kostya
parents: 10305
diff changeset
256 flush_put_bits(&pb);
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
257 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
258
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
259 static int find_group3_syncmarker(GetBitContext *gb, int srcsize)
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
260 {
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
261 unsigned int state = -1;
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
262 srcsize -= get_bits_count(gb);
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
263 while(srcsize-- > 0){
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
264 state+= state + get_bits1(gb);
8472
771f97593234 10l != vs. == (yes, my fault not kostya's).
michael
parents: 8471
diff changeset
265 if((state & 0xFFF) == 1)
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
266 return 0;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
267 }
8467
3700af1c1f4f Fix (rewrite) find_group3_syncmarker().
michael
parents: 8466
diff changeset
268 return -1;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
269 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
270
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
271 int ff_ccitt_unpack(AVCodecContext *avctx,
10305
86fadefa1143 cosmetics: reindent and reformat function declarations
kostya
parents: 10304
diff changeset
272 const uint8_t *src, int srcsize,
86fadefa1143 cosmetics: reindent and reformat function declarations
kostya
parents: 10304
diff changeset
273 uint8_t *dst, int height, int stride,
86fadefa1143 cosmetics: reindent and reformat function declarations
kostya
parents: 10304
diff changeset
274 enum TiffCompr compr, int opts)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
275 {
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
276 int j;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
277 GetBitContext gb;
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
278 int *runs, *ref, *runend;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
279 int ret;
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
280 int runsize= avctx->width + 2;
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
281
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
282 runs = av_malloc(runsize * sizeof(runs[0]));
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
283 ref = av_malloc(runsize * sizeof(ref[0]));
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
284 ref[0] = avctx->width;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
285 ref[1] = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
286 ref[2] = 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
287 init_get_bits(&gb, src, srcsize*8);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
288 for(j = 0; j < height; j++){
8478
2f7c09bb6bfb Factorize "avctx->width + 2" out to avoid someone mistakenly changing
michael
parents: 8477
diff changeset
289 runend = runs + runsize;
8474
cb4009996efa Merge ff_ccitt_unpack_1d and 2d.
michael
parents: 8473
diff changeset
290 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
291 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
292 if(ret < 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
293 av_free(runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
294 av_free(ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
295 return -1;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
296 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
297 }else{
10304
370d05e51d90 Finally distinguish TIFF_CCITT_RLE and TIFF_G3 1-D case, so both of them
kostya
parents: 10272
diff changeset
298 int g3d1 = (compr == TIFF_G3) && !(opts & 1);
10272
cc02e912d20e Fix decoding of TIFF CCITT RLE compressed data.
kostya
parents: 9428
diff changeset
299 if(compr!=TIFF_CCITT_RLE && find_group3_syncmarker(&gb, srcsize*8) < 0)
8466
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
300 break;
10304
370d05e51d90 Finally distinguish TIFF_CCITT_RLE and TIFF_G3 1-D case, so both of them
kostya
parents: 10272
diff changeset
301 if(compr==TIFF_CCITT_RLE || g3d1 || get_bits1(&gb))
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
302 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
303 else
8476
0a0d7c4f2cf3 Close gaping sechole. That is, a series of run=0 allows arbitrary data to
michael
parents: 8475
diff changeset
304 ret = decode_group3_2d_line(avctx, &gb, avctx->width, runs, runend, ref);
10315
27cb9c2c0c6b Simplify r20025: use align_get_bits instead of reimplementing it.
reimar
parents: 10311
diff changeset
305 if(compr==TIFF_CCITT_RLE)
27cb9c2c0c6b Simplify r20025: use align_get_bits instead of reimplementing it.
reimar
parents: 10311
diff changeset
306 align_get_bits(&gb);
8466
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 if(ret < 0){
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
309 put_line(dst, stride, avctx->width, ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
310 }else{
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
311 put_line(dst, stride, avctx->width, runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
312 FFSWAP(int*, runs, ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
313 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
314 dst += stride;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
315 }
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
316 av_free(runs);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
317 av_free(ref);
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
318 return 0;
a11f1002f6b0 CCITT Fax Group 3 and 4 decompression by kostya.
michael
parents:
diff changeset
319 }