JFConversionFloatingPoint: Don't rely on infinity for FP math
This commit is contained in:
@@ -11,7 +11,7 @@ pedestal_g0(RAW_MODULE_SIZE), pedestal_g1(RAW_MODULE_SIZE), pedestal_g2(RAW_MODU
|
||||
inline float one_over_gain_energy(double gain_factor, double energy) {
|
||||
double tmp = gain_factor * energy;
|
||||
if (!std::isfinite(tmp) || (tmp == 0.0))
|
||||
return std::numeric_limits<float>::infinity();
|
||||
return 0.0;
|
||||
else
|
||||
return static_cast<float>(1.0 / (gain_factor * energy));
|
||||
}
|
||||
@@ -46,24 +46,30 @@ void JFConversionFloatingPoint::ConvertModule(int16_t *dest, const uint16_t *sou
|
||||
[[likely]]
|
||||
pedestal_subtracted_adu = adc - pedestal_g0[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g0[i];
|
||||
if (gain_g0[i] == 0.0)
|
||||
expected = INT16_MIN;
|
||||
break;
|
||||
case 0x4000:
|
||||
pedestal_subtracted_adu = adc - pedestal_g1[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g1[i];
|
||||
if (adc == 0) [[unlikely]] expected = PIXEL_OUT_G1_SATURATION;
|
||||
if (gain_g1[i] == 0.0)
|
||||
expected = INT16_MIN;
|
||||
break;
|
||||
case 0xc000:
|
||||
pedestal_subtracted_adu = adc - pedestal_g2[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g2[i];
|
||||
if (adc == 0) [[unlikely]] expected = PIXEL_OUT_SATURATION;
|
||||
else if (adc == 0x3fff) [[unlikely]] expected = PIXEL_OUT_0xFFFF;
|
||||
if (gain_g0[i] == 0.0)
|
||||
expected = INT16_MIN;
|
||||
break;
|
||||
default:
|
||||
expected = PIXEL_OUT_GAINBIT_2;
|
||||
break;
|
||||
}
|
||||
|
||||
if (std::isinf(expected) || (expected == INT16_MIN))
|
||||
if (expected == INT16_MIN)
|
||||
dest[i] = PIXEL_OUT_LOST;
|
||||
else if (expected > INT16_MAX)
|
||||
dest[i] = INT16_MAX;
|
||||
@@ -88,26 +94,30 @@ void JFConversionFloatingPoint::ConvertFP(float *dest, const uint16_t *source) {
|
||||
case 0:
|
||||
pedestal_subtracted_adu = adc - pedestal_g0[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g0[i];
|
||||
if (gain_g0[i] == 0.0)
|
||||
expected = INT16_MIN, special_val = true;
|
||||
break;
|
||||
case 0x4000:
|
||||
pedestal_subtracted_adu = adc - pedestal_g1[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g1[i];
|
||||
if (adc == 0) expected = PIXEL_OUT_G1_SATURATION, special_val = true;
|
||||
if (gain_g1[i] == 0.0)
|
||||
expected = INT16_MIN, special_val = true;
|
||||
break;
|
||||
case 0xc000:
|
||||
pedestal_subtracted_adu = adc - pedestal_g2[i];
|
||||
expected = static_cast<float>(pedestal_subtracted_adu) * gain_g2[i];
|
||||
if (adc == 0) expected = PIXEL_OUT_SATURATION, special_val = true;
|
||||
else if (adc == 0x3fff) expected = PIXEL_OUT_0xFFFF, special_val = true;
|
||||
if (gain_g2[i] == 0.0)
|
||||
expected = INT16_MIN, special_val = true;
|
||||
break;
|
||||
default:
|
||||
expected = PIXEL_OUT_GAINBIT_2, special_val = true;;
|
||||
break;
|
||||
}
|
||||
|
||||
if (std::isinf(expected))
|
||||
expected = PIXEL_OUT_LOST;
|
||||
else if ((expected > PIXEL_OUT_SATURATION) && !special_val)
|
||||
if ((expected > PIXEL_OUT_SATURATION) && !special_val)
|
||||
expected = PIXEL_OUT_SATURATION;
|
||||
dest[i] = expected;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user