[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55296] trunk/blender/source/blender/imbuf /intern/cineon: Patch #34632: DPX/Cineon speed up

Sergey Sharybin sergey.vfx at gmail.com
Fri Mar 15 10:46:38 CET 2013


Revision: 55296
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55296
Author:   nazgul
Date:     2013-03-15 09:46:37 +0000 (Fri, 15 Mar 2013)
Log Message:
-----------
Patch #34632: DPX/Cineon speed up

Done by Julien Enche (aka trap), thanks!

>From the patch comment:
This patch speeds up Cineon/DPX file loading.
Some more checks are done in dpxOpen and cineonOpen functions so IB_test
flag can now be taken into account safely, and an unnecessary call to
IMB_rect_from_float has been removed.

DPX/Cineon file now loads around 3 times faster on my computer.

Own comment:
Ideally, IB_rect shall indeed indicate which buffers to load, however
currently all places which reads image uses this flag.

This fact already mentioned in OpenEXR reader and it shall be fine
to skip doing rect_from_float in readers themselves.

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c
    trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
    trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c

Modified: trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c	2013-03-15 09:35:12 UTC (rev 55295)
+++ trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c	2013-03-15 09:46:37 UTC (rev 55296)
@@ -70,31 +70,24 @@
 
 	logImageGetSize(image, &width, &height, &depth);
 
-	if (width == 0 || height == 0) {
-		logImageClose(image);
-		return 0;
-	}
-
 	ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags);
 	if (ibuf == 0) {
 		logImageClose(image);
 		return 0;
 	}
 
-	if (logImageGetDataRGBA(image, ibuf->rect_float, 1) != 0) {
-		/* Conversion not possible (probably because the format is unsupported) */
-		logImageClose(image);
-		MEM_freeN(ibuf);
-		return 0;
+	if (!(flags & IB_test)) {
+		if (logImageGetDataRGBA(image, ibuf->rect_float, 1) != 0) {
+			logImageClose(image);
+			IMB_freeImBuf(ibuf);
+			return 0;
+		}
+		IMB_flipy(ibuf);
 	}
 
 	logImageClose(image);
 	ibuf->ftype = use_cineon ? CINEON : DPX;
-	IMB_flipy(ibuf);
 
-	if (flags & IB_rect)
-		IMB_rect_from_float(ibuf);
-
 	if (flags & IB_alphamode_detect)
 		ibuf->flags |= IB_alphamode_premul;
 

Modified: trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c	2013-03-15 09:35:12 UTC (rev 55295)
+++ trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c	2013-03-15 09:46:37 UTC (rev 55296)
@@ -196,6 +196,13 @@
 
 	cineon->width = swap_uint(header.imageHeader.element[0].pixels_per_line, cineon->isMSB);
 	cineon->height = swap_uint(header.imageHeader.element[0].lines_per_image, cineon->isMSB);
+
+	if (cineon->width == 0 || cineon->height == 0) {
+		if (verbose) printf("Cineon: Wrong image dimension: %dx%d\n", cineon->width, cineon->height);
+		logImageClose(cineon);
+		return 0;
+	}
+
 	cineon->depth = header.imageHeader.elements_per_image;
 	cineon->srcFormat = format_Cineon;
 
@@ -205,6 +212,7 @@
 		cineon->numElements = header.imageHeader.elements_per_image;
 	else {
 		if (verbose) printf("Cineon: Data interleave not supported: %d\n", header.imageHeader.interleave);
+		logImageClose(cineon);
 		return 0;
 	}
 
@@ -235,6 +243,7 @@
 	}
 	else {
 		if (verbose) printf("Cineon: Cineon image depth unsupported: %d\n", cineon->depth);
+		logImageClose(cineon);
 		return 0;
 	}
 
@@ -264,6 +273,7 @@
 			default:
 				/* Not supported */
 				if (verbose) printf("Cineon: packing unsupported: %d\n", header.imageHeader.packing);
+				logImageClose(cineon);
 				return 0;
 		}
 

Modified: trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c	2013-03-15 09:35:12 UTC (rev 55295)
+++ trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c	2013-03-15 09:46:37 UTC (rev 55296)
@@ -192,8 +192,21 @@
 
 	dpx->srcFormat = format_DPX;
 	dpx->numElements = swap_ushort(header.imageHeader.elements_per_image, dpx->isMSB);
+	if (dpx->numElements == 0) {
+		if (verbose) printf("DPX: Wrong number of elements: %d\n", dpx->numElements);
+		logImageClose(dpx);
+		return 0;
+	}
+
 	dpx->width = swap_uint(header.imageHeader.pixels_per_line, dpx->isMSB);
 	dpx->height = swap_uint(header.imageHeader.lines_per_element, dpx->isMSB);
+
+	if (dpx->width == 0 || dpx->height == 0) {
+		if (verbose) printf("DPX: Wrong image dimension: %dx%d\n", dpx->width, dpx->height);
+		logImageClose(dpx);
+		return 0;
+	}
+
 	dpx->depth = 0;
 
 	for (i = 0; i < dpx->numElements; i++) {
@@ -242,8 +255,23 @@
 		}
 
 		dpx->element[i].bitsPerSample = header.imageHeader.element[i].bits_per_sample;
+		if (dpx->element[i].bitsPerSample != 1 && dpx->element[i].bitsPerSample != 8 &&
+			dpx->element[i].bitsPerSample != 10 && dpx->element[i].bitsPerSample != 12 &&
+			dpx->element[i].bitsPerSample != 16)
+		{
+			if (verbose) printf("DPX: Unsupported bitsPerSample for elements %d: %d\n", i, dpx->element[i].bitsPerSample);
+			logImageClose(dpx);
+			return 0;
+		}
+
 		dpx->element[i].maxValue = powf(2, dpx->element[i].bitsPerSample) - 1.0f;
+
 		dpx->element[i].packing = swap_ushort(header.imageHeader.element[i].packing, dpx->isMSB);
+		if (dpx->element[i].packing > 2) {
+			if (verbose) printf("DPX: Unsupported packing for element %d: %d\n", i, dpx->element[i].packing);
+			logImageClose(dpx);
+			return 0;
+		}
 
 		/* Sometimes, the offset is not set correctly in the header */
 		dpx->element[i].dataOffset = swap_uint(header.imageHeader.element[i].data_offset, dpx->isMSB);
@@ -323,7 +351,6 @@
 	    (dpx->referenceWhite == DPX_UNDEFINED_R32 || dpx->referenceWhite <= dpx->referenceBlack || isnan(dpx->referenceWhite)) ||
 	    (dpx->gamma == DPX_UNDEFINED_R32 || dpx->gamma <= 0 || isnan(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;




More information about the Bf-blender-cvs mailing list