annotate qdrw.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents d74d342cabb9
children ef2149182f1c
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 */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
20
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 */
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
25
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
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
35 static int decode_frame(AVCodecContext *avctx,
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;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
44
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];
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
57
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;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
61
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 }
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
66
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;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
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;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
91
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;
c443a6af19a7 support for Sierra Online audio files and Apple QuickDraw codec,
melanson
parents:
diff changeset
132
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 };