2
* Quicktime Planar RGB (8BPS) Video Decoder
3
* Copyright (C) 2003 Roberto Togni
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Lesser General Public
7
* License as published by the Free Software Foundation; either
8
* version 2 of the License, or (at your option) any later version.
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Lesser General Public License for more details.
15
* You should have received a copy of the GNU Lesser General Public
16
* License along with this library; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
* QT 8BPS Video Decoder by Roberto Togni <rtogni at bresciaonline dot it>
24
* For more information about the 8BPS format, visit:
25
* http://www.pcisys.net/~melanson/codecs/
27
* Supports: PAL8 (RGB 8bpp, paletted)
28
* : BGR24 (RGB 24bpp) (can also output it as RGBA32)
29
* : RGBA32 (RGB 32bpp, 4th plane is probably alpha and it's ignored)
40
const enum PixelFormat pixfmt_rgb24[] = {PIX_FMT_BGR24, PIX_FMT_RGBA32, -1};
45
typedef struct EightBpsContext {
47
AVCodecContext *avctx;
51
unsigned char planemap[4];
60
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
62
EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
63
unsigned char *encoded = (unsigned char *)buf;
64
unsigned char *pixptr;
65
unsigned int height = avctx->height; // Real image height
66
unsigned int dlen, p, row;
67
unsigned char *lp, *dp;
70
unsigned int planes = c->planes;
71
unsigned char *planemap = c->planemap;
74
/* no supplementary picture */
79
avctx->release_buffer(avctx, &c->pic);
82
c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
83
if(avctx->get_buffer(avctx, &c->pic) < 0){
84
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
88
/* Set data pointer after line lengths */
89
dp = encoded + planes * (height << 1);
91
/* Ignore alpha plane, don't know what to do with it */
95
px_inc = planes + (avctx->pix_fmt == PIX_FMT_RGBA32);
97
for (p = 0; p < planes; p++) {
98
/* Lines length pointer for this plane */
99
lp = encoded + p * (height << 1);
102
for(row = 0; row < height; row++) {
103
pixptr = c->pic.data[0] + row * c->pic.linesize[0] + planemap[p];
104
dlen = be2me_16(*(unsigned short *)(lp+row*2));
105
/* Decode a row of this plane */
107
if ((count = *dp++) <= 127) {
127
if (avctx->palctrl) {
128
memcpy (c->pic.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
129
if (avctx->palctrl->palette_changed) {
130
c->pic.palette_has_changed = 1;
131
avctx->palctrl->palette_changed = 0;
133
c->pic.palette_has_changed = 0;
136
*data_size = sizeof(AVFrame);
137
*(AVFrame*)data = c->pic;
139
/* always report that the buffer was completely consumed */
149
static int decode_init(AVCodecContext *avctx)
151
EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
154
avctx->has_b_frames = 0;
156
c->pic.data[0] = NULL;
158
switch (avctx->bits_per_sample) {
160
avctx->pix_fmt = PIX_FMT_PAL8;
162
c->planemap[0] = 0; // 1st plane is palette indexes
163
if (avctx->palctrl == NULL) {
164
av_log(avctx, AV_LOG_ERROR, "Error: PAL8 format but no palette from demuxer.\n");
169
avctx->pix_fmt = avctx->get_format(avctx, pixfmt_rgb24);
171
c->planemap[0] = 2; // 1st plane is red
172
c->planemap[1] = 1; // 2nd plane is green
173
c->planemap[2] = 0; // 3rd plane is blue
176
avctx->pix_fmt = PIX_FMT_RGBA32;
178
#ifdef WORDS_BIGENDIAN
179
c->planemap[0] = 1; // 1st plane is red
180
c->planemap[1] = 2; // 2nd plane is green
181
c->planemap[2] = 3; // 3rd plane is blue
182
c->planemap[3] = 0; // 4th plane is alpha???
184
c->planemap[0] = 2; // 1st plane is red
185
c->planemap[1] = 1; // 2nd plane is green
186
c->planemap[2] = 0; // 3rd plane is blue
187
c->planemap[3] = 3; // 4th plane is alpha???
191
av_log(avctx, AV_LOG_ERROR, "Error: Unsupported color depth: %u.\n", avctx->bits_per_sample);
203
* Uninit 8BPS decoder
206
static int decode_end(AVCodecContext *avctx)
208
EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
211
avctx->release_buffer(avctx, &c->pic);
218
AVCodec eightbps_decoder = {
222
sizeof(EightBpsContext),