Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
In the Windows SDK for Vista, the DirectShow base classes have a useful little function named ValidateBitmapInfoHeader.
BOOL ValidateBitmapInfoHeader(const BITMAPINFOHEADER *pbmi, DWORD cbSize)
This function checks a BITMAPINFOHEADER structure for some possible errors that can cause arithemetic overflow or can lead to buffer overruns (for example because the image size or color-palette size is wrong). The function returns FALSE in the following situations:
- The cbSize member is too small, or is more than 4K (more than enough for the structure plus a 256-entry color table.
- The width or height is zero.
- Bits per pixel exceeds 200.
- Calculating the (uncompressed) image size in bytes causes arithmetic overflow.
- The palette table has more than 256 entries, or exceeds the number of possible colors given the bit depth.
- biSizeImage is calculated incorrectly for RGB formats
This won't necessarily catch every possible error in a BITMAPINFOHEADER. In particular, it is not designed to ensure that the structure represents an actual video format or that every structure member is used correctly. For example, the documentation for BITMAPINFOHEADER says that the BI_BITFIELDS compression type is "valid for 16-bpp and 32-bpp bitmaps," but this function does not check that.
Two other functions are thin wrappers around ValidateBitmapInfoHeader:
- CheckVideoInfoType takes an AM_MEDIA_TYPE pointer whose format block is a VIDEOINFOHEADER structure. The function calls ValidateBitmapInfoHeader on the bmiHeader field.
- CheckVideoInfo2Type is the same thing for VIDEOINFOHEADER2 media types.
Both of these functions fail if the AM_MEDIA_TYPE doesn't have the expected format block. (Incidentally there's a typo in the syntax block for CheckVideoInfo2Type in the MSDN docs.)
This posting is provided "AS IS" with no warranties, and confers no rights.