annotate pictordec.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents 560095a27bd0
children 914f484bb476
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
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
27 #include "avcodec.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
28 #include "bytestream.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
29 #include "cga_data.h"
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
30
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
31 typedef struct PicContext {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
32 AVFrame frame;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
33 int width, height;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
34 int nb_planes;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
35 } PicContext;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
36
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
37 static void picmemset_8bpp(PicContext *s, int value, int run, int *x, int *y)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
38 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
39 while (run > 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
40 uint8_t *d = s->frame.data[0] + *y * s->frame.linesize[0];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
41 if (*x + run >= s->width) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
42 int n = s->width - *x;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
43 memset(d + *x, value, n);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
44 run -= n;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
45 *x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
46 *y -= 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
47 if (*y < 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
48 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
49 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
50 memset(d + *x, value, run);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
51 *x += run;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
52 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
53 }
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 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
58 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
59 uint8_t *d;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
60 int shift = *plane * bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
61 int mask = ((1 << bits_per_plane) - 1) << shift;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
62 value <<= shift;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
63
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
64 while (run > 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
65 int j;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
66 for (j = 8-bits_per_plane; j >= 0; j -= bits_per_plane) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
67 d = s->frame.data[0] + *y * s->frame.linesize[0];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
68 d[*x] |= (value >> j) & mask;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
69 *x += 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
70 if (*x == s->width) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
71 *y -= 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
72 *x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
73 if (*y < 0) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
74 *y = s->height - 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
75 *plane += 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
76 value <<= bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
77 mask <<= bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
78 if (*plane >= s->nb_planes)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
79 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
80 }
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 run--;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
84 }
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 static const uint8_t cga_mode45_index[6][4] = {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
88 [0] = { 0, 3, 5, 7 }, // mode4, palette#1, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
89 [1] = { 0, 2, 4, 6 }, // mode4, palette#2, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
90 [2] = { 0, 3, 4, 7 }, // mode5, low intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
91 [3] = { 0, 11, 13, 15 }, // mode4, palette#1, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
92 [4] = { 0, 10, 12, 14 }, // mode4, palette#2, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
93 [5] = { 0, 11, 12, 15 }, // mode5, high intensity
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
94 };
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
95
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
96 static int decode_frame(AVCodecContext *avctx,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
97 void *data, int *data_size,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
98 AVPacket *avpkt)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
99 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
100 PicContext *s = avctx->priv_data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
101 int buf_size = avpkt->size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
102 const uint8_t *buf = avpkt->data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
103 const uint8_t *buf_end = avpkt->data + buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
104 uint32_t *palette;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
105 int bits_per_plane, bpp, etype, esize, npal;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
106 int i, x, y, plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
107
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
108 if (buf_size < 11)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
109 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
110
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
111 if (bytestream_get_le16(&buf) != 0x1234)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
112 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
113 s->width = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
114 s->height = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
115 buf += 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
116 bits_per_plane = *buf & 0xF;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
117 s->nb_planes = (*buf++ >> 4) + 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
118 bpp = s->nb_planes ? bits_per_plane*s->nb_planes : bits_per_plane;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
119 if (bits_per_plane > 8 || bpp < 1 || bpp > 32) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
120 av_log_ask_for_sample(s, "unsupported bit depth\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
121 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
122 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
123
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
124 if (*buf == 0xFF) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
125 buf += 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
126 etype = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
127 esize = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
128 if (buf_end - buf < esize)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
129 return AVERROR_INVALIDDATA;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
130 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
131 etype = -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
132 esize = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
133 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
134
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
135 avctx->pix_fmt = PIX_FMT_PAL8;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
136
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
137 if (s->width != avctx->width && s->height != avctx->height) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
138 if (avcodec_check_dimensions(avctx, s->width, s->height) < 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
139 return -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
140 avcodec_set_dimensions(avctx, s->width, s->height);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
141 if (s->frame.data[0])
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
142 avctx->release_buffer(avctx, &s->frame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
143 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
144
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
145 if (avctx->get_buffer(avctx, &s->frame) < 0){
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
146 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
147 return -1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
148 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
149 memset(s->frame.data[0], 0, s->height * s->frame.linesize[0]);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
150 s->frame.pict_type = FF_I_TYPE;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
151 s->frame.palette_has_changed = 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
152
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
153 palette = (uint32_t*)s->frame.data[1];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
154 if (etype == 1 && esize > 1 && *buf < 6) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
155 int idx = *buf;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
156 npal = 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
157 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
158 palette[i] = ff_cga_palette[ cga_mode45_index[idx][i] ];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
159 } else if (etype == 2) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
160 npal = FFMIN(esize, 16);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
161 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
162 palette[i] = ff_cga_palette[ FFMIN(buf[i], 16)];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
163 } else if (etype == 3) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
164 npal = FFMIN(esize, 16);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
165 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
166 palette[i] = ff_ega_palette[ FFMIN(buf[i], 63)];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
167 } else if (etype == 4 || etype == 5) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
168 npal = FFMIN(esize / 3, 256);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
169 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
170 palette[i] = AV_RB24(buf + i*3) << 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
171 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
172 if (bpp == 1) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
173 npal = 2;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
174 palette[0] = 0x000000;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
175 palette[1] = 0xFFFFFF;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
176 } else if (bpp == 2) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
177 npal = 4;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
178 for (i = 0; i < npal; i++)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
179 palette[i] = ff_cga_palette[ cga_mode45_index[0][i] ];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
180 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
181 npal = 16;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
182 memcpy(palette, ff_cga_palette, npal * 4);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
183 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
184 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
185 // fill remaining palette entries
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
186 memset(palette + npal, 0, AVPALETTE_SIZE - npal * 4);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
187 buf += esize;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
188
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
189
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
190 x = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
191 y = s->height - 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
192 plane = 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
193 if (bytestream_get_le16(&buf)) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
194 while (buf_end - buf >= 6) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
195 const uint8_t *buf_pend = buf + FFMIN(AV_RL16(buf), buf_end - buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
196 //ignore uncompressed block size reported at buf[2]
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
197 int marker = buf[4];
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
198 buf += 5;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
199
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
200 while (plane < s->nb_planes && buf_pend - buf >= 1) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
201 int run = 1;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
202 int val = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
203 if (val == marker) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
204 run = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
205 if (run == 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
206 run = bytestream_get_le16(&buf);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
207 val = *buf++;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
208 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
209 if (buf > buf_end)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
210 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
211
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
212 if (bits_per_plane == 8) {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
213 picmemset_8bpp(s, val, run, &x, &y);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
214 if (y < 0)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
215 break;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
216 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
217 picmemset(s, val, run, &x, &y, &plane, bits_per_plane);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
218 }
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 } else {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
222 av_log_ask_for_sample(s, "uncompressed image\n");
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
223 return buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
224 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
225
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
226 *data_size = sizeof(AVFrame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
227 *(AVFrame*)data = s->frame;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
228 return buf_size;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
229 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
230
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
231 static av_cold int decode_end(AVCodecContext *avctx)
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
232 {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
233 PicContext *s = avctx->priv_data;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
234 if (s->frame.data[0])
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
235 avctx->release_buffer(avctx, &s->frame);
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
236 return 0;
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
237 }
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
238
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
239 AVCodec pictor_decoder = {
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
240 "pictor",
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
241 CODEC_TYPE_VIDEO,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
242 CODEC_ID_PICTOR,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
243 sizeof(PicContext),
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
244 NULL,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
245 NULL,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
246 decode_end,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
247 decode_frame,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
248 CODEC_CAP_DR1,
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
249 .long_name = NULL_IF_CONFIG_SMALL("Pictor/PC Paint"),
677c51ca528d Pictor/PC Paint decoder
pross
parents:
diff changeset
250 };