[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28084] trunk/blender/source/blender/imbuf /intern/anim.c: Fix [#21890] YUV->RGB: Color clamping 16-235 in all motion pictures (ffmpeg)

Matt Ebb matt at mke3.net
Thu Apr 8 05:26:50 CEST 2010


Revision: 28084
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28084
Author:   broken
Date:     2010-04-08 05:26:49 +0200 (Thu, 08 Apr 2010)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/anim.c

Modified: trunk/blender/source/blender/imbuf/intern/anim.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/anim.c	2010-04-08 01:42:39 UTC (rev 28083)
+++ trunk/blender/source/blender/imbuf/intern/anim.c	2010-04-08 03:26:49 UTC (rev 28084)
@@ -659,8 +659,26 @@
 	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, 





More information about the Bf-blender-cvs mailing list