使用NVIDIA SDK进行H265 HDR视频编码时的色彩映射问题
H265 HDR视频编码色彩传递异常问题
我正尝试使用NVIDIA SDK进行H265格式的HDR视频编码,但Windows Media Foundation目前暂不支持H265的10位输入,导致我无法向编码器正确传递色彩信息。
我做了一个测试:渲染包含三张单色彩画面的视频,分别对应RGB绿色值为1.0、2.0和3.0(最大值),对应D2D1_COLOR_F格式为{0,1,0,1}、{0,2,0,1}和{0,3,0,1}。
只有绿色值为3.0的画面显示正常(左侧为生成的视频画面,右侧为应显示的正确色彩):
绿色值设为2.0时的结果:
绿色值设为1.0时的结果偏差更明显:
真实HDR图像的编码结果也存在色彩异常:
NVIDIA编码器接受AR30格式的色彩数据(即R、G、B各10位,Alpha通道2位且被忽略),而我的DirectX渲染器输出为GUID_WICPixelFormat128bppPRGBAFloat格式,我编写了如下转换代码:
struct fourx { float r, g, b, a; }; float*f = pointer_to_floats; for (int x = 0; x < wi; x++) { for (int y = 0; y < he; y++) { char* dx = (char*)f; dx += y * wi * 16; dx += x * 16; fourx* col = (fourx*)dx; DirectX::XMVECTOR v; DirectX::XMVECTORF32 floatingVector = { col->r,col->g,col->b,col->a }; v = floatingVector; // float范围是0到max_lim float max_number = 3.0f; // 该值取自我的显示器白电平 DirectX::PackedVector::XMUDECN4 u4 = {}; col->r *= 1023.0f / max_number; col->g *= 1023.0f / max_number; col->b *= 1023.0f / max_number; u4.z = (int)col->r; u4.y = (int)col->g; u4.x = (int)col->b; u4.w = 0; DWORD* dy = output_pointer; dy += y * wi; dy += x; *dy = u4.operator unsigned int(); } }
我怀疑问题出在伽马校正或色彩映射环节,但不确定后续该如何排查解决。
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

