annotate bmp.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children a90490a13ac4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
1 /*
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
2 * BMP image format
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
3 * Copyright (c) 2005 Mans Rullgard
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
15 * Lesser General Public License for more details.
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
16 *
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2967
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
20 */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
21
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
22 #include "avcodec.h"
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
23 #include "bitstream.h"
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
24 #include "bswap.h"
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
25
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
26 typedef struct BMPContext {
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
27 AVFrame picture;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
28 } BMPContext;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
29
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
30 #define BMP_RGB 0
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
31 #define BMP_RLE8 1
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
32 #define BMP_RLE4 2
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
33 #define BMP_BITFIELDS 3
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
34
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
35 #define read16(bits) bswap_16(get_bits(bits, 16))
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
36 #define read32(bits) bswap_32(get_bits_long(bits, 32))
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
37
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
38 static int bmp_decode_init(AVCodecContext *avctx){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
39 BMPContext *s = avctx->priv_data;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
40
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
41 avcodec_get_frame_defaults((AVFrame*)&s->picture);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
42 avctx->coded_frame = (AVFrame*)&s->picture;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
43
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
44 return 0;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
45 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
46
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2949
diff changeset
47 static int bmp_decode_frame(AVCodecContext *avctx,
2949
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
48 void *data, int *data_size,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
49 uint8_t *buf, int buf_size)
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
50 {
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
51 BMPContext *s = avctx->priv_data;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
52 AVFrame *picture = data;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
53 AVFrame *p = &s->picture;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
54 GetBitContext bits;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
55 unsigned int fsize, hsize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
56 int width, height;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
57 unsigned int depth;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
58 unsigned int comp;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
59 unsigned int ihsize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
60 int i, j, n, linesize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
61 uint32_t rgb[3];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
62 uint8_t *ptr;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
63 int dsize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
64
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
65 if(buf_size < 14){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
66 av_log(avctx, AV_LOG_ERROR, "buf size too small (%d)\n", buf_size);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
67 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
68 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
69
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
70 init_get_bits(&bits, buf, buf_size);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
71
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
72 if(get_bits(&bits, 16) != 0x424d){ /* 'BM' */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
73 av_log(avctx, AV_LOG_ERROR, "bad magic number\n");
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
74 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
75 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
76
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
77 fsize = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
78 if(buf_size < fsize){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
79 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n",
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
80 buf_size, fsize);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
81 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
82 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
83
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
84 skip_bits(&bits, 16); /* reserved1 */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
85 skip_bits(&bits, 16); /* reserved2 */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
86
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
87 hsize = read32(&bits); /* header size */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
88 if(fsize <= hsize){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
89 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n",
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
90 fsize, hsize);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
91 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
92 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
93
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
94 ihsize = read32(&bits); /* more header size */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
95 if(ihsize + 14 > hsize){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
96 av_log(avctx, AV_LOG_ERROR, "invalid header size %d\n", hsize);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
97 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
98 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
99
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
100 width = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
101 height = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
102
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
103 if(read16(&bits) != 1){ /* planes */
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
104 av_log(avctx, AV_LOG_ERROR, "invalid BMP header\n");
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
105 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
106 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
107
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
108 depth = read16(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
109
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
110 if(ihsize > 16)
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
111 comp = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
112 else
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
113 comp = BMP_RGB;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
114
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
115 if(comp != BMP_RGB && comp != BMP_BITFIELDS){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
116 av_log(avctx, AV_LOG_ERROR, "BMP coding %d not supported\n", comp);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
117 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
118 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
119
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
120 if(comp == BMP_BITFIELDS){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
121 skip_bits(&bits, 20 * 8);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
122 rgb[0] = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
123 rgb[1] = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
124 rgb[2] = read32(&bits);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
125 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
126
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
127 avctx->codec_id = CODEC_ID_BMP;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
128 avctx->width = width;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
129 avctx->height = height > 0? height: -height;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
130
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
131 avctx->pix_fmt = PIX_FMT_NONE;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
132
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
133 switch(depth){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
134 case 32:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
135 if(comp == BMP_BITFIELDS){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
136 rgb[0] = (rgb[0] >> 15) & 3;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
137 rgb[1] = (rgb[1] >> 15) & 3;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
138 rgb[2] = (rgb[2] >> 15) & 3;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
139
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
140 if(rgb[0] + rgb[1] + rgb[2] != 3 ||
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
141 rgb[0] == rgb[1] || rgb[0] == rgb[2] || rgb[1] == rgb[2]){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
142 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
143 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
144 } else {
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
145 rgb[0] = 2;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
146 rgb[1] = 1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
147 rgb[2] = 0;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
148 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
149
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
150 avctx->pix_fmt = PIX_FMT_BGR24;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
151 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
152 case 24:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
153 avctx->pix_fmt = PIX_FMT_BGR24;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
154 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
155 case 16:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
156 if(comp == BMP_RGB)
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
157 avctx->pix_fmt = PIX_FMT_RGB555;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
158 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
159 default:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
160 av_log(avctx, AV_LOG_ERROR, "depth %d not supported\n", depth);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
161 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
162 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
163
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
164 if(avctx->pix_fmt == PIX_FMT_NONE){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
165 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
166 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
167 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
168
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
169 p->reference = 0;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
170 if(avctx->get_buffer(avctx, p) < 0){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
171 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
172 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
173 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
174 p->pict_type = FF_I_TYPE;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
175 p->key_frame = 1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
176
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
177 buf += hsize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
178 dsize = buf_size - hsize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
179
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
180 n = avctx->width * (depth / 8);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
181
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
182 if(n * avctx->height > dsize){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
183 av_log(avctx, AV_LOG_ERROR, "not enough data (%d < %d)\n",
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
184 dsize, n * avctx->height);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
185 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
186 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
187
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
188 if(height > 0){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
189 ptr = p->data[0] + (avctx->height - 1) * p->linesize[0];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
190 linesize = -p->linesize[0];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
191 } else {
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
192 ptr = p->data[0];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
193 linesize = p->linesize[0];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
194 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
195
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
196 switch(depth){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
197 case 24:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
198 for(i = 0; i < avctx->height; i++){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
199 memcpy(ptr, buf, n);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
200 buf += n;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
201 ptr += linesize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
202 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
203 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
204 case 16:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
205 for(i = 0; i < avctx->height; i++){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
206 uint16_t *src = (uint16_t *) buf;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
207 uint16_t *dst = (uint16_t *) ptr;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
208
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
209 for(j = 0; j < avctx->width; j++)
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
210 *dst++ = le2me_16(*src++);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
211
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
212 buf += n;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
213 ptr += linesize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
214 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
215 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
216 case 32:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
217 for(i = 0; i < avctx->height; i++){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
218 uint8_t *src = buf;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
219 uint8_t *dst = ptr;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
220
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
221 for(j = 0; j < avctx->width; j++){
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
222 dst[0] = src[rgb[2]];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
223 dst[1] = src[rgb[1]];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
224 dst[2] = src[rgb[0]];
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
225 dst += 3;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
226 src += 4;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
227 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
228
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
229 buf += n;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
230 ptr += linesize;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
231 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
232 break;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
233 default:
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
234 av_log(avctx, AV_LOG_ERROR, "BMP decoder is broken\n");
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
235 return -1;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
236 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
237
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
238 *picture = s->picture;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
239 *data_size = sizeof(AVPicture);
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
240
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
241 return buf_size;
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
242 }
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
243
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
244 AVCodec bmp_decoder = {
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
245 "bmp",
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
246 CODEC_TYPE_VIDEO,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
247 CODEC_ID_BMP,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
248 sizeof(BMPContext),
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
249 bmp_decode_init,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
250 NULL,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
251 NULL,
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
252 bmp_decode_frame
e5a10ae14ffb BMP image decoder
mru
parents:
diff changeset
253 };