annotate c93.c @ 6920:d02af7474bff libavcodec

Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays. fixes CID84 RUN2 CID85 RUN2 CID86 RUN2 CID87 RUN2 CID88 RUN2 CID89 RUN2 CID90 RUN2 CID91 RUN2 CID92 RUN2 CID93 RUN2 CID94 RUN2 CID95 RUN2 CID96 RUN2 CID97 RUN2 CID98 RUN2 CID99 RUN2 CID100 RUN2 CID101 RUN2 CID102 RUN2 CID103 RUN2 CID104 RUN2 CID105 RUN2 CID106 RUN2
author michael
date Wed, 28 May 2008 11:59:41 +0000
parents a4104482ceef
children e943e1409077
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
1 /*
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
2 * Interplay C93 video decoder
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
3 * Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com>
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
4 *
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
6 *
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
11 *
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
16 *
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4820
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
20 */
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
21
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
22 #include "avcodec.h"
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
23 #include "bytestream.h"
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
24
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
25 typedef struct {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
26 AVFrame pictures[2];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
27 int currentpic;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
28 } C93DecoderContext;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
29
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
30 typedef enum {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
31 C93_8X8_FROM_PREV = 0x02,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
32 C93_4X4_FROM_PREV = 0x06,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
33 C93_4X4_FROM_CURR = 0x07,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
34 C93_8X8_2COLOR = 0x08,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
35 C93_4X4_2COLOR = 0x0A,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
36 C93_4X4_4COLOR_GRP = 0x0B,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
37 C93_4X4_4COLOR = 0x0D,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
38 C93_NOOP = 0x0E,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
39 C93_8X8_INTRA = 0x0F,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
40 } C93BlockType;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
41
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
42 #define WIDTH 320
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
43 #define HEIGHT 192
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
44
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
45 #define C93_HAS_PALETTE 0x01
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
46 #define C93_FIRST_FRAME 0x02
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
47
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6227
diff changeset
48 static av_cold int decode_init(AVCodecContext *avctx)
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
49 {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
50 avctx->pix_fmt = PIX_FMT_PAL8;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
51 return 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
52 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
53
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6227
diff changeset
54 static av_cold int decode_end(AVCodecContext *avctx)
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
55 {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
56 C93DecoderContext * const c93 = avctx->priv_data;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
57
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
58 if (c93->pictures[0].data[0])
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
59 avctx->release_buffer(avctx, &c93->pictures[0]);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
60 if (c93->pictures[1].data[0])
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
61 avctx->release_buffer(avctx, &c93->pictures[1]);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
62 return 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
63 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
64
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
65 static inline int copy_block(AVCodecContext *avctx, uint8_t *to,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
66 uint8_t *from, int offset, int height, int stride)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
67 {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
68 int i;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
69 int width = height;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
70 int from_x = offset % WIDTH;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
71 int from_y = offset / WIDTH;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
72 int overflow = from_x + width - WIDTH;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
73
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
74 if (!from) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
75 /* silently ignoring predictive blocks in first frame */
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
76 return 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
77 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
78
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
79 if (from_y + height > HEIGHT) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
80 av_log(avctx, AV_LOG_ERROR, "invalid offset %d during C93 decoding\n",
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
81 offset);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
82 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
83 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
84
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
85 if (overflow > 0) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
86 width -= overflow;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
87 for (i = 0; i < height; i++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
88 memcpy(&to[i*stride+width], &from[(from_y+i)*stride], overflow);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
89 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
90 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
91
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
92 for (i = 0; i < height; i++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
93 memcpy(&to[i*stride], &from[(from_y+i)*stride+from_x], width);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
94 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
95
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
96 return 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
97 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
98
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
99 static inline void draw_n_color(uint8_t *out, int stride, int width,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
100 int height, int bpp, uint8_t cols[4], uint8_t grps[4], uint32_t col)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
101 {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
102 int x, y;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
103 for (y = 0; y < height; y++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
104 if (grps)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
105 cols[0] = grps[3 * (y >> 1)];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
106 for (x = 0; x < width; x++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
107 if (grps)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
108 cols[1]= grps[(x >> 1) + 1];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
109 out[x + y*stride] = cols[col & ((1 << bpp) - 1)];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
110 col >>= bpp;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
111 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
112 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
113 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
114
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
115 static int decode_frame(AVCodecContext *avctx, void *data,
6227
michael
parents: 5215
diff changeset
116 int *data_size, const uint8_t * buf, int buf_size)
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
117 {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
118 C93DecoderContext * const c93 = avctx->priv_data;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
119 AVFrame * const newpic = &c93->pictures[c93->currentpic];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
120 AVFrame * const oldpic = &c93->pictures[c93->currentpic^1];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
121 AVFrame *picture = data;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
122 uint8_t *out;
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
123 int stride, i, x, y, bt = 0;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
124
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
125 c93->currentpic ^= 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
126
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
127 newpic->reference = 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
128 newpic->buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
129 FF_BUFFER_HINTS_REUSABLE | FF_BUFFER_HINTS_READABLE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
130 if (avctx->reget_buffer(avctx, newpic)) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
131 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
132 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
133 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
134
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
135 stride = newpic->linesize[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
136
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
137 if (buf[0] & C93_FIRST_FRAME) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
138 newpic->pict_type = FF_I_TYPE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
139 newpic->key_frame = 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
140 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
141 newpic->pict_type = FF_P_TYPE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
142 newpic->key_frame = 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
143 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
144
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
145 if (*buf++ & C93_HAS_PALETTE) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
146 uint32_t *palette = (uint32_t *) newpic->data[1];
6227
michael
parents: 5215
diff changeset
147 const uint8_t *palbuf = buf + buf_size - 768 - 1;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
148 for (i = 0; i < 256; i++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
149 palette[i] = bytestream_get_be24(&palbuf);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
150 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
151 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
152 if (oldpic->data[1])
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
153 memcpy(newpic->data[1], oldpic->data[1], 256 * 4);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
154 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
155
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
156 for (y = 0; y < HEIGHT; y += 8) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
157 out = newpic->data[0] + y * stride;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
158 for (x = 0; x < WIDTH; x += 8) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
159 uint8_t *copy_from = oldpic->data[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
160 unsigned int offset, j;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
161 uint8_t cols[4], grps[4];
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
162 C93BlockType block_type;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
163
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
164 if (!bt)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
165 bt = *buf++;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
166
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
167 block_type= bt & 0x0F;
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
168 switch (block_type) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
169 case C93_8X8_FROM_PREV:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
170 offset = bytestream_get_le16(&buf);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
171 if (copy_block(avctx, out, copy_from, offset, 8, stride))
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
172 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
173 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
174
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
175 case C93_4X4_FROM_CURR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
176 copy_from = newpic->data[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
177 case C93_4X4_FROM_PREV:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
178 for (j = 0; j < 8; j += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
179 for (i = 0; i < 8; i += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
180 offset = bytestream_get_le16(&buf);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
181 if (copy_block(avctx, &out[j*stride+i],
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
182 copy_from, offset, 4, stride))
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
183 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
184 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
185 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
186 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
187
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
188 case C93_8X8_2COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
189 bytestream_get_buffer(&buf, cols, 2);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
190 for (i = 0; i < 8; i++) {
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
191 draw_n_color(out + i*stride, stride, 8, 1, 1, cols,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
192 NULL, *buf++);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
193 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
194
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
195 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
196
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
197 case C93_4X4_2COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
198 case C93_4X4_4COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
199 case C93_4X4_4COLOR_GRP:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
200 for (j = 0; j < 8; j += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
201 for (i = 0; i < 8; i += 4) {
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
202 if (block_type == C93_4X4_2COLOR) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
203 bytestream_get_buffer(&buf, cols, 2);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
204 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
205 1, cols, NULL, bytestream_get_le16(&buf));
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
206 } else if (block_type == C93_4X4_4COLOR) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
207 bytestream_get_buffer(&buf, cols, 4);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
208 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
209 2, cols, NULL, bytestream_get_le32(&buf));
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
210 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
211 bytestream_get_buffer(&buf, grps, 4);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
212 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
213 1, cols, grps, bytestream_get_le16(&buf));
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
214 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
215 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
216 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
217 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
218
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
219 case C93_NOOP:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
220 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
221
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
222 case C93_8X8_INTRA:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
223 for (j = 0; j < 8; j++)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
224 bytestream_get_buffer(&buf, out + j*stride, 8);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
225 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
226
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
227 default:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
228 av_log(avctx, AV_LOG_ERROR, "unexpected type %x at %dx%d\n",
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
229 block_type, x, y);
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
230 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
231 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
232 bt >>= 4;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
233 out += 8;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
234 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
235 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
236
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
237 *picture = *newpic;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
238 *data_size = sizeof(AVFrame);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
239
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
240 return buf_size;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
241 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
242
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
243 AVCodec c93_decoder = {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
244 "c93",
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
245 CODEC_TYPE_VIDEO,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
246 CODEC_ID_C93,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
247 sizeof(C93DecoderContext),
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
248 decode_init,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
249 NULL,
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
250 decode_end,
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
251 decode_frame,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
252 CODEC_CAP_DR1,
6710
a4104482ceef Add long names to many AVCodec declarations.
diego
parents: 6517
diff changeset
253 .long_name = "Interplay C93",
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
254 };