[Bf-blender-cvs] [4f25e168a25] master: Fix DPX image output having invalid float metadata

Brecht Van Lommel noreply at git.blender.org
Mon Dec 7 17:10:02 CET 2020


Commit: 4f25e168a255950f46cf10e9b6d84d0646004d7d
Author: Brecht Van Lommel
Date:   Mon Dec 7 16:34:16 2020 +0100
Branches: master
https://developer.blender.org/rB4f25e168a255950f46cf10e9b6d84d0646004d7d

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.

===================================================================

M	source/blender/imbuf/intern/cineon/dpxlib.c
M	source/blender/imbuf/intern/cineon/dpxlib.h

===================================================================

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 {



More information about the Bf-blender-cvs mailing list