The non-default coefficients for RGB cause incorrect conversion.
Reported by Claus R. F. Overbeck on the kdenlive-devel mailing list.
/*
* filter_avcolour_space.c -- Colour space filter
/*
* filter_avcolour_space.c -- Colour space filter
- * Copyright (C) 2004-2005 Ushodaya Enterprises Limited
+ * Copyright (C) 2004-2014 Ushodaya Enterprises Limited
* Author: Charles Yates <charles.yates@pandora.be>
*
* This library is free software; you can redistribute it and/or
* Author: Charles Yates <charles.yates@pandora.be>
*
* This library is free software; you can redistribute it and/or
width, height, out_fmt, flags, NULL, NULL, NULL);
if ( context )
{
width, height, out_fmt, flags, NULL, NULL, NULL);
if ( context )
{
+ // libswscale wants the RGB colorspace to be SWS_CS_DEFAULT, which is = SWS_CS_ITU601.
+ if ( out_fmt == PIX_FMT_RGB24 || out_fmt == PIX_FMT_RGBA )
+ dst_colorspace = 601;
error = set_luma_transfer( context, src_colorspace, dst_colorspace, use_full_range );
sws_scale( context, (const uint8_t* const*) input.data, input.linesize, 0, height,
output.data, output.linesize);
error = set_luma_transfer( context, src_colorspace, dst_colorspace, use_full_range );
sws_scale( context, (const uint8_t* const*) input.data, input.linesize, 0, height,
output.data, output.linesize);
/*
* producer_avformat.c -- avformat producer
/*
* producer_avformat.c -- avformat producer
- * Copyright (C) 2003-2012 Ushodaya Enterprises Limited
+ * Copyright (C) 2003-2014 Ushodaya Enterprises Limited
* Author: Charles Yates <charles.yates@pandora.be>
* Author: Dan Dennedy <dan@dennedy.org>
* Much code borrowed from ffmpeg.c: Copyright (c) 2000-2003 Fabrice Bellard
* Author: Charles Yates <charles.yates@pandora.be>
* Author: Dan Dennedy <dan@dennedy.org>
* Much code borrowed from ffmpeg.c: Copyright (c) 2000-2003 Fabrice Bellard
width, height, PIX_FMT_RGB24, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL);
AVPicture output;
avpicture_fill( &output, buffer, PIX_FMT_RGB24, width, height );
width, height, PIX_FMT_RGB24, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL);
AVPicture output;
avpicture_fill( &output, buffer, PIX_FMT_RGB24, width, height );
- set_luma_transfer( context, self->yuv_colorspace, profile->colorspace, self->full_luma );
+ // libswscale wants the RGB colorspace to be SWS_CS_DEFAULT, which is = SWS_CS_ITU601.
+ set_luma_transfer( context, self->yuv_colorspace, 601, self->full_luma );
sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height,
output.data, output.linesize);
sws_freeContext( context );
sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height,
output.data, output.linesize);
sws_freeContext( context );
width, height, PIX_FMT_RGBA, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL);
AVPicture output;
avpicture_fill( &output, buffer, PIX_FMT_RGBA, width, height );
width, height, PIX_FMT_RGBA, flags | SWS_FULL_CHR_H_INT, NULL, NULL, NULL);
AVPicture output;
avpicture_fill( &output, buffer, PIX_FMT_RGBA, width, height );
- set_luma_transfer( context, self->yuv_colorspace, profile->colorspace, self->full_luma );
+ // libswscale wants the RGB colorspace to be SWS_CS_DEFAULT, which is = SWS_CS_ITU601.
+ set_luma_transfer( context, self->yuv_colorspace, 601, self->full_luma );
sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height,
output.data, output.linesize);
sws_freeContext( context );
sws_scale( context, (const uint8_t* const*) frame->data, frame->linesize, 0, height,
output.data, output.linesize);
sws_freeContext( context );