Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2020-12-07 18:34:16 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-12-07 19:09:34 +0300
commit4f25e168a255950f46cf10e9b6d84d0646004d7d (patch)
tree9293635cdbb9fefa22b19c82bc3a0caddf4f53e8
parentb14b57fc0535afe245bff00ec59854ab8db97bb5 (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.
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.c33
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.h5
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 {