diff options
author | Martin Vignali <martin.vignali@gmail.com> | 2017-04-23 16:38:14 +0300 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2017-05-01 12:40:57 +0300 |
commit | 37f4d22075c331f7f4fd67ea80049188b0ba8814 (patch) | |
tree | fb5ea52743109e2630f3758db9ef6b2b39957ffd /libavcodec/exr.c | |
parent | cac8de2da5c4935773128335c11b806faa73e19d (diff) |
libavcodec/exr : fix piz uncompress on big endian
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/exr.c')
-rw-r--r-- | libavcodec/exr.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/libavcodec/exr.c b/libavcodec/exr.c index c32eea1b8f..b37f91fa3f 100644 --- a/libavcodec/exr.c +++ b/libavcodec/exr.c @@ -45,6 +45,11 @@ #include "avcodec.h" #include "bytestream.h" + +#if HAVE_BIGENDIAN +#include "bswapdsp.h" +#endif + #include "get_bits.h" #include "internal.h" #include "mathops.h" @@ -116,6 +121,10 @@ typedef struct EXRContext { AVFrame *picture; AVCodecContext *avctx; +#if HAVE_BIGENDIAN + BswapDSPContext bbdsp; +#endif + enum ExrCompr compression; enum ExrPixelType pixel_type; int channel_offsets[4]; // 0 = red, 1 = green, 2 = blue and 3 = alpha @@ -751,7 +760,8 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, uint16_t maxval, min_non_zero, max_non_zero; uint16_t *ptr; uint16_t *tmp = (uint16_t *)td->tmp; - uint8_t *out; + uint16_t *out; + uint16_t *in; int ret, i, j; int pixel_half_size;/* 1 for half, 2 for float and uint32 */ EXRChannel *channel; @@ -803,12 +813,11 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, apply_lut(td->lut, tmp, dsize / sizeof(uint16_t)); - out = td->uncompressed_data; + out = (uint16_t *)td->uncompressed_data; for (i = 0; i < td->ysize; i++) { tmp_offset = 0; for (j = 0; j < s->nb_channels; j++) { - uint16_t *in; - EXRChannel *channel = &s->channels[j]; + channel = &s->channels[j]; if (channel->pixel_type == EXR_HALF) pixel_half_size = 1; else @@ -816,8 +825,13 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size; tmp_offset += pixel_half_size; + +#if HAVE_BIGENDIAN + s->bbdsp.bswap16_buf(out, in, td->xsize * pixel_half_size); +#else memcpy(out, in, td->xsize * 2 * pixel_half_size); - out += td->xsize * 2 * pixel_half_size; +#endif + out += td->xsize * pixel_half_size; } } @@ -1793,6 +1807,10 @@ static av_cold int decode_init(AVCodecContext *avctx) s->avctx = avctx; +#if HAVE_BIGENDIAN + ff_bswapdsp_init(&s->bbdsp); +#endif + trc_func = avpriv_get_trc_function_from_trc(s->apply_trc_type); if (trc_func) { for (i = 0; i < 65536; ++i) { |