diff options
author | Matt Ebb <matt@mke3.net> | 2010-04-12 03:52:47 +0400 |
---|---|---|
committer | Matt Ebb <matt@mke3.net> | 2010-04-12 03:52:47 +0400 |
commit | 7d9898229582b44a525c5752550a2494adaa4fd6 (patch) | |
tree | 0682069941bf0c86bb66d10778f1b5f05114cb0c /source/blender/imbuf/intern | |
parent | fbf8287ed1a763415ba59bd12cd7e2f1b0e242d5 (diff) |
Patch from Xavier Thomas, tweaks/fixes to FFMPEG YUV conversion code
Diffstat (limited to 'source/blender/imbuf/intern')
-rw-r--r-- | source/blender/imbuf/intern/anim.c | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c index b3f7784b470..a13f426e302 100644 --- a/source/blender/imbuf/intern/anim.c +++ b/source/blender/imbuf/intern/anim.c @@ -94,8 +94,13 @@ #define FFMPEG_CODEC_IS_POINTER 1 #endif +#if (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29) && \ + (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10) +#define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT #endif +#endif //WITH_FFMPEG + #ifdef WITH_REDCODE #ifdef _WIN32 /* on windows we use the ones in extern instead */ #include "libredcode/format.h" @@ -520,6 +525,13 @@ static int startffmpeg(struct anim * anim) { AVFormatContext *pFormatCtx; AVCodecContext *pCodecCtx; +#ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT + /* The following for color space determination */ + int srcRange, dstRange, brightness, contrast, saturation; + int *table; + const int *inv_table; +#endif + if (anim == 0) return(-1); do_init_ffmpeg(); @@ -647,6 +659,25 @@ static int startffmpeg(struct anim * anim) { anim->pCodecCtx = NULL; return -1; } + +#ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT + /* Try do detect if input has 0-255 YCbCR range (JFIF Jpeg MotionJpeg) */ + if (!sws_getColorspaceDetails(anim->img_convert_ctx, (int**)&inv_table, &srcRange, + &table, &dstRange, &brightness, &contrast, &saturation)) { + + srcRange = srcRange || anim->pCodecCtx->color_range == AVCOL_RANGE_JPEG; + inv_table = sws_getCoefficients(anim->pCodecCtx->colorspace); + + if(sws_setColorspaceDetails(anim->img_convert_ctx, (int *)inv_table, srcRange, + table, dstRange, brightness, contrast, saturation)) { + + printf("Warning: Could not set libswscale colorspace details.\n"); + } + } + else { + printf("Warning: Could not set libswscale colorspace details.\n"); + } +#endif return (0); } @@ -659,26 +690,7 @@ 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) && \ - (LIBSWSCALE_VERSION_MAJOR >= 10) && (LIBSWSCALE_VERSION_MINOR >= 0) - /* 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); @@ -801,7 +813,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { unsigned char* top; sws_scale(anim->img_convert_ctx, - input->data, + (const uint8_t * const *)input->data, input->linesize, 0, anim->pCodecCtx->height, @@ -860,7 +872,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { unsigned char* r; sws_scale(anim->img_convert_ctx, - input->data, + (const uint8_t * const *)input->data, input->linesize, 0, anim->pCodecCtx->height, |