@ -749,6 +749,9 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
uint16_t * tmp = ( uint16_t * ) td - > tmp ;
uint8_t * out ;
int ret , i , j ;
int pixel_half_size ; /* 1 for half, 2 for float and uint32 */
EXRChannel * channel ;
int tmp_offset ;
if ( ! td - > bitmap )
td - > bitmap = av_malloc ( BITMAP_SIZE ) ;
@ -781,24 +784,38 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
ptr = tmp ;
for ( i = 0 ; i < s - > nb_channels ; i + + ) {
EXRChannel * channel = & s - > channels [ i ] ;
int size = channel - > pixel_type ;
channel = & s - > channels [ i ] ;
for ( j = 0 ; j < size ; j + + )
wav_decode ( ptr + j , td - > xsize , size , td - > ysize ,
td - > xsize * size , maxval ) ;
ptr + = td - > xsize * td - > ysize * size ;
if ( channel - > pixel_type = = EXR_HALF )
pixel_half_size = 1 ;
else
pixel_half_size = 2 ;
for ( j = 0 ; j < pixel_half_size ; j + + )
wav_decode ( ptr + j , td - > xsize , pixel_half_size , td - > ysize ,
td - > xsize * pixel_half_size , maxval ) ;
ptr + = td - > xsize * td - > ysize * pixel_half_size ;
}
apply_lut ( td - > lut , tmp , dsize / sizeof ( uint16_t ) ) ;
out = td - > uncompressed_data ;
for ( i = 0 ; i < td - > ysize ; i + + )
for ( i = 0 ; i < td - > ysize ; i + + ) {
tmp_offset = 0 ;
for ( j = 0 ; j < s - > nb_channels ; j + + ) {
uint16_t * in = tmp + j * td - > xsize * td - > ysize + i * td - > xsize ;
memcpy ( out , in , td - > xsize * 2 ) ;
out + = td - > xsize * 2 ;
uint16_t * in ;
EXRChannel * channel = & s - > channels [ j ] ;
if ( channel - > pixel_type = = EXR_HALF )
pixel_half_size = 1 ;
else
pixel_half_size = 2 ;
in = tmp + tmp_offset * td - > xsize * td - > ysize + i * td - > xsize * pixel_half_size ;
tmp_offset + = pixel_half_size ;
memcpy ( out , in , td - > xsize * 2 * pixel_half_size ) ;
out + = td - > xsize * 2 * pixel_half_size ;
}
}
return 0 ;
}