#include <float.h>
#include <zlib.h>
+#include "libavutil/avassert.h"
#include "libavutil/common.h"
#include "libavutil/imgutils.h"
#include "libavutil/intfloat.h"
#include "avcodec.h"
#include "bytestream.h"
+
+#if HAVE_BIGENDIAN
+#include "bswapdsp.h"
+#endif
+
#include "get_bits.h"
#include "internal.h"
#include "mathops.h"
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
*
* @return normalized 16-bit unsigned int
*/
-static inline uint16_t exr_flt2uint(uint32_t v)
+static inline uint16_t exr_flt2uint(int32_t v)
{
- unsigned int exp = v >> 23;
+ int32_t exp = v >> 23;
// "HACK": negative values result in exp< 0, so clipping them to 0
// is also handled by this condition, avoids explicit check for sign bit.
if (exp <= 127 + 7 - 24) // we would shift out all bits anyway
static void reorder_pixels(uint8_t *src, uint8_t *dst, int size)
{
- const int8_t *t1 = src;
- const int8_t *t2 = src + (size + 1) / 2;
- int8_t *s = dst;
- int8_t *stop = s + size;
-
- while (1) {
- if (s < stop)
- *(s++) = *(t1++);
- else
- break;
+ const uint8_t *t1 = src;
+ int half_size = size / 2;
+ const uint8_t *t2 = src + half_size;
+ uint8_t *s = dst;
+ int i;
- if (s < stop)
- *(s++) = *(t2++);
- else
- break;
+ av_assert1(size % 2 == 0);
+
+ for (i = 0; i < half_size; i++) {
+ *(s++) = *(t1++);
+ *(s++) = *(t2++);
}
}
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;
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
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;
}
}
uint8_t *ptr;
uint32_t data_size;
uint64_t line, col = 0;
- uint64_t tileX, tileY, tileLevelX, tileLevelY;
+ uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
const uint8_t *src;
int axmax = (avctx->width - (s->xmax + 1)) * 2 * s->desc->nb_components; /* nb pixel to add at the right of the datawindow */
int bxmin = s->xmin * 2 * s->desc->nb_components; /* nb pixel to add at the left of the datawindow */
src = buf + line_offset + 20;
- tileX = AV_RL32(src - 20);
- tileY = AV_RL32(src - 16);
- tileLevelX = AV_RL32(src - 12);
- tileLevelY = AV_RL32(src - 8);
+ tile_x = AV_RL32(src - 20);
+ tile_y = AV_RL32(src - 16);
+ tile_level_x = AV_RL32(src - 12);
+ tile_level_y = AV_RL32(src - 8);
data_size = AV_RL32(src - 4);
if (data_size <= 0 || data_size > buf_size)
return AVERROR_INVALIDDATA;
- if (tileLevelX || tileLevelY) { /* tile level, is not the full res level */
+ if (tile_level_x || tile_level_y) { /* tile level, is not the full res level */
avpriv_report_missing_feature(s->avctx, "Subres tile before full res tile");
return AVERROR_PATCHWELCOME;
}
return AVERROR_PATCHWELCOME;
}
- line = s->tile_attr.ySize * tileY;
- col = s->tile_attr.xSize * tileX;
+ line = s->tile_attr.ySize * tile_y;
+ col = s->tile_attr.xSize * tile_x;
if (line < s->ymin || line > s->ymax ||
col < s->xmin || col > s->xmax)
return AVERROR_INVALIDDATA;
- td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tileY * s->tile_attr.ySize);
- td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tileX * s->tile_attr.xSize);
+ td->ysize = FFMIN(s->tile_attr.ySize, s->ydelta - tile_y * s->tile_attr.ySize);
+ td->xsize = FFMIN(s->tile_attr.xSize, s->xdelta - tile_x * s->tile_attr.xSize);
if (col) { /* not the first tile of the line */
bxmin = 0; /* doesn't add pixel at the left of the datawindow */
return AVERROR_INVALIDDATA;
}
- av_frame_set_metadata(frame, metadata);
+ frame->metadata = metadata;
// aaand we are done
bytestream2_skip(&s->gb, 1);
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) {