I asked Claude to correlate the data from you with our codebase. This is the response. Note that hallucinations are possible in this type of analysis.
Based on my analysis of the forum post and the codebase, here’s my assessment for your support reply:
Diagnosis
The stream structure is correct (SPS/PPS before every IDR, proper NAL type 5, proper GOP structure). The issue is almost certainly related to two unusual VUI parameters in the H.264 SPS:
1. Color Range: Full (video_full_range_flag = 1)
This is the most likely culprit. Surveillance/broadcast H.264 streams almost universally use Limited range (16-235). Full range (0-255) is uncommon and some hardware decoders (Intel Quick Sync / Media SDK, NVIDIA NVDEC) may not handle it correctly, or they may apply incorrect color space conversion, producing visual artifacts or outright decode failures. This explains the hardware-dependent behavior — software decoding handles it fine, but hardware decoders on certain platforms fail.
2. BT.601 PAL color matrix with 1920×1080
Per H.264 spec convention, 1080p content should use BT.709 (colour_primaries=1, matrix_coefficients=1). Using BT.601 PAL (colour_primaries=5, matrix_coefficients=5) with HD resolution is non-standard. While this alone may not cause decode failure, combined with full range it increases the chance of hitting untested code paths in hardware decoders.
Recommendation for the customer
1.Change color range to Limited (video_full_range_flag = 0) — this is the standard for H.264 surveillance streams and is the most likely fix.
2.Use BT.709 color primaries/matrix for 1080p content (colour_primaries=1, transfer_characteristics=1, matrix_coefficients=1).
3.If they cannot change the encoder settings, they can try forcing software decoding in SmartClient as a workaround (this aligns with their observation that it works on setups without hardware acceleration).
The codebase parses these VUI parameters (CmH264VideoUsabilityInformation) and passes them through to both the Intel Media SDK decoder (MediaSDKVideoDecoder) and NVIDIA NVDEC decoder (NVDECVideoDecoder). The hardware decoder initialization paths don’t appear to have special handling for full-range YUV, which would explain why certain GPU drivers reject or mishandle the stream.