Je souhaite effectuer une conversion de l'espace colorimétrique de ma trame vidéo avant de la convertir en texture opengl avec le code suivant:
struct SwsContext * pSwsCtx = sws_getCachedContext(NULL,width, height, codec->pix_fmt, width, height, AV_PIX_FMT_RGBA, SWS_POINT, NULL, NULL, NULL);
Chaque fois que la fonction sws_getCachedContext () est appelée, je reçois l'avertissement suivant:
[swscaler @ 0x10506fa00] deprecated pixel format used, make sure you did set range correctly
Voici ma sortie ffmpeg pour les informations de version:
ffmpeg version 2.2 Copyright (c) 2000-2014 the FFmpeg developers
built on Mar 26 2014 15:29:01 with Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --Host-cflags= --Host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid
libavutil 52. 66.100 / 52. 66.100
libavcodec 55. 52.102 / 55. 52.102
libavformat 55. 33.100 / 55. 33.100
libavdevice 55. 10.100 / 55. 10.100
libavfilter 4. 2.100 / 4. 2.100
libavresample 1. 2. 0 / 1. 2. 0
libswscale 2. 5.102 / 2. 5.102
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
Hyper fast Audio and Video encoder
Une idée pour désactiver cet avertissement? Comment régler correctement la gamme de couleurs?
Il semble que vous essayez de lire AV_PIX_FMT_YUVJXXXP
trames obsolètes (voir doc libav ). Vous pouvez utiliser cette solution de contournement pour le gérer:
AVPixelFormat pixFormat;
switch (_videoStream->codec->pix_fmt) {
case AV_PIX_FMT_YUVJ420P :
pixFormat = AV_PIX_FMT_YUV420P;
break;
case AV_PIX_FMT_YUVJ422P :
pixFormat = AV_PIX_FMT_YUV422P;
break;
case AV_PIX_FMT_YUVJ444P :
pixFormat = AV_PIX_FMT_YUV444P;
break;
case AV_PIX_FMT_YUVJ440P :
pixFormat = AV_PIX_FMT_YUV440P;
break;
default:
pixFormat = _videoStream->codec->codec->pix_fmts;
break;
}
Cela fait longtemps que la question n'a pas été posée, mais comme j'ai rencontré le même problème, je l'ai regardé et j'ai essayé de trouver également la réponse à la deuxième partie (Comment définir correctement la gamme de couleurs?). Je prolonge la réponse de Thomas Ayoub:
AVCodecContext* pCodecCtx = _videoStream->codec;
AVPixelFormat pixFormat;
switch (pCodecCtx->pix_fmt)
{
case AV_PIX_FMT_YUVJ420P:
pixFormat = AV_PIX_FMT_YUV420P;
break;
case AV_PIX_FMT_YUVJ422P:
pixFormat = AV_PIX_FMT_YUV422P;
break;
case AV_PIX_FMT_YUVJ444P:
pixFormat = AV_PIX_FMT_YUV444P;
break;
case AV_PIX_FMT_YUVJ440P:
pixFormat = AV_PIX_FMT_YUV440P;
break;
default:
pixFormat = pCodecCtx->pix_fmt;
}
// initialize SWS context for software scaling
SwsContext *swsCtx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pixFormat, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL);
// change the range of input data by first reading the current color space and then setting it's range as yuvj.
int dummy[4];
int srcRange, dstRange;
int brightness, contrast, saturation;
sws_getColorspaceDetails(swsCtx, (int**)&dummy, &srcRange, (int**)&dummy, &dstRange, &brightness, &contrast, &saturation);
const int* coefs = sws_getCoefficients(SWS_CS_DEFAULT);
srcRange = 1; // this marks that values are according to yuvj
sws_setColorspaceDetails(swsCtx, coefs, srcRange, coefs, dstRange,
brightness, contrast, saturation);
Qu'en est-il des gammes? Le format de pixel YUV a des valeurs dans les plages: Y 16..235, UV 16..240. Le YUVJ est étendu un et tous les YUV sont 0 ... 255. Donc, le réglage
srcRange = 1
force la libav à utiliser une plage de données d'entrée étendue. Si vous n'effectuez aucun changement dans la plage, alors vous ne ressentirez probablement qu'un contraste exagéré. Il doit toujours mettre à l'échelle les données d'entrée dans l'espace colorimétrique RVB.