Go to the documentation of this file.
201 unsigned long dest_len = uncompressed_size;
203 if (uncompress(
td->tmp, &dest_len,
src, compressed_size) != Z_OK ||
204 dest_len != uncompressed_size)
209 s->dsp.predictor(
td->tmp, uncompressed_size);
210 s->dsp.reorder_pixels(
td->uncompressed_data,
td->tmp, uncompressed_size);
216 int compressed_size,
int uncompressed_size)
219 const int8_t *
s =
src;
220 int ssize = compressed_size;
221 int dsize = uncompressed_size;
231 if ((dsize -= count) < 0 ||
232 (ssize -= count + 1) < 0)
240 if ((dsize -= count) < 0 ||
260 rle(
td->tmp,
src, compressed_size, uncompressed_size);
264 ctx->dsp.predictor(
td->tmp, uncompressed_size);
265 ctx->dsp.reorder_pixels(
td->uncompressed_data,
td->tmp, uncompressed_size);
270 #define USHORT_RANGE (1 << 16)
271 #define BITMAP_SIZE (1 << 13)
278 if ((
i == 0) || (bitmap[
i >> 3] & (1 << (
i & 7))))
288 static void apply_lut(
const uint16_t *lut, uint16_t *dst,
int dsize)
292 for (
i = 0;
i < dsize; ++
i)
293 dst[
i] = lut[dst[
i]];
296 #define HUF_ENCBITS 16 // literal (value) bit length
297 #define HUF_ENCSIZE ((1 << HUF_ENCBITS) + 1) // encoding table size
301 uint64_t
c, n[59] = { 0 };
308 for (
i = 58;
i > 0; --
i) {
309 uint64_t nc = ((
c + n[
i]) >> 1);
318 freq[
i] = l | (n[l]++ << 6);
322 #define SHORT_ZEROCODE_RUN 59
323 #define LONG_ZEROCODE_RUN 63
324 #define SHORTEST_LONG_RUN (2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN)
325 #define LONGEST_LONG_RUN (255 + SHORTEST_LONG_RUN)
335 for (;
im <= iM;
im++) {
341 if (
im + zerun > iM + 1)
351 if (
im + zerun > iM + 1)
373 for (
int i =
im;
i < iM;
i++) {
375 td->he[j].len =
td->freq[
i] & 63;
376 td->he[j].code =
td->freq[
i] >> 6;
377 if (
td->he[j].len > 32) {
381 if (
td->he[j].len > 0)
392 if (
td->run_sym == -1) {
397 td->he[j].sym =
td->run_sym;
398 td->he[j].len =
td->freq[iM] & 63;
399 if (
td->he[j].len > 32) {
403 td->he[j].code =
td->freq[iM] >> 6;
408 &
td->he[0].len,
sizeof(
td->he[0]),
sizeof(
td->he[0].len),
409 &
td->he[0].code,
sizeof(
td->he[0]),
sizeof(
td->he[0].code),
410 &
td->he[0].sym,
sizeof(
td->he[0]),
sizeof(
td->he[0].sym), 0);
414 int no, uint16_t *
out)
427 if (oe == 0 || oe +
run > no)
445 uint16_t *dst,
int dst_size)
451 im = bytestream2_get_le32(gb);
452 iM = bytestream2_get_le32(gb);
454 nBits = bytestream2_get_le32(gb);
465 if (!
td->freq || !
td->he) {
481 return huf_decode(&
td->vlc, gb, nBits,
td->run_sym, dst_size, dst);
484 static inline void wdec14(uint16_t l, uint16_t
h, uint16_t *
a, uint16_t *
b)
489 int ai = ls + (hi & 1) + (hi >> 1);
491 int16_t bs = ai - hi;
498 #define A_OFFSET (1 << (NBITS - 1))
499 #define MOD_MASK ((1 << NBITS) - 1)
501 static inline void wdec16(uint16_t l, uint16_t
h, uint16_t *
a, uint16_t *
b)
512 int ny,
int oy, uint16_t mx)
514 int w14 = (mx < (1 << 14));
515 int n = (nx > ny) ? ny : nx;
528 uint16_t *ey =
in + oy * (ny - p2);
529 uint16_t i00, i01, i10, i11;
535 for (; py <= ey; py += oy2) {
537 uint16_t *ex = py + ox * (nx - p2);
539 for (; px <= ex; px += ox2) {
540 uint16_t *p01 = px + ox1;
541 uint16_t *p10 = px + oy1;
542 uint16_t *p11 = p10 + ox1;
545 wdec14(*px, *p10, &i00, &i10);
546 wdec14(*p01, *p11, &i01, &i11);
547 wdec14(i00, i01, px, p01);
548 wdec14(i10, i11, p10, p11);
550 wdec16(*px, *p10, &i00, &i10);
551 wdec16(*p01, *p11, &i01, &i11);
552 wdec16(i00, i01, px, p01);
553 wdec16(i10, i11, p10, p11);
558 uint16_t *p10 = px + oy1;
561 wdec14(*px, *p10, &i00, p10);
563 wdec16(*px, *p10, &i00, p10);
571 uint16_t *ex = py + ox * (nx - p2);
573 for (; px <= ex; px += ox2) {
574 uint16_t *p01 = px + ox1;
577 wdec14(*px, *p01, &i00, p01);
579 wdec16(*px, *p01, &i00, p01);
594 uint16_t maxval, min_non_zero, max_non_zero;
596 uint16_t *
tmp = (uint16_t *)
td->tmp;
608 if (!
td->bitmap || !
td->lut) {
615 min_non_zero = bytestream2_get_le16(&gb);
616 max_non_zero = bytestream2_get_le16(&gb);
622 if (min_non_zero <= max_non_zero)
624 max_non_zero - min_non_zero + 1);
625 memset(
td->bitmap + max_non_zero + 1, 0,
BITMAP_SIZE - max_non_zero - 1);
635 for (
i = 0;
i <
s->nb_channels;
i++) {
643 for (j = 0; j < pixel_half_size; j++)
645 td->xsize * pixel_half_size, maxval);
646 ptr +=
td->xsize *
td->ysize * pixel_half_size;
651 out = (uint16_t *)
td->uncompressed_data;
654 for (j = 0; j <
s->nb_channels; j++) {
661 in =
tmp + tmp_offset *
td->xsize *
td->ysize +
i *
td->xsize * pixel_half_size;
662 tmp_offset += pixel_half_size;
665 s->bbdsp.bswap16_buf(
out,
in,
td->xsize * pixel_half_size);
667 memcpy(
out,
in,
td->xsize * 2 * pixel_half_size);
669 out +=
td->xsize * pixel_half_size;
677 int compressed_size,
int uncompressed_size,
680 unsigned long dest_len, expected_len = 0;
685 for (
i = 0;
i <
s->nb_channels;
i++) {
687 expected_len += (
td->xsize *
td->ysize * 3);
688 }
else if (
s->channels[
i].pixel_type ==
EXR_HALF) {
689 expected_len += (
td->xsize *
td->ysize * 2);
691 expected_len += (
td->xsize *
td->ysize * 4);
695 dest_len = expected_len;
697 if (uncompress(
td->tmp, &dest_len,
src, compressed_size) != Z_OK) {
699 }
else if (dest_len != expected_len) {
703 out =
td->uncompressed_data;
704 for (
i = 0;
i <
td->ysize;
i++)
705 for (
c = 0;
c <
s->nb_channels;
c++) {
713 ptr[1] = ptr[0] +
td->xsize;
714 ptr[2] = ptr[1] +
td->xsize;
715 in = ptr[2] +
td->xsize;
717 for (j = 0; j <
td->xsize; ++j) {
718 uint32_t
diff = ((unsigned)*(ptr[0]++) << 24) |
719 (*(ptr[1]++) << 16) |
727 ptr[1] = ptr[0] +
td->xsize;
728 in = ptr[1] +
td->xsize;
729 for (j = 0; j <
td->xsize; j++) {
730 uint32_t
diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
738 ptr[1] = ptr[0] +
s->xdelta;
739 ptr[2] = ptr[1] +
s->xdelta;
740 ptr[3] = ptr[2] +
s->xdelta;
741 in = ptr[3] +
s->xdelta;
743 for (j = 0; j <
s->xdelta; ++j) {
744 uint32_t
diff = ((uint32_t)*(ptr[0]++) << 24) |
745 (*(ptr[1]++) << 16) |
746 (*(ptr[2]++) << 8 ) |
762 unsigned short shift = (
b[ 2] >> 2) & 15;
763 unsigned short bias = (0x20 <<
shift);
766 s[ 0] = (
b[0] << 8) |
b[1];
768 s[ 4] =
s[ 0] + ((((
b[ 2] << 4) | (
b[ 3] >> 4)) & 0x3f) <<
shift) - bias;
769 s[ 8] =
s[ 4] + ((((
b[ 3] << 2) | (
b[ 4] >> 6)) & 0x3f) <<
shift) - bias;
770 s[12] =
s[ 8] + ((
b[ 4] & 0x3f) <<
shift) - bias;
772 s[ 1] =
s[ 0] + ((
b[ 5] >> 2) <<
shift) - bias;
773 s[ 5] =
s[ 4] + ((((
b[ 5] << 4) | (
b[ 6] >> 4)) & 0x3f) <<
shift) - bias;
774 s[ 9] =
s[ 8] + ((((
b[ 6] << 2) | (
b[ 7] >> 6)) & 0x3f) <<
shift) - bias;
775 s[13] =
s[12] + ((
b[ 7] & 0x3f) <<
shift) - bias;
777 s[ 2] =
s[ 1] + ((
b[ 8] >> 2) <<
shift) - bias;
778 s[ 6] =
s[ 5] + ((((
b[ 8] << 4) | (
b[ 9] >> 4)) & 0x3f) <<
shift) - bias;
779 s[10] =
s[ 9] + ((((
b[ 9] << 2) | (
b[10] >> 6)) & 0x3f) <<
shift) - bias;
780 s[14] =
s[13] + ((
b[10] & 0x3f) <<
shift) - bias;
782 s[ 3] =
s[ 2] + ((
b[11] >> 2) <<
shift) - bias;
783 s[ 7] =
s[ 6] + ((((
b[11] << 4) | (
b[12] >> 4)) & 0x3f) <<
shift) - bias;
784 s[11] =
s[10] + ((((
b[12] << 2) | (
b[13] >> 6)) & 0x3f) <<
shift) - bias;
785 s[15] =
s[14] + ((
b[13] & 0x3f) <<
shift) - bias;
787 for (
i = 0;
i < 16; ++
i) {
799 s[0] = (
b[0] << 8) |
b[1];
806 for (
i = 1;
i < 16;
i++)
813 const int8_t *sr =
src;
814 int stay_to_uncompress = compressed_size;
815 int nb_b44_block_w, nb_b44_block_h;
816 int index_tl_x, index_tl_y, index_out, index_tmp;
817 uint16_t tmp_buffer[16];
819 int target_channel_offset = 0;
822 nb_b44_block_w =
td->xsize / 4;
823 if ((
td->xsize % 4) != 0)
826 nb_b44_block_h =
td->ysize / 4;
827 if ((
td->ysize % 4) != 0)
830 for (
c = 0;
c <
s->nb_channels;
c++) {
832 for (iY = 0; iY < nb_b44_block_h; iY++) {
833 for (iX = 0; iX < nb_b44_block_w; iX++) {
834 if (stay_to_uncompress < 3) {
839 if (
src[compressed_size - stay_to_uncompress + 2] == 0xfc) {
842 stay_to_uncompress -= 3;
844 if (stay_to_uncompress < 14) {
850 stay_to_uncompress -= 14;
857 for (y = index_tl_y; y <
FFMIN(index_tl_y + 4,
td->ysize); y++) {
858 for (x = index_tl_x; x <
FFMIN(index_tl_x + 4,
td->xsize); x++) {
859 index_out = target_channel_offset *
td->xsize + y *
td->channel_line_size + 2 * x;
860 index_tmp = (y-index_tl_y) * 4 + (x-index_tl_x);
861 td->uncompressed_data[index_out] = tmp_buffer[index_tmp] & 0xff;
862 td->uncompressed_data[index_out + 1] = tmp_buffer[index_tmp] >> 8;
867 target_channel_offset += 2;
869 if (stay_to_uncompress < td->ysize *
td->xsize * 4) {
874 for (y = 0; y <
td->ysize; y++) {
875 index_out = target_channel_offset *
td->xsize + y *
td->channel_line_size;
876 memcpy(&
td->uncompressed_data[index_out], sr,
td->xsize * 4);
879 target_channel_offset += 4;
881 stay_to_uncompress -=
td->ysize *
td->xsize * 4;
897 }
else if ((
val >> 8) == 0xff) {
922 float alpha[4], beta[4], theta[4], gamma[4];
940 gamma[0] = theta[0] + theta[1];
941 gamma[1] = theta[3] + theta[2];
942 gamma[2] = theta[3] - theta[2];
943 gamma[3] = theta[0] - theta[1];
945 blk[0 *
step] = gamma[0] + beta[0];
946 blk[1 *
step] = gamma[1] + beta[1];
947 blk[2 *
step] = gamma[2] + beta[2];
948 blk[3 *
step] = gamma[3] + beta[3];
950 blk[4 *
step] = gamma[3] - beta[3];
951 blk[5 *
step] = gamma[2] - beta[2];
952 blk[6 *
step] = gamma[1] - beta[1];
953 blk[7 *
step] = gamma[0] - beta[0];
958 for (
int i = 0;
i < 8;
i++)
961 for (
int i = 0;
i < 8;
i++) {
968 float *
b,
float *
g,
float *
r)
970 *
r = y + 1.5747f * v;
971 *
g = y - 0.1873f *
u - 0.4682f * v;
972 *
b = y + 1.8556f *
u;
982 const float log_base =
expf(2.2
f * scale);
991 int64_t
version, lo_usize, lo_size;
992 int64_t ac_size, dc_size, rle_usize, rle_csize, rle_raw_size;
993 int64_t ac_count, dc_count, ac_compression;
994 const int dc_w =
td->xsize >> 3;
995 const int dc_h =
td->ysize >> 3;
999 if (compressed_size <= 88)
1017 if ( compressed_size < (uint64_t)(lo_size | ac_size | dc_size | rle_csize) || compressed_size < 88LL + lo_size + ac_size + dc_size + rle_csize
1018 || ac_count > (uint64_t)INT_MAX/2
1023 skip = bytestream2_get_le16(&gb);
1030 if (lo_usize > uncompressed_size)
1036 unsigned long dest_len;
1039 if (ac_count > 3LL *
td->xsize *
s->scan_lines_per_block)
1042 dest_len = ac_count * 2LL;
1048 switch (ac_compression) {
1055 if (uncompress(
td->ac_data, &dest_len, agb.
buffer, ac_size) != Z_OK ||
1056 dest_len != ac_count * 2LL)
1067 unsigned long dest_len;
1070 if (dc_count != dc_w * dc_h * 3)
1073 dest_len = dc_count * 2LL;
1079 if (uncompress(
td->dc_data +
FFALIGN(dest_len, 64), &dest_len, agb.
buffer, dc_size) != Z_OK ||
1080 (dest_len != dc_count * 2LL))
1083 s->dsp.predictor(
td->dc_data +
FFALIGN(dest_len, 64), dest_len);
1084 s->dsp.reorder_pixels(
td->dc_data,
td->dc_data +
FFALIGN(dest_len, 64), dest_len);
1089 if (rle_raw_size > 0 && rle_csize > 0 && rle_usize > 0) {
1090 unsigned long dest_len = rle_usize;
1097 if (!
td->rle_raw_data)
1100 if (uncompress(
td->rle_data, &dest_len, gb.
buffer, rle_csize) != Z_OK ||
1101 (dest_len != rle_usize))
1104 ret =
rle(
td->rle_raw_data,
td->rle_data, rle_usize, rle_raw_size);
1112 for (
int y = 0; y <
td->ysize; y += 8) {
1113 for (
int x = 0; x <
td->xsize; x += 8) {
1114 memset(
td->block, 0,
sizeof(
td->block));
1116 for (
int j = 0; j < 3; j++) {
1118 const int idx = (x >> 3) + (y >> 3) * dc_w + dc_w * dc_h * j;
1119 uint16_t *
dc = (uint16_t *)
td->dc_data;
1123 s->exponenttable,
s->offsettable);
1125 block[0] = dc_val.f;
1131 const float scale =
s->pixel_type ==
EXR_FLOAT ? 2.f : 1.f;
1132 const int o =
s->nb_channels == 4;
1133 float *bo = ((
float *)
td->uncompressed_data) +
1134 y *
td->xsize *
s->nb_channels +
td->xsize * (o + 0) + x;
1135 float *go = ((
float *)
td->uncompressed_data) +
1136 y *
td->xsize *
s->nb_channels +
td->xsize * (o + 1) + x;
1137 float *ro = ((
float *)
td->uncompressed_data) +
1138 y *
td->xsize *
s->nb_channels +
td->xsize * (o + 2) + x;
1139 float *yb =
td->block[0];
1140 float *
ub =
td->block[1];
1141 float *vb =
td->block[2];
1143 for (
int yy = 0; yy < 8; yy++) {
1144 for (
int xx = 0; xx < 8; xx++) {
1145 const int idx = xx + yy * 8;
1147 convert(yb[idx],
ub[idx], vb[idx], &bo[xx], &go[xx], &ro[xx]);
1154 bo +=
td->xsize *
s->nb_channels;
1155 go +=
td->xsize *
s->nb_channels;
1156 ro +=
td->xsize *
s->nb_channels;
1162 if (
s->nb_channels < 4)
1165 for (
int y = 0; y <
td->ysize &&
td->rle_raw_data; y++) {
1166 uint32_t *ao = ((uint32_t *)
td->uncompressed_data) + y *
td->xsize *
s->nb_channels;
1168 uint8_t *ai1 =
td->rle_raw_data + y *
td->xsize + rle_raw_size / 2;
1170 for (
int x = 0; x <
td->xsize; x++) {
1171 uint16_t ha = ai0[x] | (ai1[x] << 8);
1173 ao[x] =
half2float(ha,
s->mantissatable,
s->exponenttable,
s->offsettable);
1181 int jobnr,
int threadnr)
1186 const uint8_t *channel_buffer[4] = { 0 };
1188 uint64_t line_offset, uncompressed_size;
1192 uint64_t tile_x, tile_y, tile_level_x, tile_level_y;
1195 int bxmin = 0, axmax = 0, window_xoffset = 0;
1196 int window_xmin, window_xmax, window_ymin, window_ymax;
1197 int data_xoffset, data_yoffset, data_window_offset, xsize, ysize;
1198 int i, x, buf_size =
s->buf_size;
1199 int c, rgb_channel_count;
1200 float one_gamma = 1.0f /
s->gamma;
1204 line_offset =
AV_RL64(
s->gb.buffer + jobnr * 8);
1207 if (buf_size < 20 || line_offset > buf_size - 20)
1210 src = buf + line_offset + 20;
1211 if (
s->is_multipart)
1220 if (data_size <= 0 || data_size > buf_size - line_offset - 20)
1223 if (tile_level_x || tile_level_y) {
1228 if (tile_x &&
s->tile_attr.xSize + (int64_t)
FFMAX(
s->xmin, 0) >= INT_MAX / tile_x )
1230 if (tile_y &&
s->tile_attr.ySize + (int64_t)
FFMAX(
s->ymin, 0) >= INT_MAX / tile_y )
1233 line =
s->ymin +
s->tile_attr.ySize * tile_y;
1234 col =
s->tile_attr.xSize * tile_x;
1237 s->xmin + col < s->xmin ||
s->xmin + col >
s->xmax)
1240 td->ysize =
FFMIN(
s->tile_attr.ySize,
s->ydelta - tile_y *
s->tile_attr.ySize);
1241 td->xsize =
FFMIN(
s->tile_attr.xSize,
s->xdelta - tile_x *
s->tile_attr.xSize);
1243 if (
td->xsize * (uint64_t)
s->current_channel_offset > INT_MAX)
1246 td->channel_line_size =
td->xsize *
s->current_channel_offset;
1247 uncompressed_size =
td->channel_line_size * (uint64_t)
td->ysize;
1249 if (buf_size < 8 || line_offset > buf_size - 8)
1252 src = buf + line_offset + 8;
1253 if (
s->is_multipart)
1261 if (data_size <= 0 || data_size > buf_size - line_offset - 8)
1264 td->ysize =
FFMIN(
s->scan_lines_per_block,
s->ymax -
line + 1);
1265 td->xsize =
s->xdelta;
1267 if (
td->xsize * (uint64_t)
s->current_channel_offset > INT_MAX)
1270 td->channel_line_size =
td->xsize *
s->current_channel_offset;
1271 uncompressed_size =
td->channel_line_size * (uint64_t)
td->ysize;
1273 if ((
s->compression ==
EXR_RAW && (data_size != uncompressed_size ||
1274 line_offset > buf_size - uncompressed_size)) ||
1275 (
s->compression !=
EXR_RAW && (data_size > uncompressed_size ||
1276 line_offset > buf_size - data_size))) {
1285 xsize = window_xmax - window_xmin;
1286 ysize = window_ymax - window_ymin;
1289 if (xsize <= 0 || ysize <= 0)
1296 window_xoffset =
FFMAX(0,
s->xmin);
1298 bxmin = window_xoffset *
step;
1302 if(col +
td->xsize ==
s->xdelta) {
1303 window_xmax = avctx->
width;
1308 if (data_size < uncompressed_size || s->is_tile) {
1314 if (data_size < uncompressed_size) {
1316 &
td->uncompressed_size, uncompressed_size + 64);
1318 if (!
td->uncompressed_data)
1322 switch (
s->compression) {
1349 src =
td->uncompressed_data;
1355 data_window_offset = (data_yoffset *
td->channel_line_size) + data_xoffset;
1358 channel_buffer[0] =
src + (
td->xsize *
s->channel_offsets[0]) + data_window_offset;
1359 channel_buffer[1] =
src + (
td->xsize *
s->channel_offsets[1]) + data_window_offset;
1360 channel_buffer[2] =
src + (
td->xsize *
s->channel_offsets[2]) + data_window_offset;
1361 rgb_channel_count = 3;
1363 channel_buffer[0] =
src + (
td->xsize *
s->channel_offsets[1]) + data_window_offset;
1364 rgb_channel_count = 1;
1366 if (
s->channel_offsets[3] >= 0)
1367 channel_buffer[3] =
src + (
td->xsize *
s->channel_offsets[3]) + data_window_offset;
1371 int channel_count =
s->channel_offsets[3] >= 0 ? 4 : rgb_channel_count;
1373 channel_buffer[1] = channel_buffer[0];
1374 channel_buffer[2] = channel_buffer[0];
1377 for (
c = 0;
c < channel_count;
c++) {
1378 int plane =
s->desc->comp[
c].plane;
1379 ptr = p->
data[plane] + window_ymin * p->
linesize[plane] + (window_xmin * 4);
1381 for (
i = 0;
i < ysize;
i++, ptr += p->
linesize[plane]) {
1385 src = channel_buffer[
c];
1389 memset(ptr_x, 0, bxmin);
1390 ptr_x += window_xoffset;
1397 if (trc_func &&
c < 3) {
1398 for (x = 0; x < xsize; x++) {
1399 t.
i = bytestream_get_le32(&
src);
1400 t.
f = trc_func(t.
f);
1403 }
else if (one_gamma != 1.
f) {
1404 for (x = 0; x < xsize; x++) {
1405 t.
i = bytestream_get_le32(&
src);
1406 if (t.
f > 0.0f &&
c < 3)
1407 t.
f =
powf(t.
f, one_gamma);
1411 for (x = 0; x < xsize; x++) {
1412 t.
i = bytestream_get_le32(&
src);
1418 if (
c < 3 || !trc_func) {
1419 for (x = 0; x < xsize; x++) {
1420 *ptr_x++ =
s->gamma_table[bytestream_get_le16(&
src)];
1423 for (x = 0; x < xsize; x++) {
1434 memset(ptr_x, 0, axmax);
1435 channel_buffer[
c] +=
td->channel_line_size;
1441 ptr = p->
data[0] + window_ymin * p->
linesize[0] + (window_xmin *
s->desc->nb_components * 2);
1443 for (
i = 0;
i < ysize;
i++, ptr += p->
linesize[0]) {
1449 for (
c = 0;
c < rgb_channel_count;
c++) {
1450 rgb[
c] = channel_buffer[
c];
1453 if (channel_buffer[3])
1454 a = channel_buffer[3];
1456 ptr_x = (uint16_t *) ptr;
1459 memset(ptr_x, 0, bxmin);
1460 ptr_x += window_xoffset *
s->desc->nb_components;
1462 for (x = 0; x < xsize; x++) {
1463 for (
c = 0;
c < rgb_channel_count;
c++) {
1464 *ptr_x++ = bytestream_get_le32(&
rgb[
c]) >> 16;
1467 if (channel_buffer[3])
1468 *ptr_x++ = bytestream_get_le32(&
a) >> 16;
1472 memset(ptr_x, 0, axmax);
1474 channel_buffer[0] +=
td->channel_line_size;
1475 channel_buffer[1] +=
td->channel_line_size;
1476 channel_buffer[2] +=
td->channel_line_size;
1477 if (channel_buffer[3])
1478 channel_buffer[3] +=
td->channel_line_size;
1490 if (!bytestream2_peek_byte(gb))
1494 for (
int i = 0;
i < 2;
i++)
1495 while (bytestream2_get_byte(gb) != 0);
1515 const char *value_name,
1516 const char *value_type,
1517 unsigned int minimum_length)
1523 !strcmp(gb->
buffer, value_name)) {
1525 gb->
buffer += strlen(value_name) + 1;
1526 if (!strcmp(gb->
buffer, value_type)) {
1527 gb->
buffer += strlen(value_type) + 1;
1528 var_size = bytestream2_get_le32(gb);
1534 gb->
buffer -= strlen(value_name) + 1;
1536 "Unknown data type %s for header variable %s.\n",
1537 value_type, value_name);
1549 int layer_match = 0;
1551 int dup_channels = 0;
1553 s->current_channel_offset = 0;
1560 s->channel_offsets[0] = -1;
1561 s->channel_offsets[1] = -1;
1562 s->channel_offsets[2] = -1;
1563 s->channel_offsets[3] = -1;
1569 s->tile_attr.xSize = -1;
1570 s->tile_attr.ySize = -1;
1572 s->is_multipart = 0;
1574 s->current_part = 0;
1581 magic_number = bytestream2_get_le32(gb);
1582 if (magic_number != 20000630) {
1589 version = bytestream2_get_byte(gb);
1595 flags = bytestream2_get_le24(gb);
1600 s->is_multipart = 1;
1610 while (
s->is_multipart &&
s->current_part <
s->selected_part &&
1612 if (bytestream2_peek_byte(gb)) {
1616 if (!bytestream2_peek_byte(gb))
1623 if (!bytestream2_peek_byte(gb)) {
1624 if (!
s->is_multipart)
1627 if (
s->current_part ==
s->selected_part) {
1629 if (bytestream2_peek_byte(gb)) {
1633 if (!bytestream2_peek_byte(gb))
1638 if (!bytestream2_peek_byte(gb))
1644 "chlist", 38)) >= 0) {
1656 int channel_index = -1;
1659 if (strcmp(
s->layer,
"") != 0) {
1660 if (strncmp(ch_gb.
buffer,
s->layer, strlen(
s->layer)) == 0) {
1663 "Channel match layer : %s.\n", ch_gb.
buffer);
1664 ch_gb.
buffer += strlen(
s->layer);
1665 if (*ch_gb.
buffer ==
'.')
1670 "Channel doesn't match layer : %s.\n", ch_gb.
buffer);
1698 "Unsupported channel %.256s.\n", ch_gb.
buffer);
1704 bytestream2_get_byte(&ch_gb))
1713 current_pixel_type = bytestream2_get_le32(&ch_gb);
1716 current_pixel_type);
1722 xsub = bytestream2_get_le32(&ch_gb);
1723 ysub = bytestream2_get_le32(&ch_gb);
1725 if (xsub != 1 || ysub != 1) {
1727 "Subsampling %dx%d",
1733 if (channel_index >= 0 &&
s->channel_offsets[channel_index] == -1) {
1735 s->pixel_type != current_pixel_type) {
1737 "RGB channels not of the same depth.\n");
1741 s->pixel_type = current_pixel_type;
1742 s->channel_offsets[channel_index] =
s->current_channel_offset;
1743 }
else if (channel_index >= 0) {
1745 "Multiple channels with index %d.\n", channel_index);
1746 if (++dup_channels > 10) {
1758 channel = &
s->channels[
s->nb_channels - 1];
1759 channel->pixel_type = current_pixel_type;
1763 if (current_pixel_type ==
EXR_HALF) {
1764 s->current_channel_offset += 2;
1766 s->current_channel_offset += 4;
1773 if (
FFMIN3(
s->channel_offsets[0],
1774 s->channel_offsets[1],
1775 s->channel_offsets[2]) < 0) {
1776 if (
s->channel_offsets[0] < 0)
1778 if (
s->channel_offsets[1] < 0)
1780 if (
s->channel_offsets[2] < 0)
1792 int xmin, ymin, xmax, ymax;
1798 xmin = bytestream2_get_le32(gb);
1799 ymin = bytestream2_get_le32(gb);
1800 xmax = bytestream2_get_le32(gb);
1801 ymax = bytestream2_get_le32(gb);
1803 if (xmin > xmax || ymin > ymax ||
1804 ymax == INT_MAX || xmax == INT_MAX ||
1805 (
unsigned)xmax - xmin >= INT_MAX ||
1806 (
unsigned)ymax - ymin >= INT_MAX) {
1814 s->xdelta = (
s->xmax -
s->xmin) + 1;
1815 s->ydelta = (
s->ymax -
s->ymin) + 1;
1819 "box2i", 34)) >= 0) {
1827 sx = bytestream2_get_le32(gb);
1828 sy = bytestream2_get_le32(gb);
1829 dx = bytestream2_get_le32(gb);
1830 dy = bytestream2_get_le32(gb);
1832 s->w = (unsigned)dx - sx + 1;
1833 s->h = (unsigned)dy - sy + 1;
1837 "lineOrder", 25)) >= 0) {
1844 line_order = bytestream2_get_byte(gb);
1846 if (line_order > 2) {
1854 "float", 31)) >= 0) {
1860 s->sar = bytestream2_get_le32(gb);
1864 "compression", 29)) >= 0) {
1871 s->compression = bytestream2_get_byte(gb);
1875 "Found more than one compression attribute.\n");
1880 "tiledesc", 22)) >= 0) {
1885 "Found tile attribute and scanline flags. Exr will be interpreted as scanline.\n");
1887 s->tile_attr.xSize = bytestream2_get_le32(gb);
1888 s->tile_attr.ySize = bytestream2_get_le32(gb);
1890 tileLevel = bytestream2_get_byte(gb);
1891 s->tile_attr.level_mode = tileLevel & 0x0f;
1892 s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
1896 s->tile_attr.level_mode);
1903 s->tile_attr.level_round);
1910 "string", 1)) >= 0) {
1918 "rational", 33)) >= 0) {
1924 s->avctx->framerate.num = bytestream2_get_le32(gb);
1925 s->avctx->framerate.den = bytestream2_get_le32(gb);
1931 s->chunk_count = bytestream2_get_le32(gb);
1935 "string", 16)) >= 0) {
1939 if (strncmp(
"scanlineimage",
key, var_size) &&
1940 strncmp(
"tiledimage",
key, var_size))
1945 "preview", 16)) >= 0) {
1946 uint32_t pw = bytestream2_get_le32(gb);
1947 uint32_t ph = bytestream2_get_le32(gb);
1948 int64_t psize = 4LL * pw * ph;
1973 bytestream2_peek_byte(gb) &&
i < 255) {
1974 name[
i++] = bytestream2_get_byte(gb);
1980 bytestream2_peek_byte(gb) &&
i < 255) {
1981 type[
i++] = bytestream2_get_byte(gb);
1984 size = bytestream2_get_le32(gb);
1987 if (!strcmp(
type,
"string"))
1999 if (
s->tile_attr.xSize < 1 ||
s->tile_attr.ySize < 1) {
2012 frame->metadata = metadata;
2031 int i, y,
ret, ymax;
2035 uint64_t start_offset_table;
2036 uint64_t start_next_scanline;
2046 s->current_channel_offset *= 2;
2047 for (
int i = 0;
i < 4;
i++)
2048 s->channel_offsets[
i] *= 2;
2051 switch (
s->pixel_type) {
2054 if (
s->channel_offsets[3] >= 0) {
2070 if (
s->channel_offsets[3] >= 0) {
2092 switch (
s->compression) {
2096 s->scan_lines_per_block = 1;
2100 s->scan_lines_per_block = 16;
2106 s->scan_lines_per_block = 32;
2109 s->scan_lines_per_block = 256;
2118 if (
s->xmin >
s->xmax ||
s->ymin >
s->ymax ||
2119 s->ydelta == 0xFFFFFFFF ||
s->xdelta == 0xFFFFFFFF) {
2134 planes =
s->desc->nb_components;
2135 out_line_size = avctx->
width * 4;
2138 out_line_size = avctx->
width * 2 *
s->desc->nb_components;
2142 nb_blocks = ((
s->xdelta +
s->tile_attr.xSize - 1) /
s->tile_attr.xSize) *
2143 ((
s->ydelta +
s->tile_attr.ySize - 1) /
s->tile_attr.ySize);
2145 nb_blocks = (
s->ydelta +
s->scan_lines_per_block - 1) /
2146 s->scan_lines_per_block;
2156 if (!
s->is_tile && bytestream2_peek_le64(gb) == 0) {
2160 start_next_scanline = start_offset_table + nb_blocks * 8;
2163 for (y = 0; y < nb_blocks; y++) {
2165 bytestream2_put_le64(&offset_table_writer, start_next_scanline);
2169 start_next_scanline += (bytestream2_get_le32(gb) + 8);
2175 s->buf = avpkt->
data;
2176 s->buf_size = avpkt->
size;
2180 ptr = picture->
data[
i];
2181 for (y = 0; y <
FFMIN(
s->ymin,
s->h); y++) {
2182 memset(ptr, 0, out_line_size);
2187 s->picture = picture;
2191 ymax =
FFMAX(0,
s->ymax + 1);
2193 if (ymax < avctx->
height)
2196 for (y = ymax; y < avctx->
height; y++) {
2197 memset(ptr, 0, out_line_size);
2213 float one_gamma = 1.0
f /
s->gamma;
2228 for (
i = 0;
i < 65536; ++
i) {
2229 t.
i =
half2float(
i,
s->mantissatable,
s->exponenttable,
s->offsettable);
2230 t.
f = trc_func(t.
f);
2231 s->gamma_table[
i] = t;
2234 if (one_gamma > 0.9999
f && one_gamma < 1.0001
f) {
2235 for (
i = 0;
i < 65536; ++
i) {
2236 s->gamma_table[
i].i =
half2float(
i,
s->mantissatable,
s->exponenttable,
s->offsettable);
2239 for (
i = 0;
i < 65536; ++
i) {
2240 t.
i =
half2float(
i,
s->mantissatable,
s->exponenttable,
s->offsettable);
2243 s->gamma_table[
i] = t;
2245 t.
f =
powf(t.
f, one_gamma);
2246 s->gamma_table[
i] = t;
2254 if (!
s->thread_data)
2285 #define OFFSET(x) offsetof(EXRContext, x)
2286 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2288 {
"layer",
"Set the decoding layer",
OFFSET(layer),
2290 {
"part",
"Set the decoding part",
OFFSET(selected_part),
2292 {
"gamma",
"Set the float gamma value when decoding",
OFFSET(gamma),
2296 {
"apply_trc",
"color transfer characteristics to apply to EXR linear input",
OFFSET(apply_trc_type),
2298 {
"bt709",
"BT.709", 0,
2300 {
"gamma",
"gamma", 0,
2302 {
"gamma22",
"BT.470 M", 0,
2304 {
"gamma28",
"BT.470 BG", 0,
2306 {
"smpte170m",
"SMPTE 170 M", 0,
2308 {
"smpte240m",
"SMPTE 240 M", 0,
2310 {
"linear",
"Linear", 0,
2314 {
"log_sqrt",
"Log square root", 0,
2316 {
"iec61966_2_4",
"IEC 61966-2-4", 0,
2318 {
"bt1361",
"BT.1361", 0,
2320 {
"iec61966_2_1",
"IEC 61966-2-1", 0,
2322 {
"bt2020_10bit",
"BT.2020 - 10 bit", 0,
2324 {
"bt2020_12bit",
"BT.2020 - 12 bit", 0,
2326 {
"smpte2084",
"SMPTE ST 2084", 0,
2328 {
"smpte428_1",
"SMPTE ST 428-1", 0,
static int dwa_uncompress(EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
enum ExrTileLevelRound level_round
#define AV_LOG_WARNING
Something somehow does not look correct.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
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)
static int get_bits_left(GetBitContext *gb)
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.
#define u(width, name, range_min, range_max)
uint8_t * uncompressed_data
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
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)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static int get_bits_count(const GetBitContext *s)
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
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.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
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)
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static int huf_uncompress(EXRContext *s, EXRThreadData *td, GetByteContext *gb, uint16_t *dst, int dst_size)
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
static const AVOption options[]
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int rle(uint8_t *dst, const uint8_t *src, int compressed_size, int uncompressed_size)
static void convert(float y, float u, float v, float *b, float *g, float *r)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
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()
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 so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in AVCodec caps_internal and use ff_thread_get_buffer() to allocate frames. The frames must then be freed with ff_thread_release_buffer(). Otherwise decode directly into the user-supplied frames. Call ff_thread_report_progress() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
static double val(void *priv, double ch)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
#define AV_PIX_FMT_GRAY16
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
static __device__ float fabsf(float a)
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
static float to_linear(float x, float scale)
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 void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
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.
static void huf_canonical_code_table(uint64_t *freq)
@ 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
void ff_free_vlc(VLC *vlc)
#define SHORTEST_LONG_RUN
static void skip_header_chunk(EXRContext *s)
#define AV_PIX_FMT_GRAYF32
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
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 av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
static void half2float_table(uint32_t *mantissatable, uint32_t *exponenttable, uint16_t *offsettable)
av_cold void ff_exrdsp_init(ExrDSPContext *c)
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
static void unpack_14(const uint8_t b[14], uint16_t s[16])
static int ac_uncompress(EXRContext *s, GetByteContext *gb, float *block)
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_get_bytes_left(GetByteContext *g)
static av_always_inline int bytestream2_tell(GetByteContext *g)
enum ExrPixelType pixel_type
enum ExrTileLevelMode level_mode
EXRThreadData * thread_data
enum AVPictureType pict_type
Picture type of the frame.
static uint32_t half2float(uint16_t h, uint32_t *mantissatable, uint32_t *exponenttable, uint16_t *offsettable)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_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)
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
#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)"
#define bytestream2_get_ne16
#define AV_PIX_FMT_GBRPF32
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
static void idct_1d(float *blk, int step)
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.
static int huf_build_dec_table(EXRContext *s, EXRThreadData *td, int im, int iM)
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.
static void dct_inverse(float *block)
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 av_malloc_array(a, b)
#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...
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
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 int huf_unpack_enc_table(GetByteContext *gb, int32_t im, int32_t iM, uint64_t *freq)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const uint8_t ff_zigzag_direct[64]
static int huf_decode(VLC *vlc, GetByteContext *gb, int nbits, int run_sym, int no, uint16_t *out)
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
union av_intfloat32 gamma_table[65536]
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.
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
static void wdec16(uint16_t l, uint16_t h, uint16_t *a, uint16_t *b)
#define AV_PIX_FMT_GBRAPF32
uint32_t mantissatable[2048]
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
static int shift(int a, int b)
static const struct @322 planes[]
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.
#define avpriv_request_sample(...)
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)
static const int16_t alpha[]
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.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const AVClass exr_class
uint32_t exponenttable[64]
static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size, int uncompressed_size, EXRThreadData *td)
VLC_TYPE(* table)[2]
code, bits
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