What is the most effective pixel format for WIC bitmap processing?

只愿长相守 提交于 2019-12-24 05:24:06

问题


I'm trying to make a simple video player like program with Direct2D and WIC Bitmap.
It requires fast and CPU economic drawing (with stretch) of YUV pixel format frame data.

I've already tested with GDI. I hope switching to Direct2D give at least 10x performance gain (smaller CPU overhead).

What I'll doing is basically such as below:

  1. Create an empty WIC bitmap A (for drawing canvas)
  2. Create another WIC bitmap B with YUV frame data (format conversion)
  3. Draw bitmap B onto A, then draw A to the D2D render target

For 1, 2 step, I must select a pixel format.
WIC Native Pixel Formats

There is a MSDN page recommends WICPixelFormat32bppPBGRA.
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx

What's the difference WICPixelFormat32bppPBGRA and WICPixelFormat32bppBGRA? (former has additional P)

If WICPixelFormat32bppPBGRA is the way to go, is it always the case? Regardless hardware and/or configuration?

What is the most effective pixel format for WIC bitmap processing actually?


回答1:


Unfortunately, using Direct2D 1.1 or lower, you cannot use pixelformat different from DXGI_FORMAT_B8G8R8A8_UNORM which is equivalent to WIC's WICPixelFormat32bppPBGRA ("P" is if you use D2D1_ALPHA_MODE_PREMULTIPLIED alpha mode in D2D).

If your target OS in Windows 8 then you can use Direct2D's newer features. As far as I remember there is some kind of YUV support for D2D bitmaps. (Edit: No, there is not. RGB32 remains the only pixelformat supported along with some alpha-only formats)

What is the most effective pixel format for WIC bitmap processing actually?

I'm not sure how to measure pixel format effectiveness, but if you want to use hardware acceleration you should draw using D2D instead of WIC, and use WIC only for colorspace conversion. (GDI is also hardware accelarated btw).

What's the difference WICPixelFormat32bppPBGRA and WICPixelFormat32bppBGRA? (former has additional P)

P means that RGB components are premultiplied. (see here)

What I'll doing is basically such as below:

  1. Create an empty WIC bitmap A (for drawing canvas)
  2. Create another WIC bitmap B with YUV frame data (format conversion)
  3. Draw bitmap B onto A, then draw A to the D2D render target

If you target for performance, you should minimize the bitmap copy operations, also you should avoid using WIC bitmap render target, because it is uses software rendering. If your player would only render to a window, you can use HWND render target, or DeviceContext with Swap Chain (depending of Direct2D version you use).

Instead of rendering frame B to frame A, you can use software pixel format conversion featuers of WIC (e.g. IWICFormatConverter). Another way would be to write (or find) a custom conversion routine using SIMD operations. Or use shaders to convert the format (colorspace) on the GPU side. But the latter two require advanced knowledge.

When it is converted you can lock the pixels to get the pixel data and directly copy that data to a D2D bitmap (ID2D1Bitmap::CopyFromMemory()). Given that you already have a ready d2d bitmap.

And the last step would be to render the bitmap to the render target. And you can use transformation matrices to realize stretching.



来源:https://stackoverflow.com/questions/26139710/what-is-the-most-effective-pixel-format-for-wic-bitmap-processing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!