Skip to content

Commit 2bcc03a

Browse files
committed
add clamping of +/- infinity to +/- 65504.0 for lossy compression
1 parent 796173e commit 2bcc03a

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

src/apps/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ if( OJPH_ENABLE_OPENEXR_SUPPORT )
7070
find_package(IlmBase)
7171
if(IlmBase_FOUND)
7272
message(STATUS "Found IlmBase ${IlmBase_VERSION}")
73+
message(STATUS " IlmBase_VERSION = ${OpenEXR_VERSION}")
74+
message(STATUS " IlmBase_INCLUDE_DIR = ${OpenEXR_INCLUDE_DIR}")
75+
message(STATUS " IlmBase_INCLUDE_DIRS = ${OpenEXR_INCLUDE_DIRS}")
76+
message(STATUS " IlmBase_LIBRARY = ${OpenEXR_LIBRARY}")
77+
message(STATUS " IlmBase_LIBRARIES = ${OpenEXR_LIBRARIES}")
7378
find_package(OpenEXR 2)
7479
if(OpenEXR_FOUND)
7580
message(STATUS "Found OpenEXR ${OpenEXR_VERSION}")

src/apps/others/ojph_img_io.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2434,19 +2434,27 @@ namespace ojph {
24342434
return;
24352435
}
24362436

2437-
si16 convert_si32_to_si16(const si32 si32_value, bool convert_nan_to_zero = false)
2437+
si16 convert_si32_to_si16(const si32 si32_value, bool convert_special_numbers_to_finite_numbers = false)
24382438
{
24392439
if (si32_value > INT16_MAX)
24402440
return INT16_MAX;
24412441
else if (si32_value < INT16_MIN)
24422442
return INT16_MIN;
2443-
else if (true == convert_nan_to_zero)
2443+
else if (true == convert_special_numbers_to_finite_numbers)
24442444
{
24452445
const si16 si16_value = (si16)si32_value;
2446-
Imath::half half_value;
2446+
half half_value;
24472447
half_value.setBits(si16_value);
2448+
if (half_value.isFinite())
2449+
return si16_value;
2450+
2451+
// handle non-real number to real-number mapping
24482452
if (half_value.isNan())
2449-
half_value = 0.0;
2453+
half_value = 0.0f;
2454+
else if (half_value.isInfinity() && !half_value.isNegative())
2455+
half_value = HALF_MAX;
2456+
else if (half_value.isInfinity() && half_value.isNegative())
2457+
half_value = -1.0f * HALF_MAX;
24502458

24512459
return half_value.bits();
24522460
}
@@ -2457,7 +2465,7 @@ namespace ojph {
24572465
ui32 exr_out::write(const line_buf* line, ui32 comp_num)
24582466
{
24592467
const int y = codestream_is_planar == false ? 0 : cur_line;
2460-
const bool convert_nan_to_zero = codestream_is_reversible ? false : true;
2468+
const bool convert_special_numbers_to_finite_numbers = codestream_is_reversible ? false : true;
24612469
if (true == this->is_use_Rgba_interface)
24622470
{
24632471
// if interleaved - set framebuffer for first component of the line
@@ -2471,25 +2479,25 @@ namespace ojph {
24712479
case 0:
24722480
for (ui32 i = 0; i < width; i++)
24732481
{
2474-
pixels[y][i].r.setBits(convert_si32_to_si16(line->i32[i], convert_nan_to_zero));
2482+
pixels[y][i].r.setBits(convert_si32_to_si16(line->i32[i], convert_special_numbers_to_finite_numbers));
24752483
}
24762484
break;
24772485
case 1:
24782486
for (ui32 i = 0; i < width; i++)
24792487
{
2480-
pixels[y][i].g.setBits(convert_si32_to_si16(line->i32[i], convert_nan_to_zero));
2488+
pixels[y][i].g.setBits(convert_si32_to_si16(line->i32[i], convert_special_numbers_to_finite_numbers));
24812489
}
24822490
break;
24832491
case 2:
24842492
for (ui32 i = 0; i < width; i++)
24852493
{
2486-
pixels[y][i].b.setBits(convert_si32_to_si16(line->i32[i], convert_nan_to_zero));
2494+
pixels[y][i].b.setBits(convert_si32_to_si16(line->i32[i], convert_special_numbers_to_finite_numbers));
24872495
}
24882496
break;
24892497
case 3:
24902498
for (ui32 i = 0; i < width; i++)
24912499
{
2492-
pixels[y][i].a.setBits(convert_si32_to_si16(line->i32[i], convert_nan_to_zero));
2500+
pixels[y][i].a.setBits(convert_si32_to_si16(line->i32[i], convert_special_numbers_to_finite_numbers));
24932501
}
24942502
break;
24952503
default:

0 commit comments

Comments
 (0)