我几乎可以肯定,这比我想象的要简单得多,但我在互联网上搜索的时间比我愿意承认的要长得多,试图找出冰箱如何转换这两种格式。我能够从无符号字节流(无符号字符)中提取 Y0、Cb、Y1、Cr 数据,但我不知道这些字节是如何排列的YV12 http://fourcc.org/yuv.php#YV12- 该文档是否暗示各个值实际上包含在不同的行中?
我一整天都在搜索“c++ 将 YUY2 转换为 YV12”之类的内容,但完全没有找到任何教程或代码示例。我认为这会有某种形式的文档可供我使用,但关于这个特定主题的信息似乎很少。
看起来像YUY2 上的链接条目 http://fourcc.org/yuv.php#YUY2与维基百科关于 YV12 的文章 http://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29_to_RGB888_conversion很清楚地表明了这一点:
YUY2 将每两个相邻的水平像素存储为四个字节,[Y1, U, Y2, V]
.
-
YV12存储整个M × N连续数组中的帧M*N + 2 * (M/2 * N/2)
字节。让我们调用数组byte frame[M * N * 3 / 2]
。我们有:
-
frame[i]
for i
in [0, M * N)
是Y- 像素值。
-
frame[j]
for j
in [M * N, M * N * 5/4)
是V- 每个 2 × 2 像素图块的值。
-
frame[j]
for k
in [M * N * 5/4, M * N * 6/4)
是U- 每个 2 × 2 像素图块的值。
因此,当您从 YUY2 转换为 YV12 时,您必须将数量减半U- and V-数据,可能通过取两个相邻行的平均值。
Example:
byte YUY2Source[M * N * 2] = /* source frame */;
byte YV12Dest[M * N * 3/2];
for (unsigned int i = 0; i != M * N; ++i)
{
YV12Dest[i] = YUY2Source[2 * i];
}
for (unsigned int j = 0; j != M * N / 4; ++j)
{
YV12Dest[M * N + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 3]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 3] ) / 2;
YV12Dest[M * N * 5/4 + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 1]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 1] ) / 2;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)