forked from bartvdbraak/blender
Fix #36124: VSE - Input Color option does not work for video files
Byte images and movies will now fully follow input color space. Before this non-sRGB input colorspace for byte images and movies behave really doggy (results in preview and final render were totally different). To prevent data loss, if byte image is set not stored in sequencer's space it'll be internally converted to float buffer. In theory some setups might be rendering a bit different now, but new behavior is totally expected and someone used non-sRGB input space for byte images/movies had Convert Float enabled anyway.
This commit is contained in:
parent
79759d8368
commit
529c6d0eeb
@ -417,33 +417,41 @@ void BKE_sequencer_editing_free(Scene *scene)
|
||||
|
||||
static void sequencer_imbuf_assign_spaces(Scene *scene, ImBuf *ibuf)
|
||||
{
|
||||
IMB_colormanagement_assign_float_colorspace(ibuf, scene->sequencer_colorspace_settings.name);
|
||||
if (ibuf->rect_float) {
|
||||
IMB_colormanagement_assign_float_colorspace(ibuf, scene->sequencer_colorspace_settings.name);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_sequencer_imbuf_to_sequencer_space(Scene *scene, ImBuf *ibuf, int make_float)
|
||||
{
|
||||
const char *from_colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR);
|
||||
const char *to_colorspace = scene->sequencer_colorspace_settings.name;
|
||||
const char *float_colorspace = IMB_colormanagement_get_float_colorspace(ibuf);
|
||||
|
||||
if (!ibuf->rect_float) {
|
||||
if (make_float && ibuf->rect) {
|
||||
/* when converting byte buffer to float in sequencer we need to make float
|
||||
* buffer be in sequencer's working space, which is currently only doable
|
||||
* from linear space.
|
||||
*
|
||||
*/
|
||||
if (ibuf->rect) {
|
||||
const char *byte_colorspace = IMB_colormanagement_get_rect_colorspace(ibuf);
|
||||
if (make_float || !STREQ(to_colorspace, byte_colorspace)) {
|
||||
/* If byte space is not in sequencer's working space, we deliver float color space,
|
||||
* this is to to prevent data loss.
|
||||
*/
|
||||
|
||||
/*
|
||||
* OCIO_TODO: would be nice to support direct single transform from byte to sequencer's
|
||||
*/
|
||||
/* when converting byte buffer to float in sequencer we need to make float
|
||||
* buffer be in sequencer's working space, which is currently only doable
|
||||
* from linear space.
|
||||
*/
|
||||
|
||||
IMB_float_from_rect(ibuf);
|
||||
/*
|
||||
* OCIO_TODO: would be nice to support direct single transform from byte to sequencer's
|
||||
*/
|
||||
|
||||
IMB_float_from_rect(ibuf);
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* if there's only byte buffer in image it's already in compositor's working space,
|
||||
* nothing to do here
|
||||
*/
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -452,8 +460,10 @@ void BKE_sequencer_imbuf_to_sequencer_space(Scene *scene, ImBuf *ibuf, int make_
|
||||
if (ibuf->rect)
|
||||
imb_freerectImBuf(ibuf);
|
||||
|
||||
IMB_colormanagement_transform_threaded(ibuf->rect_float, ibuf->x, ibuf->y, ibuf->channels,
|
||||
from_colorspace, to_colorspace, TRUE);
|
||||
if (!STREQ(float_colorspace, to_colorspace)) {
|
||||
IMB_colormanagement_transform_threaded(ibuf->rect_float, ibuf->x, ibuf->y, ibuf->channels,
|
||||
from_colorspace, to_colorspace, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2668,6 +2678,8 @@ static ImBuf *do_render_strip_uncached(SeqRenderData context, Sequence *seq, flo
|
||||
seq->strip->proxy ? seq->strip->proxy->tc : IMB_TC_RECORD_RUN,
|
||||
seq_rendersize_to_proxysize(context.preview_render_size));
|
||||
|
||||
BKE_sequencer_imbuf_to_sequencer_space(context.scene, ibuf, FALSE);
|
||||
|
||||
/* we don't need both (speed reasons)! */
|
||||
if (ibuf && ibuf->rect_float && ibuf->rect)
|
||||
imb_freerectImBuf(ibuf);
|
||||
|
@ -62,6 +62,9 @@ void IMB_colormanagement_check_is_data(struct ImBuf *ibuf, const char *name);
|
||||
void IMB_colormanagement_assign_float_colorspace(struct ImBuf *ibuf, const char *name);
|
||||
void IMB_colormanagement_assign_rect_colorspace(struct ImBuf *ibuf, const char *name);
|
||||
|
||||
const char *IMB_colormanagement_get_float_colorspace(struct ImBuf *ibuf);
|
||||
const char *IMB_colormanagement_get_rect_colorspace(struct ImBuf *ibuf);
|
||||
|
||||
/* ** Color space transformation functions ** */
|
||||
void IMB_colormanagement_transform(float *buffer, int width, int height, int channels,
|
||||
const char *from_colorspace, const char *to_colorspace, int predivide);
|
||||
|
@ -1134,6 +1134,21 @@ void IMB_colormanagement_assign_rect_colorspace(ImBuf *ibuf, const char *name)
|
||||
ibuf->colormanage_flag &= ~IMB_COLORMANAGE_IS_DATA;
|
||||
}
|
||||
|
||||
const char *IMB_colormanagement_get_float_colorspace(ImBuf *ibuf)
|
||||
{
|
||||
if (ibuf->float_colorspace) {
|
||||
return ibuf->float_colorspace->name;
|
||||
}
|
||||
else {
|
||||
return IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR);
|
||||
}
|
||||
}
|
||||
|
||||
const char *IMB_colormanagement_get_rect_colorspace(ImBuf *ibuf)
|
||||
{
|
||||
return ibuf->rect_colorspace->name;
|
||||
}
|
||||
|
||||
/*********************** Threaded display buffer transform routines *************************/
|
||||
|
||||
typedef struct DisplayBufferThread {
|
||||
|
Loading…
Reference in New Issue
Block a user