annotate iff.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents ffb3668ff7af
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
1 /*
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
2 * IFF PBM/ILBM bitmap decoder
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
3 * Copyright (c) 2010 Peter Ross <pross@xvid.org>
11661
7a5f3c94b9ad Switch some ints to unsigned (they can only have positive values, this allows
rbultje
parents: 11660
diff changeset
4 * Copyright (c) 2010 Sebastian Vater <cdgs.basty@googlemail.com>
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
5 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
6 * This file is part of FFmpeg.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
7 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
12 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
16 * Lesser General Public License for more details.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
17 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
21 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
22
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
23 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
24 * @file
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
25 * IFF PBM/ILBM bitmap decoder
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
26 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
27
12372
914f484bb476 Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents: 12128
diff changeset
28 #include "libavcore/imgutils.h"
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
29 #include "bytestream.h"
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
30 #include "avcodec.h"
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
31 #include "get_bits.h"
11395
5b9d41da4152 IFF: move ff_cmap_read_palette() prototype to a header file
mru
parents: 11336
diff changeset
32 #include "iff.h"
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
33
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
34 typedef struct {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
35 AVFrame frame;
11678
e1dd1ff1ab27 Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents: 11663
diff changeset
36 int planesize;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
37 uint8_t * planebuf;
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
38 int init; // 1 if buffer and palette data already initialized, 0 otherwise
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
39 } IffContext;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
40
11691
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
41 #define LUT8_PART(plane, v) \
12128
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
42 AV_LE2NE64C(UINT64_C(0x0000000)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
43 AV_LE2NE64C(UINT64_C(0x1000000)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
44 AV_LE2NE64C(UINT64_C(0x0010000)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
45 AV_LE2NE64C(UINT64_C(0x1010000)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
46 AV_LE2NE64C(UINT64_C(0x0000100)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
47 AV_LE2NE64C(UINT64_C(0x1000100)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
48 AV_LE2NE64C(UINT64_C(0x0010100)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
49 AV_LE2NE64C(UINT64_C(0x1010100)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
50 AV_LE2NE64C(UINT64_C(0x0000001)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
51 AV_LE2NE64C(UINT64_C(0x1000001)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
52 AV_LE2NE64C(UINT64_C(0x0010001)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
53 AV_LE2NE64C(UINT64_C(0x1010001)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
54 AV_LE2NE64C(UINT64_C(0x0000101)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
55 AV_LE2NE64C(UINT64_C(0x1000101)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
56 AV_LE2NE64C(UINT64_C(0x0010101)<<32 | v) << plane, \
ee740a4e80c5 bswap: change ME to NE in macro names
mru
parents: 12024
diff changeset
57 AV_LE2NE64C(UINT64_C(0x1010101)<<32 | v) << plane
11691
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
58
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
59 #define LUT8(plane) { \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
60 LUT8_PART(plane, 0x0000000), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
61 LUT8_PART(plane, 0x1000000), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
62 LUT8_PART(plane, 0x0010000), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
63 LUT8_PART(plane, 0x1010000), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
64 LUT8_PART(plane, 0x0000100), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
65 LUT8_PART(plane, 0x1000100), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
66 LUT8_PART(plane, 0x0010100), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
67 LUT8_PART(plane, 0x1010100), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
68 LUT8_PART(plane, 0x0000001), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
69 LUT8_PART(plane, 0x1000001), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
70 LUT8_PART(plane, 0x0010001), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
71 LUT8_PART(plane, 0x1010001), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
72 LUT8_PART(plane, 0x0000101), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
73 LUT8_PART(plane, 0x1000101), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
74 LUT8_PART(plane, 0x0010101), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
75 LUT8_PART(plane, 0x1010101), \
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
76 }
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
77
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
78 // 8 planes * 8-bit mask
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
79 static const uint64_t plane8_lut[8][256] = {
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
80 LUT8(0), LUT8(1), LUT8(2), LUT8(3),
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
81 LUT8(4), LUT8(5), LUT8(6), LUT8(7),
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
82 };
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
83
11700
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
84 #define LUT32(plane) { \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
85 0, 0, 0, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
86 0, 0, 0, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
87 0, 0, 1 << plane, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
88 0, 0, 1 << plane, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
89 0, 1 << plane, 0, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
90 0, 1 << plane, 0, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
91 0, 1 << plane, 1 << plane, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
92 0, 1 << plane, 1 << plane, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
93 1 << plane, 0, 0, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
94 1 << plane, 0, 0, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
95 1 << plane, 0, 1 << plane, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
96 1 << plane, 0, 1 << plane, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
97 1 << plane, 1 << plane, 0, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
98 1 << plane, 1 << plane, 0, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
99 1 << plane, 1 << plane, 1 << plane, 0, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
100 1 << plane, 1 << plane, 1 << plane, 1 << plane, \
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
101 }
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
102
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
103 // 32 planes * 4-bit mask * 4 lookup tables each
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
104 static const uint32_t plane32_lut[32][16*4] = {
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
105 LUT32( 0), LUT32( 1), LUT32( 2), LUT32( 3),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
106 LUT32( 4), LUT32( 5), LUT32( 6), LUT32( 7),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
107 LUT32( 8), LUT32( 9), LUT32(10), LUT32(11),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
108 LUT32(12), LUT32(13), LUT32(14), LUT32(15),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
109 LUT32(16), LUT32(17), LUT32(18), LUT32(19),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
110 LUT32(20), LUT32(21), LUT32(22), LUT32(23),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
111 LUT32(24), LUT32(25), LUT32(26), LUT32(27),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
112 LUT32(28), LUT32(29), LUT32(30), LUT32(31),
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
113 };
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
114
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
115 // Gray to RGB, required for palette table of grayscale images with bpp < 8
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
116 static av_always_inline uint32_t gray2rgb(const uint32_t x) {
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
117 return x << 16 | x << 8 | x;
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
118 }
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
119
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
120 /**
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
121 * Convert CMAP buffer (stored in extradata) to lavc palette format
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
122 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
123 int ff_cmap_read_palette(AVCodecContext *avctx, uint32_t *pal)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
124 {
11678
e1dd1ff1ab27 Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents: 11663
diff changeset
125 int count, i;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
126
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
127 if (avctx->bits_per_coded_sample > 8) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
128 av_log(avctx, AV_LOG_ERROR, "bit_per_coded_sample > 8 not supported\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
129 return AVERROR_INVALIDDATA;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
130 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
131
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
132 count = 1 << avctx->bits_per_coded_sample;
11718
f2beca0bbf98 Handle palette underflows, fill remaining space with black (zero) data.
rbultje
parents: 11717
diff changeset
133 // If extradata is smaller than actually needed, fill the remaining with black.
f2beca0bbf98 Handle palette underflows, fill remaining space with black (zero) data.
rbultje
parents: 11717
diff changeset
134 count = FFMIN(avctx->extradata_size / 3, count);
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
135 if (count) {
11726
7c35c611faa4 Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11725
diff changeset
136 for (i=0; i < count; i++) {
7c35c611faa4 Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11725
diff changeset
137 pal[i] = 0xFF000000 | AV_RB24( avctx->extradata + i*3 );
7c35c611faa4 Reindent after r23124. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11725
diff changeset
138 }
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
139 } else { // Create gray-scale color palette for bps < 8
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
140 count = 1 << avctx->bits_per_coded_sample;
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
141
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
142 for (i=0; i < count; i++) {
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
143 pal[i] = 0xFF000000 | gray2rgb((i * 255) >> avctx->bits_per_coded_sample);
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
144 }
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
145 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
146 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
147 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
148
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
149 static av_cold int decode_init(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
150 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
151 IffContext *s = avctx->priv_data;
11480
534872e7ab38 Make iff.c:decode_init return the value returned by
stefano
parents: 11395
diff changeset
152 int err;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
153
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
154 if (avctx->bits_per_coded_sample <= 8) {
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
155 avctx->pix_fmt = (avctx->bits_per_coded_sample < 8 ||
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
156 avctx->extradata_size) ? PIX_FMT_PAL8
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
157 : PIX_FMT_GRAY8;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
158 } else if (avctx->bits_per_coded_sample <= 32) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
159 avctx->pix_fmt = PIX_FMT_BGR32;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
160 } else {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
161 return AVERROR_INVALIDDATA;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
162 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
163
12462
ffb3668ff7af Use new imgutils.h API names, fix deprecation warnings.
stefano
parents: 12372
diff changeset
164 if ((err = av_image_check_size(avctx->width, avctx->height, 0, avctx)))
11699
83b49b0997e8 Ensure that width and height are > 0. avcodec_open() itself only checks that
rbultje
parents: 11693
diff changeset
165 return err;
11679
fe1e6103b68d Align plane size to word-boundary.
cehoyos
parents: 11678
diff changeset
166 s->planesize = FFALIGN(avctx->width, 16) >> 3; // Align plane size in bits to word-boundary
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
167 s->planebuf = av_malloc(s->planesize + FF_INPUT_BUFFER_PADDING_SIZE);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
168 if (!s->planebuf)
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
169 return AVERROR(ENOMEM);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
170
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
171 s->frame.reference = 1;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
172
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
173 return 0;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
174 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
175
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
176 /**
11660
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
177 * Decode interleaved plane buffer up to 8bpp
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
178 * @param dst Destination buffer
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
179 * @param buf Source buffer
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
180 * @param buf_size
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
181 * @param plane plane number to decode as
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
182 */
11693
3ec57be57312 Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents: 11692
diff changeset
183 static void decodeplane8(uint8_t *dst, const uint8_t *buf, int buf_size, int plane)
11660
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
184 {
11691
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
185 const uint64_t *lut = plane8_lut[plane];
11717
269ce565c70b Move a while(..){..} -> do{..}while(..), slightly faster.
rbultje
parents: 11700
diff changeset
186 do {
11691
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
187 uint64_t v = AV_RN64A(dst) | lut[*buf++];
24827da9c8dc Optimize decodeplane8(), patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11679
diff changeset
188 AV_WN64A(dst, v);
11692
5eb6d3cbf257 IFF: decode last 8 pixels per line
mru
parents: 11691
diff changeset
189 dst += 8;
11717
269ce565c70b Move a while(..){..} -> do{..}while(..), slightly faster.
rbultje
parents: 11700
diff changeset
190 } while (--buf_size);
11660
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
191 }
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
192
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
193 /**
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
194 * Decode interleaved plane buffer up to 24bpp
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
195 * @param dst Destination buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
196 * @param buf Source buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
197 * @param buf_size
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
198 * @param plane plane number to decode as
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
199 */
11700
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
200 static void decodeplane32(uint32_t *dst, const uint8_t *buf, int buf_size, int plane)
11660
dd10b0c7d0de Make two functions out of #define hackery.
cehoyos
parents: 11644
diff changeset
201 {
11700
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
202 const uint32_t *lut = plane32_lut[plane];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
203 do {
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
204 unsigned mask = (*buf >> 2) & ~3;
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
205 dst[0] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
206 dst[1] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
207 dst[2] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
208 dst[3] |= lut[mask];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
209 mask = (*buf++ << 2) & 0x3F;
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
210 dst[4] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
211 dst[5] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
212 dst[6] |= lut[mask++];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
213 dst[7] |= lut[mask];
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
214 dst += 8;
6bdec2a0e7e1 Optimize decodeplane32().
rbultje
parents: 11699
diff changeset
215 } while (--buf_size);
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
216 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
217
11738
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
218 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11914
diff changeset
219 * Decode one complete byterun1 encoded line.
11738
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
220 *
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
221 * @param dst the destination buffer where to store decompressed bitstream
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
222 * @param dst_size the destination plane size in bytes
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
223 * @param buf the source byterun1 compressed bitstream
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
224 * @param buf_end the EOF of source byterun1 compressed bitstream
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
225 * @return number of consumed bytes in byterun1 compressed bitstream
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
226 */
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
227 static int decode_byterun(uint8_t *dst, int dst_size,
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
228 const uint8_t *buf, const uint8_t *const buf_end) {
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
229 const uint8_t *const buf_start = buf;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
230 unsigned x;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
231 for (x = 0; x < dst_size && buf < buf_end;) {
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
232 unsigned length;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
233 const int8_t value = *buf++;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
234 if (value >= 0) {
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
235 length = value + 1;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
236 memcpy(dst + x, buf, FFMIN3(length, dst_size - x, buf_end - buf));
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
237 buf += length;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
238 } else if (value > -128) {
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
239 length = -value + 1;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
240 memset(dst + x, *buf++, FFMIN(length, dst_size - x));
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
241 } else { // noop
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
242 continue;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
243 }
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
244 x += length;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
245 }
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
246 return buf - buf_start;
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
247 }
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
248
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
249 static int decode_frame_ilbm(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
250 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
251 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
252 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
253 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
254 const uint8_t *buf = avpkt->data;
11678
e1dd1ff1ab27 Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents: 11663
diff changeset
255 int buf_size = avpkt->size;
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
256 const uint8_t *buf_end = buf+buf_size;
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
257 int y, plane, res;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
258
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
259 if (s->init) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
260 if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
261 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
262 return res;
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
263 }
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
264 } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) {
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
265 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
266 return res;
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
267 } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
268 if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0)
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
269 return res;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
270 }
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
271 s->init = 1;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
272
11719
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
273 if (avctx->codec_tag == MKTAG('I','L','B','M')) { // interleaved
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
274 if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) {
11720
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
275 for(y = 0; y < avctx->height; y++ ) {
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
276 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
277 memset(row, 0, avctx->width);
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
278 for (plane = 0; plane < avctx->bits_per_coded_sample && buf < buf_end; plane++) {
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
279 decodeplane8(row, buf, FFMIN(s->planesize, buf_end - buf), plane);
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
280 buf += s->planesize;
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
281 }
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
282 }
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
283 } else { // PIX_FMT_BGR32
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
284 for(y = 0; y < avctx->height; y++ ) {
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
285 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]];
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
286 memset(row, 0, avctx->width << 2);
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
287 for (plane = 0; plane < avctx->bits_per_coded_sample && buf < buf_end; plane++) {
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
288 decodeplane32((uint32_t *) row, buf, FFMIN(s->planesize, buf_end - buf), plane);
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
289 buf += s->planesize;
92f4ca7a4002 Reindent after r23112.
rbultje
parents: 11719
diff changeset
290 }
11662
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
291 }
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
292 }
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
293 } else if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) { // IFF-PBM
11719
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
294 for(y = 0; y < avctx->height; y++ ) {
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
295 uint8_t *row = &s->frame.data[0][y * s->frame.linesize[0]];
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
296 memcpy(row, buf, FFMIN(avctx->width, buf_end - buf));
11914
317c18e0b753 IFF PBM decoder: Add a pad byte if image width is odd <aleksi dot nurmi at gmail dot com>
pross
parents: 11806
diff changeset
297 buf += avctx->width + (avctx->width % 2); // padding if odd
11719
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
298 }
30356abc8604 Move handling of paletted data to the IFF demuxer. This allows future
rbultje
parents: 11718
diff changeset
299 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
300
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
301 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
302 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
303 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
304 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
305
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
306 static int decode_frame_byterun1(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
307 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
308 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
309 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
310 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
311 const uint8_t *buf = avpkt->data;
11678
e1dd1ff1ab27 Revert r22974 int->unsigned parts that don't have any meaningful effect.
rbultje
parents: 11663
diff changeset
312 int buf_size = avpkt->size;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
313 const uint8_t *buf_end = buf+buf_size;
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
314 int y, plane, res;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
315
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
316 if (s->init) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
317 if ((res = avctx->reget_buffer(avctx, &s->frame)) < 0) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
318 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
319 return res;
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
320 }
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
321 } else if ((res = avctx->get_buffer(avctx, &s->frame)) < 0) {
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
322 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
323 return res;
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
324 } else if (avctx->bits_per_coded_sample <= 8 && avctx->pix_fmt != PIX_FMT_GRAY8) {
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
325 if ((res = ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1])) < 0)
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
326 return res;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
327 }
11806
8d8ca3eb8389 Move get_buffer() calls from decode_init() to decode_frame(). Anything else is
rbultje
parents: 11738
diff changeset
328 s->init = 1;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
329
11662
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
330 if (avctx->codec_tag == MKTAG('I','L','B','M')) { //interleaved
11725
e9537b2d70ce Grayscale support. Patch by Sebastian Vater <cdgs basty googlemail com>.
rbultje
parents: 11720
diff changeset
331 if (avctx->pix_fmt == PIX_FMT_PAL8 || avctx->pix_fmt == PIX_FMT_GRAY8) {
11663
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
332 for(y = 0; y < avctx->height ; y++ ) {
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
333 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
334 memset(row, 0, avctx->width);
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
335 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) {
11738
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
336 buf += decode_byterun(s->planebuf, s->planesize, buf, buf_end);
11693
3ec57be57312 Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents: 11692
diff changeset
337 decodeplane8(row, s->planebuf, s->planesize, plane);
11662
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
338 }
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
339 }
11663
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
340 } else { //PIX_FMT_BGR32
11662
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
341 for(y = 0; y < avctx->height ; y++ ) {
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
342 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]];
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
343 memset(row, 0, avctx->width << 2);
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
344 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) {
11738
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
345 buf += decode_byterun(s->planebuf, s->planesize, buf, buf_end);
11693
3ec57be57312 Remove "bps" parameter to decodeplane8/32(), it's unused.
rbultje
parents: 11692
diff changeset
346 decodeplane32((uint32_t *) row, s->planebuf, s->planesize, plane);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
347 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
348 }
11662
33e4b0d712c8 Move some branches outside looped code. Should improve the generated asm (and
rbultje
parents: 11661
diff changeset
349 }
11663
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
350 } else {
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
351 for(y = 0; y < avctx->height ; y++ ) {
2c69c6015a84 Reidnent after r22795.
rbultje
parents: 11662
diff changeset
352 uint8_t *row = &s->frame.data[0][y*s->frame.linesize[0]];
11738
9bfef228a117 Factorize code into a single function.
cehoyos
parents: 11726
diff changeset
353 buf += decode_byterun(row, avctx->width, buf, buf_end);
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
354 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
355 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
356
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
357 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
358 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
359 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
360 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
361
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
362 static av_cold int decode_end(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
363 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
364 IffContext *s = avctx->priv_data;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
365 if (s->frame.data[0])
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
366 avctx->release_buffer(avctx, &s->frame);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
367 av_freep(&s->planebuf);
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
368 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
369 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
370
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
371 AVCodec iff_ilbm_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
372 "iff_ilbm",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11480
diff changeset
373 AVMEDIA_TYPE_VIDEO,
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
374 CODEC_ID_IFF_ILBM,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
375 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
376 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
377 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
378 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
379 decode_frame_ilbm,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
380 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
381 .long_name = NULL_IF_CONFIG_SMALL("IFF ILBM"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
382 };
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
383
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
384 AVCodec iff_byterun1_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
385 "iff_byterun1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11480
diff changeset
386 AVMEDIA_TYPE_VIDEO,
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
387 CODEC_ID_IFF_BYTERUN1,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
388 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
389 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
390 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
391 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
392 decode_frame_byterun1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
393 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
394 .long_name = NULL_IF_CONFIG_SMALL("IFF ByteRun1"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
395 };