ffmpeg Cg着色器ITU 709 YCbYg

时间:2018-07-21 22:23:32

标签: c++ ffmpeg shader libav cg

我有一个查看器(sourceforge上的mrViewer),通过提供YCbCr图像并稍后在着色器中合并它们来显示电影文件。目前,我正在尝试跟踪查看器中的颜色问题,无法正确显示DNxHD电影。 EXR文件将以RGB而不是线性场景显示。这部电影是从Nuke(一个补偿程序)中的EXR文件创建的。所有电影文件都是从EXR图像转换而来的,而在NUKE 11中没有颜色空间转换。所有电影文件都以视频颜色范围编码。

Color_Profile_nuke11.exr

Color_Profile_nuke11_DNxHD_mov64_444.mov

Color_Profile_nuke11_DNxHD_mov64_422.mov

在着色器中,我做了(简化的Cg代码):

  half3 pre;

  pre.r = tex2D(YImage, tc).r;  // Y
  pre.g = tex2D(UImage, tc).r;  // U
  pre.b = tex2D(VImage, tc).r;  // V

  half3 c;

  if ( coeffs )
  {
      pre += Koff;

      c.r = dot(Kr, pre);
      c.g = dot(Kg, pre);
      c.b = dot(Kb, pre);
  }
  else
  {

      half3 yuv;

      yuv.r = 1.1643 * ( pre.r - 0.0625 );
      yuv.g = pre.g - 0.5;
      yuv.b = pre.b - 0.5;

      c.r = yuv.r + 1.5958 * yuv.b;
      c.g = yuv.r - 0.39173 * yuv.g - 0.81290 * yuv.b;
      c.b = yuv.r + 2.017 * yuv.g;
  }

  Out output;
  output.pixel = c;
  return output;



// Send coeffs to shader shader (C++ code)
{
_shader->setUniform( "coeffs", 1 );
// HDTV  YCbCr coefficients
_shader->setUniform( "Koff", 0.0f, -0.5f, -0.5f );
_shader->setUniform( "Kr", 1.0f, 0.0f, 1.28033f );
_shader->setUniform( "Kg", 1.0f, -0.21482f, -0.38059f );
_shader->setUniform( "Kb", 1.0f, 2.12798f, 0.0f );
}

现在,我的问题是ITU 709(带有dot()呼叫的那条)的路径似乎行为不正常。它将创建褪色的图像。我想知道这是否与未考虑全jpeg和全mpeg有关,或者我的系数是否错误。

如果我使用ffmpeg库在C ++代码中将颜色矩阵设置为ITU709,并让其swscale进行转换,则在着色器中选择(默认)601路径后,图像中的颜色就会很好。

0 个答案:

没有答案