diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-11-29 15:49:31 +0100 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2015-11-29 15:49:31 +0100 |
commit | 7c56b8792c8f3d261bf2e8e391936f741886d85e (patch) | |
tree | 845c767b4e3b066c0ad367720da2721b13f7f484 | |
parent | 98626a1a4c3e7adca768a1e461399358589ea4b5 (diff) | |
parent | 4a0918cae6394e503b17c71f8f171b4a795eb849 (diff) | |
download | ffmpeg-7c56b8792c8f3d261bf2e8e391936f741886d85e.tar.gz |
Merge commit '4a0918cae6394e503b17c71f8f171b4a795eb849'
* commit '4a0918cae6394e503b17c71f8f171b4a795eb849':
sgienc: Support encoding high bit depth images with RLE
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
-rw-r--r-- | Changelog | 1 | ||||
-rw-r--r-- | libavcodec/sgienc.c | 21 |
2 files changed, 12 insertions, 10 deletions
@@ -36,6 +36,7 @@ version <next>: - 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; |