annotate c93.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 8a4984c5cacc
children
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,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 7040
diff changeset
116 int *data_size, AVPacket *avpkt)
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
117 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 7040
diff changeset
118 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 7040
diff changeset
119 int buf_size = avpkt->size;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
120 C93DecoderContext * const c93 = avctx->priv_data;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
121 AVFrame * const newpic = &c93->pictures[c93->currentpic];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
122 AVFrame * const oldpic = &c93->pictures[c93->currentpic^1];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
123 AVFrame *picture = data;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
124 uint8_t *out;
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
125 int stride, i, x, y, bt = 0;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
126
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
127 c93->currentpic ^= 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
128
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
129 newpic->reference = 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
130 newpic->buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
131 FF_BUFFER_HINTS_REUSABLE | FF_BUFFER_HINTS_READABLE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
132 if (avctx->reget_buffer(avctx, newpic)) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
133 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
134 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
135 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
136
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
137 stride = newpic->linesize[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
138
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
139 if (buf[0] & C93_FIRST_FRAME) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
140 newpic->pict_type = FF_I_TYPE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
141 newpic->key_frame = 1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
142 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
143 newpic->pict_type = FF_P_TYPE;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
144 newpic->key_frame = 0;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
145 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
146
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
147 if (*buf++ & C93_HAS_PALETTE) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
148 uint32_t *palette = (uint32_t *) newpic->data[1];
6227
michael
parents: 5215
diff changeset
149 const uint8_t *palbuf = buf + buf_size - 768 - 1;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
150 for (i = 0; i < 256; i++) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
151 palette[i] = bytestream_get_be24(&palbuf);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
152 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
153 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
154 if (oldpic->data[1])
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
155 memcpy(newpic->data[1], oldpic->data[1], 256 * 4);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
156 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
157
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
158 for (y = 0; y < HEIGHT; y += 8) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
159 out = newpic->data[0] + y * stride;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
160 for (x = 0; x < WIDTH; x += 8) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
161 uint8_t *copy_from = oldpic->data[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
162 unsigned int offset, j;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
163 uint8_t cols[4], grps[4];
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
164 C93BlockType block_type;
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
165
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
166 if (!bt)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
167 bt = *buf++;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
168
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
169 block_type= bt & 0x0F;
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
170 switch (block_type) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
171 case C93_8X8_FROM_PREV:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
172 offset = bytestream_get_le16(&buf);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
173 if (copy_block(avctx, out, copy_from, offset, 8, stride))
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
174 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
175 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
176
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
177 case C93_4X4_FROM_CURR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
178 copy_from = newpic->data[0];
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
179 case C93_4X4_FROM_PREV:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
180 for (j = 0; j < 8; j += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
181 for (i = 0; i < 8; i += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
182 offset = bytestream_get_le16(&buf);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
183 if (copy_block(avctx, &out[j*stride+i],
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
184 copy_from, offset, 4, stride))
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
185 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
186 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
187 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
188 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
189
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
190 case C93_8X8_2COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
191 bytestream_get_buffer(&buf, cols, 2);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
192 for (i = 0; i < 8; i++) {
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
193 draw_n_color(out + i*stride, stride, 8, 1, 1, cols,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
194 NULL, *buf++);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
195 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
196
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
197 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
198
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
199 case C93_4X4_2COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
200 case C93_4X4_4COLOR:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
201 case C93_4X4_4COLOR_GRP:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
202 for (j = 0; j < 8; j += 4) {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
203 for (i = 0; i < 8; i += 4) {
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
204 if (block_type == C93_4X4_2COLOR) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
205 bytestream_get_buffer(&buf, cols, 2);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
206 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
207 1, cols, NULL, bytestream_get_le16(&buf));
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
208 } else if (block_type == C93_4X4_4COLOR) {
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
209 bytestream_get_buffer(&buf, cols, 4);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
210 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
211 2, cols, NULL, bytestream_get_le32(&buf));
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
212 } else {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
213 bytestream_get_buffer(&buf, grps, 4);
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
214 draw_n_color(out + i + j*stride, stride, 4, 4,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
215 1, cols, grps, bytestream_get_le16(&buf));
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
216 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
217 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
218 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
219 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
220
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
221 case C93_NOOP:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
222 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
223
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
224 case C93_8X8_INTRA:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
225 for (j = 0; j < 8; j++)
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
226 bytestream_get_buffer(&buf, out + j*stride, 8);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
227 break;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
228
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
229 default:
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
230 av_log(avctx, AV_LOG_ERROR, "unexpected type %x at %dx%d\n",
4820
7470749c2384 factorize & 0x0F
michael
parents: 4819
diff changeset
231 block_type, x, y);
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
232 return -1;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
233 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
234 bt >>= 4;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
235 out += 8;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
236 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
237 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
238
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
239 *picture = *newpic;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
240 *data_size = sizeof(AVFrame);
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
241
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
242 return buf_size;
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
243 }
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
244
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
245 AVCodec c93_decoder = {
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
246 "c93",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9355
diff changeset
247 AVMEDIA_TYPE_VIDEO,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
248 CODEC_ID_C93,
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
249 sizeof(C93DecoderContext),
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
250 decode_init,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
251 NULL,
4819
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
252 decode_end,
ec6c58426b82 remove c93_ prefix from static functions in c93.c
michael
parents: 4797
diff changeset
253 decode_frame,
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
254 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
255 .long_name = NULL_IF_CONFIG_SMALL("Interplay C93"),
4797
12279b61177b Interplay C93 demuxer and video decoder
diego
parents:
diff changeset
256 };