Skip to content

Commit 2483047

Browse files
Issues/0109 valgrind issues in ctlrender with 16bit exr output (#116)
* add RGBA EXR tests + valgrind tests for cltrender * rewrite exr_write16() code modeled after exr_write32() with additional change of Imf::PixelType pixelType = Imf::HALF and conversion from float to half * fixes issue #109
1 parent b23d48e commit 2483047

File tree

9 files changed

+182
-23
lines changed

9 files changed

+182
-23
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ build
33
unittest/ctlrender/output
44
.DS_Store
55
.vscode
6+
Testing

ctlrender/exr_file.cc

Lines changed: 72 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -221,30 +221,80 @@ void exr_write32(const char *name, float scale, const ctl::dpx::fb<float> &pixel
221221
file.writePixels (height);
222222
}
223223

224-
void exr_write16(const char *name, float scale, const ctl::dpx::fb<float> &pixels, Compression *compression) {
225-
if (scale == 0.0) scale = 1.0;
224+
void exr_write16(const char* name, float scale, const ctl::dpx::fb<float>& pixels, Compression* compression)
225+
{
226+
int depth = pixels.depth();
227+
float width = pixels.width();
228+
float height = pixels.height();
226229

227-
ctl::dpx::fb<half> scaled_pixels;
228-
scaled_pixels.init(pixels.height(), pixels.width(), pixels.depth());
229-
scaled_pixels.alpha(1.0);
230-
231-
const float *fIn=pixels.ptr();
232-
half *out=scaled_pixels.ptr();
233-
234-
// Yes... I should lookup table this. I *know*!
235-
for(uint64_t i=0; i<pixels.count(); i++) {
236-
*(out++)=*(fIn++)/scale;
230+
ctl::dpx::fb<half> scaled_pixels;
231+
scaled_pixels.init(pixels.height(), pixels.width(), pixels.depth());
232+
scaled_pixels.alpha(1.0);
233+
234+
const float* fIn = pixels.ptr();
235+
half* out = scaled_pixels.ptr();
236+
237+
if (scale != 0.0 && scale != 1.0) {
238+
for (uint64_t i = 0; i < pixels.count(); i++) {
239+
*(out++) = half(*(fIn++) / scale);
240+
}
241+
}
242+
else
243+
{
244+
for (uint64_t i = 0; i < pixels.count(); i++) {
245+
*(out++) = half(*(fIn++));
237246
}
238-
239-
uint8_t channels=scaled_pixels.depth();
240-
const half *in=scaled_pixels.ptr();
241-
242-
Imf::RgbaOutputFile file(name, pixels.width(), pixels.height(),
243-
channels==4 ? Imf::WRITE_RGBA : Imf::WRITE_RGB, 1, Imath::V2f (0, 0), 1,
244-
Imf::INCREASING_Y, (Imf::Compression)compression->exrCompressionScheme);
245-
246-
file.setFrameBuffer((Imf::Rgba *)in, 1, pixels.width());
247-
file.writePixels(pixels.height());
247+
}
248+
249+
half const* pixelPtr = scaled_pixels.ptr();
250+
251+
depth = scaled_pixels.depth();
252+
width = scaled_pixels.width();
253+
height = scaled_pixels.height();
254+
pixelPtr = scaled_pixels.ptr();
255+
256+
Imf::PixelType pixelType = Imf::HALF;
257+
258+
Imf::Header header(width, height);
259+
header.compression() = (Imf::Compression)compression->exrCompressionScheme;
260+
261+
header.channels().insert("R", Imf::Channel(pixelType));
262+
header.channels().insert("G", Imf::Channel(pixelType));
263+
header.channels().insert("B", Imf::Channel(pixelType));
264+
265+
if (depth == 4)
266+
header.channels().insert("A", Imf::Channel(pixelType));
267+
268+
Imf::OutputFile file(name, header);
269+
270+
Imf::FrameBuffer frameBuffer;
271+
272+
int xstride = sizeof(*pixelPtr) * depth;
273+
int ystride = sizeof(*pixelPtr) * depth * width;
274+
275+
frameBuffer.insert("R",
276+
Imf::Slice(pixelType,
277+
(char*)pixelPtr,
278+
xstride, ystride));
279+
280+
frameBuffer.insert("G",
281+
Imf::Slice(pixelType,
282+
(char*)(pixelPtr + 1),
283+
xstride, ystride));
284+
285+
frameBuffer.insert("B",
286+
Imf::Slice(pixelType,
287+
(char*)(pixelPtr + 2),
288+
xstride, ystride));
289+
290+
if (depth == 4)
291+
frameBuffer.insert("A",
292+
Imf::Slice(pixelType,
293+
(char*)(pixelPtr + 3),
294+
xstride, ystride));
295+
296+
file.setFrameBuffer(frameBuffer);
297+
file.writePixels(height);
248298
}
249299

250300
void exr_write(const char *name, float scale, const ctl::dpx::fb<float> &pixels,

resources/test/scripts/run_valgrind.sh

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,43 @@ valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak
5050
test_10_status=$?
5151
test_10_label="ctlrender-exr-to-exr32"
5252

53+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr16 -ctl ../../../unittest/ctlrender/unity.ctl ../../../unittest/ctlrender/colorbars_nuke_rgb_exr16.exr out.exr
54+
test_11_status=$?
55+
test_11_label="ctlrender-rgb-exr16-to-exr16"
56+
57+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr32 -ctl ../../../unittest/ctlrender/unity.ctl ../../../unittest/ctlrender/colorbars_nuke_rgb_exr16.exr out.exr
58+
test_12_status=$?
59+
test_12_label="ctlrender-rgb-exr16-to-exr32"
60+
61+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr16 -ctl ../../../unittest/ctlrender/unity.ctl ../../../unittest/ctlrender/colorbars_nuke_rgb_exr32.exr out.exr
62+
test_13_status=$?
63+
test_13_label="ctlrender-rgb-exr32-to-exr16"
64+
65+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr32 -ctl ../../../unittest/ctlrender/unity.ctl ../../../unittest/ctlrender/colorbars_nuke_rgb_exr32.exr out.exr
66+
test_14_status=$?
67+
test_14_label="ctlrender-rgb-exr32-to-exr32"
68+
69+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr16 -ctl ../../../unittest/ctlrender/unity_with_alpha.ctl ../../../unittest/ctlrender/colorbars_nuke_rgba_exr16.exr out.exr
70+
test_15_status=$?
71+
test_15_label="ctlrender-rgba-exr16-to-exr16"
72+
73+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr32 -ctl ../../../unittest/ctlrender/unity_with_alpha.ctl ../../../unittest/ctlrender/colorbars_nuke_rgba_exr16.exr out.exr
74+
test_16_status=$?
75+
test_16_label="ctlrender-rgba-exr16-to-exr32"
76+
77+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr16 -ctl ../../../unittest/ctlrender/unity_with_alpha.ctl ../../../unittest/ctlrender/colorbars_nuke_rgba_exr32.exr out.exr
78+
test_17_status=$?
79+
test_17_label="ctlrender-rgba-exr32-to-exr16"
80+
81+
valgrind -s --error-exitcode=1 --leak-check=full --track-origins=yes --show-leak-kinds=all ../../ctlrender/ctlrender -force -format exr32 -ctl ../../../unittest/ctlrender/unity_with_alpha.ctl ../../../unittest/ctlrender/colorbars_nuke_rgba_exr32.exr out.exr
82+
test_18_status=$?
83+
test_18_label="ctlrender-rgba-exr32-to-exr32"
84+
5385
# go back to initial path
5486
cd $SCRIPTPATH
5587

5688
# return valgrind exit codes
57-
if [ $test_01_status -eq 0 ] && [ $test_02_status -eq 0 ] && [ $test_03_status -eq 0 ] && [ $test_04_status -eq 0 ] && [ $test_05_status -eq 0 ] && [ $test_06_status -eq 0 ] && [ $test_07_status -eq 0 ] && [ $test_08_status -eq 0 ] && [ $test_09_status -eq 0 ] && [ $test_10_status -eq 0 ]
89+
if [ $test_01_status -eq 0 ] && [ $test_02_status -eq 0 ] && [ $test_03_status -eq 0 ] && [ $test_04_status -eq 0 ] && [ $test_05_status -eq 0 ] && [ $test_06_status -eq 0 ] && [ $test_07_status -eq 0 ] && [ $test_08_status -eq 0 ] && [ $test_09_status -eq 0 ] && [ $test_10_status -eq 0 ] && [ $test_11_status -eq 0 ] && [ $test_12_status -eq 0 ] && [ $test_13_status -eq 0 ] && [ $test_14_status -eq 0 ] && [ $test_15_status -eq 0 ] && [ $test_16_status -eq 0 ] && [ $test_17_status -eq 0 ] && [ $test_18_status -eq 0 ]
5890
then
5991
echo "Success: valgrind detected no errors"
6092
exit 0
@@ -111,5 +143,45 @@ else
111143
echo "$test_10_label: valgrind detected errors"
112144
fi
113145

146+
if [ $test_11_status -ne 0 ]
147+
then
148+
echo "$test_11_label: valgrind detected errors"
149+
fi
150+
151+
if [ $test_12_status -ne 0 ]
152+
then
153+
echo "$test_12_label: valgrind detected errors"
154+
fi
155+
156+
if [ $test_13_status -ne 0 ]
157+
then
158+
echo "$test_13_label: valgrind detected errors"
159+
fi
160+
161+
if [ $test_14_status -ne 0 ]
162+
then
163+
echo "$test_14_label: valgrind detected errors"
164+
fi
165+
166+
if [ $test_15_status -ne 0 ]
167+
then
168+
echo "$test_15_label: valgrind detected errors"
169+
fi
170+
171+
if [ $test_16_status -ne 0 ]
172+
then
173+
echo "$test_16_label: valgrind detected errors"
174+
fi
175+
176+
if [ $test_17_status -ne 0 ]
177+
then
178+
echo "$test_17_label: valgrind detected errors"
179+
fi
180+
181+
if [ $test_18_status -ne 0 ]
182+
then
183+
echo "$test_18_label: valgrind detected errors"
184+
fi
185+
114186
exit 1
115187
fi
17.7 KB
Binary file not shown.
21.8 KB
Binary file not shown.
33 KB
Binary file not shown.
45.5 KB
Binary file not shown.

unittest/ctlrender/test.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,27 @@ if [[ $IS_OPENEXR_FOUND == 1 ]] ; then
4848
$CTLRENDER -ctl unity.ctl -format exr16 -force bars_photoshop.exr output/bars_exr_exr16.exr
4949
printf 'bars_photoshop.exr -> output/bars_exr_exr32.exr \n'
5050
$CTLRENDER -ctl unity.ctl -format exr32 -force bars_photoshop.exr output/bars_exr_exr32.exr
51+
52+
# RGB tests
53+
printf 'colorbars_nuke_rgb_exr16.exr -> output/bars_rgb_exr16_to_exr16.exr \n'
54+
$CTLRENDER -force -format exr16 -ctl unity.ctl colorbars_nuke_rgb_exr16.exr output/bars_rgb_exr16_to_exr16.exr
55+
printf 'colorbars_nuke_rgb_exr16.exr -> output/bars_rgb_exr16_to_exr32.exr \n'
56+
$CTLRENDER -force -format exr32 -ctl unity.ctl colorbars_nuke_rgb_exr16.exr output/bars_rgb_exr16_to_exr32.exr
57+
printf 'colorbars_nuke_rgb_exr32.exr -> output/bars_rgb_exr32_to_exr16.exr \n'
58+
$CTLRENDER -force -format exr16 -ctl unity.ctl colorbars_nuke_rgb_exr32.exr output/bars_rgb_exr32_to_exr16.exr
59+
printf 'colorbars_nuke_rgb_exr32.exr -> output/bars_rgb_exr32_to_exr32.exr \n'
60+
$CTLRENDER -force -format exr32 -ctl unity.ctl colorbars_nuke_rgb_exr32.exr output/bars_rgb_exr32_to_exr32.exr
61+
62+
# RGBA tests
63+
printf 'colorbars_nuke_rgba_exr16.exr -> output/bars_rgba_exr16_to_exr16.exr \n'
64+
$CTLRENDER -force -format exr16 -ctl unity_with_alpha.ctl colorbars_nuke_rgba_exr16.exr output/bars_rgba_exr16_to_exr16.exr
65+
printf 'colorbars_nuke_rgba_exr16.exr -> output/bars_rgba_exr16_to_exr32.exr \n'
66+
$CTLRENDER -force -format exr32 -ctl unity_with_alpha.ctl colorbars_nuke_rgba_exr16.exr output/bars_rgba_exr16_to_exr32.exr
67+
printf 'colorbars_nuke_rgba_exr32.exr -> output/bars_rgba_exr32_to_exr16.exr \n'
68+
$CTLRENDER -force -format exr16 -ctl unity_with_alpha.ctl colorbars_nuke_rgba_exr32.exr output/bars_rgba_exr32_to_exr16.exr
69+
printf 'colorbars_nuke_rgba_exr32.exr -> output/bars_rgba_exr32_to_exr32.exr \n'
70+
$CTLRENDER -force -format exr32 -ctl unity_with_alpha.ctl colorbars_nuke_rgba_exr32.exr output/bars_rgba_exr32_to_exr32.exr
71+
5172
fi
5273

5374
# test TIFF32 to EXR and EXR to TIFF32 support
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
void unity_with_alpha
2+
(output varying half rOut,
3+
output varying half gOut,
4+
output varying half bOut,
5+
output varying half aOut,
6+
input varying half rIn,
7+
input varying half gIn,
8+
input varying half bIn,
9+
input varying half aIn)
10+
{
11+
rOut=rIn;
12+
gOut=gIn;
13+
bOut=bIn;
14+
aOut=aIn;
15+
}

0 commit comments

Comments
 (0)