3 * Copyright (c) 2006 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Karl Morton's Video Codec decoder
31 #include "bytestream.h"
33 #define KMVC_KEYFRAME 0x80
34 #define KMVC_PALETTE 0x40
35 #define KMVC_METHOD 0x0F
40 typedef struct KmvcContext
{
41 AVCodecContext
*avctx
;
52 typedef struct BitBuf
{
57 #define BLK(data, x, y) data[(x) + (y) * 320]
59 #define kmvc_init_getbits(bb, g) bb.bits = 7; bb.bitbuf = bytestream2_get_byte(g);
61 #define kmvc_getbit(bb, g, res) {\
63 if (bb.bitbuf & (1 << bb.bits)) res = 1; \
66 bb.bitbuf = bytestream2_get_byte(g); \
71 static int kmvc_decode_intra_8x8(KmvcContext
* ctx
, int w
, int h
)
77 int l0x
, l1x
, l0y
, l1y
;
80 kmvc_init_getbits(bb
, &ctx
->g
);
82 for (by
= 0; by
< h
; by
+= 8)
83 for (bx
= 0; bx
< w
; bx
+= 8) {
84 if (!bytestream2_get_bytes_left(&ctx
->g
)) {
85 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Data overrun\n");
86 return AVERROR_INVALIDDATA
;
88 kmvc_getbit(bb
, &ctx
->g
, res
);
89 if (!res
) { // fill whole 8x8 block
90 val
= bytestream2_get_byte(&ctx
->g
);
91 for (i
= 0; i
< 64; i
++)
92 BLK(ctx
->cur
, bx
+ (i
& 0x7), by
+ (i
>> 3)) = val
;
93 } else { // handle four 4x4 subblocks
94 for (i
= 0; i
< 4; i
++) {
95 l0x
= bx
+ (i
& 1) * 4;
96 l0y
= by
+ (i
& 2) * 2;
97 kmvc_getbit(bb
, &ctx
->g
, res
);
99 kmvc_getbit(bb
, &ctx
->g
, res
);
100 if (!res
) { // fill whole 4x4 block
101 val
= bytestream2_get_byte(&ctx
->g
);
102 for (j
= 0; j
< 16; j
++)
103 BLK(ctx
->cur
, l0x
+ (j
& 3), l0y
+ (j
>> 2)) = val
;
104 } else { // copy block from already decoded place
105 val
= bytestream2_get_byte(&ctx
->g
);
108 for (j
= 0; j
< 16; j
++)
109 BLK(ctx
->cur
, l0x
+ (j
& 3), l0y
+ (j
>> 2)) =
110 BLK(ctx
->cur
, l0x
+ (j
& 3) - mx
, l0y
+ (j
>> 2) - my
);
112 } else { // descend to 2x2 sub-sub-blocks
113 for (j
= 0; j
< 4; j
++) {
114 l1x
= l0x
+ (j
& 1) * 2;
116 kmvc_getbit(bb
, &ctx
->g
, res
);
118 kmvc_getbit(bb
, &ctx
->g
, res
);
119 if (!res
) { // fill whole 2x2 block
120 val
= bytestream2_get_byte(&ctx
->g
);
121 BLK(ctx
->cur
, l1x
, l1y
) = val
;
122 BLK(ctx
->cur
, l1x
+ 1, l1y
) = val
;
123 BLK(ctx
->cur
, l1x
, l1y
+ 1) = val
;
124 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) = val
;
125 } else { // copy block from already decoded place
126 val
= bytestream2_get_byte(&ctx
->g
);
129 BLK(ctx
->cur
, l1x
, l1y
) = BLK(ctx
->cur
, l1x
- mx
, l1y
- my
);
130 BLK(ctx
->cur
, l1x
+ 1, l1y
) =
131 BLK(ctx
->cur
, l1x
+ 1 - mx
, l1y
- my
);
132 BLK(ctx
->cur
, l1x
, l1y
+ 1) =
133 BLK(ctx
->cur
, l1x
- mx
, l1y
+ 1 - my
);
134 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) =
135 BLK(ctx
->cur
, l1x
+ 1 - mx
, l1y
+ 1 - my
);
137 } else { // read values for block
138 BLK(ctx
->cur
, l1x
, l1y
) = bytestream2_get_byte(&ctx
->g
);
139 BLK(ctx
->cur
, l1x
+ 1, l1y
) = bytestream2_get_byte(&ctx
->g
);
140 BLK(ctx
->cur
, l1x
, l1y
+ 1) = bytestream2_get_byte(&ctx
->g
);
141 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) = bytestream2_get_byte(&ctx
->g
);
152 static int kmvc_decode_inter_8x8(KmvcContext
* ctx
, int w
, int h
)
158 int l0x
, l1x
, l0y
, l1y
;
161 kmvc_init_getbits(bb
, &ctx
->g
);
163 for (by
= 0; by
< h
; by
+= 8)
164 for (bx
= 0; bx
< w
; bx
+= 8) {
165 kmvc_getbit(bb
, &ctx
->g
, res
);
167 kmvc_getbit(bb
, &ctx
->g
, res
);
168 if (!res
) { // fill whole 8x8 block
169 if (!bytestream2_get_bytes_left(&ctx
->g
)) {
170 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Data overrun\n");
171 return AVERROR_INVALIDDATA
;
173 val
= bytestream2_get_byte(&ctx
->g
);
174 for (i
= 0; i
< 64; i
++)
175 BLK(ctx
->cur
, bx
+ (i
& 0x7), by
+ (i
>> 3)) = val
;
176 } else { // copy block from previous frame
177 for (i
= 0; i
< 64; i
++)
178 BLK(ctx
->cur
, bx
+ (i
& 0x7), by
+ (i
>> 3)) =
179 BLK(ctx
->prev
, bx
+ (i
& 0x7), by
+ (i
>> 3));
181 } else { // handle four 4x4 subblocks
182 if (!bytestream2_get_bytes_left(&ctx
->g
)) {
183 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Data overrun\n");
184 return AVERROR_INVALIDDATA
;
186 for (i
= 0; i
< 4; i
++) {
187 l0x
= bx
+ (i
& 1) * 4;
188 l0y
= by
+ (i
& 2) * 2;
189 kmvc_getbit(bb
, &ctx
->g
, res
);
191 kmvc_getbit(bb
, &ctx
->g
, res
);
192 if (!res
) { // fill whole 4x4 block
193 val
= bytestream2_get_byte(&ctx
->g
);
194 for (j
= 0; j
< 16; j
++)
195 BLK(ctx
->cur
, l0x
+ (j
& 3), l0y
+ (j
>> 2)) = val
;
196 } else { // copy block
197 val
= bytestream2_get_byte(&ctx
->g
);
198 mx
= (val
& 0xF) - 8;
200 for (j
= 0; j
< 16; j
++)
201 BLK(ctx
->cur
, l0x
+ (j
& 3), l0y
+ (j
>> 2)) =
202 BLK(ctx
->prev
, l0x
+ (j
& 3) + mx
, l0y
+ (j
>> 2) + my
);
204 } else { // descend to 2x2 sub-sub-blocks
205 for (j
= 0; j
< 4; j
++) {
206 l1x
= l0x
+ (j
& 1) * 2;
208 kmvc_getbit(bb
, &ctx
->g
, res
);
210 kmvc_getbit(bb
, &ctx
->g
, res
);
211 if (!res
) { // fill whole 2x2 block
212 val
= bytestream2_get_byte(&ctx
->g
);
213 BLK(ctx
->cur
, l1x
, l1y
) = val
;
214 BLK(ctx
->cur
, l1x
+ 1, l1y
) = val
;
215 BLK(ctx
->cur
, l1x
, l1y
+ 1) = val
;
216 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) = val
;
217 } else { // copy block
218 val
= bytestream2_get_byte(&ctx
->g
);
219 mx
= (val
& 0xF) - 8;
221 BLK(ctx
->cur
, l1x
, l1y
) = BLK(ctx
->prev
, l1x
+ mx
, l1y
+ my
);
222 BLK(ctx
->cur
, l1x
+ 1, l1y
) =
223 BLK(ctx
->prev
, l1x
+ 1 + mx
, l1y
+ my
);
224 BLK(ctx
->cur
, l1x
, l1y
+ 1) =
225 BLK(ctx
->prev
, l1x
+ mx
, l1y
+ 1 + my
);
226 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) =
227 BLK(ctx
->prev
, l1x
+ 1 + mx
, l1y
+ 1 + my
);
229 } else { // read values for block
230 BLK(ctx
->cur
, l1x
, l1y
) = bytestream2_get_byte(&ctx
->g
);
231 BLK(ctx
->cur
, l1x
+ 1, l1y
) = bytestream2_get_byte(&ctx
->g
);
232 BLK(ctx
->cur
, l1x
, l1y
+ 1) = bytestream2_get_byte(&ctx
->g
);
233 BLK(ctx
->cur
, l1x
+ 1, l1y
+ 1) = bytestream2_get_byte(&ctx
->g
);
244 static int decode_frame(AVCodecContext
* avctx
, void *data
, int *data_size
, AVPacket
*avpkt
)
246 KmvcContext
*const ctx
= avctx
->priv_data
;
251 const uint8_t *pal
= av_packet_get_side_data(avpkt
, AV_PKT_DATA_PALETTE
, NULL
);
253 bytestream2_init(&ctx
->g
, avpkt
->data
, avpkt
->size
);
254 if (ctx
->pic
.data
[0])
255 avctx
->release_buffer(avctx
, &ctx
->pic
);
257 ctx
->pic
.reference
= 1;
258 ctx
->pic
.buffer_hints
= FF_BUFFER_HINTS_VALID
;
259 if (avctx
->get_buffer(avctx
, &ctx
->pic
) < 0) {
260 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
264 header
= bytestream2_get_byte(&ctx
->g
);
266 /* blocksize 127 is really palette change event */
267 if (bytestream2_peek_byte(&ctx
->g
) == 127) {
268 bytestream2_skip(&ctx
->g
, 3);
269 for (i
= 0; i
< 127; i
++) {
270 ctx
->pal
[i
+ (header
& 0x81)] = bytestream2_get_be24(&ctx
->g
);
271 bytestream2_skip(&ctx
->g
, 1);
273 bytestream2_seek(&ctx
->g
, -127 * 4 - 3, SEEK_CUR
);
276 if (header
& KMVC_KEYFRAME
) {
277 ctx
->pic
.key_frame
= 1;
278 ctx
->pic
.pict_type
= AV_PICTURE_TYPE_I
;
280 ctx
->pic
.key_frame
= 0;
281 ctx
->pic
.pict_type
= AV_PICTURE_TYPE_P
;
284 if (header
& KMVC_PALETTE
) {
285 ctx
->pic
.palette_has_changed
= 1;
286 // palette starts from index 1 and has 127 entries
287 for (i
= 1; i
<= ctx
->palsize
; i
++) {
288 ctx
->pal
[i
] = bytestream2_get_be24(&ctx
->g
);
293 ctx
->pic
.palette_has_changed
= 1;
294 memcpy(ctx
->pal
, pal
, AVPALETTE_SIZE
);
299 ctx
->pic
.palette_has_changed
= 1;
302 /* make the palette available on the way out */
303 memcpy(ctx
->pic
.data
[1], ctx
->pal
, 1024);
305 blocksize
= bytestream2_get_byte(&ctx
->g
);
307 if (blocksize
!= 8 && blocksize
!= 127) {
308 av_log(avctx
, AV_LOG_ERROR
, "Block size = %i\n", blocksize
);
311 memset(ctx
->cur
, 0, 320 * 200);
312 switch (header
& KMVC_METHOD
) {
314 case 1: // used in palette changed event
315 memcpy(ctx
->cur
, ctx
->prev
, 320 * 200);
318 kmvc_decode_intra_8x8(ctx
, avctx
->width
, avctx
->height
);
321 kmvc_decode_inter_8x8(ctx
, avctx
->width
, avctx
->height
);
324 av_log(avctx
, AV_LOG_ERROR
, "Unknown compression method %i\n", header
& KMVC_METHOD
);
328 out
= ctx
->pic
.data
[0];
330 for (i
= 0; i
< avctx
->height
; i
++) {
331 memcpy(out
, src
, avctx
->width
);
333 out
+= ctx
->pic
.linesize
[0];
337 if (ctx
->cur
== ctx
->frm0
) {
338 ctx
->cur
= ctx
->frm1
;
339 ctx
->prev
= ctx
->frm0
;
341 ctx
->cur
= ctx
->frm0
;
342 ctx
->prev
= ctx
->frm1
;
345 *data_size
= sizeof(AVFrame
);
346 *(AVFrame
*) data
= ctx
->pic
;
348 /* always report that the buffer was completely consumed */
357 static av_cold
int decode_init(AVCodecContext
* avctx
)
359 KmvcContext
*const c
= avctx
->priv_data
;
364 if (avctx
->width
> 320 || avctx
->height
> 200) {
365 av_log(avctx
, AV_LOG_ERROR
, "KMVC supports frames <= 320x200\n");
369 c
->frm0
= av_mallocz(320 * 200);
370 c
->frm1
= av_mallocz(320 * 200);
374 for (i
= 0; i
< 256; i
++) {
375 c
->pal
[i
] = i
* 0x10101;
378 if (avctx
->extradata_size
< 12) {
379 av_log(NULL
, 0, "Extradata missing, decoding may not work properly...\n");
382 c
->palsize
= AV_RL16(avctx
->extradata
+ 10);
385 if (avctx
->extradata_size
== 1036) { // palette in extradata
386 uint8_t *src
= avctx
->extradata
+ 12;
387 for (i
= 0; i
< 256; i
++) {
388 c
->pal
[i
] = AV_RL32(src
);
394 avctx
->pix_fmt
= PIX_FMT_PAL8
;
402 * Uninit kmvc decoder
404 static av_cold
int decode_end(AVCodecContext
* avctx
)
406 KmvcContext
*const c
= avctx
->priv_data
;
411 avctx
->release_buffer(avctx
, &c
->pic
);
416 AVCodec ff_kmvc_decoder
= {
418 .type
= AVMEDIA_TYPE_VIDEO
,
420 .priv_data_size
= sizeof(KmvcContext
),
423 .decode
= decode_frame
,
424 .capabilities
= CODEC_CAP_DR1
,
425 .long_name
= NULL_IF_CONFIG_SMALL("Karl Morton's video codec"),