我已经写了一个基于Aaron Clauson's samples的Media Foundation Enhanced Video Renderer的独立实现。我给它提供了Y210 10位YUV4:2:2视频(从SMPTE2110-20RTP流中提取),但它只渲染一个没有错误的黑屏-无论是从HRESULTS还是使用MFTRACE。
如here所述,我已将10位值放入16位字中,并将低6位设置为0作为填充。

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,0,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;
}我可以通过将每个字右移8位将10位数据转换为8位YUY2 (>> 6用于填充,>> 2用于从10位到8位的逻辑转换),渲染器将毫无问题地显示视频帧。
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位数据。我还尝试交换像素样本的顺序,但这也不起作用。
发布于 2021-11-21 11:20:57
在这里为其他偶然发现这一点的人提供一个答案。
我一直没有找到答案,在咨询了Microsoft Media Foundation论坛后,我得出结论,这是Media Foundation中的一个bug。
请参阅微软的答案here
https://stackoverflow.com/questions/66735244
复制相似问题