diff --git a/transcode_bench.py b/transcode_bench.py index 2d64e93..4eea50e 100755 --- a/transcode_bench.py +++ b/transcode_bench.py @@ -486,6 +486,7 @@ class Benchmark: self.hwaccel_args = hwaccel_args self.accel_name = accel_name self.hw_decode = hw_decode + self.hit_nvenc_limit = False # Track if we hit NVIDIA session limit # Determine HEVC encoder (hardware or software fallback) self.hevc_encoder = self._detect_hevc_encoder() @@ -578,9 +579,15 @@ class Benchmark: avg_fps = sum(job.fps for job in jobs) / len(jobs) if jobs else 0.0 return True, avg_fps - # If failed, print first error for debugging + # If failed, check for NVENC session limit and print debug info for job in jobs: if not job.success and hasattr(job, 'stderr'): + # Check for NVIDIA session limit error + if 'OpenEncodeSessionEx failed' in job.stderr or 'incompatible client key' in job.stderr: + self.hit_nvenc_limit = True + print(f"✗ (NVIDIA concurrent session limit reached)") + return False, 0.0 + # Skip FFmpeg header and show actual error (last 10 non-empty lines) error_lines = [line for line in job.stderr.split('\n') if line.strip()] if len(error_lines) > 10: @@ -644,8 +651,8 @@ class Benchmark: print(f"✗ (failed)") high = mid - 1 - # If we have headroom, try one more stream - if max_streams > 0: + # If we have headroom, try one more stream (unless we hit NVENC limit) + if max_streams > 0 and not self.hit_nvenc_limit: print(f"Testing {max_streams + 1} simultaneous streams (checking headroom)...", end=' ', flush=True) success, avg_fps = self.run_parallel_transcodes(max_streams + 1) @@ -655,7 +662,8 @@ class Benchmark: else: if success: print(f"✗ (avg {avg_fps:.1f} fps - below real-time)") - else: + elif not self.hit_nvenc_limit: + # Only print "failed" if we didn't already print NVENC limit message print(f"✗ (failed)") return max_streams @@ -735,10 +743,21 @@ def main(): print(f"Transcode Task: 1080p H.264 → 720p H.265") print(f"Maximum Simultaneous Streams: {max_streams}") print(f"(at {args.min_fps} FPS or better)") + + # Show NVIDIA session limit warning if hit + if benchmark.hit_nvenc_limit: + print("\n⚠ IMPORTANT: Hit NVIDIA driver concurrent session limit!") + print(" Your GPU may be capable of more streams, but NVIDIA") + print(" GeForce drivers artificially limit concurrent NVENC sessions.") + print(" Typical limits: 2-5 sessions (older), 5-8 (RTX 3000/4000)") + print(" Quadro/Tesla cards have unlimited sessions.") + print("=" * 60) # Also output just the number for easy parsing print(f"\nBenchmark Score: {max_streams}") + if benchmark.hit_nvenc_limit: + print("(Limited by NVIDIA driver, not hardware performance)") finally: # Cleanup