annotate pictordec.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 34beb0af8204
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11855
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
1 /*
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
2 * Pictor/PC Paint decoder
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
3 * Copyright (c) 2010 Peter Ross <pross@xvid.org>
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
4 *
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
5 * This file is part of FFmpeg.
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
6 *
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
11 *
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
15 * Lesser General Public License for more details.
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
16 *
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
20 */
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
21
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
22 /**
12057
560095a27bd0 Remove redundant and harmful explicit filename after @file Doxygen command.
diego
parents: 11855
diff changeset
23 * @file
11855
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
24 * Pictor/PC Paint decoder
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
25 */
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
26
12372
914f484bb476 Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents: 12057
diff changeset
27 #include "libavcore/imgutils.h"
11855
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
28 #include "avcodec.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
29 #include "bytestream.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
30 #include "cga_data.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
31
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
32 typedef struct PicContext {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
33 AVFrame frame;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
34 int width, height;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
35 int nb_planes;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
36 } PicContext;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
37
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
38 static void picmemset_8bpp(PicContext *s, int value, int run, int *x, int *y)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
39 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
40 while (run > 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
41 uint8_t *d = s->frame.data[0] + *y * s->frame.linesize[0];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
42 if (*x + run >= s->width) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
43 int n = s->width - *x;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
44 memset(d + *x, value, n);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
45 run -= n;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
46 *x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
47 *y -= 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
48 if (*y < 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
49 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
50 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
51 memset(d + *x, value, run);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
52 *x += run;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
53 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
54 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
55 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
56 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
57
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
58 static void picmemset(PicContext *s, int value, int run, int *x, int *y, int *plane, int bits_per_plane)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
59 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
60 uint8_t *d;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
61 int shift = *plane * bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
62 int mask = ((1 << bits_per_plane) - 1) << shift;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
63 value <<= shift;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
64
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
65 while (run > 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
66 int j;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
67 for (j = 8-bits_per_plane; j >= 0; j -= bits_per_plane) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
68 d = s->frame.data[0] + *y * s->frame.linesize[0];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
69 d[*x] |= (value >> j) & mask;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
70 *x += 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
71 if (*x == s->width) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
72 *y -= 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
73 *x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
74 if (*y < 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
75 *y = s->height - 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
76 *plane += 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
77 value <<= bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
78 mask <<= bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
79 if (*plane >= s->nb_planes)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
80 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
81 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
82 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
83 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
84 run--;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
85 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
86 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
87
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
88 static const uint8_t cga_mode45_index[6][4] = {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
89 [0] = { 0, 3, 5, 7 }, // mode4, palette#1, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
90 [1] = { 0, 2, 4, 6 }, // mode4, palette#2, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
91 [2] = { 0, 3, 4, 7 }, // mode5, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
92 [3] = { 0, 11, 13, 15 }, // mode4, palette#1, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
93 [4] = { 0, 10, 12, 14 }, // mode4, palette#2, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
94 [5] = { 0, 11, 12, 15 }, // mode5, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
95 };
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
96
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
97 static int decode_frame(AVCodecContext *avctx,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
98 void *data, int *data_size,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
99 AVPacket *avpkt)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
100 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
101 PicContext *s = avctx->priv_data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
102 int buf_size = avpkt->size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
103 const uint8_t *buf = avpkt->data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
104 const uint8_t *buf_end = avpkt->data + buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
105 uint32_t *palette;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
106 int bits_per_plane, bpp, etype, esize, npal;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
107 int i, x, y, plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
108
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
109 if (buf_size < 11)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
110 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
111
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
112 if (bytestream_get_le16(&buf) != 0x1234)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
113 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
114 s->width = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
115 s->height = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
116 buf += 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
117 bits_per_plane = *buf & 0xF;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
118 s->nb_planes = (*buf++ >> 4) + 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
119 bpp = s->nb_planes ? bits_per_plane*s->nb_planes : bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
120 if (bits_per_plane > 8 || bpp < 1 || bpp > 32) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
121 av_log_ask_for_sample(s, "unsupported bit depth\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
122 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
123 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
124
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
125 if (*buf == 0xFF) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
126 buf += 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
127 etype = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
128 esize = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
129 if (buf_end - buf < esize)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
130 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
131 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
132 etype = -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
133 esize = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
134 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
135
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
136 avctx->pix_fmt = PIX_FMT_PAL8;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
137
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
138 if (s->width != avctx->width && s->height != avctx->height) {
12462
ffb3668ff7af Use new imgutils.h API names, fix deprecation warnings.
stefano
parents: 12372
diff changeset
139 if (av_image_check_size(s->width, s->height, 0, avctx) < 0)
11855
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
140 return -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
141 avcodec_set_dimensions(avctx, s->width, s->height);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
142 if (s->frame.data[0])
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
143 avctx->release_buffer(avctx, &s->frame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
144 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
145
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
146 if (avctx->get_buffer(avctx, &s->frame) < 0){
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
147 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
148 return -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
149 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
150 memset(s->frame.data[0], 0, s->height * s->frame.linesize[0]);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
151 s->frame.pict_type = FF_I_TYPE;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
152 s->frame.palette_has_changed = 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
153
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
154 palette = (uint32_t*)s->frame.data[1];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
155 if (etype == 1 && esize > 1 && *buf < 6) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
156 int idx = *buf;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
157 npal = 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
158 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
159 palette[i] = ff_cga_palette[ cga_mode45_index[idx][i] ];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
160 } else if (etype == 2) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
161 npal = FFMIN(esize, 16);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
162 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
163 palette[i] = ff_cga_palette[ FFMIN(buf[i], 16)];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
164 } else if (etype == 3) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
165 npal = FFMIN(esize, 16);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
166 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
167 palette[i] = ff_ega_palette[ FFMIN(buf[i], 63)];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
168 } else if (etype == 4 || etype == 5) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
169 npal = FFMIN(esize / 3, 256);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
170 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
171 palette[i] = AV_RB24(buf + i*3) << 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
172 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
173 if (bpp == 1) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
174 npal = 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
175 palette[0] = 0x000000;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
176 palette[1] = 0xFFFFFF;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
177 } else if (bpp == 2) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
178 npal = 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
179 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
180 palette[i] = ff_cga_palette[ cga_mode45_index[0][i] ];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
181 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
182 npal = 16;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
183 memcpy(palette, ff_cga_palette, npal * 4);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
184 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
185 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
186 // fill remaining palette entries
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
187 memset(palette + npal, 0, AVPALETTE_SIZE - npal * 4);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
188 buf += esize;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
189
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
190
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
191 x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
192 y = s->height - 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
193 plane = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
194 if (bytestream_get_le16(&buf)) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
195 while (buf_end - buf >= 6) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
196 const uint8_t *buf_pend = buf + FFMIN(AV_RL16(buf), buf_end - buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
197 //ignore uncompressed block size reported at buf[2]
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
198 int marker = buf[4];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
199 buf += 5;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
200
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
201 while (plane < s->nb_planes && buf_pend - buf >= 1) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
202 int run = 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
203 int val = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
204 if (val == marker) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
205 run = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
206 if (run == 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
207 run = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
208 val = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
209 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
210 if (buf > buf_end)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
211 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
212
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
213 if (bits_per_plane == 8) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
214 picmemset_8bpp(s, val, run, &x, &y);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
215 if (y < 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
216 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
217 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
218 picmemset(s, val, run, &x, &y, &plane, bits_per_plane);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
219 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
220 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
221 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
222 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
223 av_log_ask_for_sample(s, "uncompressed image\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
224 return buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
225 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
226
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
227 *data_size = sizeof(AVFrame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
228 *(AVFrame*)data = s->frame;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
229 return buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
230 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
231
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
232 static av_cold int decode_end(AVCodecContext *avctx)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
233 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
234 PicContext *s = avctx->priv_data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
235 if (s->frame.data[0])
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
236 avctx->release_buffer(avctx, &s->frame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
237 return 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
238 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
239
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
240 AVCodec pictor_decoder = {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
241 "pictor",
12516
34beb0af8204 Replace deprecated CODEC_TYPE_AUDIO and CODEC_TYPE_VIDEO with the
stefano
parents: 12462
diff changeset
242 AVMEDIA_TYPE_VIDEO,
11855
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
243 CODEC_ID_PICTOR,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
244 sizeof(PicContext),
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
245 NULL,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
246 NULL,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
247 decode_end,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
248 decode_frame,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
249 CODEC_CAP_DR1,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
250 .long_name = NULL_IF_CONFIG_SMALL("Pictor/PC Paint"),
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
251 };