annotate smc.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 54bc8a2727b0
children 5da84f0d0a55
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8573
diff changeset
23 * @file libavcodec/smc.c
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
24 * QT SMC Video Decoder by Mike Melanson (melanson@pcisys.net)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
25 * For more information about the SMC format, visit:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
26 * http://www.pcisys.net/~melanson/codecs/
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
27 *
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
28 * The SMC decoder outputs PAL8 colorspace data.
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
29 */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
30
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
31 #include <stdio.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
32 #include <stdlib.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
33 #include <string.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
34 #include <unistd.h>
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
35
8573
2acf0ae7b041 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 7040
diff changeset
36 #include "libavutil/intreadwrite.h"
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
37 #include "avcodec.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 AVFrame frame;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
49
6252
michael
parents: 5215
diff changeset
50 const unsigned char *buf;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
51 int size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
52
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
53 /* SMC color tables */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
54 unsigned char color_pairs[COLORS_PER_TABLE * CPAIR];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
55 unsigned char color_quads[COLORS_PER_TABLE * CQUAD];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
56 unsigned char color_octets[COLORS_PER_TABLE * COCTET];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
57
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
58 } SmcContext;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
59
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
60 #define GET_BLOCK_COUNT() \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
61 (opcode & 0x10) ? (1 + s->buf[stream_ptr++]) : 1 + (opcode & 0x0F);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
62
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
63 #define ADVANCE_BLOCK() \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
64 { \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
65 pixel_ptr += 4; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
66 if (pixel_ptr >= width) \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
67 { \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
68 pixel_ptr = 0; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
69 row_ptr += stride * 4; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
70 } \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
71 total_blocks--; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
72 if (total_blocks < 0) \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
73 { \
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
74 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
75 return; \
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
76 } \
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 static void smc_decode_stream(SmcContext *s)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
80 {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
81 int width = s->avctx->width;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
82 int height = s->avctx->height;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
83 int stride = s->frame.linesize[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
84 int i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
85 int stream_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
86 int chunk_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
87 unsigned char opcode;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
88 int n_blocks;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
89 unsigned int color_flags;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
90 unsigned int color_flags_a;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
91 unsigned int color_flags_b;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
92 unsigned int flag_mask;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
93
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
94 unsigned char *pixels = s->frame.data[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
95
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
96 int image_size = height * s->frame.linesize[0];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
97 int row_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
98 int pixel_ptr = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
99 int pixel_x, pixel_y;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
100 int row_inc = stride - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
101 int block_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
102 int prev_block_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
103 int prev_block_ptr1, prev_block_ptr2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
104 int prev_block_flag;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
105 int total_blocks;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
106 int color_table_index; /* indexes to color pair, quad, or octet tables */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
107 int pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
108
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
109 int color_pair_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
110 int color_quad_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
111 int color_octet_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
112
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
113 /* make the palette available */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
114 memcpy(s->frame.data[1], s->avctx->palctrl->palette, AVPALETTE_SIZE);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
115 if (s->avctx->palctrl->palette_changed) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
116 s->frame.palette_has_changed = 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
117 s->avctx->palctrl->palette_changed = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
118 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
119
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
120 chunk_size = AV_RB32(&s->buf[stream_ptr]) & 0x00FFFFFF;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
121 stream_ptr += 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
122 if (chunk_size != s->size)
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
123 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
124 chunk_size, s->size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
125
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
126 chunk_size = s->size;
2103
bcc91fa67694 fix for width or height not multiple of 4
rtognimp
parents: 1927
diff changeset
127 total_blocks = ((s->avctx->width + 3) / 4) * ((s->avctx->height + 3) / 4);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
128
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
129 /* traverse through the blocks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
130 while (total_blocks) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
131 /* sanity checks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
132 /* make sure stream ptr hasn't gone out of bounds */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
133 if (stream_ptr > chunk_size) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
134 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
135 stream_ptr, chunk_size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
136 return;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
137 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
138 /* make sure the row pointer hasn't gone wild */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
139 if (row_ptr >= image_size) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
140 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
141 row_ptr, image_size);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
142 return;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
143 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
144
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
145 opcode = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
146 switch (opcode & 0xF0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
147 /* skip n blocks */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
148 case 0x00:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
149 case 0x10:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
150 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
151 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
152 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
153 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
154 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
155
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
156 /* repeat last block n times */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
157 case 0x20:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
158 case 0x30:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
159 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
160
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
161 /* sanity check */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
162 if ((row_ptr == 0) && (pixel_ptr == 0)) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
163 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
164 opcode & 0xF0);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
165 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
166 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
167
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
168 /* figure out where the previous block started */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
169 if (pixel_ptr == 0)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2453
diff changeset
170 prev_block_ptr1 =
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
171 (row_ptr - s->avctx->width * 4) + s->avctx->width - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
172 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
173 prev_block_ptr1 = row_ptr + pixel_ptr - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
174
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
175 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
176 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
177 prev_block_ptr = prev_block_ptr1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
178 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
179 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
180 pixels[block_ptr++] = pixels[prev_block_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
181 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
182 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
183 prev_block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
184 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
185 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
186 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
187 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
188
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
189 /* repeat previous pair of blocks n times */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
190 case 0x40:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
191 case 0x50:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
192 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
193 n_blocks *= 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
194
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
195 /* sanity check */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
196 if ((row_ptr == 0) && (pixel_ptr < 2 * 4)) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
197 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
198 opcode & 0xF0);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
199 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
200 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
201
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
202 /* figure out where the previous 2 blocks started */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
203 if (pixel_ptr == 0)
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2453
diff changeset
204 prev_block_ptr1 = (row_ptr - s->avctx->width * 4) +
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
205 s->avctx->width - 4 * 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
206 else if (pixel_ptr == 4)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
207 prev_block_ptr1 = (row_ptr - s->avctx->width * 4) + row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
208 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
209 prev_block_ptr1 = row_ptr + pixel_ptr - 4 * 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
210
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
211 if (pixel_ptr == 0)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
212 prev_block_ptr2 = (row_ptr - s->avctx->width * 4) + row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
213 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
214 prev_block_ptr2 = row_ptr + pixel_ptr - 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
215
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
216 prev_block_flag = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
217 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
218 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
219 if (prev_block_flag)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
220 prev_block_ptr = prev_block_ptr2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
221 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
222 prev_block_ptr = prev_block_ptr1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
223 prev_block_flag = !prev_block_flag;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
224
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
225 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
226 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
227 pixels[block_ptr++] = pixels[prev_block_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
228 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
229 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
230 prev_block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
231 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
232 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
233 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
234 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
235
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
236 /* 1-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
237 case 0x60:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
238 case 0x70:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
239 n_blocks = GET_BLOCK_COUNT();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
240 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
241
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
242 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
243 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
244 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
245 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
246 pixels[block_ptr++] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
247 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
248 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
249 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
250 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
251 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
252 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
253
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
254 /* 2-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
255 case 0x80:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
256 case 0x90:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
257 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
258
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
259 /* figure out which color pair to use to paint the 2-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
260 if ((opcode & 0xF0) == 0x80) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
261 /* fetch the next 2 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
262 * available entry in the color pair table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
263 for (i = 0; i < CPAIR; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
264 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
265 color_table_index = CPAIR * color_pair_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
266 s->color_pairs[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
267 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
268 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
269 color_table_index = CPAIR * color_pair_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
270 color_pair_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
271 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
272 if (color_pair_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
273 color_pair_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
274 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
275 color_table_index = CPAIR * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
276
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
277 while (n_blocks--) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
278 color_flags = AV_RB16(&s->buf[stream_ptr]);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
279 stream_ptr += 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
280 flag_mask = 0x8000;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
281 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
282 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
283 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
284 if (color_flags & flag_mask)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
285 pixel = color_table_index + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
286 else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
287 pixel = color_table_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
288 flag_mask >>= 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
289 pixels[block_ptr++] = s->color_pairs[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
290 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
291 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
292 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
293 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
294 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
295 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
296
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
297 /* 4-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
298 case 0xA0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
299 case 0xB0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
300 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
301
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
302 /* figure out which color quad to use to paint the 4-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
303 if ((opcode & 0xF0) == 0xA0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
304 /* fetch the next 4 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
305 * available entry in the color quad table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
306 for (i = 0; i < CQUAD; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
307 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
308 color_table_index = CQUAD * color_quad_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
309 s->color_quads[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
310 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
311 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
312 color_table_index = CQUAD * color_quad_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
313 color_quad_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
314 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
315 if (color_quad_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
316 color_quad_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
317 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
318 color_table_index = CQUAD * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
319
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
320 while (n_blocks--) {
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 3947
diff changeset
321 color_flags = AV_RB32(&s->buf[stream_ptr]);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
322 stream_ptr += 4;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
323 /* flag mask actually acts as a bit shift count here */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
324 flag_mask = 30;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
325 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
326 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
327 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2453
diff changeset
328 pixel = color_table_index +
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
329 ((color_flags >> flag_mask) & 0x03);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
330 flag_mask -= 2;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
331 pixels[block_ptr++] = s->color_quads[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
332 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
333 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
334 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
335 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
336 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
337 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
338
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
339 /* 8-color block encoding */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
340 case 0xC0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
341 case 0xD0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
342 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
343
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
344 /* figure out which color octet to use to paint the 8-color block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
345 if ((opcode & 0xF0) == 0xC0) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
346 /* fetch the next 8 colors from bytestream and store in next
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
347 * available entry in the color octet table */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
348 for (i = 0; i < COCTET; i++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
349 pixel = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
350 color_table_index = COCTET * color_octet_index + i;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
351 s->color_octets[color_table_index] = pixel;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
352 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
353 /* this is the base index to use for this block */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
354 color_table_index = COCTET * color_octet_index;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
355 color_octet_index++;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
356 /* wraparound */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
357 if (color_octet_index == COLORS_PER_TABLE)
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
358 color_octet_index = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
359 } else
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
360 color_table_index = COCTET * s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
361
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
362 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
363 /*
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
364 For this input of 6 hex bytes:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
365 01 23 45 67 89 AB
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
366 Mangle it to this output:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
367 flags_a = xx012456, flags_b = xx89A37B
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
368 */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
369 /* build the color flags */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
370 color_flags_a = color_flags_b = 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
371 color_flags_a =
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
372 (s->buf[stream_ptr + 0] << 16) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
373 ((s->buf[stream_ptr + 1] & 0xF0) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
374 ((s->buf[stream_ptr + 2] & 0xF0) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
375 ((s->buf[stream_ptr + 2] & 0x0F) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
376 ((s->buf[stream_ptr + 3] & 0xF0) >> 4);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
377 color_flags_b =
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
378 (s->buf[stream_ptr + 4] << 16) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
379 ((s->buf[stream_ptr + 5] & 0xF0) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
380 ((s->buf[stream_ptr + 1] & 0x0F) << 8) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
381 ((s->buf[stream_ptr + 3] & 0x0F) << 4) |
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
382 (s->buf[stream_ptr + 5] & 0x0F);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
383 stream_ptr += 6;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
384
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
385 color_flags = color_flags_a;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
386 /* flag mask actually acts as a bit shift count here */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
387 flag_mask = 21;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
388 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
389 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
390 /* reload flags at third row (iteration pixel_y == 2) */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
391 if (pixel_y == 2) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
392 color_flags = color_flags_b;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
393 flag_mask = 21;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
394 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
395 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2453
diff changeset
396 pixel = color_table_index +
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
397 ((color_flags >> flag_mask) & 0x07);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
398 flag_mask -= 3;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
399 pixels[block_ptr++] = s->color_octets[pixel];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
400 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
401 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
402 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
403 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
404 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
405 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
406
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
407 /* 16-color block encoding (every pixel is a different color) */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
408 case 0xE0:
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
409 n_blocks = (opcode & 0x0F) + 1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
410
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
411 while (n_blocks--) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
412 block_ptr = row_ptr + pixel_ptr;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
413 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
414 for (pixel_x = 0; pixel_x < 4; pixel_x++) {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
415 pixels[block_ptr++] = s->buf[stream_ptr++];
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
416 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
417 block_ptr += row_inc;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
418 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
419 ADVANCE_BLOCK();
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
420 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
421 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
422
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
423 case 0xF0:
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
424 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
425 break;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
426 }
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
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6484
diff changeset
430 static av_cold int smc_decode_init(AVCodecContext *avctx)
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
431 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
432 SmcContext *s = avctx->priv_data;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
433
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
434 s->avctx = avctx;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
435 avctx->pix_fmt = PIX_FMT_PAL8;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
436
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
437 s->frame.data[0] = NULL;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
438
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
439 return 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
440 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
441
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
442 static int smc_decode_frame(AVCodecContext *avctx,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
443 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
444 AVPacket *avpkt)
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
445 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
446 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
447 int buf_size = avpkt->size;
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
448 SmcContext *s = avctx->priv_data;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
449
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
450 s->buf = buf;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
451 s->size = buf_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
452
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
453 s->frame.reference = 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2453
diff changeset
454 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
1769
1514fd5d434b watch those hard tabs
melanson
parents: 1630
diff changeset
455 FF_BUFFER_HINTS_REUSABLE | FF_BUFFER_HINTS_READABLE;
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
456 if (avctx->reget_buffer(avctx, &s->frame)) {
1927
d7505fbe66cb conversion to av_log
alex
parents: 1881
diff changeset
457 av_log(s->avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
458 return -1;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
459 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
460
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
461 smc_decode_stream(s);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
462
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
463 *data_size = sizeof(AVFrame);
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
464 *(AVFrame*)data = s->frame;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
465
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
466 /* always report that the buffer was completely consumed */
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
467 return buf_size;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
468 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
469
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6484
diff changeset
470 static av_cold int smc_decode_end(AVCodecContext *avctx)
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
471 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
472 SmcContext *s = avctx->priv_data;
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
473
1630
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
474 if (s->frame.data[0])
586b5c08863c - Add reget_buffer() function to AVCodecContext
rtognimp
parents: 1610
diff changeset
475 avctx->release_buffer(avctx, &s->frame);
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
476
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
477 return 0;
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
478 }
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
479
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
480 AVCodec smc_decoder = {
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
481 "smc",
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
482 CODEC_TYPE_VIDEO,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
483 CODEC_ID_SMC,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
484 sizeof(SmcContext),
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
485 smc_decode_init,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
486 NULL,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
487 smc_decode_end,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
488 smc_decode_frame,
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
489 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6712
diff changeset
490 .long_name = NULL_IF_CONFIG_SMALL("QuickTime Graphics (SMC)"),
1610
b0fe2a0adf49 added Apple Graphics (SMC) decoder
melanson
parents:
diff changeset
491 };