You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Update LLImageJ2C::calcDataSizeJ2C for better 2k image support (#2406)
Adjusted calculations based on dimensions and assumed maximum block size so that higher discards (4-5) of 2048x2048 images can be decoded with aux/alpha.
(It should also work for dimensions larger than 2048.)
This function will now return a reliable discard 5 data size for unknown dimensions (w and/or h equals 0), which could be used in LLTextureFetch::createRequest to skip the header fetch and go right to a discard 5 decode.
Tested on OpenJPEG 2.5 with partial decode support (opj_decoder_set_strict_mode set to false).
Should work on KDU fine but might be a good idea to test.
// Estimate the number of layers. This is consistent with what's done for j2c encoding in LLImageJ2CKDU::encodeImpl().
277
277
constexpr S32 precision = 8; // assumed bitrate per component channel, might change in future for HDR support
278
278
constexpr S32 max_components = 4; // assumed the file has four components; three color and alpha
279
-
S32 nb_layers = 1;
280
-
const S32 surface = w*h;
281
-
S32 s = 64*64;
282
-
S32 totalbytes = (S32)(s * max_components * precision * rate); // first level computed before loop
283
-
while (surface > s)
279
+
// Use MAX_IMAGE_SIZE_DEFAULT (currently 2048) if either dimension is unknown (zero)
280
+
S32 width = (w > 0) ? w : 2048;
281
+
S32 height = (h > 0) ? h : 2048;
282
+
S32 max_dimension = llmax(width, height); // Find largest dimension
283
+
S32 block_area = MAX_BLOCK_SIZE * MAX_BLOCK_SIZE; // Calculated initial block area from established max block size (currently 64)
284
+
block_area *= (max_dimension / MAX_BLOCK_SIZE / max_components); // Adjust initial block area by ratio of largest dimension to block size per component
285
+
S32 totalbytes = (S32) (block_area * max_components * precision); // First block layer computed before loop without compression rate
286
+
S32 block_layers = 1; // Start at layer 1 since first block layer is computed outside loop
287
+
while (block_layers < 6) // Walk five layers for the five discards in JPEG2000
0 commit comments