annotate smc.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents f67b63ed036d
children ef2149182f1c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
1 /*
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
2 * Quicktime Graphics (SMC) Video Decoder
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
3 * Copyright (C) 2003 the ffmpeg project
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
4 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
9 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
13 * Lesser General Public License for more details.
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
14 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
18 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
19 */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
20
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
21 /**
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
22 * @file smc.c
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
23 * QT SMC Video Decoder by Mike Melanson (melanson@pcisys.net)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
24 * For more information about the SMC format, visit:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
25 * http://www.pcisys.net/~melanson/codecs/
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
26 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
27 * The SMC decoder outputs PAL8 colorspace data.
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
28 */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
29
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
30 #include <stdio.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
31 #include <stdlib.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
32 #include <string.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
33 #include <unistd.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
34
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
35 #include "common.h"
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
36 #include "avcodec.h"
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
37 #include "dsputil.h"
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
38
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
39 #define CPAIR 2
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
40 #define CQUAD 4
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
41 #define COCTET 8
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
42
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
43 #define COLORS_PER_TABLE 256
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
44
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
45 typedef struct SmcContext {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
46
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
47 AVCodecContext *avctx;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
48 DSPContext dsp;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
49 AVFrame frame;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
50
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
51 unsigned char *buf;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
52 int size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
53
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
54 /* SMC color tables */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
55 unsigned char color_pairs[COLORS_PER_TABLE * CPAIR];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
56 unsigned char color_quads[COLORS_PER_TABLE * CQUAD];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
57 unsigned char color_octets[COLORS_PER_TABLE * COCTET];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
58
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
59 } SmcContext;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
60
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
61 #define GET_BLOCK_COUNT() \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
62 (opcode & 0x10) ? (1 + s->buf[stream_ptr++]) : 1 + (opcode & 0x0F);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
63
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
64 #define ADVANCE_BLOCK() \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
65 { \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
66 pixel_ptr += 4; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
67 if (pixel_ptr >= width) \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
68 { \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
69 pixel_ptr = 0; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
70 row_ptr += stride * 4; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
71 } \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
72 total_blocks--; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
73 if (total_blocks < 0) \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
74 { \
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
75 av_log(s->avctx, AV_LOG_INFO, "warning: block counter just went negative (this should not happen)\n"); \
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
76 return; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
77 } \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
78 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
79
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
80 static void smc_decode_stream(SmcContext *s)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
81 {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
82 int width = s->avctx->width;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
83 int height = s->avctx->height;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
84 int stride = s->frame.linesize[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
85 int i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
86 int stream_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
87 int chunk_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
88 unsigned char opcode;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
89 int n_blocks;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
90 unsigned int color_flags;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
91 unsigned int color_flags_a;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
92 unsigned int color_flags_b;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
93 unsigned int flag_mask;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
94
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
95 unsigned char *pixels = s->frame.data[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
96
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
97 int image_size = height * s->frame.linesize[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
98 int row_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
99 int pixel_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
100 int pixel_x, pixel_y;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
101 int row_inc = stride - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
102 int block_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
103 int prev_block_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
104 int prev_block_ptr1, prev_block_ptr2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
105 int prev_block_flag;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
106 int total_blocks;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
107 int color_table_index; /* indexes to color pair, quad, or octet tables */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
108 int pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
109
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
110 int color_pair_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
111 int color_quad_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
112 int color_octet_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
113
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
114 /* make the palette available */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
115 memcpy(s->frame.data[1], s->avctx->palctrl->palette, AVPALETTE_SIZE);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
116 if (s->avctx->palctrl->palette_changed) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
117 s->frame.palette_has_changed = 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
118 s->avctx->palctrl->palette_changed = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
119 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
120
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
121 chunk_size = BE_32(&s->buf[stream_ptr]) & 0x00FFFFFF;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
122 stream_ptr += 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
123 if (chunk_size != s->size)
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
124 av_log(s->avctx, AV_LOG_INFO, "warning: MOV chunk size != encoded chunk size (%d != %d); using MOV chunk size\n",
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
125 chunk_size, s->size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
126
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
127 chunk_size = s->size;
2103
bcc91fa67694 fix for width or height not multiple of 4
rtognimp
parents: 1927
diff changeset
128 total_blocks = ((s->avctx->width + 3) / 4) * ((s->avctx->height + 3) / 4);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
129
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
130 /* traverse through the blocks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
131 while (total_blocks) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
132 /* sanity checks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
133 /* make sure stream ptr hasn't gone out of bounds */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
134 if (stream_ptr > chunk_size) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
135 av_log(s->avctx, AV_LOG_INFO, "SMC decoder just went out of bounds (stream ptr = %d, chunk size = %d)\n",
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
136 stream_ptr, chunk_size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
137 return;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
138 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
139 /* make sure the row pointer hasn't gone wild */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
140 if (row_ptr >= image_size) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
141 av_log(s->avctx, AV_LOG_INFO, "SMC decoder just went out of bounds (row ptr = %d, height = %d)\n",
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
142 row_ptr, image_size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
143 return;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
144 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
145
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
146 opcode = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
147 switch (opcode & 0xF0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
148 /* skip n blocks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
149 case 0x00:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
150 case 0x10:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
151 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
152 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
153 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
154 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
155 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
156
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
157 /* repeat last block n times */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
158 case 0x20:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
159 case 0x30:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
160 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
161
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
162 /* sanity check */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
163 if ((row_ptr == 0) && (pixel_ptr == 0)) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
164 av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but no blocks rendered yet\n",
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
165 opcode & 0xF0);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
166 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
167 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
168
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
169 /* figure out where the previous block started */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
170 if (pixel_ptr == 0)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
171 prev_block_ptr1 =
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
172 (row_ptr - s->avctx->width * 4) + s->avctx->width - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
173 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
174 prev_block_ptr1 = row_ptr + pixel_ptr - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
175
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
176 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
177 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
178 prev_block_ptr = prev_block_ptr1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
179 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
180 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
181 pixels[block_ptr++] = pixels[prev_block_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
182 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
183 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
184 prev_block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
185 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
186 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
187 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
188 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
189
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
190 /* repeat previous pair of blocks n times */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
191 case 0x40:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
192 case 0x50:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
193 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
194 n_blocks *= 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
195
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
196 /* sanity check */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
197 if ((row_ptr == 0) && (pixel_ptr < 2 * 4)) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
198 av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but not enough blocks rendered yet\n",
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
199 opcode & 0xF0);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
200 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
201 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
202
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
203 /* figure out where the previous 2 blocks started */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
204 if (pixel_ptr == 0)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
205 prev_block_ptr1 = (row_ptr - s->avctx->width * 4) +
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
206 s->avctx->width - 4 * 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
207 else if (pixel_ptr == 4)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
208 prev_block_ptr1 = (row_ptr - s->avctx->width * 4) + row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
209 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
210 prev_block_ptr1 = row_ptr + pixel_ptr - 4 * 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
211
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
212 if (pixel_ptr == 0)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
213 prev_block_ptr2 = (row_ptr - s->avctx->width * 4) + row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
214 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
215 prev_block_ptr2 = row_ptr + pixel_ptr - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
216
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
217 prev_block_flag = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
218 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
219 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
220 if (prev_block_flag)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
221 prev_block_ptr = prev_block_ptr2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
222 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
223 prev_block_ptr = prev_block_ptr1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
224 prev_block_flag = !prev_block_flag;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
225
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
226 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
227 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
228 pixels[block_ptr++] = pixels[prev_block_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
229 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
230 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
231 prev_block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
232 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
233 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
234 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
235 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
236
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
237 /* 1-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
238 case 0x60:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
239 case 0x70:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
240 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
241 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
242
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
243 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
244 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
245 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
246 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
247 pixels[block_ptr++] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
248 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
249 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
250 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
251 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
252 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
253 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
254
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
255 /* 2-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
256 case 0x80:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
257 case 0x90:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
258 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
259
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
260 /* figure out which color pair to use to paint the 2-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
261 if ((opcode & 0xF0) == 0x80) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
262 /* fetch the next 2 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
263 * available entry in the color pair table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
264 for (i = 0; i < CPAIR; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
265 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
266 color_table_index = CPAIR * color_pair_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
267 s->color_pairs[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
268 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
269 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
270 color_table_index = CPAIR * color_pair_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
271 color_pair_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
272 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
273 if (color_pair_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
274 color_pair_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
275 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
276 color_table_index = CPAIR * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
277
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
278 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
279 color_flags = BE_16(&s->buf[stream_ptr]);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
280 stream_ptr += 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
281 flag_mask = 0x8000;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
282 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
283 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
284 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
285 if (color_flags & flag_mask)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
286 pixel = color_table_index + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
287 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
288 pixel = color_table_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
289 flag_mask >>= 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
290 pixels[block_ptr++] = s->color_pairs[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
291 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
292 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
293 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
294 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
295 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
296 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
297
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
298 /* 4-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
299 case 0xA0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
300 case 0xB0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
301 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
302
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
303 /* figure out which color quad to use to paint the 4-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
304 if ((opcode & 0xF0) == 0xA0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
305 /* fetch the next 4 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
306 * available entry in the color quad table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
307 for (i = 0; i < CQUAD; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
308 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
309 color_table_index = CQUAD * color_quad_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
310 s->color_quads[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
311 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
312 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
313 color_table_index = CQUAD * color_quad_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
314 color_quad_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
315 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
316 if (color_quad_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
317 color_quad_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
318 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
319 color_table_index = CQUAD * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
320
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
321 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
322 color_flags = BE_32(&s->buf[stream_ptr]);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
323 stream_ptr += 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
324 /* flag mask actually acts as a bit shift count here */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
325 flag_mask = 30;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
326 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
327 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
328 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
329 pixel = color_table_index +
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
330 ((color_flags >> flag_mask) & 0x03);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
331 flag_mask -= 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
332 pixels[block_ptr++] = s->color_quads[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
333 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
334 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
335 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
336 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
337 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
338 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
339
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
340 /* 8-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
341 case 0xC0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
342 case 0xD0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
343 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
344
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
345 /* figure out which color octet to use to paint the 8-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
346 if ((opcode & 0xF0) == 0xC0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
347 /* fetch the next 8 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
348 * available entry in the color octet table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
349 for (i = 0; i < COCTET; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
350 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
351 color_table_index = COCTET * color_octet_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
352 s->color_octets[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
353 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
354 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
355 color_table_index = COCTET * color_octet_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
356 color_octet_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
357 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
358 if (color_octet_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
359 color_octet_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
360 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
361 color_table_index = COCTET * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
362
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
363 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
364 /*
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
365 For this input of 6 hex bytes:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
366 01 23 45 67 89 AB
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
367 Mangle it to this output:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
368 flags_a = xx012456, flags_b = xx89A37B
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
369 */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
370 /* build the color flags */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
371 color_flags_a = color_flags_b = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
372 color_flags_a =
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
373 (s->buf[stream_ptr + 0] << 16) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
374 ((s->buf[stream_ptr + 1] & 0xF0) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
375 ((s->buf[stream_ptr + 2] & 0xF0) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
376 ((s->buf[stream_ptr + 2] & 0x0F) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
377 ((s->buf[stream_ptr + 3] & 0xF0) >> 4);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
378 color_flags_b =
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
379 (s->buf[stream_ptr + 4] << 16) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
380 ((s->buf[stream_ptr + 5] & 0xF0) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
381 ((s->buf[stream_ptr + 1] & 0x0F) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
382 ((s->buf[stream_ptr + 3] & 0x0F) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
383 (s->buf[stream_ptr + 5] & 0x0F);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
384 stream_ptr += 6;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
385
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
386 color_flags = color_flags_a;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
387 /* flag mask actually acts as a bit shift count here */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
388 flag_mask = 21;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
389 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
390 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
391 /* reload flags at third row (iteration pixel_y == 2) */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
392 if (pixel_y == 2) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
393 color_flags = color_flags_b;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
394 flag_mask = 21;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
395 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
396 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
397 pixel = color_table_index +
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
398 ((color_flags >> flag_mask) & 0x07);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
399 flag_mask -= 3;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
400 pixels[block_ptr++] = s->color_octets[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
401 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
402 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
403 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
404 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
405 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
406 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
407
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
408 /* 16-color block encoding (every pixel is a different color) */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
409 case 0xE0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
410 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
411
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
412 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
413 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
414 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
415 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
416 pixels[block_ptr++] = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
417 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
418 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
419 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
420 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
421 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
422 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
423
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
424 case 0xF0:
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
425 av_log(s->avctx, AV_LOG_INFO, "0xF0 opcode seen in SMC chunk (contact the developers)\n");
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
426 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
427 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
428 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
429 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
430
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
431 static int smc_decode_init(AVCodecContext *avctx)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
432 {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
433 SmcContext *s = (SmcContext *)avctx->priv_data;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
434
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
435 s->avctx = avctx;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
436 avctx->pix_fmt = PIX_FMT_PAL8;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
437 avctx->has_b_frames = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
438 dsputil_init(&s->dsp, avctx);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
439
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
440 s->frame.data[0] = NULL;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
441
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
442 return 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
443 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
444
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
445 static int smc_decode_frame(AVCodecContext *avctx,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
446 void *data, int *data_size,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
447 uint8_t *buf, int buf_size)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
448 {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
449 SmcContext *s = (SmcContext *)avctx->priv_data;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
450
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
451 s->buf = buf;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
452 s->size = buf_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
453
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
454 s->frame.reference = 1;
1769
1514fd5d434b watch those hard tabs
melanson
parents: 1630
diff changeset
455 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
1514fd5d434b watch those hard tabs
melanson
parents: 1630
diff changeset
456 FF_BUFFER_HINTS_REUSABLE | FF_BUFFER_HINTS_READABLE;
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
457 if (avctx->reget_buffer(avctx, &s->frame)) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
458 av_log(s->avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
459 return -1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
460 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
461
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
462 smc_decode_stream(s);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
463
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
464 *data_size = sizeof(AVFrame);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
465 *(AVFrame*)data = s->frame;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
466
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
467 /* always report that the buffer was completely consumed */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
468 return buf_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
469 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
470
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
471 static int smc_decode_end(AVCodecContext *avctx)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
472 {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
473 SmcContext *s = (SmcContext *)avctx->priv_data;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
474
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
475 if (s->frame.data[0])
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
476 avctx->release_buffer(avctx, &s->frame);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
477
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
478 return 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
479 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
480
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
481 AVCodec smc_decoder = {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
482 "smc",
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
483 CODEC_TYPE_VIDEO,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
484 CODEC_ID_SMC,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
485 sizeof(SmcContext),
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
486 smc_decode_init,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
487 NULL,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
488 smc_decode_end,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
489 smc_decode_frame,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
490 CODEC_CAP_DR1,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
491 };