annotate iff.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents 534872e7ab38
children 7dd2a45249a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
1 /*
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
2 * IFF PBM/ILBM bitmap decoder
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
3 * Copyright (c) 2010 Peter Ross <pross@xvid.org>
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
4 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
5 * This file is part of FFmpeg.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
6 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
11 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
15 * Lesser General Public License for more details.
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
16 *
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
20 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
21
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
22 /**
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
23 * @file libavcodec/iff.c
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
24 * IFF PBM/ILBM bitmap decoder
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
25 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
26
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
27 #include "bytestream.h"
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
28 #include "avcodec.h"
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
29 #include "get_bits.h"
11395
5b9d41da4152 IFF: move ff_cmap_read_palette() prototype to a header file
mru
parents: 11336
diff changeset
30 #include "iff.h"
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
31
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
32 typedef struct {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
33 AVFrame frame;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
34 int planesize;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
35 uint8_t * planebuf;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
36 } IffContext;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
37
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
38 /**
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
39 * Convert CMAP buffer (stored in extradata) to lavc palette format
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
40 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
41 int ff_cmap_read_palette(AVCodecContext *avctx, uint32_t *pal)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
42 {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
43 int count, i;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
44
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
45 if (avctx->bits_per_coded_sample > 8) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
46 av_log(avctx, AV_LOG_ERROR, "bit_per_coded_sample > 8 not supported\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
47 return AVERROR_INVALIDDATA;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
48 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
49
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
50 count = 1 << avctx->bits_per_coded_sample;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
51 if (avctx->extradata_size < count * 3) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
52 av_log(avctx, AV_LOG_ERROR, "palette data underflow\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
53 return AVERROR_INVALIDDATA;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
54 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
55 for (i=0; i < count; i++) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
56 pal[i] = 0xFF000000 | AV_RB24( avctx->extradata + i*3 );
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
57 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
58 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
59 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
60
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
61 static av_cold int decode_init(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
62 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
63 IffContext *s = avctx->priv_data;
11480
534872e7ab38 Make iff.c:decode_init return the value returned by
stefano
parents: 11395
diff changeset
64 int err;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
65
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
66 if (avctx->bits_per_coded_sample <= 8) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
67 avctx->pix_fmt = PIX_FMT_PAL8;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
68 } else if (avctx->bits_per_coded_sample <= 32) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
69 avctx->pix_fmt = PIX_FMT_BGR32;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
70 } else {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
71 return AVERROR_INVALIDDATA;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
72 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
73
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
74 s->planesize = avctx->width / 8;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
75 s->planebuf = av_malloc(s->planesize + FF_INPUT_BUFFER_PADDING_SIZE);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
76 if (!s->planebuf)
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
77 return AVERROR(ENOMEM);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
78
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
79 s->frame.reference = 1;
11480
534872e7ab38 Make iff.c:decode_init return the value returned by
stefano
parents: 11395
diff changeset
80 if ((err = avctx->get_buffer(avctx, &s->frame) < 0)) {
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
81 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
11480
534872e7ab38 Make iff.c:decode_init return the value returned by
stefano
parents: 11395
diff changeset
82 return err;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
83 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
84
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
85 return avctx->bits_per_coded_sample <= 8 ?
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
86 ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1]) : 0;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
87 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
88
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
89 /**
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
90 * Decode interleaved plane buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
91 * @param dst Destination buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
92 * @param buf Source buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
93 * @param buf_size
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
94 * @param bps bits_per_coded_sample
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
95 * @param plane plane number to decode as
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
96 */
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
97 #define DECLARE_DECODEPLANE(suffix, type) \
11336
ad4ac2a6373f use intended const syntax
pross
parents: 11187
diff changeset
98 static void decodeplane##suffix(void *dst, const uint8_t *const buf, int buf_size, int bps, int plane) \
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
99 { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
100 GetBitContext gb; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
101 int i, b; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
102 init_get_bits(&gb, buf, buf_size * 8); \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
103 for(i = 0; i < (buf_size * 8 + bps - 1) / bps; i++) { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
104 for (b = 0; b < bps; b++) { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
105 ((type *)dst)[ i*bps + b ] |= get_bits1(&gb) << plane; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
106 } \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
107 } \
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
108 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
109 DECLARE_DECODEPLANE(8, uint8_t)
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
110 DECLARE_DECODEPLANE(32, uint32_t)
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
111
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
112 static int decode_frame_ilbm(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
113 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
114 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
115 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
116 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
117 const uint8_t *buf = avpkt->data;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
118 int buf_size = avpkt->size;
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
119 const uint8_t *buf_end = buf+buf_size;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
120 int y, plane;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
121
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
122 if (avctx->reget_buffer(avctx, &s->frame) < 0){
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
123 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
124 return -1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
125 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
126
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
127 for(y = 0; y < avctx->height; y++ ) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
128 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
129 memset(row, 0, avctx->pix_fmt == PIX_FMT_PAL8 ? avctx->width : (avctx->width * 4));
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
130 for (plane = 0; plane < avctx->bits_per_coded_sample && buf < buf_end; plane++) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
131 if (avctx->pix_fmt == PIX_FMT_PAL8) {
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
132 decodeplane8(row, buf, FFMIN(s->planesize, buf_end - buf), avctx->bits_per_coded_sample, plane);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
133 } else { // PIX_FMT_BGR32
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
134 decodeplane32(row, buf, FFMIN(s->planesize, buf_end - buf), avctx->bits_per_coded_sample, plane);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
135 }
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
136 buf += s->planesize;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
137 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
138 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
139
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
140 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
141 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
142 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
143 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
144
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
145 static int decode_frame_byterun1(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
146 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
147 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
148 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
149 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
150 const uint8_t *buf = avpkt->data;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
151 int buf_size = avpkt->size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
152 const uint8_t *buf_end = buf+buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
153 int y, plane, x;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
154
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
155 if (avctx->reget_buffer(avctx, &s->frame) < 0){
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
156 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
157 return -1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
158 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
159
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
160 for(y = 0; y < avctx->height ; y++ ) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
161 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
162 if (avctx->codec_tag == MKTAG('I','L','B','M')) { //interleaved
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
163 memset(row, 0, avctx->pix_fmt == PIX_FMT_PAL8 ? avctx->width : (avctx->width * 4));
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
164 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
165 for(x = 0; x < s->planesize && buf < buf_end; ) {
11124
85a1b00a2413 Use int8_t instead of char, the signedness of char can differ between systems.
reimar
parents: 11074
diff changeset
166 int8_t value = *buf++;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
167 int length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
168 if (value >= 0) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
169 length = value + 1;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
170 memcpy(s->planebuf + x, buf, FFMIN3(length, s->planesize - x, buf_end - buf));
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
171 buf += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
172 } else if (value > -128) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
173 length = -value + 1;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
174 memset(s->planebuf + x, *buf++, FFMIN(length, s->planesize - x));
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
175 } else { //noop
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
176 continue;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
177 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
178 x += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
179 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
180 if (avctx->pix_fmt == PIX_FMT_PAL8) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
181 decodeplane8(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
182 } else { //PIX_FMT_BGR32
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
183 decodeplane32(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
184 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
185 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
186 } else {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
187 for(x = 0; x < avctx->width && buf < buf_end; ) {
11124
85a1b00a2413 Use int8_t instead of char, the signedness of char can differ between systems.
reimar
parents: 11074
diff changeset
188 int8_t value = *buf++;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
189 int length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
190 if (value >= 0) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
191 length = value + 1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
192 memcpy(row + x, buf, FFMIN3(length, buf_end - buf, avctx->width - x));
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
193 buf += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
194 } else if (value > -128) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
195 length = -value + 1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
196 memset(row + x, *buf++, FFMIN(length, avctx->width - x));
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
197 } else { //noop
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
198 continue;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
199 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
200 x += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
201 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
202 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
203 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
204
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
205 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
206 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
207 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
208 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
209
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
210 static av_cold int decode_end(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
211 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
212 IffContext *s = avctx->priv_data;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
213 if (s->frame.data[0])
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
214 avctx->release_buffer(avctx, &s->frame);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
215 av_freep(&s->planebuf);
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
216 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
217 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
218
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
219 AVCodec iff_ilbm_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
220 "iff_ilbm",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11480
diff changeset
221 AVMEDIA_TYPE_VIDEO,
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
222 CODEC_ID_IFF_ILBM,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
223 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
224 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
225 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
226 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
227 decode_frame_ilbm,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
228 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
229 .long_name = NULL_IF_CONFIG_SMALL("IFF ILBM"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
230 };
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
231
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
232 AVCodec iff_byterun1_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
233 "iff_byterun1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11480
diff changeset
234 AVMEDIA_TYPE_VIDEO,
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
235 CODEC_ID_IFF_BYTERUN1,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
236 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
237 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
238 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
239 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
240 decode_frame_byterun1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
241 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
242 .long_name = NULL_IF_CONFIG_SMALL("IFF ByteRun1"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
243 };