Fix [#21890] YUV->RGB: Color clamping 16-235 in all motion pictures (ffmpeg)
Patch by Troy James Sobotka - this uses options in newer FFMPEG versions to convert the full 0-255 YUV range of imported imagery to RGB, rather than clipping at 16-235. This functionality is not available yet in an official FFMPEG release (current precompiled version in /lib for osx at least is v0.5.1 from 2009) so this won't take effect in that situation, but if you've got a newer ffmpeg on your system it will work.
This commit is contained in:
@@ -659,8 +659,26 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
|
||||
int pos_found = 1;
|
||||
int filter_y = 0;
|
||||
|
||||
#if (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)
|
||||
/* The following for color space determination */
|
||||
int srcRange, dstRange, brightness, contrast, saturation;
|
||||
int *inv_table, *table;
|
||||
|
||||
if (anim == 0) return (0);
|
||||
|
||||
/* The magic to assert we get full range for YUV to RGB, instead of
|
||||
mapping into 16-235 (only supported by newer ffmpeg versions) */
|
||||
if (!sws_getColorspaceDetails(anim->img_convert_ctx, &inv_table, &srcRange,
|
||||
&table, &dstRange, &brightness, &contrast, &saturation)) {
|
||||
srcRange = srcRange || anim->pCodecCtx->color_range == AVCOL_RANGE_JPEG;
|
||||
inv_table = sws_getCoefficients(anim->pCodecCtx->colorspace);
|
||||
sws_setColorspaceDetails(anim->img_convert_ctx, inv_table, srcRange,
|
||||
table, dstRange, brightness, contrast, saturation);
|
||||
}
|
||||
#else
|
||||
if (anim == 0) return (0);
|
||||
#endif
|
||||
|
||||
ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect, 0);
|
||||
|
||||
avpicture_fill((AVPicture*) anim->pFrameRGB,
|
||||
|
||||
Reference in New Issue
Block a user