Commit 473147be authored by Sebastian Vater's avatar Sebastian Vater Committed by Ronald S. Bultje

Switch some ints to unsigned (they can only have positive values, this allows

compiler to optimize some math from mul/div to shr/shl). Also add a cast to
uint32_t when calling decodeplane32(), this silences a compiler warning.
Lastly, in decodeplane8/32(), flatten a double-loop into a single-loop and
calculate the length once before entering the loop instead of during every
iteration (since it doesn't change).

Patch by Sebastian Vater <cdgs.basty googlemail com>.

Originally committed as revision 22974 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent a31e7956
/*
* IFF PBM/ILBM bitmap decoder
* Copyright (c) 2010 Peter Ross <pross@xvid.org>
* Copyright (c) 2010 Sebastian Vater <cdgs.basty@googlemail.com>
*
* This file is part of FFmpeg.
*
......@@ -31,7 +32,7 @@
typedef struct {
AVFrame frame;
int planesize;
unsigned planesize;
uint8_t * planebuf;
} IffContext;
......@@ -40,7 +41,7 @@ typedef struct {
*/
int ff_cmap_read_palette(AVCodecContext *avctx, uint32_t *pal)
{
int count, i;
unsigned count, i;
if (avctx->bits_per_coded_sample > 8) {
av_log(avctx, AV_LOG_ERROR, "bit_per_coded_sample > 8 not supported\n");
......@@ -71,7 +72,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA;
}
s->planesize = avctx->width / 8;
s->planesize = avctx->width >> 3;
s->planebuf = av_malloc(s->planesize + FF_INPUT_BUFFER_PADDING_SIZE);
if (!s->planebuf)
return AVERROR(ENOMEM);
......@@ -97,12 +98,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
static void decodeplane8(uint8_t *dst, const uint8_t *const buf, int buf_size, int bps, int plane)
{
GetBitContext gb;
int i, b;
unsigned int i;
const unsigned b = (buf_size * 8) + bps - 1;
init_get_bits(&gb, buf, buf_size * 8);
for(i = 0; i < (buf_size * 8 + bps - 1) / bps; i++) {
for (b = 0; b < bps; b++) {
dst[ i*bps + b ] |= get_bits1(&gb) << plane;
}
for(i = 0; i < b; i++) {
dst[i] |= get_bits1(&gb) << plane;
}
}
......@@ -117,12 +117,11 @@ static void decodeplane8(uint8_t *dst, const uint8_t *const buf, int buf_size, i
static void decodeplane32(uint32_t *dst, const uint8_t *const buf, int buf_size, int bps, int plane)
{
GetBitContext gb;
int i, b;
unsigned i;
const unsigned b = (buf_size * 8) + bps - 1;
init_get_bits(&gb, buf, buf_size * 8);
for(i = 0; i < (buf_size * 8 + bps - 1) / bps; i++) {
for (b = 0; b < bps; b++) {
dst[ i*bps + b ] |= get_bits1(&gb) << plane;
}
for(i = 0; i < b; i++) {
dst[i] |= get_bits1(&gb) << plane;
}
}
......@@ -132,9 +131,9 @@ static int decode_frame_ilbm(AVCodecContext *avctx,
{
IffContext *s = avctx->priv_data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
unsigned buf_size = avpkt->size;
const uint8_t *buf_end = buf+buf_size;
int y, plane;
unsigned y, plane;
if (avctx->reget_buffer(avctx, &s->frame) < 0){
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
......@@ -148,7 +147,7 @@ static int decode_frame_ilbm(AVCodecContext *avctx,
if (avctx->pix_fmt == PIX_FMT_PAL8) {
decodeplane8(row, buf, FFMIN(s->planesize, buf_end - buf), avctx->bits_per_coded_sample, plane);
} else { // PIX_FMT_BGR32
decodeplane32(row, buf, FFMIN(s->planesize, buf_end - buf), avctx->bits_per_coded_sample, plane);
decodeplane32((uint32_t *) row, buf, FFMIN(s->planesize, buf_end - buf), avctx->bits_per_coded_sample, plane);
}
buf += s->planesize;
}
......@@ -165,9 +164,9 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
{
IffContext *s = avctx->priv_data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
unsigned buf_size = avpkt->size;
const uint8_t *buf_end = buf+buf_size;
int y, plane, x;
unsigned y, plane, x;
if (avctx->reget_buffer(avctx, &s->frame) < 0){
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
......@@ -181,7 +180,7 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
for (plane = 0; plane < avctx->bits_per_coded_sample; plane++) {
for(x = 0; x < s->planesize && buf < buf_end; ) {
int8_t value = *buf++;
int length;
unsigned length;
if (value >= 0) {
length = value + 1;
memcpy(s->planebuf + x, buf, FFMIN3(length, s->planesize - x, buf_end - buf));
......@@ -197,13 +196,13 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
if (avctx->pix_fmt == PIX_FMT_PAL8) {
decodeplane8(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
} else { //PIX_FMT_BGR32
decodeplane32(row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
decodeplane32((uint32_t *) row, s->planebuf, s->planesize, avctx->bits_per_coded_sample, plane);
}
}
} else {
for(x = 0; x < avctx->width && buf < buf_end; ) {
int8_t value = *buf++;
int length;
unsigned length;
if (value >= 0) {
length = value + 1;
memcpy(row + x, buf, FFMIN3(length, buf_end - buf, avctx->width - x));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment