diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-12-07 18:34:16 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-12-07 19:09:34 +0300 |
commit | 4f25e168a255950f46cf10e9b6d84d0646004d7d (patch) | |
tree | 9293635cdbb9fefa22b19c82bc3a0caddf4f53e8 /source/blender/imbuf/intern/cineon | |
parent | b14b57fc0535afe245bff00ec59854ab8db97bb5 (diff) |
Fix DPX image output having invalid float metadata
Casting 0xFFFFFFFF to float does not give NaN as is needed here. Found through
compiler warning which is now fixed.
Diffstat (limited to 'source/blender/imbuf/intern/cineon')
-rw-r--r-- | source/blender/imbuf/intern/cineon/dpxlib.c | 33 | ||||
-rw-r--r-- | source/blender/imbuf/intern/cineon/dpxlib.h | 5 |
2 files changed, 18 insertions, 20 deletions
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.c b/source/blender/imbuf/intern/cineon/dpxlib.c index b7a15812547..4580bfd2cbf 100644 --- a/source/blender/imbuf/intern/cineon/dpxlib.c +++ b/source/blender/imbuf/intern/cineon/dpxlib.c @@ -123,16 +123,16 @@ static void fillDpxMainHeader(LogImageFile *dpx, header->televisionHeader.field_number = DPX_UNDEFINED_U8; header->televisionHeader.video_signal = DPX_UNDEFINED_U8; header->televisionHeader.padding = DPX_UNDEFINED_U8; - header->televisionHeader.horizontal_sample_rate = DPX_UNDEFINED_R32; - header->televisionHeader.vertical_sample_rate = DPX_UNDEFINED_R32; - header->televisionHeader.frame_rate = DPX_UNDEFINED_R32; - header->televisionHeader.time_offset = DPX_UNDEFINED_R32; + header->televisionHeader.horizontal_sample_rate = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); + header->televisionHeader.vertical_sample_rate = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); + header->televisionHeader.frame_rate = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); + header->televisionHeader.time_offset = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); header->televisionHeader.gamma = swap_float(dpx->gamma, dpx->isMSB); header->televisionHeader.black_level = swap_float(dpx->referenceBlack, dpx->isMSB); - header->televisionHeader.black_gain = DPX_UNDEFINED_R32; - header->televisionHeader.breakpoint = DPX_UNDEFINED_R32; + header->televisionHeader.black_gain = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); + header->televisionHeader.breakpoint = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); header->televisionHeader.white_level = swap_float(dpx->referenceWhite, dpx->isMSB); - header->televisionHeader.integration_times = DPX_UNDEFINED_R32; + header->televisionHeader.integration_times = swap_float(DPX_UNDEFINED_R32, dpx->isMSB); } LogImageFile *dpxOpen(const unsigned char *byteStuff, int fromMemory, size_t bufferSize) @@ -339,13 +339,11 @@ LogImageFile *dpxOpen(const unsigned char *byteStuff, int fromMemory, size_t buf dpx->element[i].refHighData = (unsigned int)dpx->element[i].maxValue; } - if (dpx->element[i].refLowQuantity == DPX_UNDEFINED_R32 || - isnan(dpx->element[i].refLowQuantity)) { + if (IS_DPX_UNDEFINED_R32(dpx->element[i].refLowQuantity)) { dpx->element[i].refLowQuantity = 0.0f; } - if (dpx->element[i].refHighQuantity == DPX_UNDEFINED_R32 || - isnan(dpx->element[i].refHighQuantity)) { + if (IS_DPX_UNDEFINED_R32(dpx->element[i].refHighQuantity)) { if (ELEM(dpx->element[i].transfer, transfer_PrintingDensity, transfer_Logarithmic)) { dpx->element[i].refHighQuantity = 2.048f; } @@ -370,13 +368,11 @@ LogImageFile *dpxOpen(const unsigned char *byteStuff, int fromMemory, size_t buf dpx->element[i].refHighData = 235.0f / 255.0f * dpx->element[i].maxValue; } - if (dpx->element[i].refLowQuantity == DPX_UNDEFINED_R32 || - isnan(dpx->element[i].refLowQuantity)) { + if (IS_DPX_UNDEFINED_R32(dpx->element[i].refLowQuantity)) { dpx->element[i].refLowQuantity = 0.0f; } - if (dpx->element[i].refHighQuantity == DPX_UNDEFINED_R32 || - isnan(dpx->element[i].refHighQuantity)) { + if (IS_DPX_UNDEFINED_R32(dpx->element[i].refHighQuantity)) { dpx->element[i].refHighQuantity = 0.7f; } @@ -391,10 +387,9 @@ LogImageFile *dpxOpen(const unsigned char *byteStuff, int fromMemory, size_t buf dpx->referenceWhite = swap_float(header.televisionHeader.white_level, dpx->isMSB); dpx->gamma = swap_float(header.televisionHeader.gamma, dpx->isMSB); - if ((dpx->referenceBlack == DPX_UNDEFINED_R32 || isnan(dpx->referenceBlack)) || - (dpx->referenceWhite == DPX_UNDEFINED_R32 || dpx->referenceWhite <= dpx->referenceBlack || - isnan(dpx->referenceWhite)) || - (dpx->gamma == DPX_UNDEFINED_R32 || dpx->gamma <= 0 || isnan(dpx->gamma))) { + if (IS_DPX_UNDEFINED_R32(dpx->referenceBlack) || + (dpx->referenceWhite <= dpx->referenceBlack || IS_DPX_UNDEFINED_R32(dpx->referenceWhite)) || + (dpx->gamma <= 0 || IS_DPX_UNDEFINED_R32(dpx->gamma))) { dpx->referenceBlack = 95.0f / 1023.0f * dpx->element[0].maxValue; dpx->referenceWhite = 685.0f / 1023.0f * dpx->element[0].maxValue; dpx->gamma = 1.7f; diff --git a/source/blender/imbuf/intern/cineon/dpxlib.h b/source/blender/imbuf/intern/cineon/dpxlib.h index 6b729dba59a..1228ac4ee66 100644 --- a/source/blender/imbuf/intern/cineon/dpxlib.h +++ b/source/blender/imbuf/intern/cineon/dpxlib.h @@ -24,6 +24,8 @@ #pragma once +#include <math.h> + #include "logImageCore.h" #ifdef __cplusplus @@ -34,7 +36,8 @@ extern "C" { #define DPX_UNDEFINED_U8 0xFF #define DPX_UNDEFINED_U16 0xFFFF #define DPX_UNDEFINED_U32 0xFFFFFFFF -#define DPX_UNDEFINED_R32 0xFFFFFFFF +#define DPX_UNDEFINED_R32 NAN +#define IS_DPX_UNDEFINED_R32(x) isnan(x) #define DPX_UNDEFINED_CHAR 0 typedef struct { |