annotate iff.c @ 11352:6e0af2cfdcfe libavcodec

Do MC and IDCT in coding (hilbert) order This increases the slice size to 64 pixels, due to having to decode an entire chroma superblock row per slice. This can be up to 6% slower depending on clip and CPU, but is necessary for future optimizations that gain significantly more than was lost.
author conrad
date Wed, 03 Mar 2010 23:27:40 +0000
parents ad4ac2a6373f
children 5b9d41da4152
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"
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
30
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
31 typedef struct {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
32 AVFrame frame;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
33 int planesize;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
34 uint8_t * planebuf;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
35 } IffContext;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
36
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
37 /**
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
38 * Convert CMAP buffer (stored in extradata) to lavc palette format
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
39 */
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
40 int ff_cmap_read_palette(AVCodecContext *avctx, uint32_t *pal)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
41 {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
42 int count, i;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
43
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
44 if (avctx->bits_per_coded_sample > 8) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
45 av_log(avctx, AV_LOG_ERROR, "bit_per_coded_sample > 8 not supported\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
46 return AVERROR_INVALIDDATA;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
47 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
48
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
49 count = 1 << avctx->bits_per_coded_sample;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
50 if (avctx->extradata_size < count * 3) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
51 av_log(avctx, AV_LOG_ERROR, "palette data underflow\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
52 return AVERROR_INVALIDDATA;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
53 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
54 for (i=0; i < count; i++) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
55 pal[i] = 0xFF000000 | AV_RB24( avctx->extradata + i*3 );
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
56 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
57 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
58 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
59
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
60 static av_cold int decode_init(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
61 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
62 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
63
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
64 if (avctx->bits_per_coded_sample <= 8) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
65 avctx->pix_fmt = PIX_FMT_PAL8;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
66 } else if (avctx->bits_per_coded_sample <= 32) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
67 avctx->pix_fmt = PIX_FMT_BGR32;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
68 } else {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
69 return AVERROR_INVALIDDATA;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
70 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
71
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
72 s->planesize = avctx->width / 8;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
73 s->planebuf = av_malloc(s->planesize + FF_INPUT_BUFFER_PADDING_SIZE);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
74 if (!s->planebuf)
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
75 return AVERROR(ENOMEM);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
76
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
77 s->frame.reference = 1;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
78 if (avctx->get_buffer(avctx, &s->frame) < 0) {
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
79 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
80 return AVERROR_UNKNOWN;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
81 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
82
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
83 return avctx->bits_per_coded_sample <= 8 ?
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
84 ff_cmap_read_palette(avctx, (uint32_t*)s->frame.data[1]) : 0;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
85 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
86
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
87 /**
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
88 * Decode interleaved plane buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
89 * @param dst Destination buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
90 * @param buf Source buffer
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
91 * @param buf_size
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
92 * @param bps bits_per_coded_sample
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
93 * @param plane plane number to decode as
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
94 */
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
95 #define DECLARE_DECODEPLANE(suffix, type) \
11336
ad4ac2a6373f use intended const syntax
pross
parents: 11187
diff changeset
96 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
97 { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
98 GetBitContext gb; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
99 int i, b; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
100 init_get_bits(&gb, buf, buf_size * 8); \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
101 for(i = 0; i < (buf_size * 8 + bps - 1) / bps; i++) { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
102 for (b = 0; b < bps; b++) { \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
103 ((type *)dst)[ i*bps + b ] |= get_bits1(&gb) << plane; \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
104 } \
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
105 } \
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
106 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
107 DECLARE_DECODEPLANE(8, uint8_t)
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
108 DECLARE_DECODEPLANE(32, uint32_t)
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
109
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
110 static int decode_frame_ilbm(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
111 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
112 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
113 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
114 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
115 const uint8_t *buf = avpkt->data;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
116 int buf_size = avpkt->size;
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
117 const uint8_t *buf_end = buf+buf_size;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
118 int y, plane;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
119
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
120 if (avctx->reget_buffer(avctx, &s->frame) < 0){
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
121 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
122 return -1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
123 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
124
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
125 for(y = 0; y < avctx->height; y++ ) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
126 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
127 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
128 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
129 if (avctx->pix_fmt == PIX_FMT_PAL8) {
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
130 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
131 } else { // PIX_FMT_BGR32
11187
a4c6587e2c27 Support <8-bit ILBM uncompressed bitmaps
pross
parents: 11175
diff changeset
132 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
133 }
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
134 buf += s->planesize;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
135 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
136 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
137
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
138 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
139 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
140 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
141 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
142
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
143 static int decode_frame_byterun1(AVCodecContext *avctx,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
144 void *data, int *data_size,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
145 AVPacket *avpkt)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
146 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
147 IffContext *s = avctx->priv_data;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
148 const uint8_t *buf = avpkt->data;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
149 int buf_size = avpkt->size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
150 const uint8_t *buf_end = buf+buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
151 int y, plane, x;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
152
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
153 if (avctx->reget_buffer(avctx, &s->frame) < 0){
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
154 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
155 return -1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
156 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
157
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
158 for(y = 0; y < avctx->height ; y++ ) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
159 uint8_t *row = &s->frame.data[0][ y*s->frame.linesize[0] ];
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
160 if (avctx->codec_tag == MKTAG('I','L','B','M')) { //interleaved
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
161 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
162 for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
163 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
164 int8_t value = *buf++;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
165 int length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
166 if (value >= 0) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
167 length = value + 1;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
168 memcpy(s->planebuf + x, buf, FFMIN3(length, s->planesize - x, buf_end - buf));
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
169 buf += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
170 } else if (value > -128) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
171 length = -value + 1;
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
172 memset(s->planebuf + x, *buf++, FFMIN(length, s->planesize - x));
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
173 } else { //noop
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
174 continue;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
175 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
176 x += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
177 }
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
178 if (avctx->pix_fmt == PIX_FMT_PAL8) {
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
179 decodeplane8(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
180 } else { //PIX_FMT_BGR32
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
181 decodeplane32(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
182 }
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
183 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
184 } else {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
185 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
186 int8_t value = *buf++;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
187 int length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
188 if (value >= 0) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
189 length = value + 1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
190 memcpy(row + x, buf, FFMIN3(length, buf_end - buf, avctx->width - x));
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
191 buf += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
192 } else if (value > -128) {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
193 length = -value + 1;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
194 memset(row + x, *buf++, FFMIN(length, avctx->width - x));
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
195 } else { //noop
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
196 continue;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
197 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
198 x += length;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
199 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
200 }
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 *data_size = sizeof(AVFrame);
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
204 *(AVFrame*)data = s->frame;
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
205 return buf_size;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
206 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
207
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
208 static av_cold int decode_end(AVCodecContext *avctx)
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
209 {
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
210 IffContext *s = avctx->priv_data;
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
211 if (s->frame.data[0])
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
212 avctx->release_buffer(avctx, &s->frame);
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
213 av_freep(&s->planebuf);
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
214 return 0;
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
215 }
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
216
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
217 AVCodec iff_ilbm_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
218 "iff_ilbm",
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
219 CODEC_TYPE_VIDEO,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
220 CODEC_ID_IFF_ILBM,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
221 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
222 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
223 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
224 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
225 decode_frame_ilbm,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
226 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
227 .long_name = NULL_IF_CONFIG_SMALL("IFF ILBM"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
228 };
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
229
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
230 AVCodec iff_byterun1_decoder = {
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
231 "iff_byterun1",
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
232 CODEC_TYPE_VIDEO,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
233 CODEC_ID_IFF_BYTERUN1,
11175
30856cadb01b IFF bitmap n-bit color support
pross
parents: 11124
diff changeset
234 sizeof(IffContext),
11074
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
235 decode_init,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
236 NULL,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
237 decode_end,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
238 decode_frame_byterun1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
239 CODEC_CAP_DR1,
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
240 .long_name = NULL_IF_CONFIG_SMALL("IFF ByteRun1"),
9fe3b0dcd33d IFF PBM/ILBM bitmap decoder
pross
parents:
diff changeset
241 };