annotate smc.c @ 3990:746a60ba3177 libavcodec

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