Mercurial > libavcodec.hg
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 |
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 | 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 | 72 if (idx > 255) { |
73 av_log(avctx, AV_LOG_ERROR, "Palette index out of range: %u\n", idx); | |
74 buf += 6; | |
75 continue; | |
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 | 103 if ((out + (257 - code) * 3) > (outdata + a->pic.linesize[0])) |
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 | 114 if ((out + code * 3) > (outdata + a->pic.linesize[0])) |
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 | 139 if (avcodec_check_dimensions(avctx, avctx->height, avctx->width) < 0) { |
140 return 1; | |
141 } | |
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 }; |