[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50776] trunk/blender/source/blender/imbuf /intern/colormanagement.c: Color Management: avoid byte->linear-> byte conversion if display colorspace matches image's one
Sergey Sharybin
sergey.vfx at gmail.com
Thu Sep 20 13:35:33 CEST 2012
Revision: 50776
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50776
Author: nazgul
Date: 2012-09-20 11:35:33 +0000 (Thu, 20 Sep 2012)
Log Message:
-----------
Color Management: avoid byte->linear->byte conversion if display colorspace matches image's one
Solves slowdown when re-encoding byte image sequence or movie in sequencer.
Fixes #32605: Blender vse renders take more time to render than before
Modified Paths:
--------------
trunk/blender/source/blender/imbuf/intern/colormanagement.c
Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c 2012-09-20 10:38:12 UTC (rev 50775)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c 2012-09-20 11:35:33 UTC (rev 50776)
@@ -1192,7 +1192,6 @@
{
DisplayBufferThread *handle = (DisplayBufferThread *) handle_v;
ColormanageProcessor *cm_processor = handle->cm_processor;
- float *buffer = handle->buffer;
float *display_buffer = handle->display_buffer;
unsigned char *display_buffer_byte = handle->display_buffer_byte;
int channels = handle->channels;
@@ -1202,31 +1201,43 @@
int predivide = handle->predivide;
int is_data = handle->is_data;
- float *linear_buffer = display_buffer_apply_get_linear_buffer(handle);
+ if (cm_processor == NULL) {
+ if (display_buffer_byte) {
+ IMB_buffer_byte_from_byte(display_buffer_byte, handle->byte_buffer, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
+ FALSE, width, height, width, width);
+ }
- if (is_data) {
- /* special case for data buffers - no color space conversions,
- * only generate byte buffers
- */
+ if (display_buffer) {
+ IMB_buffer_float_from_byte(display_buffer, handle->byte_buffer, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
+ FALSE, width, height, width, width);
+ }
}
else {
- /* apply processor */
- IMB_colormanagement_processor_apply(cm_processor, linear_buffer, width, height, channels, predivide);
- }
+ float *linear_buffer = display_buffer_apply_get_linear_buffer(handle);
- /* copy result to output buffers */
- if (display_buffer_byte) {
- /* do conversion */
- IMB_buffer_byte_from_float(display_buffer_byte, linear_buffer,
- channels, dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
- predivide, width, height, width, width);
- }
+ if (is_data) {
+ /* special case for data buffers - no color space conversions,
+ * only generate byte buffers
+ */
+ }
+ else {
+ /* apply processor */
+ IMB_colormanagement_processor_apply(cm_processor, linear_buffer, width, height, channels, predivide);
+ }
- if (display_buffer)
- memcpy(display_buffer, linear_buffer, width * height * channels * sizeof(float));
+ /* copy result to output buffers */
+ if (display_buffer_byte) {
+ /* do conversion */
+ IMB_buffer_byte_from_float(display_buffer_byte, linear_buffer,
+ channels, dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
+ predivide, width, height, width, width);
+ }
- if (linear_buffer != buffer)
+ if (display_buffer)
+ memcpy(display_buffer, linear_buffer, width * height * channels * sizeof(float));
+
MEM_freeN(linear_buffer);
+ }
return NULL;
}
@@ -1269,14 +1280,43 @@
const ColorManagedViewSettings *view_settings,
const ColorManagedDisplaySettings *display_settings)
{
- ColormanageProcessor *cm_processor;
+ ColormanageProcessor *cm_processor = NULL;
+ int skip_transform = FALSE;
- cm_processor = IMB_colormanagement_display_processor_new(view_settings, display_settings);
+ /* if we're going to transform byte buffer, check whether transformation would
+ * happen to the same color space as byte buffer itself is
+ * this would save byte -> float -> byte conversions making display buffer
+ * computation noticeable faster
+ */
+ if (ibuf->rect_float == NULL && ibuf->rect_colorspace) {
+ if ((view_settings->flag & COLORMANAGE_VIEW_USE_CURVES) == 0 &&
+ view_settings->exposure == 0.0f &&
+ view_settings->gamma == 1.0f)
+ {
+ ConstConfigRcPtr *config = OCIO_getCurrentConfig();
+ if (config) {
+ const char *display = display_settings->display_device;
+ const char *view = view_settings->view_transform;
+ const char *from_colorspace = ibuf->rect_colorspace->name;
+ const char *to_colorspace = OCIO_configGetDisplayColorSpaceName(config, display, view);
+
+ if (!strcmp(from_colorspace, to_colorspace))
+ skip_transform = TRUE;
+
+ OCIO_configRelease(config);
+ }
+ }
+ }
+
+ if (skip_transform == FALSE)
+ cm_processor = IMB_colormanagement_display_processor_new(view_settings, display_settings);
+
display_buffer_apply_threaded(ibuf, ibuf->rect_float, (unsigned char *) ibuf->rect,
display_buffer, display_buffer_byte, cm_processor);
- IMB_colormanagement_processor_free(cm_processor);
+ if (cm_processor)
+ IMB_colormanagement_processor_free(cm_processor);
}
static void colormanage_display_buffer_process(ImBuf *ibuf, unsigned char *display_buffer,
More information about the Bf-blender-cvs
mailing list