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