annotate 8bps.c @ 4166:eced83504436 libavcodec

mp3 header (de)compression bitstream filter this will make mp3 frames 4 bytes smaller, it will not give you binary identical mp3 files, but it will give you mp3 files which decode to binary identical output this will only work in containers providing at least packet size, sample_rate and number of channels bugreports about mp3 files for which this fails are welcome and this is experimental (dont expect compatibility and dont even expect to be able to decompress what you compressed, hell dont even expect this to work without editing the source a little)
author michael
date Fri, 10 Nov 2006 01:41:53 +0000
parents c8c591fe26f8
children f97a2081b5b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
1 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
2 * Quicktime Planar RGB (8BPS) Video Decoder
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
3 * Copyright (C) 2003 Roberto Togni
639972344c6f 8BPS decoder
rtognimp
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
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
639972344c6f 8BPS decoder
rtognimp
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.
1608
639972344c6f 8BPS decoder
rtognimp
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,
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
15 * Lesser General Public License for more details.
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
16 *
639972344c6f 8BPS decoder
rtognimp
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: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
20 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
21 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
22
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
23 /**
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
24 * @file 8bps.c
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
25 * QT 8BPS Video Decoder by Roberto Togni <rtogni at bresciaonline dot it>
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
26 * For more information about the 8BPS format, visit:
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
27 * http://www.pcisys.net/~melanson/codecs/
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
28 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
29 * Supports: PAL8 (RGB 8bpp, paletted)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
30 * : BGR24 (RGB 24bpp) (can also output it as RGBA32)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
31 * : RGBA32 (RGB 32bpp, 4th plane is probably alpha and it's ignored)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
32 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
33 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
34
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
35 #include <stdio.h>
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
36 #include <stdlib.h>
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
37
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
38 #include "common.h"
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
39 #include "avcodec.h"
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
40
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
41
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
42 const enum PixelFormat pixfmt_rgb24[] = {PIX_FMT_BGR24, PIX_FMT_RGBA32, -1};
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
43
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
44 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
45 * Decoder context
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
46 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
47 typedef struct EightBpsContext {
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
48
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
49 AVCodecContext *avctx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
50 AVFrame pic;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
51
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
52 unsigned char planes;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
53 unsigned char planemap[4];
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
54 } EightBpsContext;
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
55
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
56
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
57 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
58 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
59 * Decode a frame
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
60 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
61 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
62 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
63 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
64 EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
65 unsigned char *encoded = (unsigned char *)buf;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
66 unsigned char *pixptr, *pixptr_end;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 unsigned int height = avctx->height; // Real image height
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
68 unsigned int dlen, p, row;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 unsigned char *lp, *dp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 unsigned char count;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 unsigned int px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 unsigned int planes = c->planes;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
73 unsigned char *planemap = c->planemap;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2788
diff changeset
74
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
75 if(c->pic.data[0])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
76 avctx->release_buffer(avctx, &c->pic);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
77
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
78 c->pic.reference = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
79 c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
80 if(avctx->get_buffer(avctx, &c->pic) < 0){
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
81 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
82 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
83 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
84
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
85 /* Set data pointer after line lengths */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
86 dp = encoded + planes * (height << 1);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
87
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
88 /* Ignore alpha plane, don't know what to do with it */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
89 if (planes == 4)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
90 planes--;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
91
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
92 px_inc = planes + (avctx->pix_fmt == PIX_FMT_RGBA32);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
93
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
94 for (p = 0; p < planes; p++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
95 /* Lines length pointer for this plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
96 lp = encoded + p * (height << 1);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
97
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
98 /* Decode a plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 for(row = 0; row < height; row++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 pixptr = c->pic.data[0] + row * c->pic.linesize[0] + planemap[p];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
101 pixptr_end = pixptr + c->pic.linesize[0];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
102 dlen = be2me_16(*(unsigned short *)(lp+row*2));
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
103 /* Decode a row of this plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
104 while(dlen > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
105 if(dp + 1 >= buf+buf_size) return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
106 if ((count = *dp++) <= 127) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
107 count++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
108 dlen -= count + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
109 if (pixptr + count * px_inc > pixptr_end)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
110 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
111 if(dp + count > buf+buf_size) return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
112 while(count--) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
113 *pixptr = *dp++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 pixptr += px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
115 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
117 count = 257 - count;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
118 if (pixptr + count * px_inc > pixptr_end)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 while(count--) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 *pixptr = *dp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 pixptr += px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
123 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
124 dp++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
125 dlen -= 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
126 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
127 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
128 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
129 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
130
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 if (avctx->palctrl) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 memcpy (c->pic.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
133 if (avctx->palctrl->palette_changed) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 c->pic.palette_has_changed = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 avctx->palctrl->palette_changed = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 } else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 c->pic.palette_has_changed = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
139
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 *data_size = sizeof(AVFrame);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
141 *(AVFrame*)data = c->pic;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
142
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 /* always report that the buffer was completely consumed */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
144 return buf_size;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
145 }
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
146
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
147
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
148 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
149 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
150 * Init 8BPS decoder
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
151 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
152 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
153 static int decode_init(AVCodecContext *avctx)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
154 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
155 EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
156
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 c->avctx = avctx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 avctx->has_b_frames = 0;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
159
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 c->pic.data[0] = NULL;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
161
2429
4b350cc506a7 Use avcodec_check_dimensions instead of custom hack
rtognimp
parents: 2418
diff changeset
162 if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
2418
82af834636c2 Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents: 1608
diff changeset
163 return 1;
82af834636c2 Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents: 1608
diff changeset
164 }
82af834636c2 Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents: 1608
diff changeset
165
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
166 switch (avctx->bits_per_sample) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 case 8:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
168 avctx->pix_fmt = PIX_FMT_PAL8;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
169 c->planes = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
170 c->planemap[0] = 0; // 1st plane is palette indexes
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
171 if (avctx->palctrl == NULL) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
172 av_log(avctx, AV_LOG_ERROR, "Error: PAL8 format but no palette from demuxer.\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
173 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
174 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
175 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
176 case 24:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
177 avctx->pix_fmt = avctx->get_format(avctx, pixfmt_rgb24);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
178 c->planes = 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
179 c->planemap[0] = 2; // 1st plane is red
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
180 c->planemap[1] = 1; // 2nd plane is green
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
181 c->planemap[2] = 0; // 3rd plane is blue
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
182 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
183 case 32:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
184 avctx->pix_fmt = PIX_FMT_RGBA32;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
185 c->planes = 4;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
186 #ifdef WORDS_BIGENDIAN
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
187 c->planemap[0] = 1; // 1st plane is red
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
188 c->planemap[1] = 2; // 2nd plane is green
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
189 c->planemap[2] = 3; // 3rd plane is blue
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
190 c->planemap[3] = 0; // 4th plane is alpha???
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
191 #else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
192 c->planemap[0] = 2; // 1st plane is red
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
193 c->planemap[1] = 1; // 2nd plane is green
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
194 c->planemap[2] = 0; // 3rd plane is blue
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
195 c->planemap[3] = 3; // 4th plane is alpha???
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
196 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
197 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
198 default:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
199 av_log(avctx, AV_LOG_ERROR, "Error: Unsupported color depth: %u.\n", avctx->bits_per_sample);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
200 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
201 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
202
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
203 return 0;
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
204 }
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
205
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
206
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
207
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
208
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
209 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
210 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
211 * Uninit 8BPS decoder
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
212 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
213 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
214 static int decode_end(AVCodecContext *avctx)
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
215 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
216 EightBpsContext * const c = (EightBpsContext *)avctx->priv_data;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
217
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
218 if (c->pic.data[0])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
219 avctx->release_buffer(avctx, &c->pic);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
220
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
221 return 0;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
222 }
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
223
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
224
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
225
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
226 AVCodec eightbps_decoder = {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
227 "8bps",
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
228 CODEC_TYPE_VIDEO,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 CODEC_ID_8BPS,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
230 sizeof(EightBpsContext),
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
231 decode_init,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
232 NULL,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
233 decode_end,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
234 decode_frame,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
235 CODEC_CAP_DR1,
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
236 };