增强型视频渲染器渲染 8 位 YUY2 但不渲染 10 位 Y210

问题描述

我编写了一个基于 Media Foundation Enhanced Video RendererAaron Clauson's samples 的独立实现。我正在为它提供 Y210 10 位 YUV 4:2:2 视频(从 SMPTE 2110-20 RTP 流中提取)但它只呈现没有错误的黑屏 - 无论是来自 HRESULTS 还是同时使用 MFTRACE

here 所述,我已将 10 位值放入一个 16 位 WORD,低 6 位设置为 0 作为填充。

enter image description here

int x = 0;
for (int i = 0; i < intermediateByteBuffer.size(); i += 5) //intermediateBYTEBuffer is a vector of uint8_t that holds 5 byte "pGroups". Each 10 bits is moved into a new WORD array element and padded
{
    //WORD buffer order is 1,3,2 to convert samples from Cb,Y0,Cr,Y1 to Y0,Cb,Y1,Cr as specified in Y210 and YUY2
    intermediateWORDBuffer[1 + x] = (((uint16_t)intermediateByteBuffer[0 + i] & 0b11111111u) << (0 + 8)) | (((uint16_t)intermediateByteBuffer[1 + i] & 0b11000000u) << 0);
    intermediateWORDBuffer[0 + x] = (((uint16_t)intermediateByteBuffer[1 + i] & 0b00111111u) << (2 + 8)) | (((uint16_t)intermediateByteBuffer[2 + i] & 0b11110000u) << 2);
    intermediateWORDBuffer[3 + x] = (((uint16_t)intermediateByteBuffer[2 + i] & 0b00001111u) << (4 + 8)) | (((uint16_t)intermediateByteBuffer[3 + i] & 0b11111100u) << 4);
    intermediateWORDBuffer[2 + x] = (((uint16_t)intermediateByteBuffer[3 + i] & 0b00000011u) << (6 + 8)) | (((uint16_t)intermediateByteBuffer[4 + i] & 0b11111111u) << 6);
    x += 4;
}

我可以通过将每个 WORD 右移 8 位(YUY2 用于填充,>> 6 用于从 10 到 8 的逻辑转换)将 10 位数据转换为 8 位 >> 2位),渲染器将毫无问题地显示视频帧。

for (int i = 0; i < intermediateWORDBuffer.size(); i += 8)
{
    renderBuffer[i + 0] = (intermediateWORDBuffer[i + 0] >> 8); //renderBuffer is a uint8_t vector
    renderBuffer[i + 1] = (intermediateWORDBuffer[i + 1] >> 8);
    renderBuffer[i + 2] = (intermediateWORDBuffer[i + 2] >> 8);
    renderBuffer[i + 3] = (intermediateWORDBuffer[i + 3] >> 8);
    renderBuffer[i + 4] = (intermediateWORDBuffer[i + 4] >> 8);
    renderBuffer[i + 5] = (intermediateWORDBuffer[i + 5] >> 8);
    renderBuffer[i + 6] = (intermediateWORDBuffer[i + 6] >> 8);
    renderBuffer[i + 7] = (intermediateWORDBuffer[i + 7] >> 8);
}

这让我质疑为什么渲染器会接受 8 位而不是 10 位(16 位,包括填充),因为转换工作从一开始就需要有效的 10 位数据。我也尝试过交换像素样本的顺序,但这也不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)