Mercurial > libavcodec.hg
annotate zmbv.c @ 12043:f9a0bd0888a4 libavcodec
mpegaudio: call ff_mpegaudiodec_init_mmx() only from float decoder
The mmx code is floating-point only, and this function does not know
from which decoder it is called. Without this change, the integer
decoder only "works" because the size of the context struct is smaller
in this case, and the mmx init function writes the function pointer
outside the allocated context.
author | mru |
---|---|
date | Thu, 01 Jul 2010 23:21:17 +0000 |
parents | 7dd2a45249a9 |
children | 3c5a6cc5a652 |
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 uint8_t *outptr; |
401 int zret = Z_OK; // Zlib return code | |
402 int len = buf_size; | |
403 int hi_ver, lo_ver; | |
404 | |
405 if(c->pic.data[0]) | |
406 avctx->release_buffer(avctx, &c->pic); | |
407 | |
408 c->pic.reference = 1; | |
409 c->pic.buffer_hints = FF_BUFFER_HINTS_VALID; | |
410 if(avctx->get_buffer(avctx, &c->pic) < 0){ | |
411 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
412 return -1; | |
413 } | |
414 | |
415 outptr = c->pic.data[0]; // Output image pointer | |
416 | |
417 /* parse header */ | |
418 c->flags = buf[0]; | |
419 buf++; len--; | |
420 if(c->flags & ZMBV_KEYFRAME) { | |
421 hi_ver = buf[0]; | |
422 lo_ver = buf[1]; | |
423 c->comp = buf[2]; | |
424 c->fmt = buf[3]; | |
425 c->bw = buf[4]; | |
426 c->bh = buf[5]; | |
427 | |
428 buf += 6; | |
429 len -= 6; | |
430 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); | |
431 if(hi_ver != 0 || lo_ver != 1) { | |
432 av_log(avctx, AV_LOG_ERROR, "Unsupported version %i.%i\n", hi_ver, lo_ver); | |
433 return -1; | |
434 } | |
435 if(c->bw == 0 || c->bh == 0) { | |
436 av_log(avctx, AV_LOG_ERROR, "Unsupported block size %ix%i\n", c->bw, c->bh); | |
11584 | 437 return -1; |
3120 | 438 } |
439 if(c->comp != 0 && c->comp != 1) { | |
440 av_log(avctx, AV_LOG_ERROR, "Unsupported compression type %i\n", c->comp); | |
441 return -1; | |
442 } | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
443 |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
444 switch(c->fmt) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
445 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
|
446 c->bpp = 8; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
447 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
|
448 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
|
449 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
450 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
|
451 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
|
452 c->bpp = 16; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
453 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
|
454 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
|
455 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
456 #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
|
457 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
|
458 c->bpp = 24; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
459 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
|
460 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
|
461 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
462 #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
|
463 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
|
464 c->bpp = 32; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
465 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
|
466 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
|
467 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
468 default: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
469 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
|
470 c->decode_xor = NULL; |
3120 | 471 av_log(avctx, AV_LOG_ERROR, "Unsupported (for now) format %i\n", c->fmt); |
472 return -1; | |
473 } | |
5349 | 474 |
3120 | 475 zret = inflateReset(&c->zstream); |
476 if (zret != Z_OK) { | |
477 av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret); | |
478 return -1; | |
479 } | |
5349 | 480 |
3120 | 481 c->cur = av_realloc(c->cur, avctx->width * avctx->height * (c->bpp / 8)); |
482 c->prev = av_realloc(c->prev, avctx->width * avctx->height * (c->bpp / 8)); | |
483 c->bx = (c->width + c->bw - 1) / c->bw; | |
484 c->by = (c->height+ c->bh - 1) / c->bh; | |
485 } | |
486 | |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
487 if(c->decode_intra == NULL) { |
3120 | 488 av_log(avctx, AV_LOG_ERROR, "Error! Got no format or no keyframe!\n"); |
489 return -1; | |
490 } | |
491 | |
492 if(c->comp == 0) { //Uncompressed data | |
493 memcpy(c->decomp_buf, buf, len); | |
494 c->decomp_size = 1; | |
495 } else { // ZLIB-compressed data | |
496 c->zstream.total_in = c->zstream.total_out = 0; | |
497 c->zstream.next_in = buf; | |
498 c->zstream.avail_in = len; | |
499 c->zstream.next_out = c->decomp_buf; | |
500 c->zstream.avail_out = c->decomp_size; | |
501 inflate(&c->zstream, Z_FINISH); | |
502 c->decomp_len = c->zstream.total_out; | |
503 } | |
504 if(c->flags & ZMBV_KEYFRAME) { | |
505 c->pic.key_frame = 1; | |
506 c->pic.pict_type = FF_I_TYPE; | |
507 c->decode_intra(c); | |
508 } else { | |
509 c->pic.key_frame = 0; | |
510 c->pic.pict_type = FF_P_TYPE; | |
6478 | 511 if(c->decomp_len) |
6479 | 512 c->decode_xor(c); |
3120 | 513 } |
514 | |
515 /* update frames */ | |
516 { | |
517 uint8_t *out, *src; | |
518 int i, j; | |
519 | |
520 out = c->pic.data[0]; | |
521 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
|
522 switch(c->fmt) { |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
523 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
|
524 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
|
525 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
|
526 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
|
527 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
|
528 out[i * 3 + 2] = c->pal[(*src) * 3 + 2]; |
5258 | 529 src++; |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
530 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
531 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
|
532 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
533 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
534 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
|
535 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
|
536 for(i = 0; i < c->width; i++) { |
4364 | 537 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
|
538 src += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
539 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
|
540 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
|
541 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
|
542 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
543 out += c->pic.linesize[0]; |
3120 | 544 } |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
545 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
546 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
|
547 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
|
548 for(i = 0; i < c->width; i++) { |
4364 | 549 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
|
550 src += 2; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
551 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
|
552 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
|
553 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
|
554 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
555 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
|
556 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
557 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
558 #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
|
559 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
|
560 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
|
561 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
|
562 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
|
563 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
|
564 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
565 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
566 #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
|
567 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
|
568 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
|
569 for(i = 0; i < c->width; i++) { |
4364 | 570 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
|
571 src += 4; |
5089 | 572 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
|
573 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
574 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
|
575 } |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
576 break; |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
577 default: |
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
578 av_log(avctx, AV_LOG_ERROR, "Cannot handle format %i\n", c->fmt); |
3120 | 579 } |
3134
03af25454cc3
ZMBV 15-/16-/32-bit decoding. 24-bit mode is disabled because it's not
diego
parents:
3122
diff
changeset
|
580 memcpy(c->prev, c->cur, c->width * c->height * (c->bpp / 8)); |
3120 | 581 } |
582 *data_size = sizeof(AVFrame); | |
583 *(AVFrame*)data = c->pic; | |
584 | |
585 /* always report that the buffer was completely consumed */ | |
586 return buf_size; | |
587 } | |
588 | |
589 | |
590 | |
591 /* | |
592 * | |
593 * Init zmbv decoder | |
594 * | |
595 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6479
diff
changeset
|
596 static av_cold int decode_init(AVCodecContext *avctx) |
3120 | 597 { |
4827 | 598 ZmbvContext * const c = avctx->priv_data; |
3120 | 599 int zret; // Zlib return code |
600 | |
601 c->avctx = avctx; | |
602 | |
603 c->width = avctx->width; | |
604 c->height = avctx->height; | |
605 | |
7823
4525dcd81357
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
7040
diff
changeset
|
606 c->bpp = avctx->bits_per_coded_sample; |
3120 | 607 |
608 // Needed if zlib unused or init aborted before inflateInit | |
609 memset(&(c->zstream), 0, sizeof(z_stream)); | |
5349 | 610 |
3120 | 611 avctx->pix_fmt = PIX_FMT_RGB24; |
612 c->decomp_size = (avctx->width + 255) * 4 * (avctx->height + 64); | |
613 | |
614 /* Allocate decompression buffer */ | |
615 if (c->decomp_size) { | |
616 if ((c->decomp_buf = av_malloc(c->decomp_size)) == NULL) { | |
617 av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n"); | |
618 return 1; | |
619 } | |
620 } | |
621 | |
622 c->zstream.zalloc = Z_NULL; | |
623 c->zstream.zfree = Z_NULL; | |
624 c->zstream.opaque = Z_NULL; | |
625 zret = inflateInit(&(c->zstream)); | |
626 if (zret != Z_OK) { | |
627 av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret); | |
628 return 1; | |
629 } | |
630 | |
631 return 0; | |
632 } | |
633 | |
634 | |
635 | |
636 /* | |
637 * | |
638 * Uninit zmbv decoder | |
639 * | |
640 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6479
diff
changeset
|
641 static av_cold int decode_end(AVCodecContext *avctx) |
3120 | 642 { |
4827 | 643 ZmbvContext * const c = avctx->priv_data; |
3120 | 644 |
645 av_freep(&c->decomp_buf); | |
646 | |
647 if (c->pic.data[0]) | |
648 avctx->release_buffer(avctx, &c->pic); | |
649 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
|
650 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
|
651 av_freep(&c->prev); |
3120 | 652 |
653 return 0; | |
654 } | |
655 | |
656 AVCodec zmbv_decoder = { | |
657 "zmbv", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10397
diff
changeset
|
658 AVMEDIA_TYPE_VIDEO, |
3120 | 659 CODEC_ID_ZMBV, |
660 sizeof(ZmbvContext), | |
661 decode_init, | |
662 NULL, | |
663 decode_end, | |
6713 | 664 decode_frame, |
9816
e19113273403
zmbv decoder uses get_buffer, set CODEC_CAP_DR1
bcoudurier
parents:
9553
diff
changeset
|
665 CODEC_CAP_DR1, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6713
diff
changeset
|
666 .long_name = NULL_IF_CONFIG_SMALL("Zip Motion Blocks Video"), |
3120 | 667 }; |
668 |