diff options
Diffstat (limited to 'libavcodec/sgidec.c')
-rw-r--r-- | libavcodec/sgidec.c | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/libavcodec/sgidec.c b/libavcodec/sgidec.c index ebca2e8f00..6f51ec3531 100644 --- a/libavcodec/sgidec.c +++ b/libavcodec/sgidec.c @@ -2,24 +2,25 @@ * SGI image decoder * Todd Kirby <doubleshot@pacbell.net> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "libavutil/imgutils.h" +#include "libavutil/avassert.h" #include "avcodec.h" #include "bytestream.h" #include "internal.h" @@ -41,7 +42,7 @@ typedef struct SgiState { * @param out_buf Points to one line after the output buffer. * @param len length of out_buf in bytes * @param pixelstride pixel stride of input buffer - * @return size of output in bytes, -1 if buffer overflows + * @return size of output in bytes, else return error code. */ static int expand_rle_row8(SgiState *s, uint8_t *out_buf, int len, int pixelstride) @@ -59,7 +60,7 @@ static int expand_rle_row8(SgiState *s, uint8_t *out_buf, } /* Check for buffer overflow. */ - if (pixelstride * (count - 1) >= len) { + if (out_end - out_buf <= pixelstride * (count - 1)) { av_log(s->avctx, AV_LOG_ERROR, "Invalid pixel count.\n"); return AVERROR_INVALIDDATA; } @@ -125,7 +126,7 @@ static int expand_rle_row16(SgiState *s, uint16_t *out_buf, * Read a run length encoded SGI image. * @param out_buf output buffer * @param s the current image state - * @return 0 if no error, else return error number. + * @return 0 if no error, else return error code. */ static int read_rle_sgi(uint8_t *out_buf, SgiState *s) { @@ -163,7 +164,7 @@ static int read_rle_sgi(uint8_t *out_buf, SgiState *s) * Read an uncompressed SGI image. * @param out_buf output buffer * @param s the current image state - * @return 0 if read success, otherwise return -1. + * @return 0 if read success, else return error code. */ static int read_uncompressed_sgi(unsigned char *out_buf, SgiState *s) { @@ -215,27 +216,27 @@ static int decode_frame(AVCodecContext *avctx, } /* Test for SGI magic. */ - if (bytestream2_get_be16(&s->g) != SGI_MAGIC) { + if (bytestream2_get_be16u(&s->g) != SGI_MAGIC) { av_log(avctx, AV_LOG_ERROR, "bad magic number\n"); return AVERROR_INVALIDDATA; } - rle = bytestream2_get_byte(&s->g); - s->bytes_per_channel = bytestream2_get_byte(&s->g); - dimension = bytestream2_get_be16(&s->g); - s->width = bytestream2_get_be16(&s->g); - s->height = bytestream2_get_be16(&s->g); - s->depth = bytestream2_get_be16(&s->g); + rle = bytestream2_get_byteu(&s->g); + s->bytes_per_channel = bytestream2_get_byteu(&s->g); + dimension = bytestream2_get_be16u(&s->g); + s->width = bytestream2_get_be16u(&s->g); + s->height = bytestream2_get_be16u(&s->g); + s->depth = bytestream2_get_be16u(&s->g); if (s->bytes_per_channel != 1 && s->bytes_per_channel != 2) { av_log(avctx, AV_LOG_ERROR, "wrong channel number\n"); - return -1; + return AVERROR_INVALIDDATA; } /* Check for supported image dimensions. */ if (dimension != 2 && dimension != 3) { av_log(avctx, AV_LOG_ERROR, "wrong dimension number\n"); - return -1; + return AVERROR_INVALIDDATA; } if (s->depth == SGI_GRAYSCALE) { @@ -246,17 +247,15 @@ static int decode_frame(AVCodecContext *avctx, avctx->pix_fmt = s->bytes_per_channel == 2 ? AV_PIX_FMT_RGBA64BE : AV_PIX_FMT_RGBA; } else { av_log(avctx, AV_LOG_ERROR, "wrong picture format\n"); - return -1; + return AVERROR_INVALIDDATA; } ret = ff_set_dimensions(avctx, s->width, s->height); if (ret < 0) return ret; - if (ff_get_buffer(avctx, p, 0) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed.\n"); - return -1; - } + if ((ret = ff_get_buffer(avctx, p, 0)) < 0) + return ret; p->pict_type = AV_PICTURE_TYPE_I; p->key_frame = 1; @@ -273,13 +272,11 @@ static int decode_frame(AVCodecContext *avctx, } else { ret = read_uncompressed_sgi(out_buf, s); } - - if (ret == 0) { - *got_frame = 1; - return avpkt->size; - } else { + if (ret) return ret; - } + + *got_frame = 1; + return avpkt->size; } static av_cold int sgi_decode_init(AVCodecContext *avctx) |