diff --git a/Changelog b/Changelog index 1f53d44654..98927cc7b9 100644 --- a/Changelog +++ b/Changelog @@ -36,6 +36,7 @@ version : - IVR demuxer - compensationdelay filter - acompressor filter +- support encoding 16-bit RLE SGI images version 2.8: diff --git a/libavcodec/sgienc.c b/libavcodec/sgienc.c index 4d5de9d29b..b150178add 100644 --- a/libavcodec/sgienc.c +++ b/libavcodec/sgienc.c @@ -46,7 +46,10 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src, int val, count, x, start = bytestream2_tell_p(pbc); void (*bytestream2_put)(PutByteContext *, unsigned int); - bytestream2_put = bytestream2_put_byte; + if (bpp == 1) + bytestream2_put = bytestream2_put_byte; + else + bytestream2_put = bytestream2_put_be16; for (x = 0; x < w; x += count) { /* see if we can encode the next set of pixels with RLE */ @@ -55,7 +58,7 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src, if (bytestream2_get_bytes_left_p(pbc) < bpp * 2) return AVERROR_INVALIDDATA; - val = *src; + val = bpp == 1 ? *src : AV_RB16(src); bytestream2_put(pbc, count); bytestream2_put(pbc, val); } else { @@ -67,7 +70,7 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src, bytestream2_put(pbc, count + 0x80); for (i = 0; i < count; i++) { - val = src[i]; + val = bpp == 1 ? src[i] : AV_RB16(src + i * bpp); bytestream2_put(pbc, val); } } @@ -117,7 +120,6 @@ FF_ENABLE_DEPRECATION_WARNINGS case AV_PIX_FMT_GRAY16LE: put_be = !HAVE_BIGENDIAN; case AV_PIX_FMT_GRAY16BE: - avctx->coder_type = FF_CODER_TYPE_RAW; bytes_per_channel = 2; pixmax = 0xFFFF; dimension = SGI_SINGLE_CHAN; @@ -126,7 +128,6 @@ FF_ENABLE_DEPRECATION_WARNINGS case AV_PIX_FMT_RGB48LE: put_be = !HAVE_BIGENDIAN; case AV_PIX_FMT_RGB48BE: - avctx->coder_type = FF_CODER_TYPE_RAW; bytes_per_channel = 2; pixmax = 0xFFFF; dimension = SGI_MULTI_CHAN; @@ -135,7 +136,6 @@ FF_ENABLE_DEPRECATION_WARNINGS case AV_PIX_FMT_RGBA64LE: put_be = !HAVE_BIGENDIAN; case AV_PIX_FMT_RGBA64BE: - avctx->coder_type = FF_CODER_TYPE_RAW; bytes_per_channel = 2; pixmax = 0xFFFF; dimension = SGI_MULTI_CHAN; @@ -191,19 +191,20 @@ FF_ENABLE_DEPRECATION_WARNINGS bytestream2_skip_p(&pbc, tablesize); /* Make an intermediate consecutive buffer. */ - if (!(encode_buf = av_malloc(width))) + if (!(encode_buf = av_malloc(width * bytes_per_channel))) return AVERROR(ENOMEM); for (z = 0; z < depth; z++) { - in_buf = p->data[0] + p->linesize[0] * (height - 1) + z; + in_buf = p->data[0] + p->linesize[0] * (height - 1) + z * bytes_per_channel; for (y = 0; y < height; y++) { bytestream2_put_be32(&taboff_pcb, bytestream2_tell_p(&pbc)); - for (x = 0; x < width; x++) + for (x = 0; x < width * bytes_per_channel; x += bytes_per_channel) encode_buf[x] = in_buf[depth * x]; - length = sgi_rle_encode(&pbc, encode_buf, width, 1); + length = sgi_rle_encode(&pbc, encode_buf, width, + bytes_per_channel); if (length < 1) { av_free(encode_buf); return -1;