35 #define KMVC_KEYFRAME 0x80 
   36 #define KMVC_PALETTE  0x40 
   37 #define KMVC_METHOD   0x0F 
   38 #define MAX_PALSIZE   256 
   59 #define BLK(data, x, y)  data[av_clip((x) + (y) * 320, 0, 320 * 200 -1)] 
   61 #define kmvc_init_getbits(bb, g)  bb.bits = 7; bb.bitbuf = bytestream2_get_byte(g); 
   63 #define kmvc_getbit(bb, g, res) {\ 
   65     if (bb.bitbuf & (1 << bb.bits)) res = 1; \ 
   68         bb.bitbuf = bytestream2_get_byte(g); \ 
   79     int l0x, l1x, l0y, l1y;
 
   84     for (by = 0; by < 
h; by += 8)
 
   85         for (bx = 0; bx < 
w; bx += 8) {
 
   92                 val = bytestream2_get_byte(&
ctx->g);
 
   93                 for (
i = 0; 
i < 64; 
i++)
 
   96                 for (
i = 0; 
i < 4; 
i++) {
 
   97                     l0x = bx + (
i & 1) * 4;
 
   98                     l0y = by + (
i & 2) * 2;
 
  103                             val = bytestream2_get_byte(&
ctx->g);
 
  104                             for (j = 0; j < 16; j++)
 
  105                                 BLK(
ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = 
val;
 
  107                             val = bytestream2_get_byte(&
ctx->g);
 
  110                             if ((l0x-mx) + 320*(l0y-my) < 0 || (l0x-mx) + 320*(l0y-my) > 320*197 - 4) {
 
  114                             for (j = 0; j < 16; j++)
 
  115                                 BLK(
ctx->cur, l0x + (j & 3), l0y + (j >> 2)) =
 
  116                                     BLK(
ctx->cur, l0x + (j & 3) - mx, l0y + (j >> 2) - my);
 
  119                         for (j = 0; j < 4; j++) {
 
  120                             l1x = l0x + (j & 1) * 2;
 
  126                                     val = bytestream2_get_byte(&
ctx->g);
 
  132                                     val = bytestream2_get_byte(&
ctx->g);
 
  135                                     if ((l1x-mx) + 320*(l1y-my) < 0 || (l1x-mx) + 320*(l1y-my) > 320*199 - 2) {
 
  139                                     BLK(
ctx->cur, l1x, l1y) = 
BLK(
ctx->cur, l1x - mx, l1y - my);
 
  140                                     BLK(
ctx->cur, l1x + 1, l1y) =
 
  141                                         BLK(
ctx->cur, l1x + 1 - mx, l1y - my);
 
  142                                     BLK(
ctx->cur, l1x, l1y + 1) =
 
  143                                         BLK(
ctx->cur, l1x - mx, l1y + 1 - my);
 
  144                                     BLK(
ctx->cur, l1x + 1, l1y + 1) =
 
  145                                         BLK(
ctx->cur, l1x + 1 - mx, l1y + 1 - my);
 
  148                                 BLK(
ctx->cur, l1x, l1y) = bytestream2_get_byte(&
ctx->g);
 
  149                                 BLK(
ctx->cur, l1x + 1, l1y) = bytestream2_get_byte(&
ctx->g);
 
  150                                 BLK(
ctx->cur, l1x, l1y + 1) = bytestream2_get_byte(&
ctx->g);
 
  151                                 BLK(
ctx->cur, l1x + 1, l1y + 1) = bytestream2_get_byte(&
ctx->g);
 
  168     int l0x, l1x, l0y, l1y;
 
  173     for (by = 0; by < 
h; by += 8)
 
  174         for (bx = 0; bx < 
w; bx += 8) {
 
  183                     val = bytestream2_get_byte(&
ctx->g);
 
  184                     for (
i = 0; 
i < 64; 
i++)
 
  185                         BLK(
ctx->cur, bx + (
i & 0x7), by + (
i >> 3)) = 
val;
 
  187                     for (
i = 0; 
i < 64; 
i++)
 
  188                         BLK(
ctx->cur, bx + (
i & 0x7), by + (
i >> 3)) =
 
  189                             BLK(
ctx->prev, bx + (
i & 0x7), by + (
i >> 3));
 
  196                 for (
i = 0; 
i < 4; 
i++) {
 
  197                     l0x = bx + (
i & 1) * 4;
 
  198                     l0y = by + (
i & 2) * 2;
 
  203                             val = bytestream2_get_byte(&
ctx->g);
 
  204                             for (j = 0; j < 16; j++)
 
  205                                 BLK(
ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = 
val;
 
  207                             val = bytestream2_get_byte(&
ctx->g);
 
  208                             mx = (
val & 0xF) - 8;
 
  210                             if ((l0x+mx) + 320*(l0y+my) < 0 || (l0x+mx) + 320*(l0y+my) > 320*197 - 4) {
 
  214                             for (j = 0; j < 16; j++)
 
  215                                 BLK(
ctx->cur, l0x + (j & 3), l0y + (j >> 2)) =
 
  216                                     BLK(
ctx->prev, l0x + (j & 3) + mx, l0y + (j >> 2) + my);
 
  219                         for (j = 0; j < 4; j++) {
 
  220                             l1x = l0x + (j & 1) * 2;
 
  226                                     val = bytestream2_get_byte(&
ctx->g);
 
  232                                     val = bytestream2_get_byte(&
ctx->g);
 
  233                                     mx = (
val & 0xF) - 8;
 
  235                                     if ((l1x+mx) + 320*(l1y+my) < 0 || (l1x+mx) + 320*(l1y+my) > 320*199 - 2) {
 
  239                                     BLK(
ctx->cur, l1x, l1y) = 
BLK(
ctx->prev, l1x + mx, l1y + my);
 
  240                                     BLK(
ctx->cur, l1x + 1, l1y) =
 
  241                                         BLK(
ctx->prev, l1x + 1 + mx, l1y + my);
 
  242                                     BLK(
ctx->cur, l1x, l1y + 1) =
 
  243                                         BLK(
ctx->prev, l1x + mx, l1y + 1 + my);
 
  244                                     BLK(
ctx->cur, l1x + 1, l1y + 1) =
 
  245                                         BLK(
ctx->prev, l1x + 1 + mx, l1y + 1 + my);
 
  248                                 BLK(
ctx->cur, l1x, l1y) = bytestream2_get_byte(&
ctx->g);
 
  249                                 BLK(
ctx->cur, l1x + 1, l1y) = bytestream2_get_byte(&
ctx->g);
 
  250                                 BLK(
ctx->cur, l1x, l1y + 1) = bytestream2_get_byte(&
ctx->g);
 
  251                                 BLK(
ctx->cur, l1x + 1, l1y + 1) = bytestream2_get_byte(&
ctx->g);
 
  282     if (bytestream2_peek_byte(&
ctx->g) == 127) {
 
  284         for (
i = 0; 
i < 127; 
i++) {
 
  285             ctx->pal[
i + (
header & 0x81)] = 0xFFU << 24 | bytestream2_get_be24(&
ctx->g);
 
  292         frame->key_frame = 1;
 
  295         frame->key_frame = 0;
 
  300         frame->palette_has_changed = 1;
 
  302         for (
i = 1; 
i <= 
ctx->palsize; 
i++) {
 
  303             ctx->pal[
i] = 0xFF
U << 24 | bytestream2_get_be24(&
ctx->g);
 
  308         frame->palette_has_changed = 1;
 
  316         frame->palette_has_changed = 1;
 
  320     memcpy(
frame->data[1], 
ctx->pal, 1024);
 
  322     blocksize = bytestream2_get_byte(&
ctx->g);
 
  324     if (blocksize != 8 && blocksize != 127) {
 
  328     memset(
ctx->cur, 0, 320 * 200);
 
  332         memcpy(
ctx->cur, 
ctx->prev, 320 * 200);
 
  354     if (
ctx->cur == 
ctx->frm0) {
 
  388     for (
i = 0; 
i < 256; 
i++) {
 
  389         c->pal[
i] = 0xFF
U << 24 | 
i * 0x10101;
 
  394                "Extradata missing, decoding may not work properly...\n");
 
  407         for (
i = 0; 
i < 256; 
i++) {