Mercurial > libavcodec.hg
annotate zmbv.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 3c5a6cc5a652 |
children |
rev | line source |
---|---|
3120 | 1 /* |
2 * Zip Motion Blocks Video (ZMBV) decoder | |
3 * Copyright (c) 2006 Konstantin Shishkov | |
4 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3120 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3120 | 11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3120 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3800
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3120 | 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 */ | |
21 | |
22 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11584
diff
changeset
|
23 * @file |
3120 | 24 * Zip Motion Blocks Video decoder |
25 */ | |
26 | |
27 #include <stdio.h> | |
28 #include <stdlib.h> | |
29 | |
8573
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
7823
diff
changeset
|
30 #include "libavutil/intreadwrite.h" |
3120 | 31 #include "avcodec.h" |
32 | |
33 #include <zlib.h> | |
34 | |
35 #define ZMBV_KEYFRAME 1 | |
36 #define ZMBV_DELTAPAL 2 | |
37 | |
38 enum ZmbvFormat { | |
39 ZMBV_FMT_NONE = 0, | |
40 ZMBV_FMT_1BPP = 1, | |
41 ZMBV_FMT_2BPP = 2, | |
42 ZMBV_FMT_4BPP = 3, | |
43 ZMBV_FMT_8BPP = 4, | |
44 ZMBV_FMT_15BPP = 5, | |
45 ZMBV_FMT_16BPP = 6, | |
46 ZMBV_FMT_24BPP = 7, | |
47 ZMBV_FMT_32BPP = 8 | |
48 }; | |
49 | |
50 /* | |
51 * Decoder context | |
52 */ | |
53 typedef struct ZmbvContext { | |
54 AVCodecContext *avctx; | |
55 AVFrame pic; | |
56 | |
57 int bpp; | |
58 unsigned int decomp_size; | |
59 uint8_t* decomp_buf; | |
60 uint8_t pal[768]; | |
61 uint8_t *prev, *cur; | |
62 int width, height; | |
63 int fmt; | |
64 int comp; | |
65 int flags; | |
66 int bw, bh, bx, by; | |
67 int decomp_len; | |
68 z_stream zstream; | |
69 int (*decode_intra)(struct ZmbvContext *c); | |
70 int (*decode_xor)(struct ZmbvContext *c); | |
71 } ZmbvContext; | |
72 | |
73 /** | |
74 * Decode XOR'ed frame - 8bpp version | |
75 */ | |
76 | |
77 static int zmbv_decode_xor_8(ZmbvContext *c) | |
78 { | |
79 uint8_t *src = c->decomp_buf; | |
80 uint8_t *output, *prev; | |
81 int8_t *mvec; | |
82 int x, y; | |
83 int d, dx, dy, bw2, bh2; | |
84 int block; | |
85 int i, j; | |
86 int mx, my; | |
87 | |
88 output = c->cur; | |
89 prev = c->prev; | |
90 | |
91 if(c->flags & ZMBV_DELTAPAL){ | |
92 for(i = 0; i < 768; i++) | |
93 c->pal[i] ^= *src++; | |
94 } | |
95 | |
96 mvec = (int8_t*)src; | |
97 src += ((c->bx * c->by * 2 + 3) & ~3); | |
98 | |
99 block = 0; | |
100 for(y = 0; y < c->height; y += c->bh) { | |
101 bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y); | |
102 for(x = 0; x < c->width; x += c->bw) { | |
103 uint8_t *out, *tprev; | |
104 | |
105 d = mvec[block] & 1; | |
106 dx = mvec[block] >> 1; | |
107 dy = mvec[block + 1] >> 1; | |
108 block += 2; | |
109 | |
110 bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x); | |
111 | |
112 /* copy block - motion vectors out of bounds are used to zero blocks */ | |
113 out = output + x; | |
114 tprev = prev + x + dx + dy * c->width; | |
115 mx = x + dx; | |
116 my = y + dy; | |
117 for(j = 0; j < bh2; j++){ | |
118 if((my + j < 0) || (my + j >= c->height)) { | |
119 memset(out, 0, bw2); | |
120 } else { | |
121 for(i = 0; i < bw2; i++){ | |
122 if((mx + i < 0) || (mx + i >= c->width)) | |
123 out[i] = 0; | |
124 else | |
125 out[i] = tprev[i]; | |
126 } | |
127 } | |
128 out += c->width; | |
129 tprev += c->width; | |
130 } | |
131 | |
132 if(d) { /* apply XOR'ed difference */ | |
133 out = output + x; | |
134 for(j = 0; j < bh2; j++){ | |
135 for(i = 0; i < bw2; i++) | |
136 out[i] ^= *src++; | |
137 out += c->width; | |
138 } | |
139 } | |
140 } | |
141 output += c->width * c->bh; | |
142 prev += c->width * c->bh; | |
143 } | |
144 if(src - c->decomp_buf != c->decomp_len) | |
5153 | 145 av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n", src-c->decomp_buf, c->decomp_len); |
3120 | 146 return 0; |
147 } | |
148 | |
149 /** | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
150 * Decode XOR'ed frame - 15bpp and 16bpp version |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
151 */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
152 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
153 static int zmbv_decode_xor_16(ZmbvContext *c) |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
154 { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
155 uint8_t *src = c->decomp_buf; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
156 uint16_t *output, *prev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
157 int8_t *mvec; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
158 int x, y; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
159 int d, dx, dy, bw2, bh2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
160 int block; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
161 int i, j; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
162 int mx, my; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
163 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
164 output = (uint16_t*)c->cur; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
165 prev = (uint16_t*)c->prev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
166 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
167 mvec = (int8_t*)src; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
168 src += ((c->bx * c->by * 2 + 3) & ~3); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
169 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
170 block = 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
171 for(y = 0; y < c->height; y += c->bh) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
172 bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
173 for(x = 0; x < c->width; x += c->bw) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
174 uint16_t *out, *tprev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
175 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
176 d = mvec[block] & 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
177 dx = mvec[block] >> 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
178 dy = mvec[block + 1] >> 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
179 block += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
180 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
181 bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
182 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
183 /* copy block - motion vectors out of bounds are used to zero blocks */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
184 out = output + x; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
185 tprev = prev + x + dx + dy * c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
186 mx = x + dx; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
187 my = y + dy; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
188 for(j = 0; j < bh2; j++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
189 if((my + j < 0) || (my + j >= c->height)) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
190 memset(out, 0, bw2 * 2); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
191 } else { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
192 for(i = 0; i < bw2; i++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
193 if((mx + i < 0) || (mx + i >= c->width)) |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
194 out[i] = 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
195 else |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
196 out[i] = tprev[i]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
197 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
198 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
199 out += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
200 tprev += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
201 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
202 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
203 if(d) { /* apply XOR'ed difference */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
204 out = output + x; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
205 for(j = 0; j < bh2; j++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
206 for(i = 0; i < bw2; i++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
207 out[i] ^= *((uint16_t*)src); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
208 src += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
209 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
210 out += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
211 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
212 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
213 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
214 output += c->width * c->bh; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
215 prev += c->width * c->bh; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
216 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
217 if(src - c->decomp_buf != c->decomp_len) |
5153 | 218 av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n", src-c->decomp_buf, c->decomp_len); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
219 return 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
220 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
221 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
222 #ifdef ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
223 /** |
3120 | 224 * Decode XOR'ed frame - 24bpp version |
225 */ | |
226 | |
227 static int zmbv_decode_xor_24(ZmbvContext *c) | |
228 { | |
229 uint8_t *src = c->decomp_buf; | |
230 uint8_t *output, *prev; | |
231 int8_t *mvec; | |
232 int x, y; | |
233 int d, dx, dy, bw2, bh2; | |
234 int block; | |
235 int i, j; | |
236 int mx, my; | |
237 int stride; | |
238 | |
239 output = c->cur; | |
240 prev = c->prev; | |
241 | |
242 stride = c->width * 3; | |
243 mvec = (int8_t*)src; | |
244 src += ((c->bx * c->by * 2 + 3) & ~3); | |
245 | |
246 block = 0; | |
247 for(y = 0; y < c->height; y += c->bh) { | |
248 bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y); | |
249 for(x = 0; x < c->width; x += c->bw) { | |
250 uint8_t *out, *tprev; | |
251 | |
252 d = mvec[block] & 1; | |
253 dx = mvec[block] >> 1; | |
254 dy = mvec[block + 1] >> 1; | |
255 block += 2; | |
256 | |
257 bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x); | |
258 | |
259 /* copy block - motion vectors out of bounds are used to zero blocks */ | |
260 out = output + x * 3; | |
261 tprev = prev + (x + dx) * 3 + dy * stride; | |
262 mx = x + dx; | |
263 my = y + dy; | |
264 for(j = 0; j < bh2; j++){ | |
265 if((my + j < 0) || (my + j >= c->height)) { | |
266 memset(out, 0, bw2 * 3); | |
267 } else { | |
268 for(i = 0; i < bw2; i++){ | |
269 if((mx + i < 0) || (mx + i >= c->width)) { | |
270 out[i * 3 + 0] = 0; | |
271 out[i * 3 + 1] = 0; | |
272 out[i * 3 + 2] = 0; | |
273 } else { | |
274 out[i * 3 + 0] = tprev[i * 3 + 0]; | |
275 out[i * 3 + 1] = tprev[i * 3 + 1]; | |
276 out[i * 3 + 2] = tprev[i * 3 + 2]; | |
277 } | |
278 } | |
279 } | |
280 out += stride; | |
281 tprev += stride; | |
282 } | |
283 | |
284 if(d) { /* apply XOR'ed difference */ | |
285 out = output + x * 3; | |
286 for(j = 0; j < bh2; j++){ | |
287 for(i = 0; i < bw2; i++) { | |
288 out[i * 3 + 0] ^= *src++; | |
289 out[i * 3 + 1] ^= *src++; | |
290 out[i * 3 + 2] ^= *src++; | |
291 } | |
292 out += stride; | |
293 } | |
294 } | |
295 } | |
296 output += stride * c->bh; | |
297 prev += stride * c->bh; | |
298 } | |
299 if(src - c->decomp_buf != c->decomp_len) | |
300 av_log(c->avctx, AV_LOG_ERROR, "Used %i of %i bytes\n", src-c->decomp_buf, c->decomp_len); | |
301 return 0; | |
302 } | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
303 #endif //ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
304 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
305 /** |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
306 * Decode XOR'ed frame - 32bpp version |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
307 */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
308 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
309 static int zmbv_decode_xor_32(ZmbvContext *c) |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
310 { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
311 uint8_t *src = c->decomp_buf; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
312 uint32_t *output, *prev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
313 int8_t *mvec; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
314 int x, y; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
315 int d, dx, dy, bw2, bh2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
316 int block; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
317 int i, j; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
318 int mx, my; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
319 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
320 output = (uint32_t*)c->cur; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
321 prev = (uint32_t*)c->prev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
322 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
323 mvec = (int8_t*)src; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
324 src += ((c->bx * c->by * 2 + 3) & ~3); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
325 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
326 block = 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
327 for(y = 0; y < c->height; y += c->bh) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
328 bh2 = ((c->height - y) > c->bh) ? c->bh : (c->height - y); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
329 for(x = 0; x < c->width; x += c->bw) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
330 uint32_t *out, *tprev; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
331 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
332 d = mvec[block] & 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
333 dx = mvec[block] >> 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
334 dy = mvec[block + 1] >> 1; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
335 block += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
336 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
337 bw2 = ((c->width - x) > c->bw) ? c->bw : (c->width - x); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
338 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
339 /* copy block - motion vectors out of bounds are used to zero blocks */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
340 out = output + x; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
341 tprev = prev + x + dx + dy * c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
342 mx = x + dx; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
343 my = y + dy; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
344 for(j = 0; j < bh2; j++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
345 if((my + j < 0) || (my + j >= c->height)) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
346 memset(out, 0, bw2 * 4); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
347 } else { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
348 for(i = 0; i < bw2; i++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
349 if((mx + i < 0) || (mx + i >= c->width)) |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
350 out[i] = 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
351 else |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
352 out[i] = tprev[i]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
353 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
354 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
355 out += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
356 tprev += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
357 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
358 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
359 if(d) { /* apply XOR'ed difference */ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
360 out = output + x; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
361 for(j = 0; j < bh2; j++){ |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
362 for(i = 0; i < bw2; i++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
363 out[i] ^= *((uint32_t*)src); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
364 src += 4; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
365 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
366 out += c->width; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
367 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
368 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
369 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
370 output += c->width * c->bh; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
371 prev += c->width * c->bh; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
372 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
373 if(src - c->decomp_buf != c->decomp_len) |
5153 | 374 av_log(c->avctx, AV_LOG_ERROR, "Used %ti of %i bytes\n", src-c->decomp_buf, c->decomp_len); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
375 return 0; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
376 } |
3120 | 377 |
378 /** | |
379 * Decode intraframe | |
380 */ | |
381 static int zmbv_decode_intra(ZmbvContext *c) | |
382 { | |
383 uint8_t *src = c->decomp_buf; | |
384 | |
385 /* make the palette available on the way out */ | |
386 if (c->fmt == ZMBV_FMT_8BPP) { | |
387 memcpy(c->pal, src, 768); | |
388 src += 768; | |
389 } | |
390 | |
391 memcpy(c->cur, src, c->width * c->height * (c->bpp / 8)); | |
392 return 0; | |
393 } | |
394 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
395 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) |
3120 | 396 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
397 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
398 int buf_size = avpkt->size; |
4827 | 399 ZmbvContext * const c = avctx->priv_data; |
3120 | 400 int zret = Z_OK; // Zlib return code |
401 int len = buf_size; | |
402 int hi_ver, lo_ver; | |
403 | |
404 if(c->pic.data[0]) | |
405 avctx->release_buffer(avctx, &c->pic); | |
406 | |
407 c->pic.reference = 1; | |
408 c->pic.buffer_hints = FF_BUFFER_HINTS_VALID; | |
409 if(avctx->get_buffer(avctx, &c->pic) < 0){ | |
410 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
411 return -1; | |
412 } | |
413 | |
414 /* parse header */ | |
415 c->flags = buf[0]; | |
416 buf++; len--; | |
417 if(c->flags & ZMBV_KEYFRAME) { | |
418 hi_ver = buf[0]; | |
419 lo_ver = buf[1]; | |
420 c->comp = buf[2]; | |
421 c->fmt = buf[3]; | |
422 c->bw = buf[4]; | |
423 c->bh = buf[5]; | |
424 | |
425 buf += 6; | |
426 len -= 6; | |
427 av_log(avctx, AV_LOG_DEBUG, "Flags=%X ver=%i.%i comp=%i fmt=%i blk=%ix%i\n",c->flags,hi_ver,lo_ver,c->comp,c->fmt,c->bw,c->bh); | |
428 if(hi_ver != 0 || lo_ver != 1) { | |
429 av_log(avctx, AV_LOG_ERROR, "Unsupported version %i.%i\n", hi_ver, lo_ver); | |
430 return -1; | |
431 } | |
432 if(c->bw == 0 || c->bh == 0) { | |
433 av_log(avctx, AV_LOG_ERROR, "Unsupported block size %ix%i\n", c->bw, c->bh); | |
11584 | 434 return -1; |
3120 | 435 } |
436 if(c->comp != 0 && c->comp != 1) { | |
437 av_log(avctx, AV_LOG_ERROR, "Unsupported compression type %i\n", c->comp); | |
438 return -1; | |
439 } | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
440 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
441 switch(c->fmt) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
442 case ZMBV_FMT_8BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
443 c->bpp = 8; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
444 c->decode_intra = zmbv_decode_intra; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
445 c->decode_xor = zmbv_decode_xor_8; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
446 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
447 case ZMBV_FMT_15BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
448 case ZMBV_FMT_16BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
449 c->bpp = 16; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
450 c->decode_intra = zmbv_decode_intra; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
451 c->decode_xor = zmbv_decode_xor_16; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
452 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
453 #ifdef ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
454 case ZMBV_FMT_24BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
455 c->bpp = 24; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
456 c->decode_intra = zmbv_decode_intra; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
457 c->decode_xor = zmbv_decode_xor_24; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
458 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
459 #endif //ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
460 case ZMBV_FMT_32BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
461 c->bpp = 32; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
462 c->decode_intra = zmbv_decode_intra; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
463 c->decode_xor = zmbv_decode_xor_32; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
464 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
465 default: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
466 c->decode_intra = NULL; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
467 c->decode_xor = NULL; |
3120 | 468 av_log(avctx, AV_LOG_ERROR, "Unsupported (for now) format %i\n", c->fmt); |
469 return -1; | |
470 } | |
5349 | 471 |
3120 | 472 zret = inflateReset(&c->zstream); |
473 if (zret != Z_OK) { | |
474 av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret); | |
475 return -1; | |
476 } | |
5349 | 477 |
3120 | 478 c->cur = av_realloc(c->cur, avctx->width * avctx->height * (c->bpp / 8)); |
479 c->prev = av_realloc(c->prev, avctx->width * avctx->height * (c->bpp / 8)); | |
480 c->bx = (c->width + c->bw - 1) / c->bw; | |
481 c->by = (c->height+ c->bh - 1) / c->bh; | |
482 } | |
483 | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
484 if(c->decode_intra == NULL) { |
3120 | 485 av_log(avctx, AV_LOG_ERROR, "Error! Got no format or no keyframe!\n"); |
486 return -1; | |
487 } | |
488 | |
489 if(c->comp == 0) { //Uncompressed data | |
490 memcpy(c->decomp_buf, buf, len); | |
491 c->decomp_size = 1; | |
492 } else { // ZLIB-compressed data | |
493 c->zstream.total_in = c->zstream.total_out = 0; | |
494 c->zstream.next_in = buf; | |
495 c->zstream.avail_in = len; | |
496 c->zstream.next_out = c->decomp_buf; | |
497 c->zstream.avail_out = c->decomp_size; | |
498 inflate(&c->zstream, Z_FINISH); | |
499 c->decomp_len = c->zstream.total_out; | |
500 } | |
501 if(c->flags & ZMBV_KEYFRAME) { | |
502 c->pic.key_frame = 1; | |
503 c->pic.pict_type = FF_I_TYPE; | |
504 c->decode_intra(c); | |
505 } else { | |
506 c->pic.key_frame = 0; | |
507 c->pic.pict_type = FF_P_TYPE; | |
6478 | 508 if(c->decomp_len) |
6479 | 509 c->decode_xor(c); |
3120 | 510 } |
511 | |
512 /* update frames */ | |
513 { | |
514 uint8_t *out, *src; | |
515 int i, j; | |
516 | |
517 out = c->pic.data[0]; | |
518 src = c->cur; | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
519 switch(c->fmt) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
520 case ZMBV_FMT_8BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
521 for(j = 0; j < c->height; j++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
522 for(i = 0; i < c->width; i++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
523 out[i * 3 + 0] = c->pal[(*src) * 3 + 0]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
524 out[i * 3 + 1] = c->pal[(*src) * 3 + 1]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
525 out[i * 3 + 2] = c->pal[(*src) * 3 + 2]; |
5258 | 526 src++; |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
527 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
528 out += c->pic.linesize[0]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
529 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
530 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
531 case ZMBV_FMT_15BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
532 for(j = 0; j < c->height; j++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
533 for(i = 0; i < c->width; i++) { |
4364 | 534 uint16_t tmp = AV_RL16(src); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
535 src += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
536 out[i * 3 + 0] = (tmp & 0x7C00) >> 7; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
537 out[i * 3 + 1] = (tmp & 0x03E0) >> 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
538 out[i * 3 + 2] = (tmp & 0x001F) << 3; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
539 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
540 out += c->pic.linesize[0]; |
3120 | 541 } |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
542 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
543 case ZMBV_FMT_16BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
544 for(j = 0; j < c->height; j++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
545 for(i = 0; i < c->width; i++) { |
4364 | 546 uint16_t tmp = AV_RL16(src); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
547 src += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
548 out[i * 3 + 0] = (tmp & 0xF800) >> 8; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
549 out[i * 3 + 1] = (tmp & 0x07E0) >> 3; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
550 out[i * 3 + 2] = (tmp & 0x001F) << 3; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
551 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
552 out += c->pic.linesize[0]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
553 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
554 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
555 #ifdef ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
556 case ZMBV_FMT_24BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
557 for(j = 0; j < c->height; j++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
558 memcpy(out, src, c->width * 3); |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
559 src += c->width * 3; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
560 out += c->pic.linesize[0]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
561 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
562 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
563 #endif //ZMBV_ENABLE_24BPP |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
564 case ZMBV_FMT_32BPP: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
565 for(j = 0; j < c->height; j++) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
566 for(i = 0; i < c->width; i++) { |
4364 | 567 uint32_t tmp = AV_RL32(src); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
568 src += 4; |
5089 | 569 AV_WB24(out+(i*3), tmp); |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
570 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
571 out += c->pic.linesize[0]; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
572 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
573 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
574 default: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
575 av_log(avctx, AV_LOG_ERROR, "Cannot handle format %i\n", c->fmt); |
3120 | 576 } |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
577 memcpy(c->prev, c->cur, c->width * c->height * (c->bpp / 8)); |
3120 | 578 } |
579 *data_size = sizeof(AVFrame); | |
580 *(AVFrame*)data = c->pic; | |
581 | |
582 /* always report that the buffer was completely consumed */ | |
583 return buf_size; | |
584 } | |
585 | |
586 | |
587 | |
588 /* | |
589 * | |
590 * Init zmbv decoder | |
591 * | |
592 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6479
diff
changeset
|
593 static av_cold int decode_init(AVCodecContext *avctx) |
3120 | 594 { |
4827 | 595 ZmbvContext * const c = avctx->priv_data; |
3120 | 596 int zret; // Zlib return code |
597 | |
598 c->avctx = avctx; | |
599 | |
600 c->width = avctx->width; | |
601 c->height = avctx->height; | |
602 | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7040
diff
changeset
|
603 c->bpp = avctx->bits_per_coded_sample; |
3120 | 604 |
605 // Needed if zlib unused or init aborted before inflateInit | |
606 memset(&(c->zstream), 0, sizeof(z_stream)); | |
5349 | 607 |
3120 | 608 avctx->pix_fmt = PIX_FMT_RGB24; |
609 c->decomp_size = (avctx->width + 255) * 4 * (avctx->height + 64); | |
610 | |
611 /* Allocate decompression buffer */ | |
612 if (c->decomp_size) { | |
613 if ((c->decomp_buf = av_malloc(c->decomp_size)) == NULL) { | |
614 av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n"); | |
615 return 1; | |
616 } | |
617 } | |
618 | |
619 c->zstream.zalloc = Z_NULL; | |
620 c->zstream.zfree = Z_NULL; | |
621 c->zstream.opaque = Z_NULL; | |
622 zret = inflateInit(&(c->zstream)); | |
623 if (zret != Z_OK) { | |
624 av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret); | |
625 return 1; | |
626 } | |
627 | |
628 return 0; | |
629 } | |
630 | |
631 | |
632 | |
633 /* | |
634 * | |
635 * Uninit zmbv decoder | |
636 * | |
637 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6479
diff
changeset
|
638 static av_cold int decode_end(AVCodecContext *avctx) |
3120 | 639 { |
4827 | 640 ZmbvContext * const c = avctx->priv_data; |
3120 | 641 |
642 av_freep(&c->decomp_buf); | |
643 | |
644 if (c->pic.data[0]) | |
645 avctx->release_buffer(avctx, &c->pic); | |
646 inflateEnd(&(c->zstream)); | |
3694
8765ee4eaa45
Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents:
3134
diff
changeset
|
647 av_freep(&c->cur); |
8765ee4eaa45
Drop unneeded checks before av_free() and change to av_freep() where it's more suitable.
kostya
parents:
3134
diff
changeset
|
648 av_freep(&c->prev); |
3120 | 649 |
650 return 0; | |
651 } | |
652 | |
653 AVCodec zmbv_decoder = { | |
654 "zmbv", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10397
diff
changeset
|
655 AVMEDIA_TYPE_VIDEO, |
3120 | 656 CODEC_ID_ZMBV, |
657 sizeof(ZmbvContext), | |
658 decode_init, | |
659 NULL, | |
660 decode_end, | |
6713 | 661 decode_frame, |
9816
e19113273403
zmbv decoder uses get_buffer, set CODEC_CAP_DR1
bcoudurier
parents:
9553
diff
changeset
|
662 CODEC_CAP_DR1, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6713
diff
changeset
|
663 .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"), |
3120 | 664 }; |
665 |