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:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-09-20 15:35:33 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-09-20 15:35:33 +0400
commit42558f83df30c6b65b52daa97e559cd0d5bae8c8 (patch)
tree64e463acfdd5bd69df335f3ac86bafd6c60b6d8a /source/blender/imbuf
parent414bb1a5f0427442a317acdd9f3d2ae88083f63f (diff)
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
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r--source/blender/imbuf/intern/colormanagement.c84
1 files changed, 62 insertions, 22 deletions
diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c
index 4843c9b2b6c..de7d78897f8 100644
--- a/source/blender/imbuf/intern/colormanagement.c
+++ b/source/blender/imbuf/intern/colormanagement.c
@@ -1192,7 +1192,6 @@ static void *do_display_buffer_apply_thread(void *handle_v)
{
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 @@ static void *do_display_buffer_apply_thread(void *handle_v)
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 (display_buffer)
+ memcpy(display_buffer, linear_buffer, width * height * channels * sizeof(float));
- if (linear_buffer != buffer)
MEM_freeN(linear_buffer);
+ }
return NULL;
}
@@ -1269,14 +1280,43 @@ static void colormanage_display_buffer_process_ex(ImBuf *ibuf, float *display_bu
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,