annotate qdrw.c @ 3014:959b8ad880dc libavcodec

Dual mono stereo strems sound ok now, added sanity checks and removed some unused variables and redundant memsets. Patch by Benjamin Larsson
author rtognimp
date Fri, 06 Jan 2006 12:41:57 +0000
parents ef2149182f1c
children 0b546eab515d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
1 /*
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
2 * QuickDraw (qdrw) codec
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
3 * Copyright (c) 2004 Konstantin Shishkov
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
4 *
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
9 *
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
13 * Lesser General Public License for more details.
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
14 *
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
18 *
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
19 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
20
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
21 /**
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
22 * @file qdrw.c
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
23 * Apple QuickDraw codec.
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
24 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
25
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
26 #include "avcodec.h"
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
27 #include "mpegvideo.h"
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
28
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
29 typedef struct QdrawContext{
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
30 AVCodecContext *avctx;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
31 AVFrame pic;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
32 uint8_t palette[256*3];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
33 } QdrawContext;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
34
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
35 static int decode_frame(AVCodecContext *avctx,
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
36 void *data, int *data_size,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
37 uint8_t *buf, int buf_size)
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
38 {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
39 QdrawContext * const a = avctx->priv_data;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
40 AVFrame * const p= (AVFrame*)&a->pic;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
41 uint8_t* outdata;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
42 int colors;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
43 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
44
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
45 if(p->data[0])
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
46 avctx->release_buffer(avctx, p);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
47
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
48 p->reference= 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
49 if(avctx->get_buffer(avctx, p) < 0){
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
50 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
51 return -1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
52 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
53 p->pict_type= I_TYPE;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
54 p->key_frame= 1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
55
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
56 outdata = a->pic.data[0];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
57
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
58 buf += 0x68; /* jump to palette */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
59 colors = BE_32(buf);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
60 buf += 4;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
61
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
62 if(colors < 0 || colors > 256) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
63 av_log(avctx, AV_LOG_ERROR, "Error color count - %i(0x%X)\n", colors, colors);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
64 return -1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
65 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
66
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
67 for (i = 0; i <= colors; i++) {
2455
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
68 unsigned int idx;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
69 idx = BE_16(buf); /* color index */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
70 buf += 2;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
71
2455
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
72 if (idx > 255) {
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
73 av_log(avctx, AV_LOG_ERROR, "Palette index out of range: %u\n", idx);
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
74 buf += 6;
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
75 continue;
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
76 }
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
77 a->palette[idx * 3 + 0] = *buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
78 buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
79 a->palette[idx * 3 + 1] = *buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
80 buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
81 a->palette[idx * 3 + 2] = *buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
82 buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
83 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
84
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
85 buf += 18; /* skip unneeded data */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
86 for (i = 0; i < avctx->height; i++) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
87 int size, left, code, pix;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
88 uint8_t *next;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
89 uint8_t *out;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
90 int tsize = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
91
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
92 /* decode line */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
93 out = outdata;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
94 size = BE_16(buf); /* size of packed line */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
95 buf += 2;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
96 left = size;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
97 next = buf + size;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
98 while (left > 0) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
99 code = *buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
100 if (code & 0x80 ) { /* run */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
101 int i;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
102 pix = *buf++;
2455
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
103 if ((out + (257 - code) * 3) > (outdata + a->pic.linesize[0]))
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
104 break;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
105 for (i = 0; i < 257 - code; i++) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
106 *out++ = a->palette[pix * 3 + 0];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
107 *out++ = a->palette[pix * 3 + 1];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
108 *out++ = a->palette[pix * 3 + 2];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
109 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
110 tsize += 257 - code;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
111 left -= 2;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
112 } else { /* copy */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
113 int i, pix;
2455
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
114 if ((out + code * 3) > (outdata + a->pic.linesize[0]))
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
115 break;
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
116 for (i = 0; i <= code; i++) {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
117 pix = *buf++;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
118 *out++ = a->palette[pix * 3 + 0];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
119 *out++ = a->palette[pix * 3 + 1];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
120 *out++ = a->palette[pix * 3 + 2];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
121 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
122 left -= 2 + code;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
123 tsize += code + 1;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
124 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
125 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
126 buf = next;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
127 outdata += a->pic.linesize[0];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
128 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
129
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
130 *data_size = sizeof(AVFrame);
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
131 *(AVFrame*)data = a->pic;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2455
diff changeset
132
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
133 return buf_size;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
134 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
135
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
136 static int decode_init(AVCodecContext *avctx){
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
137 // QdrawContext * const a = avctx->priv_data;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
138
2455
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
139 if (avcodec_check_dimensions(avctx, avctx->height, avctx->width) < 0) {
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
140 return 1;
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
141 }
d74d342cabb9 Check pointers before writing to memory
rtognimp
parents: 2453
diff changeset
142
2275
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
143 avctx->pix_fmt= PIX_FMT_RGB24;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
144
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
145 return 0;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
146 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
147
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
148 AVCodec qdraw_decoder = {
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
149 "qdraw",
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
150 CODEC_TYPE_VIDEO,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
151 CODEC_ID_QDRAW,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
152 sizeof(QdrawContext),
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
153 decode_init,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
154 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
155 NULL,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
156 decode_frame,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
157 CODEC_CAP_DR1,
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
158 };