libavcodec/exr : fix piz uncompress on big endian
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
		
							parent
							
								
									cac8de2da5
								
							
						
					
					
						commit
						37f4d22075
					
				@ -45,6 +45,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "avcodec.h"
 | 
					#include "avcodec.h"
 | 
				
			||||||
#include "bytestream.h"
 | 
					#include "bytestream.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if HAVE_BIGENDIAN
 | 
				
			||||||
 | 
					#include "bswapdsp.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "get_bits.h"
 | 
					#include "get_bits.h"
 | 
				
			||||||
#include "internal.h"
 | 
					#include "internal.h"
 | 
				
			||||||
#include "mathops.h"
 | 
					#include "mathops.h"
 | 
				
			||||||
@ -116,6 +121,10 @@ typedef struct EXRContext {
 | 
				
			|||||||
    AVFrame *picture;
 | 
					    AVFrame *picture;
 | 
				
			||||||
    AVCodecContext *avctx;
 | 
					    AVCodecContext *avctx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if HAVE_BIGENDIAN
 | 
				
			||||||
 | 
					    BswapDSPContext bbdsp;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    enum ExrCompr compression;
 | 
					    enum ExrCompr compression;
 | 
				
			||||||
    enum ExrPixelType pixel_type;
 | 
					    enum ExrPixelType pixel_type;
 | 
				
			||||||
    int channel_offsets[4]; // 0 = red, 1 = green, 2 = blue and 3 = alpha
 | 
					    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 maxval, min_non_zero, max_non_zero;
 | 
				
			||||||
    uint16_t *ptr;
 | 
					    uint16_t *ptr;
 | 
				
			||||||
    uint16_t *tmp = (uint16_t *)td->tmp;
 | 
					    uint16_t *tmp = (uint16_t *)td->tmp;
 | 
				
			||||||
    uint8_t *out;
 | 
					    uint16_t *out;
 | 
				
			||||||
 | 
					    uint16_t *in;
 | 
				
			||||||
    int ret, i, j;
 | 
					    int ret, i, j;
 | 
				
			||||||
    int pixel_half_size;/* 1 for half, 2 for float and uint32 */
 | 
					    int pixel_half_size;/* 1 for half, 2 for float and uint32 */
 | 
				
			||||||
    EXRChannel *channel;
 | 
					    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));
 | 
					    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++) {
 | 
					    for (i = 0; i < td->ysize; i++) {
 | 
				
			||||||
        tmp_offset = 0;
 | 
					        tmp_offset = 0;
 | 
				
			||||||
        for (j = 0; j < s->nb_channels; j++) {
 | 
					        for (j = 0; j < s->nb_channels; j++) {
 | 
				
			||||||
            uint16_t *in;
 | 
					            channel = &s->channels[j];
 | 
				
			||||||
            EXRChannel *channel = &s->channels[j];
 | 
					 | 
				
			||||||
            if (channel->pixel_type == EXR_HALF)
 | 
					            if (channel->pixel_type == EXR_HALF)
 | 
				
			||||||
                pixel_half_size = 1;
 | 
					                pixel_half_size = 1;
 | 
				
			||||||
            else
 | 
					            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;
 | 
					            in = tmp + tmp_offset * td->xsize * td->ysize + i * td->xsize * pixel_half_size;
 | 
				
			||||||
            tmp_offset += 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);
 | 
					            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;
 | 
					    s->avctx              = avctx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if HAVE_BIGENDIAN
 | 
				
			||||||
 | 
					    ff_bswapdsp_init(&s->bbdsp);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    trc_func = avpriv_get_trc_function_from_trc(s->apply_trc_type);
 | 
					    trc_func = avpriv_get_trc_function_from_trc(s->apply_trc_type);
 | 
				
			||||||
    if (trc_func) {
 | 
					    if (trc_func) {
 | 
				
			||||||
        for (i = 0; i < 65536; ++i) {
 | 
					        for (i = 0; i < 65536; ++i) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user