Go to the documentation of this file.
166 #define HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP 0x38000000
170 #define HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP 0x47800000
173 #define FLOAT_MAX_BIASED_EXP (0xFF << 23)
175 #define HALF_FLOAT_MAX_BIASED_EXP (0x1F << 10)
186 unsigned int sign = (
unsigned int) (hf >> 15);
187 unsigned int mantissa = (
unsigned int) (hf & ((1 << 10) - 1));
197 mantissa = (1 << 23) - 1;
198 }
else if (
exp == 0x0) {
204 while ((mantissa & (1 << 10))) {
211 mantissa &= ((1 << 10) - 1);
222 f.i = (sign << 31) |
exp | mantissa;
240 if (
exp <= 127 + 7 - 24)
245 return (v + (1 << 23)) >> (127 + 7 -
exp);
257 unsigned exp = 14 - (v >> 10);
262 return (v & 0x8000) ? 0 : 0xffff;
265 return (v + (1 << 16)) >> (
exp + 1);
271 unsigned long dest_len = uncompressed_size;
273 if (uncompress(
td->tmp, &dest_len,
src, compressed_size) != Z_OK ||
274 dest_len != uncompressed_size)
279 s->dsp.predictor(
td->tmp, uncompressed_size);
280 s->dsp.reorder_pixels(
td->uncompressed_data,
td->tmp, uncompressed_size);
289 const int8_t *
s =
src;
290 int ssize = compressed_size;
291 int dsize = uncompressed_size;
301 if ((dsize -=
count) < 0 ||
302 (ssize -=
count + 1) < 0)
310 if ((dsize -=
count) < 0 ||
326 ctx->dsp.predictor(
td->tmp, uncompressed_size);
327 ctx->dsp.reorder_pixels(
td->uncompressed_data,
td->tmp, uncompressed_size);
332 #define USHORT_RANGE (1 << 16)
333 #define BITMAP_SIZE (1 << 13)
340 if ((
i == 0) || (bitmap[
i >> 3] & (1 << (
i & 7))))
350 static void apply_lut(
const uint16_t *lut, uint16_t *dst,
int dsize)
354 for (
i = 0;
i < dsize; ++
i)
355 dst[
i] = lut[dst[
i]];
358 #define HUF_ENCBITS 16 // literal (value) bit length
359 #define HUF_DECBITS 14 // decoding bit size (>= 8)
361 #define HUF_ENCSIZE ((1 << HUF_ENCBITS) + 1) // encoding table size
362 #define HUF_DECSIZE (1 << HUF_DECBITS) // decoding table size
363 #define HUF_DECMASK (HUF_DECSIZE - 1)
373 uint64_t
c,
n[59] = { 0 };
380 for (
i = 58;
i > 0; --
i) {
381 uint64_t nc = ((
c +
n[
i]) >> 1);
390 hcode[
i] = l | (
n[l]++ << 6);
394 #define SHORT_ZEROCODE_RUN 59
395 #define LONG_ZEROCODE_RUN 63
396 #define SHORTEST_LONG_RUN (2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN)
397 #define LONGEST_LONG_RUN (255 + SHORTEST_LONG_RUN)
407 for (;
im <= iM;
im++) {
413 if (
im + zerun > iM + 1)
423 if (
im + zerun > iM + 1)
442 for (;
im <= iM;
im++) {
443 uint64_t
c = hcode[
im] >> 6;
444 int i, l = hcode[
im] & 63;
465 if (pl->
len || pl->
p)
476 #define get_char(c, lc, gb) \
478 c = (c << 8) | bytestream2_get_byte(gb); \
482 #define get_code(po, rlc, c, lc, gb, out, oe, outb) \
486 get_char(c, lc, gb); \
491 if (out + cs > oe || out == outb) \
492 return AVERROR_INVALIDDATA; \
498 } else if (out < oe) { \
501 return AVERROR_INVALIDDATA; \
507 int rlc,
int no, uint16_t *
out)
510 uint16_t *outb =
out;
511 uint16_t *oe =
out + no;
532 for (j = 0; j < pl.
lit; j++) {
533 int l = hcode[pl.
p[j]] & 63;
539 if ((hcode[pl.
p[j]] >> 6) ==
540 ((
c >> (lc - l)) & ((1LL << l) - 1))) {
561 if (pl.
len && lc >= pl.
len) {
569 if (
out - outb != no)
575 uint16_t *dst,
int dst_size)
583 src_size = bytestream2_get_le32(gb);
584 im = bytestream2_get_le32(gb);
585 iM = bytestream2_get_le32(gb);
587 nBits = bytestream2_get_le32(gb);
597 if (!freq || !hdec) {
625 static inline void wdec14(uint16_t l, uint16_t
h, uint16_t *
a, uint16_t *
b)
630 int ai = ls + (hi & 1) + (hi >> 1);
632 int16_t bs = ai - hi;
639 #define A_OFFSET (1 << (NBITS - 1))
640 #define MOD_MASK ((1 << NBITS) - 1)
642 static inline void wdec16(uint16_t l, uint16_t
h, uint16_t *
a, uint16_t *
b)
653 int ny,
int oy, uint16_t mx)
655 int w14 = (mx < (1 << 14));
656 int n = (nx > ny) ? ny : nx;
669 uint16_t *ey =
in + oy * (ny - p2);
670 uint16_t i00, i01, i10, i11;
676 for (; py <= ey; py += oy2) {
678 uint16_t *ex = py + ox * (nx - p2);
680 for (; px <= ex; px += ox2) {
681 uint16_t *p01 = px + ox1;
682 uint16_t *p10 = px + oy1;
683 uint16_t *p11 = p10 + ox1;
686 wdec14(*px, *p10, &i00, &i10);
687 wdec14(*p01, *p11, &i01, &i11);
688 wdec14(i00, i01, px, p01);
689 wdec14(i10, i11, p10, p11);
691 wdec16(*px, *p10, &i00, &i10);
692 wdec16(*p01, *p11, &i01, &i11);
693 wdec16(i00, i01, px, p01);
694 wdec16(i10, i11, p10, p11);
699 uint16_t *p10 = px + oy1;
702 wdec14(*px, *p10, &i00, p10);
704 wdec16(*px, *p10, &i00, p10);
712 uint16_t *ex = py + ox * (nx - p2);
714 for (; px <= ex; px += ox2) {
715 uint16_t *p01 = px + ox1;
718 wdec14(*px, *p01, &i00, p01);
720 wdec16(*px, *p01, &i00, p01);
735 uint16_t maxval, min_non_zero, max_non_zero;
737 uint16_t *
tmp = (uint16_t *)
td->tmp;
749 if (!
td->bitmap || !
td->lut) {
756 min_non_zero = bytestream2_get_le16(&gb);
757 max_non_zero = bytestream2_get_le16(&gb);
763 if (min_non_zero <= max_non_zero)
765 max_non_zero - min_non_zero + 1);
766 memset(
td->bitmap + max_non_zero + 1, 0,
BITMAP_SIZE - max_non_zero - 1);
775 for (
i = 0;
i <
s->nb_channels;
i++) {
783 for (j = 0; j < pixel_half_size; j++)
785 td->xsize * pixel_half_size, maxval);
786 ptr +=
td->xsize *
td->ysize * pixel_half_size;
791 out = (uint16_t *)
td->uncompressed_data;
794 for (j = 0; j <
s->nb_channels; j++) {
801 in =
tmp + tmp_offset *
td->xsize *
td->ysize +
i *
td->xsize * pixel_half_size;
802 tmp_offset += pixel_half_size;
805 s->bbdsp.bswap16_buf(
out,
in,
td->xsize * pixel_half_size);
807 memcpy(
out,
in,
td->xsize * 2 * pixel_half_size);
809 out +=
td->xsize * pixel_half_size;
817 int compressed_size,
int uncompressed_size,
820 unsigned long dest_len, expected_len = 0;
825 for (
i = 0;
i <
s->nb_channels;
i++) {
827 expected_len += (
td->xsize *
td->ysize * 3);
828 }
else if (
s->channels[
i].pixel_type ==
EXR_HALF) {
829 expected_len += (
td->xsize *
td->ysize * 2);
831 expected_len += (
td->xsize *
td->ysize * 4);
835 dest_len = expected_len;
837 if (uncompress(
td->tmp, &dest_len,
src, compressed_size) != Z_OK) {
839 }
else if (dest_len != expected_len) {
843 out =
td->uncompressed_data;
844 for (
i = 0;
i <
td->ysize;
i++)
845 for (
c = 0;
c <
s->nb_channels;
c++) {
853 ptr[1] = ptr[0] +
td->xsize;
854 ptr[2] = ptr[1] +
td->xsize;
855 in = ptr[2] +
td->xsize;
857 for (j = 0; j <
td->xsize; ++j) {
858 uint32_t
diff = ((unsigned)*(ptr[0]++) << 24) |
859 (*(ptr[1]++) << 16) |
867 ptr[1] = ptr[0] +
td->xsize;
868 in = ptr[1] +
td->xsize;
869 for (j = 0; j <
td->xsize; j++) {
870 uint32_t
diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
878 ptr[1] = ptr[0] +
s->xdelta;
879 ptr[2] = ptr[1] +
s->xdelta;
880 ptr[3] = ptr[2] +
s->xdelta;
881 in = ptr[3] +
s->xdelta;
883 for (j = 0; j <
s->xdelta; ++j) {
884 uint32_t
diff = ((uint32_t)*(ptr[0]++) << 24) |
885 (*(ptr[1]++) << 16) |
886 (*(ptr[2]++) << 8 ) |
902 unsigned short shift = (
b[ 2] >> 2) & 15;
903 unsigned short bias = (0x20 <<
shift);
906 s[ 0] = (
b[0] << 8) |
b[1];
908 s[ 4] =
s[ 0] + ((((
b[ 2] << 4) | (
b[ 3] >> 4)) & 0x3f) <<
shift) - bias;
909 s[ 8] =
s[ 4] + ((((
b[ 3] << 2) | (
b[ 4] >> 6)) & 0x3f) <<
shift) - bias;
910 s[12] =
s[ 8] + ((
b[ 4] & 0x3f) <<
shift) - bias;
912 s[ 1] =
s[ 0] + ((
b[ 5] >> 2) <<
shift) - bias;
913 s[ 5] =
s[ 4] + ((((
b[ 5] << 4) | (
b[ 6] >> 4)) & 0x3f) <<
shift) - bias;
914 s[ 9] =
s[ 8] + ((((
b[ 6] << 2) | (
b[ 7] >> 6)) & 0x3f) <<
shift) - bias;
915 s[13] =
s[12] + ((
b[ 7] & 0x3f) <<
shift) - bias;
917 s[ 2] =
s[ 1] + ((
b[ 8] >> 2) <<
shift) - bias;
918 s[ 6] =
s[ 5] + ((((
b[ 8] << 4) | (
b[ 9] >> 4)) & 0x3f) <<
shift) - bias;
919 s[10] =
s[ 9] + ((((
b[ 9] << 2) | (
b[10] >> 6)) & 0x3f) <<
shift) - bias;
920 s[14] =
s[13] + ((
b[10] & 0x3f) <<
shift) - bias;
922 s[ 3] =
s[ 2] + ((
b[11] >> 2) <<
shift) - bias;
923 s[ 7] =
s[ 6] + ((((
b[11] << 4) | (
b[12] >> 4)) & 0x3f) <<
shift) - bias;
924 s[11] =
s[10] + ((((
b[12] << 2) | (
b[13] >> 6)) & 0x3f) <<
shift) - bias;
925 s[15] =
s[14] + ((
b[13] & 0x3f) <<
shift) - bias;
927 for (
i = 0;
i < 16; ++
i) {
939 s[0] = (
b[0] << 8) |
b[1];
946 for (
i = 1;
i < 16;
i++)
953 const int8_t *sr =
src;
954 int stay_to_uncompress = compressed_size;
955 int nb_b44_block_w, nb_b44_block_h;
956 int index_tl_x, index_tl_y, index_out, index_tmp;
957 uint16_t tmp_buffer[16];
959 int target_channel_offset = 0;
962 nb_b44_block_w =
td->xsize / 4;
963 if ((
td->xsize % 4) != 0)
966 nb_b44_block_h =
td->ysize / 4;
967 if ((
td->ysize % 4) != 0)
970 for (
c = 0;
c <
s->nb_channels;
c++) {
972 for (iY = 0; iY < nb_b44_block_h; iY++) {
973 for (iX = 0; iX < nb_b44_block_w; iX++) {
974 if (stay_to_uncompress < 3) {
979 if (
src[compressed_size - stay_to_uncompress + 2] == 0xfc) {
982 stay_to_uncompress -= 3;
984 if (stay_to_uncompress < 14) {
990 stay_to_uncompress -= 14;
997 for (y = index_tl_y; y <
FFMIN(index_tl_y + 4,
td->ysize); y++) {
998 for (x = index_tl_x; x <
FFMIN(index_tl_x + 4,
td->xsize); x++) {
999 index_out = target_channel_offset *
td->xsize + y *
td->channel_line_size + 2 * x;
1000 index_tmp = (y-index_tl_y) * 4 + (x-index_tl_x);
1001 td->uncompressed_data[index_out] = tmp_buffer[index_tmp] & 0xff;
1002 td->uncompressed_data[index_out + 1] = tmp_buffer[index_tmp] >> 8;
1007 target_channel_offset += 2;
1009 if (stay_to_uncompress < td->ysize *
td->xsize * 4) {
1010 av_log(
s,
AV_LOG_ERROR,
"Not enough data for uncompress channel: %d", stay_to_uncompress);
1014 for (y = 0; y <
td->ysize; y++) {
1015 index_out = target_channel_offset *
td->xsize + y *
td->channel_line_size;
1016 memcpy(&
td->uncompressed_data[index_out], sr,
td->xsize * 4);
1017 sr +=
td->xsize * 4;
1019 target_channel_offset += 4;
1021 stay_to_uncompress -=
td->ysize *
td->xsize * 4;
1029 int jobnr,
int threadnr)
1034 const uint8_t *channel_buffer[4] = { 0 };
1036 uint64_t line_offset, uncompressed_size;
1040 uint64_t
line, col = 0;
1041 uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
1043 int axmax = (avctx->
width - (
s->xmax + 1)) * 2 *
s->desc->nb_components;
1044 int bxmin =
s->xmin * 2 *
s->desc->nb_components;
1045 int i, x, buf_size =
s->buf_size;
1046 int c, rgb_channel_count;
1047 float one_gamma = 1.0f /
s->gamma;
1051 line_offset =
AV_RL64(
s->gb.buffer + jobnr * 8);
1054 if (buf_size < 20 || line_offset > buf_size - 20)
1057 src =
buf + line_offset + 20;
1065 if (data_size <= 0 || data_size > buf_size - line_offset - 20)
1068 if (tile_level_x || tile_level_y) {
1073 if (
s->xmin ||
s->ymin) {
1078 line =
s->tile_attr.ySize * tile_y;
1079 col =
s->tile_attr.xSize * tile_x;
1082 col < s->xmin || col >
s->xmax)
1085 td->ysize =
FFMIN(
s->tile_attr.ySize,
s->ydelta - tile_y *
s->tile_attr.ySize);
1086 td->xsize =
FFMIN(
s->tile_attr.xSize,
s->xdelta - tile_x *
s->tile_attr.xSize);
1092 if ((col +
td->xsize) !=
s->xdelta)
1095 if (
td->xsize * (uint64_t)
s->current_channel_offset > INT_MAX)
1098 td->channel_line_size =
td->xsize *
s->current_channel_offset;
1099 uncompressed_size =
td->channel_line_size * (uint64_t)
td->ysize;
1101 if (buf_size < 8 || line_offset > buf_size - 8)
1104 src =
buf + line_offset + 8;
1111 if (data_size <= 0 || data_size > buf_size - line_offset - 8)
1114 td->ysize =
FFMIN(
s->scan_lines_per_block,
s->ymax -
line + 1);
1115 td->xsize =
s->xdelta;
1117 if (
td->xsize * (uint64_t)
s->current_channel_offset > INT_MAX)
1120 td->channel_line_size =
td->xsize *
s->current_channel_offset;
1121 uncompressed_size =
td->channel_line_size * (uint64_t)
td->ysize;
1123 if ((
s->compression ==
EXR_RAW && (data_size != uncompressed_size ||
1124 line_offset > buf_size - uncompressed_size)) ||
1125 (
s->compression !=
EXR_RAW && (data_size > uncompressed_size ||
1126 line_offset > buf_size - data_size))) {
1131 if (data_size < uncompressed_size || s->is_tile) {
1137 if (data_size < uncompressed_size) {
1139 &
td->uncompressed_size, uncompressed_size + 64);
1141 if (!
td->uncompressed_data)
1145 switch (
s->compression) {
1168 src =
td->uncompressed_data;
1172 channel_buffer[0] =
src +
td->xsize *
s->channel_offsets[0];
1173 channel_buffer[1] =
src +
td->xsize *
s->channel_offsets[1];
1174 channel_buffer[2] =
src +
td->xsize *
s->channel_offsets[2];
1175 rgb_channel_count = 3;
1177 channel_buffer[0] =
src +
td->xsize *
s->channel_offsets[1];
1178 rgb_channel_count = 1;
1180 if (
s->channel_offsets[3] >= 0)
1181 channel_buffer[3] =
src +
td->xsize *
s->channel_offsets[3];
1191 for (
c = 0;
c < rgb_channel_count;
c++){
1192 rgb[
c] = channel_buffer[
c];
1195 if (channel_buffer[3])
1196 a = channel_buffer[3];
1198 ptr_x = (uint16_t *) ptr;
1201 memset(ptr_x, 0, bxmin);
1202 ptr_x +=
s->xmin *
s->desc->nb_components;
1207 for (x = 0; x <
td->xsize; x++) {
1210 for (
c = 0;
c < rgb_channel_count;
c++) {
1211 t.
i = bytestream_get_le32(&rgb[
c]);
1212 t.
f = trc_func(t.
f);
1215 if (channel_buffer[3])
1219 for (x = 0; x <
td->xsize; x++) {
1223 for (
c = 0;
c < rgb_channel_count;
c++) {
1224 t.
i = bytestream_get_le32(&rgb[
c]);
1226 t.
f =
powf(t.
f, one_gamma);
1230 if (channel_buffer[3])
1236 for (x = 0; x <
td->xsize; x++) {
1238 for (
c = 0;
c < rgb_channel_count;
c++) {
1239 *ptr_x++ =
s->gamma_table[bytestream_get_le16(&rgb[
c])];
1242 if (channel_buffer[3])
1246 for (x = 0; x <
td->xsize; x++) {
1247 for (
c = 0;
c < rgb_channel_count;
c++) {
1248 *ptr_x++ = bytestream_get_le32(&rgb[
c]) >> 16;
1251 if (channel_buffer[3])
1252 *ptr_x++ = bytestream_get_le32(&
a) >> 16;
1257 memset(ptr_x, 0, axmax);
1259 channel_buffer[0] +=
td->channel_line_size;
1260 channel_buffer[1] +=
td->channel_line_size;
1261 channel_buffer[2] +=
td->channel_line_size;
1262 if (channel_buffer[3])
1263 channel_buffer[3] +=
td->channel_line_size;
1282 const char *value_name,
1283 const char *value_type,
1284 unsigned int minimum_length)
1289 !strcmp(
s->gb.buffer, value_name)) {
1291 s->gb.buffer += strlen(value_name) + 1;
1292 if (!strcmp(
s->gb.buffer, value_type)) {
1293 s->gb.buffer += strlen(value_type) + 1;
1294 var_size = bytestream2_get_le32(&
s->gb);
1300 s->gb.buffer -= strlen(value_name) + 1;
1302 "Unknown data type %s for header variable %s.\n",
1303 value_type, value_name);
1314 int layer_match = 0;
1316 int dup_channels = 0;
1318 s->current_channel_offset = 0;
1325 s->channel_offsets[0] = -1;
1326 s->channel_offsets[1] = -1;
1327 s->channel_offsets[2] = -1;
1328 s->channel_offsets[3] = -1;
1334 s->tile_attr.xSize = -1;
1335 s->tile_attr.ySize = -1;
1344 magic_number = bytestream2_get_le32(&
s->gb);
1345 if (magic_number != 20000630) {
1352 version = bytestream2_get_byte(&
s->gb);
1358 flags = bytestream2_get_le24(&
s->gb);
1375 "chlist", 38)) >= 0) {
1387 int channel_index = -1;
1390 if (strcmp(
s->layer,
"") != 0) {
1391 if (strncmp(ch_gb.
buffer,
s->layer, strlen(
s->layer)) == 0) {
1394 "Channel match layer : %s.\n", ch_gb.
buffer);
1395 ch_gb.
buffer += strlen(
s->layer);
1396 if (*ch_gb.
buffer ==
'.')
1401 "Channel doesn't match layer : %s.\n", ch_gb.
buffer);
1408 if (!strcmp(ch_gb.
buffer,
"R") ||
1409 !strcmp(ch_gb.
buffer,
"X") ||
1410 !strcmp(ch_gb.
buffer,
"U")) {
1413 }
else if (!strcmp(ch_gb.
buffer,
"G") ||
1414 !strcmp(ch_gb.
buffer,
"V")) {
1417 }
else if (!strcmp(ch_gb.
buffer,
"Y")) {
1420 }
else if (!strcmp(ch_gb.
buffer,
"B") ||
1421 !strcmp(ch_gb.
buffer,
"Z") ||
1422 !strcmp(ch_gb.
buffer,
"W")){
1425 }
else if (!strcmp(ch_gb.
buffer,
"A")) {
1429 "Unsupported channel %.256s.\n", ch_gb.
buffer);
1435 bytestream2_get_byte(&ch_gb))
1444 current_pixel_type = bytestream2_get_le32(&ch_gb);
1447 current_pixel_type);
1453 xsub = bytestream2_get_le32(&ch_gb);
1454 ysub = bytestream2_get_le32(&ch_gb);
1456 if (xsub != 1 || ysub != 1) {
1458 "Subsampling %dx%d",
1464 if (channel_index >= 0 &&
s->channel_offsets[channel_index] == -1) {
1466 s->pixel_type != current_pixel_type) {
1468 "RGB channels not of the same depth.\n");
1472 s->pixel_type = current_pixel_type;
1473 s->channel_offsets[channel_index] =
s->current_channel_offset;
1474 }
else if (channel_index >= 0) {
1476 "Multiple channels with index %d.\n", channel_index);
1477 if (++dup_channels > 10) {
1489 channel = &
s->channels[
s->nb_channels - 1];
1490 channel->pixel_type = current_pixel_type;
1494 if (current_pixel_type ==
EXR_HALF) {
1495 s->current_channel_offset += 2;
1497 s->current_channel_offset += 4;
1504 if (
FFMIN3(
s->channel_offsets[0],
1505 s->channel_offsets[1],
1506 s->channel_offsets[2]) < 0) {
1507 if (
s->channel_offsets[0] < 0)
1509 if (
s->channel_offsets[1] < 0)
1511 if (
s->channel_offsets[2] < 0)
1519 s->gb.buffer = ch_gb.
buffer + 1;
1523 int xmin, ymin, xmax, ymax;
1529 xmin = bytestream2_get_le32(&
s->gb);
1530 ymin = bytestream2_get_le32(&
s->gb);
1531 xmax = bytestream2_get_le32(&
s->gb);
1532 ymax = bytestream2_get_le32(&
s->gb);
1534 if (xmin > xmax || ymin > ymax ||
1535 ymax == INT_MAX || xmax == INT_MAX ||
1536 (
unsigned)xmax - xmin >= INT_MAX ||
1537 (
unsigned)ymax - ymin >= INT_MAX) {
1545 s->xdelta = (
s->xmax -
s->xmin) + 1;
1546 s->ydelta = (
s->ymax -
s->ymin) + 1;
1550 "box2i", 34)) >= 0) {
1557 s->w = bytestream2_get_le32(&
s->gb) + 1;
1558 s->h = bytestream2_get_le32(&
s->gb) + 1;
1562 "lineOrder", 25)) >= 0) {
1569 line_order = bytestream2_get_byte(&
s->gb);
1571 if (line_order > 2) {
1579 "float", 31)) >= 0) {
1585 sar = bytestream2_get_le32(&
s->gb);
1589 "compression", 29)) >= 0) {
1596 s->compression = bytestream2_get_byte(&
s->gb);
1599 "Found more than one compression attribute.\n");
1603 "tiledesc", 22)) >= 0) {
1608 "Found tile attribute and scanline flags. Exr will be interpreted as scanline.\n");
1610 s->tile_attr.xSize = bytestream2_get_le32(&
s->gb);
1611 s->tile_attr.ySize = bytestream2_get_le32(&
s->gb);
1613 tileLevel = bytestream2_get_byte(&
s->gb);
1614 s->tile_attr.level_mode = tileLevel & 0x0f;
1615 s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
1619 s->tile_attr.level_mode);
1626 s->tile_attr.level_round);
1633 "string", 1)) >= 0) {
1650 for (
i = 0;
i < 2;
i++)
1651 while (bytestream2_get_byte(&
s->gb) != 0);
1666 if (
s->tile_attr.xSize < 1 ||
s->tile_attr.ySize < 1) {
1679 frame->metadata = metadata;
1700 uint64_t start_offset_table;
1701 uint64_t start_next_scanline;
1709 switch (
s->pixel_type) {
1713 if (
s->channel_offsets[3] >= 0) {
1735 switch (
s->compression) {
1739 s->scan_lines_per_block = 1;
1743 s->scan_lines_per_block = 16;
1748 s->scan_lines_per_block = 32;
1757 if (
s->xmin >
s->xmax ||
1758 s->ymin >
s->ymax ||
1759 s->xdelta !=
s->xmax -
s->xmin + 1 ||
1762 s->ydelta == 0xFFFFFFFF ||
s->xdelta == 0xFFFFFFFF
1774 out_line_size = avctx->
width * 2 *
s->desc->nb_components;
1777 nb_blocks = ((
s->xdelta +
s->tile_attr.xSize - 1) /
s->tile_attr.xSize) *
1778 ((
s->ydelta +
s->tile_attr.ySize - 1) /
s->tile_attr.ySize);
1780 nb_blocks = (
s->ydelta +
s->scan_lines_per_block - 1) /
1781 s->scan_lines_per_block;
1791 if (!
s->is_tile && bytestream2_peek_le64(&
s->gb) == 0) {
1795 start_next_scanline = start_offset_table + nb_blocks * 8;
1798 for (y = 0; y < nb_blocks; y++) {
1800 bytestream2_put_le64(&offset_table_writer, start_next_scanline);
1804 start_next_scanline += (bytestream2_get_le32(&
s->gb) + 8);
1810 s->buf = avpkt->
data;
1811 s->buf_size = avpkt->
size;
1812 ptr = picture->
data[0];
1815 for (y = 0; y <
FFMIN(
s->ymin,
s->h); y++) {
1816 memset(ptr, 0, out_line_size);
1820 s->picture = picture;
1825 if ((
s->ymax+1) < avctx->
height) {
1826 ptr = picture->
data[0] + ((
s->ymax+1) * picture->
linesize[0]);
1827 for (y =
s->ymax + 1; y < avctx->
height; y++) {
1828 memset(ptr, 0, out_line_size);
1844 float one_gamma = 1.0
f /
s->gamma;
1857 for (
i = 0;
i < 65536; ++
i) {
1859 t.
f = trc_func(t.
f);
1863 if (one_gamma > 0.9999
f && one_gamma < 1.0001
f) {
1864 for (
i = 0;
i < 65536; ++
i)
1867 for (
i = 0;
i < 65536; ++
i) {
1873 t.
f =
powf(t.
f, one_gamma);
1882 if (!
s->thread_data)
1894 if (!
s->thread_data)
1919 #define OFFSET(x) offsetof(EXRContext, x)
1920 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1922 {
"layer",
"Set the decoding layer",
OFFSET(layer),
1924 {
"gamma",
"Set the float gamma value when decoding",
OFFSET(gamma),
1928 {
"apply_trc",
"color transfer characteristics to apply to EXR linear input",
OFFSET(apply_trc_type),
1930 {
"bt709",
"BT.709", 0,
1932 {
"gamma",
"gamma", 0,
1934 {
"gamma22",
"BT.470 M", 0,
1936 {
"gamma28",
"BT.470 BG", 0,
1938 {
"smpte170m",
"SMPTE 170 M", 0,
1940 {
"smpte240m",
"SMPTE 240 M", 0,
1942 {
"linear",
"Linear", 0,
1946 {
"log_sqrt",
"Log square root", 0,
1948 {
"iec61966_2_4",
"IEC 61966-2-4", 0,
1950 {
"bt1361",
"BT.1361", 0,
1952 {
"iec61966_2_1",
"IEC 61966-2-1", 0,
1954 {
"bt2020_10bit",
"BT.2020 - 10 bit", 0,
1956 {
"bt2020_12bit",
"BT.2020 - 12 bit", 0,
1958 {
"smpte2084",
"SMPTE ST 2084", 0,
1960 {
"smpte428_1",
"SMPTE ST 428-1", 0,
enum ExrTileLevelRound level_round
#define AV_LOG_WARNING
Something somehow does not look correct.
static av_cold int init(AVCodecContext *avctx)
static int rle_uncompress(EXRContext *ctx, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVColorTransferCharacteristic
Color Transfer Characteristic.
uint8_t * uncompressed_data
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
static uint16_t exr_flt2uint(int32_t v)
Convert from 32-bit float as uint32_t to uint16_t.
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
#define FLOAT_MAX_BIASED_EXP
static int decode_header(EXRContext *s, AVFrame *frame)
static int pxr24_uncompress(EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
static int get_bits_count(const GetBitContext *s)
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
This structure describes decoded (raw) audio or video data.
@ AVCOL_TRC_NB
Not part of ABI.
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
static av_cold int decode_init(AVCodecContext *avctx)
static uint16_t reverse_lut(const uint8_t *bitmap, uint16_t *lut)
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
void * av_mallocz_array(size_t nmemb, size_t size)
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
static const AVOption options[]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
static int huf_uncompress(GetByteContext *gb, uint16_t *dst, int dst_size)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
EXRTileAttribute tile_attr
static void apply_lut(const uint16_t *lut, uint16_t *dst, int dsize)
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
static av_always_inline float av_int2float(uint32_t i)
Reinterpret a 32-bit integer as a float.
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
#define AV_PIX_FMT_GRAY16
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
#define HALF_FLOAT_MAX_BIASED_EXP
static av_cold int decode_end(AVCodecContext *avctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static int zip_uncompress(EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
enum ExrCompr compression
static int check_header_variable(EXRContext *s, const char *value_name, const char *value_type, unsigned int minimum_length)
Check if the variable name corresponds to its data type.
@ AVCOL_TRC_BT1361_ECG
ITU-R BT1361 Extended Colour Gamut.
int current_channel_offset
static int decode_block(AVCodecContext *avctx, void *tdata, int jobnr, int threadnr)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
enum ExrPixelType pixel_type
uint16_t gamma_table[65536]
#define SHORTEST_LONG_RUN
const AVPixFmtDescriptor * desc
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define AV_PIX_FMT_RGBA64
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define LONG_ZEROCODE_RUN
#define SHORT_ZEROCODE_RUN
@ AVCOL_TRC_IEC61966_2_4
IEC 61966-2-4.
avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharacteristic trc)
Determine the function needed to apply the given AVColorTransferCharacteristic to linear input.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
static int huf_decode(const uint64_t *hcode, const HufDec *hdecod, GetByteContext *gb, int nbits, int rlc, int no, uint16_t *out)
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
av_cold void ff_exrdsp_init(ExrDSPContext *c)
#define get_char(c, lc, gb)
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
static void unpack_14(const uint8_t b[14], uint16_t s[16])
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static av_always_inline int bytestream2_tell(GetByteContext *g)
static union av_intfloat32 exr_half2float(uint16_t hf)
Convert a half float as a uint16_t into a full float.
#define HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP
enum ExrPixelType pixel_type
enum ExrTileLevelMode level_mode
EXRThreadData * thread_data
enum AVPictureType pict_type
Picture type of the frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static void wdec14(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
static void wav_decode(uint16_t *in, int nx, int ox, int ny, int oy, uint16_t mx)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have add an init_thread_copy() which re-allocates them for other threads. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. If there are inter-frame dependencies
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
static int huf_build_dec_table(const uint64_t *hcode, int im, int iM, HufDec *hdecod)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
enum AVColorTransferCharacteristic apply_trc_type
static void unpack_3(const uint8_t b[3], uint16_t s[16])
#define AV_LOG_INFO
Standard information.
@ AVCOL_TRC_BT709
also ITU-R BT1361
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
#define get_code(po, rlc, c, lc, gb, out, oe, outb)
#define i(width, name, range_min, range_max)
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
const char * name
Name of the codec implementation.
static uint16_t exr_halflt2uint(uint16_t v)
Convert from 16-bit float as uint16_t to uint16_t.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static int huf_unpack_enc_table(GetByteContext *gb, int32_t im, int32_t iM, uint64_t *hcode)
double(* avpriv_trc_function)(double)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
main external API structure.
static void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
static void huf_canonical_code_table(uint64_t *hcode)
static int shift(int a, int b)
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
static av_always_inline int diff(const uint32_t a, const uint32_t b)
This structure stores compressed data.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int width
picture width / height.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define flags(name, subs,...)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const AVClass exr_class
static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize, int dsize, EXRThreadData *td)
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line