72 unsigned int exp = v >> 23;
75 if (exp<= 127 + 7 - 24)
80 return (v + (1 << 23)) >> (127 + 7 - exp);
91 unsigned exp = 14 - (v >> 10);
93 if (exp == 14)
return (v >> 9) & 1;
94 else return (v & 0x8000) ? 0 : 0xffff;
97 return (v + (1 << 16)) >> (exp + 1);
111 unsigned int variable_buffer_data_size = bytestream_get_le32(buf);
112 if (variable_buffer_data_size >= buf_end - *buf)
114 return variable_buffer_data_size;
134 const char *value_name,
135 const char *value_type,
136 unsigned int minimum_length,
137 unsigned int *variable_buffer_data_size)
139 if (buf_end - *buf >= minimum_length && !strcmp(*buf, value_name)) {
140 *buf += strlen(value_name)+1;
141 if (!strcmp(*buf, value_type)) {
142 *buf += strlen(value_type)+1;
144 if (!*variable_buffer_data_size)
146 if (*variable_buffer_data_size > buf_end - *buf)
150 *buf -= strlen(value_name)+1;
162 int d = (int)t[-1] + (
int)t[0] - 128;
170 const int8_t *
t1 = src;
171 const int8_t *
t2 = src + (size + 1) / 2;
173 int8_t *stop = s +
size;
190 int8_t *d = (int8_t *)dst;
191 int8_t *s = (int8_t *)src;
192 int8_t *dend = d + dsize;
201 if ((dsize -= count ) < 0 ||
202 (ssize -= count + 1) < 0)
210 if ((dsize -= count) < 0 ||
230 unsigned int buf_size = avpkt->
size;
231 const uint8_t *buf_end = buf + buf_size;
239 int i, x, y,
stride, magic_number, version_flag, ret;
242 unsigned int xmin = ~0;
243 unsigned int xmax = ~0;
244 unsigned int ymin = ~0;
245 unsigned int ymax = ~0;
246 unsigned int xdelta = ~0;
250 int scan_lines_per_block;
251 unsigned long scan_line_size;
252 unsigned long uncompressed_size;
254 unsigned int current_channel_offset = 0;
267 magic_number = bytestream_get_le32(&buf);
268 if (magic_number != 20000630) {
273 version_flag = bytestream_get_le32(&buf);
274 if ((version_flag & 0x200) == 0x200) {
280 while (buf < buf_end && buf[0]) {
281 unsigned int variable_buffer_data_size;
283 if (
check_header_variable(avctx, &buf, buf_end,
"channels",
"chlist", 38, &variable_buffer_data_size) >= 0) {
284 const uint8_t *channel_list_end;
285 if (!variable_buffer_data_size)
288 channel_list_end = buf + variable_buffer_data_size;
289 while (channel_list_end - buf >= 19) {
290 int current_bits_per_color_id = -1;
291 int channel_index = -1;
293 if (!strcmp(buf,
"R"))
295 else if (!strcmp(buf,
"G"))
297 else if (!strcmp(buf,
"B"))
299 else if (!strcmp(buf,
"A"))
304 while (bytestream_get_byte(&buf) && buf < channel_list_end)
307 if (channel_list_end - * &buf < 4) {
312 current_bits_per_color_id = bytestream_get_le32(&buf);
313 if (current_bits_per_color_id > 2) {
318 if (channel_index >= 0) {
327 current_channel_offset += 1 << current_bits_per_color_id;
346 buf = channel_list_end;
351 if (
check_header_variable(avctx, &buf, buf_end,
"dataWindow",
"box2i", 31, &variable_buffer_data_size) >= 0) {
352 if (!variable_buffer_data_size)
359 xdelta = (xmax-xmin) + 1;
361 buf += variable_buffer_data_size;
366 if (
check_header_variable(avctx, &buf, buf_end,
"displayWindow",
"box2i", 34, &variable_buffer_data_size) >= 0) {
367 if (!variable_buffer_data_size)
373 buf += variable_buffer_data_size;
378 if (
check_header_variable(avctx, &buf, buf_end,
"lineOrder",
"lineOrder", 25, &variable_buffer_data_size) >= 0) {
379 if (!variable_buffer_data_size)
387 buf += variable_buffer_data_size;
392 if (
check_header_variable(avctx, &buf, buf_end,
"pixelAspectRatio",
"float", 31, &variable_buffer_data_size) >= 0) {
393 if (!variable_buffer_data_size)
398 buf += variable_buffer_data_size;
403 if (
check_header_variable(avctx, &buf, buf_end,
"compression",
"compression", 29, &variable_buffer_data_size) >= 0) {
404 if (!variable_buffer_data_size)
412 buf += variable_buffer_data_size;
417 if (buf_end - buf <= 9) {
423 for (i = 0; i < 2; i++) {
425 while (++buf < buf_end)
431 if (buf_end - buf >= 5) {
433 if (!variable_buffer_data_size) {
437 buf += variable_buffer_data_size;
441 if (s->
compr == -1) {
446 if (buf >= buf_end) {
473 scan_lines_per_block = 1;
476 scan_lines_per_block = 16;
489 if (xmin > xmax || ymin > ymax || xdelta != xmax - xmin + 1 || xmax >= w || ymax >= h) {
502 scan_line_size = xdelta * current_channel_offset;
503 uncompressed_size = scan_line_size * scan_lines_per_block;
521 for (y = 0; y < ymin; y++) {
522 memset(ptr, 0, out_line_size);
527 for (y = ymin; y <= ymax; y += scan_lines_per_block) {
528 uint16_t *ptr_x = (uint16_t *)ptr;
529 if (buf_end - buf > 8) {
532 const uint64_t line_offset = bytestream_get_le64(&buf) + 8;
536 if ((line_offset > buf_size) ||
537 (s->
compr ==
EXR_RAW && line_offset > avpkt->
size - xdelta * current_channel_offset) ||
540 av_log(avctx,
AV_LOG_WARNING,
"Line offset for line %d is out of reach setting it to black\n", y);
541 for (i = 0; i < scan_lines_per_block && y + i <= ymax; i++, ptr +=
stride) {
542 ptr_x = (uint16_t *)ptr;
543 memset(ptr_x, 0, out_line_size);
546 const uint8_t *red_channel_buffer, *green_channel_buffer, *blue_channel_buffer, *alpha_channel_buffer = 0;
548 if (scan_lines_per_block > 1)
549 uncompressed_size = scan_line_size *
FFMIN(scan_lines_per_block, ymax - y + 1);
551 unsigned long dest_len = uncompressed_size;
553 if (uncompress(s->
tmp, &dest_len, avpkt->
data + line_offset, data_size) != Z_OK ||
554 dest_len != uncompressed_size) {
558 }
else if (s->
compr ==
EXR_RLE && data_size < uncompressed_size) {
565 if (s->
compr !=
EXR_RAW && data_size < uncompressed_size) {
582 for (i = 0; i < scan_lines_per_block && y + i <= ymax; i++, ptr +=
stride) {
585 r = red_channel_buffer;
586 g = green_channel_buffer;
587 b = blue_channel_buffer;
588 if (alpha_channel_buffer)
589 a = alpha_channel_buffer;
591 ptr_x = (uint16_t *)ptr;
594 memset(ptr_x, 0, bxmin);
598 for (x = 0; x < xdelta; x++) {
602 if (alpha_channel_buffer)
607 for (x = 0; x < xdelta; x++) {
611 if (alpha_channel_buffer)
617 memset(ptr_x, 0, axmax);
619 red_channel_buffer += scan_line_size;
620 green_channel_buffer += scan_line_size;
621 blue_channel_buffer += scan_line_size;
622 if (alpha_channel_buffer)
623 alpha_channel_buffer += scan_line_size;
630 for (y = ymax + 1; y < avctx->
height; y++) {
631 memset(ptr, 0, out_line_size);