annotate 8bps.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 54bc8a2727b0
children 266bf83f634d
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8573
diff changeset
23 * @file libavcodec/8bps.c
7009
9e617affaa69 Remove my old email address.
rtogni
parents: 6788
diff changeset
24 * QT 8BPS Video Decoder by Roberto Togni
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
25 * For more information about the 8BPS format, visit:
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
26 * http://www.pcisys.net/~melanson/codecs/
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
27 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
28 * Supports: PAL8 (RGB 8bpp, paletted)
4494
ce643a22f049 Replace deprecated PIX_FMT names by the newer variants.
diego
parents: 4170
diff changeset
29 * : BGR24 (RGB 24bpp) (can also output it as RGB32)
ce643a22f049 Replace deprecated PIX_FMT names by the newer variants.
diego
parents: 4170
diff changeset
30 * : RGB32 (RGB 32bpp, 4th plane is probably alpha and it's ignored)
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
31 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
32 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
33
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
34 #include <stdio.h>
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
35 #include <stdlib.h>
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
36
8573
2acf0ae7b041 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 7823
diff changeset
37 #include "libavutil/intreadwrite.h"
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
38 #include "avcodec.h"
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
39
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
40
6788
e1302edb0f69 Replace some occurrences of -1 with PIX_FMT_NONE.
cehoyos
parents: 6712
diff changeset
41 static const enum PixelFormat pixfmt_rgb24[] = {PIX_FMT_BGR24, PIX_FMT_RGB32, PIX_FMT_NONE};
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
42
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
43 /*
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
44 * Decoder context
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
45 */
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
46 typedef struct EightBpsContext {
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
47
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
48 AVCodecContext *avctx;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
49 AVFrame pic;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
50
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
51 unsigned char planes;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
52 unsigned char planemap[4];
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
53 } EightBpsContext;
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
54
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 * Decode a frame
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
59 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
60 */
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
61 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
62 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
63 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
64 int buf_size = avpkt->size;
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
65 EightBpsContext * const c = avctx->priv_data;
6268
michael
parents: 5215
diff changeset
66 const unsigned char *encoded = buf;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 unsigned char *pixptr, *pixptr_end;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
68 unsigned int height = avctx->height; // Real image height
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 unsigned int dlen, p, row;
6268
michael
parents: 5215
diff changeset
70 const unsigned char *lp, *dp;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 unsigned char count;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 unsigned int px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
73 unsigned int planes = c->planes;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
74 unsigned char *planemap = c->planemap;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2788
diff changeset
75
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
76 if(c->pic.data[0])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
77 avctx->release_buffer(avctx, &c->pic);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
78
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
79 c->pic.reference = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
80 c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
81 if(avctx->get_buffer(avctx, &c->pic) < 0){
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
82 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
83 return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
84 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
85
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
86 /* Set data pointer after line lengths */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
87 dp = encoded + planes * (height << 1);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
88
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
89 /* Ignore alpha plane, don't know what to do with it */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
90 if (planes == 4)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
91 planes--;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
92
4494
ce643a22f049 Replace deprecated PIX_FMT names by the newer variants.
diego
parents: 4170
diff changeset
93 px_inc = planes + (avctx->pix_fmt == PIX_FMT_RGB32);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
94
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
95 for (p = 0; p < planes; p++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
96 /* Lines length pointer for this plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
97 lp = encoded + p * (height << 1);
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
98
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 /* Decode a plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
100 for(row = 0; row < height; row++) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
101 pixptr = c->pic.data[0] + row * c->pic.linesize[0] + planemap[p];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
102 pixptr_end = pixptr + c->pic.linesize[0];
6268
michael
parents: 5215
diff changeset
103 dlen = be2me_16(*(const unsigned short *)(lp+row*2));
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
104 /* Decode a row of this plane */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
105 while(dlen > 0) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
106 if(dp + 1 >= buf+buf_size) return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
107 if ((count = *dp++) <= 127) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
108 count++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
109 dlen -= count + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
110 if (pixptr + count * px_inc > pixptr_end)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
111 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
112 if(dp + count > buf+buf_size) return -1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
113 while(count--) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 *pixptr = *dp++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
115 pixptr += px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
116 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
117 } else {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
118 count = 257 - count;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
119 if (pixptr + count * px_inc > pixptr_end)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
120 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
121 while(count--) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
122 *pixptr = *dp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
123 pixptr += px_inc;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
124 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
125 dp++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
126 dlen -= 2;
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 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
130 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
131
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 if (avctx->palctrl) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
133 memcpy (c->pic.data[1], avctx->palctrl->palette, AVPALETTE_SIZE);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
134 if (avctx->palctrl->palette_changed) {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 c->pic.palette_has_changed = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 avctx->palctrl->palette_changed = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 } else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 c->pic.palette_has_changed = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 }
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
140
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
141 *data_size = sizeof(AVFrame);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
142 *(AVFrame*)data = c->pic;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
143
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
144 /* always report that the buffer was completely consumed */
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
145 return buf_size;
1608
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 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
151 * Init 8BPS decoder
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
152 *
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
153 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6268
diff changeset
154 static av_cold int decode_init(AVCodecContext *avctx)
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
155 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
156 EightBpsContext * const c = avctx->priv_data;
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
157
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
158 c->avctx = avctx;
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
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
166 switch (avctx->bits_per_coded_sample) {
2979
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:
4494
ce643a22f049 Replace deprecated PIX_FMT names by the newer variants.
diego
parents: 4170
diff changeset
184 avctx->pix_fmt = PIX_FMT_RGB32;
2979
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:
7823
4525dcd81357 Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents: 7040
diff changeset
199 av_log(avctx, AV_LOG_ERROR, "Error: Unsupported color depth: %u.\n", avctx->bits_per_coded_sample);
2979
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 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6268
diff changeset
214 static av_cold int decode_end(AVCodecContext *avctx)
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
215 {
4827
b3ee9a1526b0 Get rid of unnecessary pointer casts.
diego
parents: 4801
diff changeset
216 EightBpsContext * const c = 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,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 7009
diff changeset
236 .long_name = NULL_IF_CONFIG_SMALL("QuickTime 8BPS video"),
1608
639972344c6f 8BPS decoder
rtognimp
parents:
diff changeset
237 };