Patch from Xavier Thomas, tweaks/fixes to FFMPEG YUV conversion code

This commit is contained in:
Matt Ebb 2010-04-11 23:52:47 +00:00
parent fbf8287ed1
commit 7d98982295

@ -94,8 +94,13 @@
#define FFMPEG_CODEC_IS_POINTER 1 #define FFMPEG_CODEC_IS_POINTER 1
#endif #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
#endif //WITH_FFMPEG
#ifdef WITH_REDCODE #ifdef WITH_REDCODE
#ifdef _WIN32 /* on windows we use the ones in extern instead */ #ifdef _WIN32 /* on windows we use the ones in extern instead */
#include "libredcode/format.h" #include "libredcode/format.h"
@ -520,6 +525,13 @@ static int startffmpeg(struct anim * anim) {
AVFormatContext *pFormatCtx; AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx; 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); if (anim == 0) return(-1);
do_init_ffmpeg(); do_init_ffmpeg();
@ -647,6 +659,25 @@ static int startffmpeg(struct anim * anim) {
anim->pCodecCtx = NULL; anim->pCodecCtx = NULL;
return -1; 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); return (0);
} }
@ -659,27 +690,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
int pos_found = 1; int pos_found = 1;
int filter_y = 0; 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); 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); ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect, 0);
avpicture_fill((AVPicture*) anim->pFrameRGB, avpicture_fill((AVPicture*) anim->pFrameRGB,
@ -801,7 +813,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
unsigned char* top; unsigned char* top;
sws_scale(anim->img_convert_ctx, sws_scale(anim->img_convert_ctx,
input->data, (const uint8_t * const *)input->data,
input->linesize, input->linesize,
0, 0,
anim->pCodecCtx->height, anim->pCodecCtx->height,
@ -860,7 +872,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
unsigned char* r; unsigned char* r;
sws_scale(anim->img_convert_ctx, sws_scale(anim->img_convert_ctx,
input->data, (const uint8_t * const *)input->data,
input->linesize, input->linesize,
0, 0,
anim->pCodecCtx->height, anim->pCodecCtx->height,