如何通过WIC为UWP将YCbCr平面格式转换为打包格式?

时间:2015-12-14 15:21:49

标签: directx direct3d direct2d wic

我的来源是FFmpeg,它是YCbCr平面格式(YUV420P,I420),

由于某些原因,我需要将其转换为YCbCr打包格式(NV12),

它必须通过WIC YCbCr API来完成,我该怎么做?

2 个答案:

答案 0 :(得分:1)

为何选择WIC? Libyuv更直接,可能表现更好。

https://code.google.com/p/libyuv/

功能:

  

缩放YUV以准备压缩内容,使用点,双线性或盒式过滤器   从网络摄像头格式转换为YUV   从YUV转换为渲染/效果的格式   旋转90/180/270度,以纵向模式调整移动设备   针对x86 / x64上的SSE2 / SSSE3 / AVX2进行了优化。

API:

/ Convert NV12 to I420.
LIBYUV_API
int NV12ToI420(const uint8* src_y, int src_stride_y,
               const uint8* src_uv, int src_stride_uv,
               uint8* dst_y, int dst_stride_y,
               uint8* dst_u, int dst_stride_u,
               uint8* dst_v, int dst_stride_v,
               int width, int height);

// Convert NV21 to I420.
LIBYUV_API
int NV21ToI420(const uint8* src_y, int src_stride_y,
               const uint8* src_vu, int src_stride_vu,
               uint8* dst_y, int dst_stride_y,
               uint8* dst_u, int dst_stride_u,
               uint8* dst_v, int dst_stride_v,
               int width, int height);

答案 1 :(得分:0)

我不确定WIC是否是正确的API来处理它。媒体基金会的一篇文章Color Converter DSP可以单独使用,肯定会关注转换。它使用SIMD指令进行了很好的优化,并且自Windows Vista开始就存在于核心操作系统中。

FFmpeg的libswscale也做同样的事情。像这样的库和API可能会根据内部实现更好或更差地处理特定方向。有可能NV12在libswscale中没有很好地实现。

同时,I420到NV12是一个非常简单的转换方向,您可以使用一次代码屏幕和SIMD内部函数来实现它,而且效率非常高。