首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强的视频渲染器渲染8位YUY2而不是10位Y210

增强的视频渲染器渲染8位YUY2而不是10位Y210
EN

Stack Overflow用户
提问于 2021-03-22 01:11:02
回答 1查看 64关注 0票数 0

我已经写了一个基于Aaron Clauson's samplesMedia Foundation Enhanced Video Renderer的独立实现。我给它提供了Y210 10位YUV4:2:2视频(从SMPTE2110-20RTP流中提取),但它只渲染一个没有错误的黑屏-无论是从HRESULTS还是使用MFTRACE

here所述,我已将10位值放入16位字中,并将低6位设置为0作为填充。

代码语言:javascript
复制
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位的逻辑转换),渲染器将毫无问题地显示视频帧。

代码语言:javascript
复制
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位数据。我还尝试交换像素样本的顺序,但这也不起作用。

EN

回答 1

Stack Overflow用户

发布于 2021-11-21 11:20:57

在这里为其他偶然发现这一点的人提供一个答案。

我一直没有找到答案,在咨询了Microsoft Media Foundation论坛后,我得出结论,这是Media Foundation中的一个bug。

请参阅微软的答案here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66735244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档