Commit e8cd598
{CUDA Decoding} Restore SW decoder fallback in xprsDecoderMaker
Summary:
A wheel built with `ENABLE_NVCODEC=ON` segfaults on any machine without an NVIDIA driver. The GitHub CI "Test wheel" job crashes with exit 139 after:
Cannot load libcuda.so.1
[XPRS][WARNING]: Loading CUDA functions failed
[DecoderFactory][WARNING]: Could not create a decoder for 'H.265'!
With no driver, `getNvCodecContext()` throws while probing the HW entries and `enumDecoders()` catches it, returning a non-OK result. The SW `hevc`/`h264` decoders were already collected before the throw (they precede the HW entries in `kPreferredDecoderImplementations`), so the list is usable. `xprsDecoderMaker` bailed on the non-OK result and discarded that list, so no decoder was created and the null decoder was dereferenced downstream. Note the HW decoders never enter the list at all: the throw happens before `codecs.push_back`.
Three changes:
- Ignore the `enumDecoders()` result and fail only when the decoder list is genuinely empty. This is what fixes the crash.
- On decoder `init()` failure, continue to the next candidate instead of returning, so the HW->SW fallback actually runs. This matters on a machine that does have a GPU, where enumeration succeeds but `init()` fails (NVDEC session limit, VRAM pressure).
- Return `nullptr` rather than `decoder` when the loop is exhausted. Raised by DevMate: with the `continue` above, a candidate that initialized but failed `decode()` could otherwise be returned by a later iteration's fall-through. A non-null return is also load-bearing in `DecoderFactory::makeDecoder`, which stops at the first maker that returns anything, so handing back a known-bad decoder would prevent other registered makers from being tried. This also removes a pre-existing path to the same stale return.
The GPU path is unchanged.
Reviewed By: kongchen1992
Differential Revision: D114806413
fbshipit-source-id: e0886dcd9523d3b4cb20dd6efcd96f76c0f1b6fa1 parent 2f4fc9e commit e8cd598
1 file changed
Lines changed: 10 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
373 | 373 | | |
374 | 374 | | |
375 | 375 | | |
376 | | - | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
377 | 381 | | |
378 | 382 | | |
379 | 383 | | |
| |||
399 | 403 | | |
400 | 404 | | |
401 | 405 | | |
402 | | - | |
| 406 | + | |
403 | 407 | | |
404 | 408 | | |
405 | 409 | | |
| |||
424 | 428 | | |
425 | 429 | | |
426 | 430 | | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
427 | 434 | | |
428 | | - | |
| 435 | + | |
429 | 436 | | |
430 | 437 | | |
431 | 438 | | |
0 commit comments