Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Support] Human-126094 - docker templates

Featured Replies

On 6/18/2026 at 10:14 AM, Human-126094 said:

Before I start planning the details — does this match what you'd expect? Anything specific about your setup I should know (e.g. how many GPUs are passed into the container, and the output of "ls -la /dev/dri" from inside the container)? That last one would help me a lot. Thanks!

Sure, this sounds fine.
I have two GPUs passed to the container

drwxr-xr-x 2 root root      120 Jun 19 04:15 .
drwxr-xr-x 6 root root      360 Jun 19 04:15 ..
crwxrwxrwx 1 root   18 226,   0 Jun 19 04:15 card0
crw-rw---- 1 root   18 226,   1 Jun 19 04:15 card1
crwxrwxrwx 1 root   18 226, 128 Jun 19 04:15 renderD128
crwxrwxrwx 1 root   18 226, 129 Jun 19 04:15 renderD129

I can help to debug and test, if necessary.

  • Replies 118
  • Views 4.2k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • illrigger
    illrigger

    I figured this out, the image doesn't have any drivers in it. From the console inside the container, run the following (assuming you are using Intel QuickSync): sed -i 's/Components: main/Components:

  • Human-126094
    Human-126094

    @tulathron Thanks for the report, all three issues have been scheduled for the next release. 1. statfs_failed:ENOENT on encode start encoder pre-flight stats the input file inside the container and

  • Human-126094
    Human-126094

    Thanks for digging into this — your instinct was right that something's off in the media stack, just not quite where it looked. Two things are going on: 1. Your container is still on Bookworm becaus

Posted Images

  • Author

🚀 v2.31.0 - GPU Device Selection is live

ghcr.io/masterjb/x265-butler:2.31.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

If you run more than one GPU, you can now choose which one encodes. Before this, x265-butler always used the first /dev/dri/renderD* node it found - usually the Intel iGPU - so a discrete card like an Arc A380 was never picked up and there was no way to override it. This release adds a GPU device picker.

🎛️ WHAT'S NEW
• New "GPU Device" picker in Settings → Encoder, and a matching one in the first-run onboarding hardware step.
• Both lists are filled from a live probe of your /dev/dri/renderD* nodes - you select the actual device you want (e.g. the Arc).
• Leave it on "Auto" (the default) and nothing changes - single-GPU setups and anyone who never touches the setting are completely unaffected.
• The picked node is now passed explicitly to both QSV and VAAPI; no container restart needed when you change it.

Multi-GPU folks (especially Intel iGPU + Arc): I don't have that hardware here, so this is the build to test it on. If your discrete card now shows up and encodes - great, let me know. If it binds but throws "Current pixel format is unsupported", please post the container log so I can chase it. To revert instantly, just set GPU Device back to Auto.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.31.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.30.0

🔭 COMING NEXT
• Auto-crop / black-bar removal - optional cropdetect pass to strip letterbox/pillarbox bars during the encode (the Handbrake crop=auto equivalent).

Plans can change, but that's what's next on the bench.

  • Author

Hi @cmeyer86

thanks for the detailed report.

Trash on a separate path: this is already possible. Open Settings and look for the Trash Path field. Leave it empty to keep the trash on the cache pool, or point it at an array share so the files can live there for the retention window (default 30 days). The path is fully adjustable.

Queue picking up already encoded files: I could reproduce the cause and added a fix to the pipeline. It will land in one of the next releases.

Progress bar: both points (the bar disappearing, and one bar per encode when parallelism is 2 or higher) are queued as well and ship in the same line of updates.

Cheers

  • Author

🚀 v2.32.0 - Auto-Crop / Black-Bar Removal is live

ghcr.io/masterjb/x265-butler:2.32.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

This one is for everyone with letterboxed or pillarboxed sources (black bars baked into the picture). x265-butler can now detect and crop those bars out during the encode - the same idea as Handbrake's "crop = auto". Cropping the dead bars saves bitrate and gives a cleaner output.

✂️ AUTO-CROP + MANUAL OVERRIDE
New card under Settings -> Encoder -> Auto-Crop, with two controls:

• Auto-Crop toggle - runs an ffmpeg cropdetect pass on a short sample of each source, figures out the crop, and applies it to the encode automatically. Per-file, so each title gets its own crop.
• Crop override (W:H:X:Y) - a fixed geometry for when you already know the exact crop, or when auto-detect guesses wrong. A valid override wins over the toggle, so you can leave Auto-Crop off and still force one specific crop. Bad/odd values are rejected right in the form and at the API, so you get told immediately instead of a failed encode later.

The first-run onboarding now mentions where to find this too.

Both controls are OFF by default. If you do not touch them, the encode is byte-identical to v2.31.x - nothing changes for you. Works across libx265, NVENC, QSV and VAAPI.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.32.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.31.0

🔭 COMING NEXT
• Central-sidecar re-queue fix - if you store sidecars centrally and keep the source files, rescans can re-queue already-encoded files. A write-side fix is planned.
• Per-encode progress bars - the queue progress bar can disappear, and with parallelism set to 2 or more each running encode should show its own bar.

Feedback and crop results from real hardware welcome - especially QSV/VAAPI/NVENC, since I cannot test the cropped HW encode locally.

  • Author

🚀 v2.33.0 - Re-Queue, Queue Progress & Cache-Path Fixes is live

ghcr.io/masterjb/x265-butler:2.33.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

This is a plumbing release - three operator-reported fixes in the queue/encode path, no codec or quality changes.

🛠️ WHAT CHANGED
• Cache-path EACCES fix for older installs. If you installed before v2.21 you carry a stored cache path of /mnt/cache/x265-butler (the old hard-coded default). Since v2.21 any stored value is treated as a manual override and used as-is with no writability check - so on any host that doesn't map /mnt/cache/x265-butler into the container, every encode failed with cache_pool_unavailable:EACCES. v2.33.0 adds a one-time boot migration that drops ONLY that exact legacy-default value, so it auto-resolves again (writable /mnt/cache -> same path; otherwise falls back to /config/cache). A real custom cache path is never touched.
• Central-sidecar source re-queue fix. In central sidecar + suffix mode, a smaller re-encode kept the source but never wrote a source-keyed sidecar for it, so rescans kept re-queueing already-encoded files. The marker is now written on that path - rescans stop redoing finished work.
• Per-job queue progress bars. The progress bar could vanish mid-encode, and with parallelism >=2 the concurrent encodes collapsed onto one bar. Each concurrent encode now shows its own live progress bar.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)

If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.33.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.32.0

🔭 COMING NEXT
• Route the job-log retention sweep through the cache-path resolver (so log retention keeps running after the cache-path fix above).
• More operator-reported stabilization across the queue, encode, and storage surfaces.

Hi,

I wanted to try the new black bars settings (thanks again !) in x265 (CPU) but realize that it just does nothing...

I've even tried previous images, including the first one I tried (2.13.0 which I'm almost sure was working) but cannot get any encoding to work...

I have verified all my settings, tried from fresh images, still the same behavior : when I click Encode now it goes to the queue and shows the name of the file with no progress at all :

image.png

My Unraid CPU does absolutely nothing, and even the Test Encode gives an error :

image.png

Encoder logs :

19eefa977bb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/cache/x265-butler/work/1/input':

19eefa977bb Metadata:

19eefa977bb major_brand : qt

19eefa977bb minor_version : 0

19eefa977bb compatible_brands: qt

19eefa977bb creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bb com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 019eefa977bc

19eefa977bc com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

19eefa977bc com.apple.quicktime.make: Apple

19eefa977bc com.apple.quicktime.model: iPhone 15 Pro

19eefa977bc com.apple.quicktime.software: 26.5

19eefa977bc com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

19eefa977bc Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s

19eefa977bc Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Video

19eefa977bc vendor_id : [0][0][0][0]

19eefa977bc encoder : HEVC

19eefa977bc Side data:

19eefa977bc DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

19eefa977bc Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

19eefa977bc Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Audio

19eefa977bc vendor_id : [0][0][0][0]

19eefa977bc Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977be Stream mapping:

19eefa977be Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

19eefa977be Stream #0:1 -> #0:1 (copy)

19eefa977be Stream #0:2 -> #0:2 (copy)

Stream #0:3 -> #0:319eefa977be (copy)

19eefa977be Stream #0:4 -> #0:4 (copy)

19eefa977be Stream #0:5 -> #0:5 (copy)

19eefa977be Stream #0:6 -> #0:6 (copy)

19eefa977bf Press [q] to stop, [?] for help

19eefa97930 x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

19eefa97930 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

19eefa97931 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

19eefa97931 x265 [info]: Main 10 profile, Level-5.1 (Main tier)

19eefa97931 x265 [info]: Thread pool created using 128 threads

19eefa97934 x265 [info]: Thread pool created using 21914 threads

19eefa97934 x265 [info]: Slices : 1

19eefa97934 x265 [info]: frame threads / pool features : 6 / wpp(34 rows)

Container logs :

x265-butler: LIBVA_DRIVER_NAME unset (no Intel PCI device; Mesa/NVENC autodetect)

▲ Next.js 15.5.18

- Local: http://localhost:3000

- Network: http://0.0.0.0:3000

✓ Starting...

✓ Ready in 366ms

{"level":30,"time":1782137172903,"pid":7,"hostname":"5ccc3af18555","migration":"0028","action":"migrated_default_output_suffix","from":".x265.mkv","to":"-x265","rowsAffected":1,"msg":"16-05: default output_suffix migrated"}

{"level":30,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"server_init","msg":"server init complete"}

{"level":40,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"legacy_cache_path_migrated","removed":"/mnt/cache/x265-butler","msg":"deleted legacy default cache_pool_path row → DC-B auto-resolve"}

{"level":30,"time":1782137172940,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_start","recoveredStaleEncoding":0,"recoveredFiles":[],"recoveredFileRows":0,"msg":"encoder loop started"}

{"level":30,"time":1782137172956,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_capacity","cpuCount":128,"concurrencySetting":"auto","limits":{"libx265":8,"nvenc":1,"qsv":1,"vaapi":1},"msg":"encoder loop capacity computed"}

{"level":30,"time":1782137172976,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/logs","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":40,"time":1782137172981,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137173060,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":103,"msg":"encoder detection complete"}

{"level":30,"time":1782137173089,"pid":7,"hostname":"5ccc3af18555","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137173090,"pid":7,"hostname":"5ccc3af18555","action":"auto_scan_reconcile_complete","reconcileCount":0,"orphanReEnqueueCount":0,"durationMs":121,"msg":"auto-scan reconcile complete"}

{"level":30,"time":1782137177565,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/media","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}

{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","filesScanned":0,"filesAdded":0,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":1,"msg":"scan complete"}

{"level":30,"time":1782137177609,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","key":"autoScan.enabled","oldValue":"true","newValue":"false","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_setting_changed","changes":[{"key":"autoScan.enabled","oldValue":"true","newValue":"false"}],"msg":"auto-scan settings mutated"}

{"level":30,"time":1782137182167,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_disabled","msg":"auto-scan disabled — service idle"}

{"level":30,"time":1782137183201,"pid":7,"hostname":"5ccc3af18555","requestId":"24e36873-73fb-4b63-88c1-7264b7181f30","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137199990,"pid":7,"hostname":"5ccc3af18555","requestId":"1516dd8f-57de-4beb-bb53-914ae1232d32","route":"/api/events","action":"sse_stream_closed","durationMs":25702,"deliveredCount":1,"droppedCount":0,"msg":"SSE stream closed"}

{"level":30,"time":1782137200086,"pid":7,"hostname":"5ccc3af18555","action":"wizard_entered","locale":"en","fileCount":0,"autoSkipPathsStep":true,"share_id":1,"placeholderSharePath":"/media","msg":"first-run wizard rendered"}

{"level":30,"time":1782137200092,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/onboarding","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":40,"time":1782137201769,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137201770,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}

{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}

{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}

{"level":30,"time":1782137221953,"pid":7,"hostname":"5ccc3af18555","requestId":"6561bfc3-d2c6-40b5-b92e-e9f5733c27e0","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_libx265","oldValue":"23","newValue":"20","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_nvenc","oldValue":"23","newValue":"18","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_qsv","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_vaapi","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137172},"after":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"msg":"placeholder share PATCHed via onboarding"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_completed","timestamp":1782137229,"shareAction":"updated","shareId":1,"msg":"first-run wizard completed"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"wizard_completed_via_auto_skip_path","share_path":"/media","share_id":1,"locale":"fr,fr-FR;q=0.9,en-US;q=0.8,en;q=0.7","msg":"wizard completed via skip-branch — no path override"}

{"level":30,"time":1782137253623,"pid":7,"hostname":"5ccc3af18555","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","route":"/api/settings","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","key":"cache_pool_path","oldValue":null,"newValue":"/mnt/cache/x265-butler","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137253657,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137255950,"pid":7,"hostname":"5ccc3af18555","requestId":"788c7555-4b32-4240-b666-218941d3082e","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_libx265","oldValue":"medium","newValue":"slow","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_nvenc","oldValue":"p5","newValue":"p7","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"sidecar_mode","oldValue":null,"newValue":"central","action":"settings_change","msg":"settings_change"}

{"level":40,"time":1782137268735,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137268736,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}

{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}

{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}

{"level":30,"time":1782137268778,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137269127,"pid":7,"hostname":"5ccc3af18555","requestId":"639b2ab6-654a-47f7-8599-e93cfb4c6623","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137273162,"pid":7,"hostname":"5ccc3af18555","requestId":"a7507ffa-2f3d-45d1-afa0-a840256b0093","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137277616,"pid":7,"hostname":"5ccc3af18555","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","route":"/api/settings","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","key":"auto_crop","oldValue":null,"newValue":"true","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137277669,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137278112,"pid":7,"hostname":"5ccc3af18555","requestId":"e8a9e8aa-ff4a-44e9-88bf-63dcdb96edfd","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137296659,"pid":7,"hostname":"5ccc3af18555","requestId":"da916cea-b34c-4d63-9fe8-0c744046c9ce","route":"/api/shares/[id]","action":"share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"after":{"id":1,"name":"Library","path":"/library","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137296},"actor":"anonymous","msg":"share updated"}

{"level":30,"time":1782137299767,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/library","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}

{"level":30,"time":1782137300660,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":9}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137300661,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","filesScanned":9,"filesAdded":9,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":893,"msg":"scan complete"}

{"level":30,"time":1782137300715,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137311679,"pid":7,"hostname":"5ccc3af18555","requestId":"2e5edd5f-c43a-46bd-874c-925435145665","route":"/api/queue","method":"POST","action":"enqueue","jobId":1,"fileId":6,"encoder":"libx265","msg":"job enqueued"}

{"level":30,"time":1782137312303,"pid":7,"hostname":"5ccc3af18555","action":"job_transition","jobId":1,"fileId":6,"transition":"queued→encoding","encoder":"libx265","msg":"job transition: queued→encoding"}

{"level":30,"time":1782137312304,"pid":7,"hostname":"5ccc3af18555","jobId":1,"encoder":"libx265","presetResolved":"slow","presetSource":"settings","msg":"dispatch_preset_resolved"}

{"level":30,"time":1782137312309,"pid":7,"hostname":"5ccc3af18555","jobId":1,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/mnt/cache/x265-butler/work/1/input","statfs_ok":true},{"path":"/mnt/cache/x265-butler/work/1/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/library/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}],"msg":"preflight_statfs_probe"}

{"level":30,"time":1782137321223,"pid":7,"hostname":"5ccc3af18555","action":"crop_detect","inputPath":"/library/IMG_5450.MOV","durationMs":8913,"result":"3840:2160:0:0","msg":"cropdetect pre-pass complete"}

{"level":30,"time":1782137405958,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}

{"level":30,"time":1782137406149,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}

{"level":30,"time":1782137572324,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}

{"level":30,"time":1782137572388,"pid":7,"hostname":"5ccc3af18555","requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"1","droppedLineCount":0,"lastReadOffset":3965,"requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","msg":"log SSE stream closed"}

{"level":30,"time":1782137572418,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}

{"level":30,"time":1782137575706,"pid":7,"hostname":"5ccc3af18555","encoder":"libx265","durationMs":6,"outcome":"failed","exitCode":null,"msg":"testEncodeTriggered"}

{"level":30,"time":1782137575729,"pid":7,"hostname":"5ccc3af18555","event":"copyReportUnlocked","source":"diagnostics-client","outcome":"killed_timeout","encoderPicked":"libx265","msg":"diagnostics.log-event"}

EDIT : forgot to post the Diagnostic Report :

x265-butler diagnostics report

## x265-butler diagnostics report

### App

- version: 2.33.0

- gitHash: 9c2b8daa

- committedAt: 1782125397

- committedAtCET: 22.06.26, 12:49:57

### Runtime

- nodeVersion: v22.23.0

- platform: linux

- arch: x64

- uptimeSec: 237

- pid: 7

### Mounts

| path | readable | writable | error |

|---|---|---|---|

| /media | ✓ | ✓ | |

| /cache | ✓ | ✓ | |

| /config | ✓ | ✓ | |

### Cache

- effectivePath: /cache

- resolution: user-override

- settingValue: /cache

- writable: ✓

### Devices

- DRI: none

- NVIDIA: none

### Encoders

- detected: libx265

- detection warnings: none

- probe outcomes:

- nvenc: missing

- qsv: missing

- vaapi: missing

- libx265: functional

### Active warnings

no warnings

### Recent errors (in-memory, last ≤25)

no recent errors

### Onboarding

- completed: ✓

- hasShare: ✓

## Container Image

- OS: Debian GNU/Linux 13 (trixie)

- GLIBC: 2.41

- Intel Media Driver: — (so-symlink)

- libva: 2.22.0-3

- libdrm: 2.4.124-2

- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1

- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1

- libigfxcmrt7: 25.2.3+dfsg1-1

- (oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)

- ffmpeg version: N-125095-g364d309af8-20260618

<details>

<summary>ffmpeg configuration flags</summary>

```

--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618

```

</details>

## CPU

- Vendor: AuthenticAMD

- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor

- CPUID family/model: 23 / 49

- Microarch: —

- Graphics gen: —

- HEVC-QSV (hardware): unknown

- (HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)

## Blocklist Evaluation

<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->

- Total entries: 0

- Pattern cache: 2026-06-22T19:18:02.755Z

No recent evaluations.

## Slow Requests

No slow requests recorded (threshold: 1s).

## Slow Queries

No slow queries recorded (threshold: 100ms).

## Web Vitals

No web vitals recorded.

## DRI Render Devices

No render devices found (no /dev/dri).

### Last test-encode (client UAT run)

- outcome: killed_timeout

- encoderPicked: libx265

- durationMs: 10663

- exitCode: (killed)

stderr:

```

Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5':

Duration: N/A, start: 0.000000, bitrate: N/A

Stream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbn

Stream mapping:

Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))

Press [q] to stop, [?] for help

x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bit

x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6

x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)

x265 [info]: Thread pool created using 128 threads

```

Generated 2026-06-22T19:19:07.738Z

Edited by tbal82

  • Author
5 hours ago, tbal82 said:

Hi,

I wanted to try the new black bars settings (thanks again !) in x265 (CPU) but realize that it just does nothing...

I've even tried previous images, including the first one I tried (2.13.0 which I'm almost sure was working) but cannot get any encoding to work...

I have verified all my settings, tried from fresh images, still the same behavior : when I click Encode now it goes to the queue and shows the name of the file with no progress at all :

image.png

My Unraid CPU does absolutely nothing, and even the Test Encode gives an error :

image.png

Encoder logs :

19eefa977bb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/cache/x265-butler/work/1/input':

19eefa977bb Metadata:

19eefa977bb major_brand : qt

19eefa977bb minor_version : 0

19eefa977bb compatible_brands: qt

19eefa977bb creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bb com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 019eefa977bc

19eefa977bc com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

19eefa977bc com.apple.quicktime.make: Apple

19eefa977bc com.apple.quicktime.model: iPhone 15 Pro

19eefa977bc com.apple.quicktime.software: 26.5

19eefa977bc com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

19eefa977bc Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s

19eefa977bc Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Video

19eefa977bc vendor_id : [0][0][0][0]

19eefa977bc encoder : HEVC

19eefa977bc Side data:

19eefa977bc DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

19eefa977bc Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

19eefa977bc Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Audio

19eefa977bc vendor_id : [0][0][0][0]

19eefa977bc Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977bc Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)

19eefa977bc Metadata:

19eefa977bc creation_time : 2026-06-16T18:07:40.000000Z

19eefa977bc handler_name : Core Media Metadata

19eefa977be Stream mapping:

19eefa977be Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

19eefa977be Stream #0:1 -> #0:1 (copy)

19eefa977be Stream #0:2 -> #0:2 (copy)

Stream #0:3 -> #0:319eefa977be (copy)

19eefa977be Stream #0:4 -> #0:4 (copy)

19eefa977be Stream #0:5 -> #0:5 (copy)

19eefa977be Stream #0:6 -> #0:6 (copy)

19eefa977bf Press [q] to stop, [?] for help

19eefa97930 x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

19eefa97930 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

19eefa97931 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

19eefa97931 x265 [info]: Main 10 profile, Level-5.1 (Main tier)

19eefa97931 x265 [info]: Thread pool created using 128 threads

19eefa97934 x265 [info]: Thread pool created using 21914 threads

19eefa97934 x265 [info]: Slices : 1

19eefa97934 x265 [info]: frame threads / pool features : 6 / wpp(34 rows)

Container logs :

x265-butler: LIBVA_DRIVER_NAME unset (no Intel PCI device; Mesa/NVENC autodetect)

▲ Next.js 15.5.18

- Local: http://localhost:3000

- Network: http://0.0.0.0:3000

✓ Starting...

✓ Ready in 366ms

{"level":30,"time":1782137172903,"pid":7,"hostname":"5ccc3af18555","migration":"0028","action":"migrated_default_output_suffix","from":".x265.mkv","to":"-x265","rowsAffected":1,"msg":"16-05: default output_suffix migrated"}

{"level":30,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"server_init","msg":"server init complete"}

{"level":40,"time":1782137172930,"pid":7,"hostname":"5ccc3af18555","action":"legacy_cache_path_migrated","removed":"/mnt/cache/x265-butler","msg":"deleted legacy default cache_pool_path row → DC-B auto-resolve"}

{"level":30,"time":1782137172940,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_start","recoveredStaleEncoding":0,"recoveredFiles":[],"recoveredFileRows":0,"msg":"encoder loop started"}

{"level":30,"time":1782137172956,"pid":7,"hostname":"5ccc3af18555","action":"encoder_loop_capacity","cpuCount":128,"concurrencySetting":"auto","limits":{"libx265":8,"nvenc":1,"qsv":1,"vaapi":1},"msg":"encoder loop capacity computed"}

{"level":30,"time":1782137172976,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/logs","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":40,"time":1782137172981,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137173060,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":103,"msg":"encoder detection complete"}

{"level":30,"time":1782137173089,"pid":7,"hostname":"5ccc3af18555","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137173090,"pid":7,"hostname":"5ccc3af18555","action":"auto_scan_reconcile_complete","reconcileCount":0,"orphanReEnqueueCount":0,"durationMs":121,"msg":"auto-scan reconcile complete"}

{"level":30,"time":1782137177565,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/media","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}

{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":0}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137177566,"pid":7,"hostname":"5ccc3af18555","requestId":"ffd06cbf-db55-4136-bd9e-cd7d4cc8e18e","route":"/api/scan","filesScanned":0,"filesAdded":0,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":1,"msg":"scan complete"}

{"level":30,"time":1782137177609,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","key":"autoScan.enabled","oldValue":"true","newValue":"false","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137181665,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_setting_changed","changes":[{"key":"autoScan.enabled","oldValue":"true","newValue":"false"}],"msg":"auto-scan settings mutated"}

{"level":30,"time":1782137182167,"pid":7,"hostname":"5ccc3af18555","requestId":"04a540d3-6c09-43fe-95fa-a7edb2534184","route":"/api/settings","action":"auto_scan_disabled","msg":"auto-scan disabled — service idle"}

{"level":30,"time":1782137183201,"pid":7,"hostname":"5ccc3af18555","requestId":"24e36873-73fb-4b63-88c1-7264b7181f30","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137199990,"pid":7,"hostname":"5ccc3af18555","requestId":"1516dd8f-57de-4beb-bb53-914ae1232d32","route":"/api/events","action":"sse_stream_closed","durationMs":25702,"deliveredCount":1,"droppedCount":0,"msg":"SSE stream closed"}

{"level":30,"time":1782137200086,"pid":7,"hostname":"5ccc3af18555","action":"wizard_entered","locale":"en","fileCount":0,"autoSkipPathsStep":true,"share_id":1,"placeholderSharePath":"/media","msg":"first-run wizard rendered"}

{"level":30,"time":1782137200092,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/onboarding","locale":"en","onboardingIncomplete":true,"msg":"diagnostics.not-found"}

{"level":40,"time":1782137201769,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137201770,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}

{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}

{"level":30,"time":1782137201781,"pid":7,"hostname":"5ccc3af18555","requestId":"fcd8a853-171f-465e-9ff0-0c89445549d4","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}

{"level":30,"time":1782137221953,"pid":7,"hostname":"5ccc3af18555","requestId":"6561bfc3-d2c6-40b5-b92e-e9f5733c27e0","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_libx265","oldValue":"23","newValue":"20","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_nvenc","oldValue":"23","newValue":"18","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_qsv","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229245,"pid":7,"hostname":"5ccc3af18555","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","route":"/api/settings","requestId":"cf9402fc-cd12-466c-8ac4-58185bb008ba","key":"crf_vaapi","oldValue":"22","newValue":"22","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137172},"after":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"msg":"placeholder share PATCHed via onboarding"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"onboarding_completed","timestamp":1782137229,"shareAction":"updated","shareId":1,"msg":"first-run wizard completed"}

{"level":30,"time":1782137229395,"pid":7,"hostname":"5ccc3af18555","requestId":"e47d78ac-7988-426f-9e3a-29c4ba7c9301","route":"/api/onboarding/complete","action":"wizard_completed_via_auto_skip_path","share_path":"/media","share_id":1,"locale":"fr,fr-FR;q=0.9,en-US;q=0.8,en;q=0.7","msg":"wizard completed via skip-branch — no path override"}

{"level":30,"time":1782137253623,"pid":7,"hostname":"5ccc3af18555","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","route":"/api/settings","requestId":"a0246b0b-c24f-4151-bdf3-27fe8e871976","key":"cache_pool_path","oldValue":null,"newValue":"/mnt/cache/x265-butler","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137253657,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137255950,"pid":7,"hostname":"5ccc3af18555","requestId":"788c7555-4b32-4240-b666-218941d3082e","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_libx265","oldValue":"medium","newValue":"slow","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"preset_nvenc","oldValue":"p5","newValue":"p7","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137268654,"pid":7,"hostname":"5ccc3af18555","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","route":"/api/settings","requestId":"ee33d9d5-cad8-434b-b487-2ab19f626588","key":"sidecar_mode","oldValue":null,"newValue":"central","action":"settings_change","msg":"settings_change"}

{"level":40,"time":1782137268735,"pid":7,"hostname":"5ccc3af18555","action":"encoder_probe_failed","probe":"nvenc","cause":"ENOENT","err":"spawn nvidia-smi ENOENT","msg":"encoder probe failed (nvenc)"}

{"level":30,"time":1782137268736,"pid":7,"hostname":"5ccc3af18555","action":"encoder_detection_complete","detected":["libx265"],"activeFromAuto":"libx265","warningCount":0,"outcome":{"nvenc":"missing","qsv":"missing","vaapi":"missing","libx265":"functional"},"probeEncodeDisabled":false,"probeDurationMs":0,"durationMs":7,"msg":"encoder detection complete"}

{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_refreshed","detected":["libx265"],"active":"libx265","resolution":"auto","previousActive":"auto","msg":"encoder cache invalidated + re-probed + perEncoderLimits recomputed"}

{"level":30,"time":1782137268744,"pid":7,"hostname":"5ccc3af18555","requestId":"ef9bf7bd-42a2-45f1-81b2-951c21e8d87b","route":"/api/encoders/refresh","action":"encoders_active_changed","from":"auto","to":"libx265","msg":"active encoder changed"}

{"level":30,"time":1782137268778,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137269127,"pid":7,"hostname":"5ccc3af18555","requestId":"639b2ab6-654a-47f7-8599-e93cfb4c6623","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137273162,"pid":7,"hostname":"5ccc3af18555","requestId":"a7507ffa-2f3d-45d1-afa0-a840256b0093","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137277616,"pid":7,"hostname":"5ccc3af18555","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","route":"/api/settings","requestId":"2ad36338-9f42-408d-98b1-9fb1c0c10c82","key":"auto_crop","oldValue":null,"newValue":"true","action":"settings_change","msg":"settings_change"}

{"level":30,"time":1782137277669,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/settings","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137278112,"pid":7,"hostname":"5ccc3af18555","requestId":"e8a9e8aa-ff4a-44e9-88bf-63dcdb96edfd","route":"/api/bench/recommendation","method":"GET","event":"recommendation_no_completed_run"}

{"level":30,"time":1782137296659,"pid":7,"hostname":"5ccc3af18555","requestId":"da916cea-b34c-4d63-9fe8-0c744046c9ce","route":"/api/shares/[id]","action":"share_updated","shareId":1,"before":{"id":1,"name":"Library","path":"/media","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137229},"after":{"id":1,"name":"Library","path":"/library","min_size_mb":50,"extensions_csv":"mp4,mkv,avi,mov,m4v,webm,ts,m2ts,wmv","max_depth":12,"created_at":1782137172,"updated_at":1782137296},"actor":"anonymous","msg":"share updated"}

{"level":30,"time":1782137299767,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","effectiveFilters":{"resolvedRootPath":"/library","extensions":["mp4","mkv","avi","mov","m4v","webm","ts","m2ts","wmv"],"minSizeMb":50,"maxDepth":12},"msg":"scan starting"}

{"level":30,"time":1782137300660,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","action":"scan_complete_multi_share","shareCount":1,"byShareSummary":[{"id":1,"name":"Library","scanned":9}],"msg":"multi-share scan complete"}

{"level":30,"time":1782137300661,"pid":7,"hostname":"5ccc3af18555","requestId":"2d68c3da-a4c9-4fbf-bb8b-0e890373ab7d","route":"/api/scan","filesScanned":9,"filesAdded":9,"filesUpdated":0,"filesUnchanged":0,"filesFailed":0,"filesVanished":0,"byShareCount":1,"durationMs":893,"msg":"scan complete"}

{"level":30,"time":1782137300715,"pid":7,"hostname":"5ccc3af18555","event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/library","locale":"en","onboardingIncomplete":false,"msg":"diagnostics.not-found"}

{"level":30,"time":1782137311679,"pid":7,"hostname":"5ccc3af18555","requestId":"2e5edd5f-c43a-46bd-874c-925435145665","route":"/api/queue","method":"POST","action":"enqueue","jobId":1,"fileId":6,"encoder":"libx265","msg":"job enqueued"}

{"level":30,"time":1782137312303,"pid":7,"hostname":"5ccc3af18555","action":"job_transition","jobId":1,"fileId":6,"transition":"queued→encoding","encoder":"libx265","msg":"job transition: queued→encoding"}

{"level":30,"time":1782137312304,"pid":7,"hostname":"5ccc3af18555","jobId":1,"encoder":"libx265","presetResolved":"slow","presetSource":"settings","msg":"dispatch_preset_resolved"}

{"level":30,"time":1782137312309,"pid":7,"hostname":"5ccc3af18555","jobId":1,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/mnt/cache/x265-butler/work/1/input","statfs_ok":true},{"path":"/mnt/cache/x265-butler/work/1/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/library/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}],"msg":"preflight_statfs_probe"}

{"level":30,"time":1782137321223,"pid":7,"hostname":"5ccc3af18555","action":"crop_detect","inputPath":"/library/IMG_5450.MOV","durationMs":8913,"result":"3840:2160:0:0","msg":"cropdetect pre-pass complete"}

{"level":30,"time":1782137405958,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}

{"level":30,"time":1782137406149,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}

{"level":30,"time":1782137572324,"pid":7,"hostname":"5ccc3af18555","event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0,"msg":"diagnostics.page.opened"}

{"level":30,"time":1782137572388,"pid":7,"hostname":"5ccc3af18555","requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"1","droppedLineCount":0,"lastReadOffset":3965,"requestId":"13cb3c2b-fff1-4963-afc2-b32a0260b3d8","msg":"log SSE stream closed"}

{"level":30,"time":1782137572418,"pid":7,"hostname":"5ccc3af18555","event":"copyReportGated","source":"diagnostics-client","msg":"diagnostics.log-event"}

{"level":30,"time":1782137575706,"pid":7,"hostname":"5ccc3af18555","encoder":"libx265","durationMs":6,"outcome":"failed","exitCode":null,"msg":"testEncodeTriggered"}

{"level":30,"time":1782137575729,"pid":7,"hostname":"5ccc3af18555","event":"copyReportUnlocked","source":"diagnostics-client","outcome":"killed_timeout","encoderPicked":"libx265","msg":"diagnostics.log-event"}


Hi, thanks a lot for the detailed report and logs, they were exactly what I needed.


I think I've found the cause. Your log shows the x265 encoder trying to create a thread pool with 21914 threads on your 128-core host. That's bad auto-detection on machines with very high core counts (and/or multiple NUMA nodes): x265 over-allocates the thread pool, gets stuck spawning threads, and never actually starts encoding — which is exactly why the CPU sits idle, the queue shows no progress, and the Test Encode times out. It's not the black-bars/auto-crop setting (that part worked correctly and found no bars on your footage), and it's not specific to a version — every image fails because the app never capped x265's threads.


The fix: I'll set an explicit x265 thread-pool cap so it can't over-allocate, with an override (X265_POOLS) in case you want to tune it.


If you don't mind, two quick things to confirm the diagnosis while I prepare the fix:

1. The output of "lscpu" on your server (so I can see the CPU/NUMA layout).

2. Does a manual encode complete if you cap the pool? For example:

ffmpeg -i input.mov -c:v libx265 -x265-params pools=8 -an -t 30 -f null -

If that runs (instead of hanging), it confirms the thread-pool theory.


I'll post back when the fixed image is up. Thanks again for helping track this down!


Hi, thanks a lot for the detailed report and logs, they were exactly what I needed.


I think I've found the cause. Your log shows the x265 encoder trying to create a thread pool with 21914 threads on your 128-core host. That's bad auto-detection on machines with very high core counts (and/or multiple NUMA nodes): x265 over-allocates the thread pool, gets stuck spawning threads, and never actually starts encoding — which is exactly why the CPU sits idle, the queue shows no progress, and the Test Encode times out. It's not the black-bars/auto-crop setting (that part worked correctly and found no bars on your footage), and it's not specific to a version — every image fails because the app never capped x265's threads.


The fix: I'll set an explicit x265 thread-pool cap so it can't over-allocate, with an override (X265_POOLS) in case you want to tune it.


If you don't mind, two quick things to confirm the diagnosis while I prepare the fix:

1. The output of "lscpu" on your server (so I can see the CPU/NUMA layout).

2. Does a manual encode complete if you cap the pool? For example:

ffmpeg -i input.mov -c:v libx265 -x265-params pools=8 -an -t 30 -f null -

If that runs (instead of hanging), it confirms the thread-pool theory.


I'll post back when the fixed image is up. Thanks again for helping track this down!

Seems to be it, here are the logs.

lscpu

Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Address sizes: 43 bits physical, 48 bits virtual

Byte Order: Little Endian

CPU(s): 128

On-line CPU(s) list: 0-127

Vendor ID: AuthenticAMD

Model name: AMD Ryzen Threadripper 3990X 64-Core Processor

CPU family: 23

Model: 49

Thread(s) per core: 2

Core(s) per socket: 64

Socket(s): 1

Stepping: 0

Frequency boost: disabled

CPU(s) scaling MHz: 20%

CPU max MHz: 4376.0000

CPU min MHz: 550.0000

BogoMIPS: 5789.12

Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxex

t fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni p

clmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic c

r8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_l

lc mwaitx cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap

clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf

xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilte

r pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_es

Virtualization features:

Virtualization: AMD-V

Caches (sum of all):

L1d: 2 MiB (64 instances)

L1i: 2 MiB (64 instances)

L2: 32 MiB (64 instances)

L3: 256 MiB (16 instances)

NUMA:

NUMA node(s): 1

NUMA node0 CPU(s): 0-127

Vulnerabilities:

Gather data sampling: Not affected

Indirect target selection: Not affected

Itlb multihit: Not affected

L1tf: Not affected

Mds: Not affected

Meltdown: Not affected

Mmio stale data: Not affected

Reg file data sampling: Not affected

Retbleed: Mitigation; untrained return thunk; SMT enabled with STIBP protection

Spec rstack overflow: Mitigation; Safe RET

Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl

Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization

Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected

Srbds: Not affected

Tsa: Not affected

Tsx async abort: Not affected

Vmscape: Mitigation; IBPB before exit to userspace

Manual ffmpeg

ffmpeg version N-125095-g364d309af8-20260618 Copyright (c) 2000-2026 the FFmpeg developers

built with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348)

configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618

libavutil 60. 33.101 / 60. 33.101

libavcodec 62. 36.101 / 62. 36.101

libavformat 62. 19.101 / 62. 19.101

libavdevice 62. 4.100 / 62. 4.100

libavfilter 11. 17.100 / 11. 17.100

libswscale 9. 8.100 / 9. 8.100

libswresample 6. 4.100 / 6. 4.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/media/IMG_5450.MOV':

Metadata:

major_brand : qt

minor_version : 0

compatible_brands: qt

creation_time : 2026-06-16T18:07:40.000000Z

com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 0

com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

com.apple.quicktime.make: Apple

com.apple.quicktime.model: iPhone 15 Pro

com.apple.quicktime.software: 26.5

com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s

Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Video

vendor_id : [0][0][0][0]

encoder : HEVC

Side data:

DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Audio

vendor_id : [0][0][0][0]

Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream mapping:

Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

Press [q] to stop, [?] for help

x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

x265 [info]: Main 10 profile, Level-5.1 (Main tier)

x265 [info]: Thread pool created using 8 threads

x265 [info]: Slices : 1

x265 [info]: frame threads / pool features : 3 / wpp(34 rows)

x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3

x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00

x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2

x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

x265 [info]: References / ref-limit cu / depth : 3 / off / on

x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60

x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvp

x265 [info]: tools: b-intra strong-intra-smoothing lslices=8 deblock sao

x265 [info]: tools: dhdr10-info

Output #0, null, to 'pipe:':

Metadata:

major_brand : qt

minor_version : 0

compatible_brands: qt

com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 0

com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

com.apple.quicktime.make: Apple

com.apple.quicktime.model: iPhone 15 Pro

com.apple.quicktime.software: 26.5

encoder : Lavf62.19.101

Stream #0:0(und): Video: hevc, yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67, progressive), 3840x2160, q=2-31, 59.94 fps, 59.94 tbn (default)

Metadata:

encoder : Lavc62.36.101 libx265

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Video

vendor_id : [0][0][0][0]

Side data:

Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A

[out#0/null @ 0x56002b6e8fc0] video:11069KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown

frame= 1799 fps=6.9 q=37.7 Lsize=N/A time=00:00:29.97 bitrate=N/A speed=0.114x elapsed=0:04:22.07

x265 [info]: frame I: 8, Avg QP:30.45 kb/s: 27036.98

x265 [info]: frame P: 430, Avg QP:31.83 kb/s: 8125.31

x265 [info]: frame B: 1361, Avg QP:37.08 kb/s: 1258.02

x265 [info]: Weighted P-Frames: Y:0.5% UV:0.2%

encoded 1799 frames in 261.67s (6.88 fps), 3014.09 kb/s, Avg QP:35.79

Watching my cores on the dashboard page, it is definitely working. Not much (5 to 8%), but working...

I know it does not come from the crop option, but I'm almost sure it was working days ago... Or maybe I dreamt it :)

If you set a cap, will it still be able to use all the available cores ?

  • Author
11 minutes ago, tbal82 said:

Seems to be it, here are the logs.

lscpu

Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Address sizes: 43 bits physical, 48 bits virtual

Byte Order: Little Endian

CPU(s): 128

On-line CPU(s) list: 0-127

Vendor ID: AuthenticAMD

Model name: AMD Ryzen Threadripper 3990X 64-Core Processor

CPU family: 23

Model: 49

Thread(s) per core: 2

Core(s) per socket: 64

Socket(s): 1

Stepping: 0

Frequency boost: disabled

CPU(s) scaling MHz: 20%

CPU max MHz: 4376.0000

CPU min MHz: 550.0000

BogoMIPS: 5789.12

Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxex

t fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid extd_apicid aperfmperf rapl pni p

clmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic c

r8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_l

lc mwaitx cat_l3 cdp_l3 hw_pstate ssbd mba ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap

clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf

xsaveerptr rdpru wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilte

r pfthreshold avic v_vmsave_vmload vgif v_spec_ctrl umip rdpid overflow_recov succor smca sev sev_es

Virtualization features:

Virtualization: AMD-V

Caches (sum of all):

L1d: 2 MiB (64 instances)

L1i: 2 MiB (64 instances)

L2: 32 MiB (64 instances)

L3: 256 MiB (16 instances)

NUMA:

NUMA node(s): 1

NUMA node0 CPU(s): 0-127

Vulnerabilities:

Gather data sampling: Not affected

Indirect target selection: Not affected

Itlb multihit: Not affected

L1tf: Not affected

Mds: Not affected

Meltdown: Not affected

Mmio stale data: Not affected

Reg file data sampling: Not affected

Retbleed: Mitigation; untrained return thunk; SMT enabled with STIBP protection

Spec rstack overflow: Mitigation; Safe RET

Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl

Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization

Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP always-on; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected

Srbds: Not affected

Tsa: Not affected

Tsx async abort: Not affected

Vmscape: Mitigation; IBPB before exit to userspace

Manual ffmpeg

ffmpeg version N-125095-g364d309af8-20260618 Copyright (c) 2000-2026 the FFmpeg developers

built with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348)

configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618

libavutil 60. 33.101 / 60. 33.101

libavcodec 62. 36.101 / 62. 36.101

libavformat 62. 19.101 / 62. 19.101

libavdevice 62. 4.100 / 62. 4.100

libavfilter 11. 17.100 / 11. 17.100

libswscale 9. 8.100 / 9. 8.100

libswresample 6. 4.100 / 6. 4.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/media/IMG_5450.MOV':

Metadata:

major_brand : qt

minor_version : 0

compatible_brands: qt

creation_time : 2026-06-16T18:07:40.000000Z

com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 0

com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

com.apple.quicktime.make: Apple

com.apple.quicktime.model: iPhone 15 Pro

com.apple.quicktime.software: 26.5

com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

Duration: 00:17:45.81, start: 0.000000, bitrate: 64891 kb/s

Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 64440 kb/s, 59.96 fps, 59.94 tbr, 600 tbn (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Video

vendor_id : [0][0][0][0]

encoder : HEVC

Side data:

DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 198 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Audio

vendor_id : [0][0][0][0]

Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 59 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 156 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D) (default)

Metadata:

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Metadata

Stream mapping:

Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

Press [q] to stop, [?] for help

x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

x265 [info]: Main 10 profile, Level-5.1 (Main tier)

x265 [info]: Thread pool created using 8 threads

x265 [info]: Slices : 1

x265 [info]: frame threads / pool features : 3 / wpp(34 rows)

x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3

x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00

x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2

x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

x265 [info]: References / ref-limit cu / depth : 3 / off / on

x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60

x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvp

x265 [info]: tools: b-intra strong-intra-smoothing lslices=8 deblock sao

x265 [info]: tools: dhdr10-info

Output #0, null, to 'pipe:':

Metadata:

major_brand : qt

minor_version : 0

compatible_brands: qt

com.apple.quicktime.creationdate: 2026-06-16T20:07:40+0200

com.apple.quicktime.location.accuracy.horizontal: 14.414267

com.apple.quicktime.full-frame-rate-playback-intent: 0

com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.306/

com.apple.quicktime.make: Apple

com.apple.quicktime.model: iPhone 15 Pro

com.apple.quicktime.software: 26.5

encoder : Lavf62.19.101

Stream #0:0(und): Video: hevc, yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67, progressive), 3840x2160, q=2-31, 59.94 fps, 59.94 tbn (default)

Metadata:

encoder : Lavc62.36.101 libx265

creation_time : 2026-06-16T18:07:40.000000Z

handler_name : Core Media Video

vendor_id : [0][0][0][0]

Side data:

Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A

[out#0/null @ 0x56002b6e8fc0] video:11069KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown

frame= 1799 fps=6.9 q=37.7 Lsize=N/A time=00:00:29.97 bitrate=N/A speed=0.114x elapsed=0:04:22.07

x265 [info]: frame I: 8, Avg QP:30.45 kb/s: 27036.98

x265 [info]: frame P: 430, Avg QP:31.83 kb/s: 8125.31

x265 [info]: frame B: 1361, Avg QP:37.08 kb/s: 1258.02

x265 [info]: Weighted P-Frames: Y:0.5% UV:0.2%

encoded 1799 frames in 261.67s (6.88 fps), 3014.09 kb/s, Avg QP:35.79

Watching my cores on the dashboard page, it is definitely working. Not much (5 to 8%), but working...

I know it does not come from the crop option, but I'm almost sure it was working days ago... Or maybe I dreamt it :)

If you set a cap, will it still be able to use all the available cores ?


Great, that confirms it, thanks for running the manual test.


Short answer: no, the cap does not use all 128 threads, and that's deliberate, not a limitation.


Here's the reasoning:

- For a single x265 encode, throughput stops scaling well past ~16 threads. A 4K HEVC encode only exposes so much parallelism (wavefront ≈ 34 rows, 3 frame-threads in your log), so threads 17–128 mostly sit idle waiting on each other anyway. The 21914 threads your box tried to spawn wasn't "using all cores" — it was the auto-detect over-allocating on a 64-core/128-thread CPU, getting stuck spawning threads, and never starting the encode. That's the hang we're fixing.

- So the fix defaults the pool to min(cores, 16) = 16 on your machine. Your pools=8 manual test (8 threads, encode completed) already proved the pool just needs to be bounded.

- The 5–8% CPU you see is expected for one encode on a 128-thread box, that's roughly 10 cores busy. The encode being slow (0.114x in your test) is just 4K 60fps 10-bit HEVC being heavy; the thread cap is not what makes it slow.


If you want more cores working, two levers:

1. X265_POOLS=32 (or 64), raises the per-encode pool. It's uncapped above 16, so you can tune it. Expect diminishing returns, and don't go silly-high or you risk the same over-allocation

stall.

2. Better on a 64-core box: raise the app's concurrency so it encodes several files at once. One encode won't saturate your CPU no matter the pool size; running 4–8 in parallel will. That's

the real way to put those cores to work.


The "it worked days ago" isn't you dreaming, if those encodes used the NVIDIA/Intel hardware path, or were shorter/smaller clips, they'd dodge the x265 thread-pool path entirely.


Fixed image is on the way, it ships the 16-thread default plus the X265_POOLS override so you can tune it without waiting on me.

  • Author

🚀 v2.34.0 - Encode-stall fix on high-core-count hosts + auto-crop clarity is live

ghcr.io/masterjb/x265-butler:2.34.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

This fixes libx265 encodes that hung forever on machines with very many CPU threads (the report: a 128-thread host) - x265's own thread-pool auto-detect over-allocated and stalled before the first frame. v2.34.0 caps the pool to a sane bound so the encode actually runs.

🔧 WHAT CHANGED
• libx265 thread-pool cap (the stall fix): we now pass pools=min(cpuCount, 16) to x265, bypassing the NUMA auto-detect that logged "Thread pool created using 21914 threads" on a 128-CPU box and then hung. The cap covers normal encodes, the Test Encode, and the boot detection-probe. Override with X265_POOLS=8 to pin an exact size, or X265_POOLS=0 (or "auto") to fall back to x265 native auto-detect. libx265 only - NVENC/QSV/VAAPI are unaffected (no CPU thread pool).
• Auto-crop no-op is now visible: when Auto-Crop is on and the source has NO black bars, the file is encoded full-frame (correct, unchanged). That used to be silent, so it looked broken. Now it logs a clear line and the Settings + onboarding text says a bars-free file is left unchanged on purpose - that is the expected result, not an error.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.34.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.33.0

🔭 COMING NEXT
Rolling bug-stabilization continues - keep the diagnostics reports coming, they drive these fixes.

Edited by Human-126094
fix spelling

So - every thing works fine now from my side.
Thanks for this nice work.

Just one thing...
The system is very sluggish when encoding is in progress.

The pages take a very long time to load, and sometimes the loading process even crashes (though in that case, I had three encodes running simultaneously).

But the encodes are still running in the background.

  • Author
On 6/15/2026 at 5:24 PM, ASimpleSomething said:

Okay i got encoding to work i was having issues with my cache settings. But now after i restart the docker after a fresh install its super laggy on the interface and i loose my amd card. Any ideas as to why?

Hi @ASimpleSomething thanks for the report, and glad encoding is working now!

I'd like to fix the "lose my AMD card after restart" issue properly, but I need a bit of data from your setup to target it instead of guessing. When you get a chance, could you grab the following right after a restart where the AMD card has gone missing?

1) Diagnostics page

Open the app's /diagnostics page and take a screenshot (or copy the text). I'm specifically looking at the VAAPI / render-device section, does it say the encoder is "broken" or "missing", and is there any driver / render-node warning shown?

2) Container log around startup

From the Docker logs, please copy the lines from right after the restart.

The two I care about most are:

- "encoder loop started"

- "encoder detection complete"

The "detection complete" line lists the detected encoders, the outcome per encoder, and a short error excerpt if a probe failed, that excerpt is the key piece.

3) Was anything encoding at the moment you restarted?

Were there jobs running or queued when you restarted the container? (yes/no, roughly how many)

4) Does a second restart bring it back?

If you restart again with the queue paused or empty, does the AMD card show up correctly? (yes/no)

5) GPU passthrough

How is the GPU passed into the container, which /dev/dri device(s), and your --device / PGID settings? Just want to rule out the device dropping out at the Docker level vs. the app mis-detecting it.

My current suspicion: at boot the app probes the GPU and starts encoding at the Same time, so a real encode can grab the AMD card's encode session before the probe finishes, the probe then fails, the card gets marked unavailable, and it stays that way until the next restart. The data above will confirm whether that's what's happening before I ship the fix.

Thanks a lot, this will let me fix it precisely rather than blind.

  • Author
2 hours ago, cmeyer86 said:

So - every thing works fine now from my side.
Thanks for this nice work.

Just one thing...
The system is very sluggish when encoding is in progress.

The pages take a very long time to load, and sometimes the loading process even crashes (though in that case, I had three encodes running simultaneously).

But the encodes are still running in the background.

Great to hear it's all working for you now, thanks for the kind words! 🙏

You've actually spotted something that's already on my radar. The sluggish page loads (and the occasional crash) during active encodes come from the encoder processes competing with the web server for CPU, especially noticeable with three encodes running at once.

Good news: the encodes themselves keep running in the background regardless, so no work is ever lost. And a fix to keep the UI responsive while encoding is already in planning. The goal is to make sure the web interface stays snappy no matter how many encodes are in flight.

I'll post here once it ships. Thanks again for the detailed report, that's exactly the kind of feedback that helps! 👍

  • Author

🚀 v2.35.0 - Web UI stays responsive while encoding is live

ghcr.io/masterjb/x265-butler:2.35.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

If the UI got sluggish while encoding, pages slow to load, or the page-load "crashing" when a couple of encodes ran at once, this is the fix. ffmpeg used to run at the same priority as the web server and starved it on a busy CPU. Now every ffmpeg child is renice'd to the lowest priority, so the UI always wins the scheduler. Encodes still use the full CPU when the UI is idle, so encode speed is unchanged.

• Tune it with ENCODE_NICE (default 19). ENCODE_NICE=0 = the old behavior (revert lever).
• Bonus: slow request-path DB queries now show up in the /diagnostics copy-report (were silently dropped before). Tune the threshold with SLOW_QUERY_MS (default 100ms).

No new dependencies, no migrations, encode output byte-identical to v2.34.x.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.35.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.34.0

Or just set ENCODE_NICE=0 to turn off the renice without rolling back.

🔭 COMING NEXT
• Detection robustness on restart - an AMD/VAAPI card that can go missing after a fresh-install restart (a boot-timing race against the first encode). Looking into a re-detect path so the card comes back without a manual restart.

Plans can change, but that's the next thing on the bench.

Hi, v2.35.0 improves ffmpeg scheduling correctly, but the Web UI is still very sluggish for me during two concurrent QSV encodes.

What works:

- x265-butler 2.35.0

- qsv detected and functional

- last test encode uses hevc_qsv successfully

- active encode commands use -c:v hevc_qsv

- ffmpeg processes are correctly reniced to NI 19

- no DRI permission issues

- no slow queries/requests in diagnostics

Observed during two active QSV encodes:

next-server NI 0 CPU ~102%

ffmpeg NI 19 CPU ~67% -c:v hevc_qsv

ffmpeg NI 19 CPU ~68% -c:v hevc_qsv

The UI is sluggish even though ffmpeg is already at nice 19. Closing the browser tab does not noticeably reduce next-server CPU usage. This looks like the remaining bottleneck is inside the single-process Next.js server, possibly queue/progress/SSE/SQLite/job-state handling.

Edited by cmeyer86
switched from quote to inline code

🚀 v2.34.0 - Encode-stall fix on high-core-count hosts + auto-crop clarity is live

ghcr.io/masterjb/x265-butler:2.34.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

This fixes libx265 encodes that hung forever on machines with very many CPU threads (the report: a 128-thread host) - x265's own thread-pool auto-detect over-allocated and stalled before the first frame. v2.34.0 caps the pool to a sane bound so the encode actually runs.

🔧 WHAT CHANGED
• libx265 thread-pool cap (the stall fix): we now pass pools=min(cpuCount, 16) to x265, bypassing the NUMA auto-detect that logged "Thread pool created using 21914 threads" on a 128-CPU box and then hung. The cap covers normal encodes, the Test Encode, and the boot detection-probe. Override with X265_POOLS=8 to pin an exact size, or X265_POOLS=0 (or "auto") to fall back to x265 native auto-detect. libx265 only - NVENC/QSV/VAAPI are unaffected (no CPU thread pool).
• Auto-crop no-op is now visible: when Auto-Crop is on and the source has NO black bars, the file is encoded full-frame (correct, unchanged). That used to be silent, so it looked broken. Now it logs a clear line and the Settings + onboarding text says a bars-free file is left unchanged on purpose - that is the expected result, not an error.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.34.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.33.0

🔭 COMING NEXT
Rolling bug-stabilization continues - keep the diagnostics reports coming, they drive these fixes.

Hi,

Again : huge work, thanks a lot !

I've been trying 4 times since yesterday but it never finishes...

I have tried with both big and small files, it seems to always fail close to the end.

Here are the logs of a small file :

File

Skip to main content

x265-butler2.35.0

Dashboard

Stats

Bench

Storage

Library

Queue

Trash

Blocklist

Estimate

Settings

Diagnostics

Logs

Logs

IMG_5453.MOV

Static98 lines

19ef54582cb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/cache/work/9/input':

19ef54582cb Metadata:

19ef54582cb major_brand : qt

19ef54582cb minor_version : 0

19ef54582cb compatible_brands: qt

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb com.apple.quicktime.location.accuracy.horizontal: 19.970706

19ef54582cb com.apple.quicktime.full-frame-rate-playback-intent: 0

19ef54582cb com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.292/

19ef54582cb com.apple.quicktime.make: Apple

19ef54582cb com.apple.quicktime.model: iPhone 15 Pro

19ef54582cb com.apple.quicktime.software: 26.5

19ef54582cb com.apple.quicktime.creationdate: 2026-06-16T20:47:31+0200

19ef54582cb Duration: 00:04:34.77, start: 0.000000, bitrate: 80563 kb/s

19ef54582cb Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 79979 kb/s, 59.94 fps, 59.94 tbr, 600 tbn (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Video

19ef54582cb vendor_id : [0][0][0][0]

19ef54582cb encoder : HEVC

19ef54582cb Side data:

19ef54582cb DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

19ef54582cb Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

19ef54582cb Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 210 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Audio

19ef54582cb vendor_id : [0][0][0][0]

19ef54582cb Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 102 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 230 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D), 0 kb/s (default)

19ef54582cb Metadata:

creation_time : 2026-06-16T18:47:31.000000Z19ef54582cc

19ef54582cc handler_name : Core Media Metadata

19ef54582ce Stream mapping:

19ef54582ce Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

19ef54582ce Stream #0:1 -> #0:1 (copy)

Stream #0:2 -> #0:2 (copy)19ef54582ce

19ef54582cf Stream #0:3 -> #0:3 (copy)

19ef54582cf Stream #0:4 -> #0:4 (copy)

19ef54582cf Stream #0:5 -> #0:5 (copy)

19ef54582cf Stream #0:6 -> #0:6 (copy)

19ef54582cf Press [q] to stop, [?] for help

19ef5458472 x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

19ef5458472 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

19ef5458473 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

19ef5458473 x265 [info]: Main 10 profile, Level-5.1 (Main tier)

19ef5458473 x265 [info]: Thread pool created using 16 threads

19ef5458473 x265 [info]: Slices : 1

19ef5458473 x265 [info]: frame threads / pool features : 4 / wpp(34 rows)

19ef54584b7 x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

19ef54584b7 x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

19ef54584b7 x265 [info]: ME / range / subpel / merge : star / 57 / 3 / 3

19ef54584b7 x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00

19ef54584b7 x265 [info]: Lookahead / bframes / badapt : 25 / 4 / 2

19ef54584b7 x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

19ef54584b7 x265 [info]: References / ref-limit cu / depth : 4 / on / on

19ef54584b7 x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

19ef54584b7 x265 [info]: Rate Control / qCompress : CRF-20.0 / 0.60

19ef54584b7 x265 [info]: tools: rect limit-modes rd=4 psy-rd=2.00 rdoq=2 psy-rdoq=1.00

19ef54584b7 x265 [info]: tools: rskip mode=1 signhide tmvp strong-intra-smoothing lslices=4

19ef54584b7 x265 [info]: tools: deblock sao dhdr10-info

19ef54584b8 [matroska @ 0x55d090600900] Only audio, video, and subtitles are supported for Matroska.

19ef54584b8 [out#0/matroska @ 0x55d0905ec0c0] Could not write header (incorrect codec parameters ?): Invalid argument

19ef54584b8 [vf#0:0 @ 0x55d090601980] Error sending frames to consumers: Invalid argument

19ef54584b8 [vf#0:0 @ 0x55d090601980] Task finished with error code: -22 (Invalid argument)

19ef54584b8 [vf#0:0 @ 0x55d090601980] Terminating thread with return code -22 (Invalid argument)

19ef54586fe [out#0/matroska @ 0x55d0905ec0c0] Nothing was written into output file, because at least one of its streams received no packets.

19ef54586fe frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=00:04:34.77 bitrate= 0.0kbits/s speed= 256x elapsed=0:00:01.07

19ef54586ff frame=0

19ef54586ff fps=0.00

19ef54586ff stream_0_0_q=0.0

19ef54586ff bitrate= 0.0kbits/s

19ef54586ff total_size=0

19ef54586ff out_time_us=274775000

19ef54586ff out_time_ms=274775000

19ef54586ff out_time=00:04:34.775000

19ef54586ff dup_frames=0

19ef54586ff drop_frames=0

19ef54586ff speed= 256x

19ef54586ff progress=end

19ef5458700

19ef5458700 encoded 0 frames

19ef5458705 Conversion failed!

Showing 1–9 of 9

x265-butler

Container

2026-06-23T16:17:03.616Z INFO job enqueued {"requestId":"e5c89d39-3d1b-41be-bb8e-6d238e19cc2e","route":"/api/queue","method":"POST","action":"enqueue","jobId":9,"fileId":42,"encoder":"libx265"}

2026-06-23T16:17:04.362Z INFO job transition: queued→encoding {"action":"job_transition","jobId":9,"fileId":42,"transition":"queued→encoding","encoder":"libx265"}

2026-06-23T16:17:04.363Z INFO dispatch_preset_resolved {"jobId":9,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-23T16:17:04.365Z INFO preflight_statfs_probe {"jobId":9,"fileId":42,"encoder":"libx265","paths_probed":[{"path":"/cache/work/9/input","statfs_ok":true},{"path":"/cache/work/9/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5453-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-23T16:17:13.773Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5453.MOV","durationMs":9408,"result":"3840:2160:0:0"}

2026-06-23T16:17:13.774Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":9,"fileId":42,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-23T16:17:15.043Z INFO job transition: encoding→failed {"action":"job_transition","jobId":9,"fileId":42,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}

2026-06-23T16:17:15.119Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-23T16:18:02.245Z INFO diagnostics.page.opened {"event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0}

2026-06-23T16:18:02.360Z INFO diagnostics.log-event {"event":"copyReportGated","source":"diagnostics-client"}

2026-06-23T16:18:09.514Z INFO testEncodeTriggered {"encoder":"libx265","durationMs":332,"outcome":"success","exitCode":0}

2026-06-23T16:18:09.542Z INFO diagnostics.log-event {"event":"copyReportUnlocked","source":"diagnostics-client","outcome":"success","encoderPicked":"libx265"}

And the logs for a large file I'm trying to convert, I have attached the file (which seems truncated, but is exactly the same in the UI...)7.log

Test Encode is in success, and I have tried X265_POOLS to 16/32/64 with no success...

Diagnostic Report

## x265-butler diagnostics report

### App

- version: 2.35.0

- gitHash: f944b8d2

- committedAt: 1782209160

- committedAtCET: 23.06.26, 12:06:00

### Runtime

- nodeVersion: v22.23.0

- platform: linux

- arch: x64

- uptimeSec: 442

- pid: 52

### Mounts

| path | readable | writable | error |

|---|---|---|---|

| /media | ✓ | ✓ | |

| /cache | ✓ | ✓ | |

| /config | ✓ | ✓ | |

### Cache

- effectivePath: /cache

- resolution: user-override

- settingValue: /cache

- writable: ✓

### Devices

- DRI: /dev/dri/card0, /dev/dri/renderD128

- NVIDIA: /dev/nvidia0, /dev/nvidiactl

### Encoders

- detected: libx265

- detection warnings:

- encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)

- probe outcomes:

- nvenc: compiled-in-broken — 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)

- qsv: missing

- vaapi: missing

- libx265: functional

### Active warnings

- WARN encoder:encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating

### Recent errors (in-memory, last ≤25)

_no recent errors_

### Onboarding

- completed: ✓

- hasShare: ✓

## Container Image

- OS: Debian GNU/Linux 13 (trixie)

- GLIBC: 2.41

- Intel Media Driver: — (so-symlink)

- libva: 2.22.0-3

- libdrm: 2.4.124-2

- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1

- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1

- libigfxcmrt7: 25.2.3+dfsg1-1

- _(oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)_

- ffmpeg version: N-125095-g364d309af8-20260618

<details>

<summary>ffmpeg configuration flags</summary>

```

--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618

```

</details>

## CPU

- Vendor: AuthenticAMD

- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor

- CPUID family/model: 23 / 49

- Microarch: —

- Graphics gen: —

- HEVC-QSV (hardware): unknown

- _(HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)_

## Blocklist Evaluation

<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->

- Total entries: 0

- Pattern cache: —

_No recent evaluations._

## Slow Requests

_No slow requests recorded (threshold: 1s)._

## Slow Queries

_No slow queries recorded (threshold: 100ms)._

## Web Vitals

_No web vitals recorded._

## DRI Render Devices

| Device | GID | Group | In group | R | W | Error |

|---|---|---|---|---|---|---|

| /dev/dri/renderD128 | 18 | — | ✗ | ✓ | ✓ | |

_Group name is container-side and informational; the numeric GID is authoritative. No render device reported an access failure that group membership would resolve — PGID / --group-add changes are not required._

### Last test-encode (client UAT run)

- outcome: success

- encoderPicked: libx265

- durationMs: 265

- exitCode: 0

stderr:

```

Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5':

Duration: N/A, start: 0.000000, bitrate: N/A

Stream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbn

Stream mapping:

Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))

Press [q] to stop, [?] for help

x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bit

x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6

x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)

x265 [info]: Thread pool created using 16 threads

x265 [info]: Slices : 1

x265 [info]: frame threads / pool features : 4 / wpp(4 rows)

x265 [warning]: Source height < 720p; disabling lookahead-slices

x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3

x265 [info]: Keyframe min / max / scenecut / bias : 1 / 250 / 40 / 5.00

x265 [info]: Cb/Cr QP Offset : 6 / 6

x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2

x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

x265 [info]: References / ref-limit cu / depth : 3 / off / on

x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60

x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvp

x265 [info]: tools: b-intra strong-intra-smoothing deblock sao

Output #0, null, to '/dev/null':

Metadata:

encoder : Lavf62.19.101

Stream #0:0: Video: hevc, gbrp(pc, gbr/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 1 fps, 1 tbn

Metadata:

encoder : Lavc62.36.101 libx265

Side data:

CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A

[out#0/null @ 0x55b818757f40] video:10KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown

frame= 5 fps=0.0 q=25.8 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=15.3x elapsed=0:00:00.19

x265 [info]: frame I: 1, Avg QP:20.35 kb/s: 30.37

x265 [info]: frame P: 2, Avg QP:22.61 kb/s: 10.22

x265 [info]: frame B: 2, Avg QP:25.89 kb/s: 6.65

x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%

encoded 5 frames in 0.14s (35.74 fps), 12.82 kb/s, Avg QP:23.47

```

_Generated 2026-06-23T16:21:17.419Z_

  • Author
9 hours ago, cmeyer86 said:

Hi, v2.35.0 improves ffmpeg scheduling correctly, but the Web UI is still very sluggish for me during two concurrent QSV encodes.

What works:

- x265-butler 2.35.0

- qsv detected and functional

- last test encode uses hevc_qsv successfully

- active encode commands use -c:v hevc_qsv

- ffmpeg processes are correctly reniced to NI 19

- no DRI permission issues

- no slow queries/requests in diagnostics

Observed during two active QSV encodes:

The UI is sluggish even though ffmpeg is already at nice 19. Closing the browser tab does not noticeably reduce next-server CPU usage. This looks like the remaining bottleneck is inside the single-process Next.js server, possibly queue/progress/SSE/SQLite/job-state handling.

Thanks, that's a clean report and rules out the obvious suspects (renice, DRI permissions, slow queries). With both ffmpeg children already at nice 19 and next-server pinned near 100%, the bottleneck is inside the Node process itself, not the encodes. To find which loop is burning the CPU I need a few data points captured DURING the two active QSV encodes.

1. Per-thread CPU of next-server (which thread is hot, main loop vs libuv pool):

ps -eLo pid,tid,ni,pcpu,comm | grep -i next-server | sort -k4 -nr | head -20

2. Run with debug logging for ~60s during the two encodes and attach the output:

docker exec <container> sh -c 'LOG_LEVEL=debug' is build-baked, so instead set LOG_LEVEL=debug in the container env and restart, then capture:

docker logs --since 60s <container> > x265-debug.log

3. How many concurrent SSE/progress clients are open? Please test with ALL browser tabs to the UI fully closed (not just backgrounded) for 60s and report whether next-server CPU drops. "Closing the tab doesn't help" suggests the work is server-side and tab-independent — confirming that narrows it to the encode progress/poll path, not SSE fan-out.

4. Library size, rough row counts help me judge if a query/scan loop scales with DB size:

- number of files in library

- number of active + queued jobs

5. Progress granularity: are the two encodes 4K/long sources? Frequent ffmpeg progress lines (per-frame) parsed + persisted per encode can dominate. Knowing source resolution/fps + how often the queue/progress UI updates helps.

What I suspect: the per-encode ffmpeg progress parser + per-update SQLite write, multiplied by 2 concurrent encodes, running hotter than expected, or a UI poll endpoint doing more work per request than it should.

  • Author
4 hours ago, tbal82 said:

Hi,

Again : huge work, thanks a lot !

I've been trying 4 times since yesterday but it never finishes...

I have tried with both big and small files, it seems to always fail close to the end.

Here are the logs of a small file :

File

Skip to main content

x265-butler2.35.0

Dashboard

Stats

Bench

Storage

Library

Queue

Trash

Blocklist

Estimate

Settings

Diagnostics

Logs

Logs

IMG_5453.MOV

Static98 lines

19ef54582cb Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/cache/work/9/input':

19ef54582cb Metadata:

19ef54582cb major_brand : qt

19ef54582cb minor_version : 0

19ef54582cb compatible_brands: qt

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb com.apple.quicktime.location.accuracy.horizontal: 19.970706

19ef54582cb com.apple.quicktime.full-frame-rate-playback-intent: 0

19ef54582cb com.apple.quicktime.location.ISO6709: +48.8737+002.7090+079.292/

19ef54582cb com.apple.quicktime.make: Apple

19ef54582cb com.apple.quicktime.model: iPhone 15 Pro

19ef54582cb com.apple.quicktime.software: 26.5

19ef54582cb com.apple.quicktime.creationdate: 2026-06-16T20:47:31+0200

19ef54582cb Duration: 00:04:34.77, start: 0.000000, bitrate: 80563 kb/s

19ef54582cb Stream #0:0[0x1](und): Video: hevc (Main 10) (hvc1 / 0x31637668), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 3840x2160, 79979 kb/s, 59.94 fps, 59.94 tbr, 600 tbn (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Video

19ef54582cb vendor_id : [0][0][0][0]

19ef54582cb encoder : HEVC

19ef54582cb Side data:

19ef54582cb DOVI configuration record: version: 1.0, profile: 8, level: 9, rpu flag: 1, el flag: 0, bl flag: 1, compatibility id: 4, compression: 0

19ef54582cb Ambient viewing environment: ambient_illuminance=314.000000, ambient_light_x=0.312700, ambient_light_y=0.329000

19ef54582cb Stream #0:1[0x2](und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 210 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Audio

19ef54582cb vendor_id : [0][0][0][0]

19ef54582cb Stream #0:2[0x3](und): Data: none (mebx / 0x7862656D) (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:3[0x4](und): Data: none (mebx / 0x7862656D), 102 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:4[0x5](und): Data: none (mebx / 0x7862656D), 230 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:5[0x6](und): Data: none (mebx / 0x7862656D), 5 kb/s (default)

19ef54582cb Metadata:

19ef54582cb creation_time : 2026-06-16T18:47:31.000000Z

19ef54582cb handler_name : Core Media Metadata

19ef54582cb Stream #0:6[0x7](und): Data: none (mebx / 0x7862656D), 0 kb/s (default)

19ef54582cb Metadata:

creation_time : 2026-06-16T18:47:31.000000Z19ef54582cc

19ef54582cc handler_name : Core Media Metadata

19ef54582ce Stream mapping:

19ef54582ce Stream #0:0 -> #0:0 (hevc (native) -> hevc (libx265))

19ef54582ce Stream #0:1 -> #0:1 (copy)

Stream #0:2 -> #0:2 (copy)19ef54582ce

19ef54582cf Stream #0:3 -> #0:3 (copy)

19ef54582cf Stream #0:4 -> #0:4 (copy)

19ef54582cf Stream #0:5 -> #0:5 (copy)

19ef54582cf Stream #0:6 -> #0:6 (copy)

19ef54582cf Press [q] to stop, [?] for help

19ef5458472 x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

19ef5458472 x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 10bit

19ef5458473 x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

19ef5458473 x265 [info]: Main 10 profile, Level-5.1 (Main tier)

19ef5458473 x265 [info]: Thread pool created using 16 threads

19ef5458473 x265 [info]: Slices : 1

19ef5458473 x265 [info]: frame threads / pool features : 4 / wpp(34 rows)

19ef54584b7 x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

19ef54584b7 x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

19ef54584b7 x265 [info]: ME / range / subpel / merge : star / 57 / 3 / 3

19ef54584b7 x265 [info]: Keyframe min / max / scenecut / bias : 25 / 250 / 40 / 5.00

19ef54584b7 x265 [info]: Lookahead / bframes / badapt : 25 / 4 / 2

19ef54584b7 x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

19ef54584b7 x265 [info]: References / ref-limit cu / depth : 4 / on / on

19ef54584b7 x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

19ef54584b7 x265 [info]: Rate Control / qCompress : CRF-20.0 / 0.60

19ef54584b7 x265 [info]: tools: rect limit-modes rd=4 psy-rd=2.00 rdoq=2 psy-rdoq=1.00

19ef54584b7 x265 [info]: tools: rskip mode=1 signhide tmvp strong-intra-smoothing lslices=4

19ef54584b7 x265 [info]: tools: deblock sao dhdr10-info

19ef54584b8 [matroska @ 0x55d090600900] Only audio, video, and subtitles are supported for Matroska.

19ef54584b8 [out#0/matroska @ 0x55d0905ec0c0] Could not write header (incorrect codec parameters ?): Invalid argument

19ef54584b8 [vf#0:0 @ 0x55d090601980] Error sending frames to consumers: Invalid argument

19ef54584b8 [vf#0:0 @ 0x55d090601980] Task finished with error code: -22 (Invalid argument)

19ef54584b8 [vf#0:0 @ 0x55d090601980] Terminating thread with return code -22 (Invalid argument)

19ef54586fe [out#0/matroska @ 0x55d0905ec0c0] Nothing was written into output file, because at least one of its streams received no packets.

19ef54586fe frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=00:04:34.77 bitrate= 0.0kbits/s speed= 256x elapsed=0:00:01.07

19ef54586ff frame=0

19ef54586ff fps=0.00

19ef54586ff stream_0_0_q=0.0

19ef54586ff bitrate= 0.0kbits/s

19ef54586ff total_size=0

19ef54586ff out_time_us=274775000

19ef54586ff out_time_ms=274775000

19ef54586ff out_time=00:04:34.775000

19ef54586ff dup_frames=0

19ef54586ff drop_frames=0

19ef54586ff speed= 256x

19ef54586ff progress=end

19ef5458700

19ef5458700 encoded 0 frames

19ef5458705 Conversion failed!

Showing 1–9 of 9

x265-butler

Container

2026-06-23T16:17:03.616Z INFO job enqueued {"requestId":"e5c89d39-3d1b-41be-bb8e-6d238e19cc2e","route":"/api/queue","method":"POST","action":"enqueue","jobId":9,"fileId":42,"encoder":"libx265"}

2026-06-23T16:17:04.362Z INFO job transition: queued→encoding {"action":"job_transition","jobId":9,"fileId":42,"transition":"queued→encoding","encoder":"libx265"}

2026-06-23T16:17:04.363Z INFO dispatch_preset_resolved {"jobId":9,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-23T16:17:04.365Z INFO preflight_statfs_probe {"jobId":9,"fileId":42,"encoder":"libx265","paths_probed":[{"path":"/cache/work/9/input","statfs_ok":true},{"path":"/cache/work/9/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5453-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-23T16:17:13.773Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5453.MOV","durationMs":9408,"result":"3840:2160:0:0"}

2026-06-23T16:17:13.774Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":9,"fileId":42,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-23T16:17:15.043Z INFO job transition: encoding→failed {"action":"job_transition","jobId":9,"fileId":42,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}

2026-06-23T16:17:15.119Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-23T16:18:02.245Z INFO diagnostics.page.opened {"event":"diagnosticsPageOpened","source":"page-server-component","warningCount":1,"recentErrorCount":0}

2026-06-23T16:18:02.360Z INFO diagnostics.log-event {"event":"copyReportGated","source":"diagnostics-client"}

2026-06-23T16:18:09.514Z INFO testEncodeTriggered {"encoder":"libx265","durationMs":332,"outcome":"success","exitCode":0}

2026-06-23T16:18:09.542Z INFO diagnostics.log-event {"event":"copyReportUnlocked","source":"diagnostics-client","outcome":"success","encoderPicked":"libx265"}

And the logs for a large file I'm trying to convert, I have attached the file (which seems truncated, but is exactly the same in the UI...)7.log

Test Encode is in success, and I have tried X265_POOLS to 16/32/64 with no success...

Diagnostic Report

## x265-butler diagnostics report

### App

- version: 2.35.0

- gitHash: f944b8d2

- committedAt: 1782209160

- committedAtCET: 23.06.26, 12:06:00

### Runtime

- nodeVersion: v22.23.0

- platform: linux

- arch: x64

- uptimeSec: 442

- pid: 52

### Mounts

| path | readable | writable | error |

|---|---|---|---|

| /media | ✓ | ✓ | |

| /cache | ✓ | ✓ | |

| /config | ✓ | ✓ | |

### Cache

- effectivePath: /cache

- resolution: user-override

- settingValue: /cache

- writable: ✓

### Devices

- DRI: /dev/dri/card0, /dev/dri/renderD128

- NVIDIA: /dev/nvidia0, /dev/nvidiactl

### Encoders

- detected: libx265

- detection warnings:

- encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)

- probe outcomes:

- nvenc: compiled-in-broken — 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating thread with return code -22 (Invalid argument)

- qsv: missing

- vaapi: missing

- libx265: functional

### Active warnings

- WARN encoder:encoder_runtime_broken — nvenc: 0x55efd38178c0] Could not open encoder before EOF [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Task finished with error code: -22 (Invalid argument) [vost#0:0/hevc_nvenc @ 0x55efd38173c0] Terminating

### Recent errors (in-memory, last ≤25)

_no recent errors_

### Onboarding

- completed: ✓

- hasShare: ✓

## Container Image

- OS: Debian GNU/Linux 13 (trixie)

- GLIBC: 2.41

- Intel Media Driver: — (so-symlink)

- libva: 2.22.0-3

- libdrm: 2.4.124-2

- oneVPL MFX runtime (libmfx-gen1.2): 25.1.4-1

- oneVPL dispatcher (libvpl2): 1:2.14.0-1+b1

- libigfxcmrt7: 25.2.3+dfsg1-1

- _(oneVPL versions report installed-package presence; runtime QSV-functionality is verified separately by the probe-encode — 23-04)_

- ffmpeg version: N-125095-g364d309af8-20260618

<details>

<summary>ffmpeg configuration flags</summary>

```

--prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-ffbuild-linux-gnu- --arch=x86_64 --target-os=linux --enable-gpl --enable-version3 --disable-debug --enable-iconv --enable-zlib --enable-libxml2 --enable-libsoxr --enable-openssl --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --enable-libxcb --enable-xlib --enable-libpulse --enable-opencl --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --disable-schannel --enable-sdl2 --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --enable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs='-lgomp -ldl' --extra-ldflags=-pthread --extra-ldexeflags=-pie --cc=x86_64-ffbuild-linux-gnu-gcc --cxx=x86_64-ffbuild-linux-gnu-g++ --ar=x86_64-ffbuild-linux-gnu-gcc-ar --ranlib=x86_64-ffbuild-linux-gnu-gcc-ranlib --nm=x86_64-ffbuild-linux-gnu-gcc-nm --extra-version=20260618

```

</details>

## CPU

- Vendor: AuthenticAMD

- Model name: AMD Ryzen Threadripper 3990X 64-Core Processor

- CPUID family/model: 23 / 49

- Microarch: —

- Graphics gen: —

- HEVC-QSV (hardware): unknown

- _(HEVC-QSV reflects iGPU HARDWARE capability by the embedded gen-table; runtime QSV functionality is verified separately by the probe-encode — 23-04)_

## Blocklist Evaluation

<!-- Operator: paths below are verbatim. Redact mount/user prefixes before posting if sensitive. -->

- Total entries: 0

- Pattern cache: —

_No recent evaluations._

## Slow Requests

_No slow requests recorded (threshold: 1s)._

## Slow Queries

_No slow queries recorded (threshold: 100ms)._

## Web Vitals

_No web vitals recorded._

## DRI Render Devices

| Device | GID | Group | In group | R | W | Error |

|---|---|---|---|---|---|---|

| /dev/dri/renderD128 | 18 | — | ✗ | ✓ | ✓ | |

_Group name is container-side and informational; the numeric GID is authoritative. No render device reported an access failure that group membership would resolve — PGID / --group-add changes are not required._

### Last test-encode (client UAT run)

- outcome: success

- encoderPicked: libx265

- durationMs: 265

- exitCode: 0

stderr:

```

Input #0, lavfi, from 'testsrc=size=320x240:rate=1:duration=5':

Duration: N/A, start: 0.000000, bitrate: N/A

Stream #0:0: Video: wrapped_avframe, rgb24, 320x240 [SAR 1:1 DAR 4:3], 1 fps, 1 tbr, 1 tbn

Stream mapping:

Stream #0:0 -> #0:0 (wrapped_avframe (native) -> hevc (libx265))

Press [q] to stop, [?] for help

x265 [info]: HEVC encoder version 4.2+5-7b3d1f51

x265 [info]: build info [Linux][GCC 15.2.0][64 bit] 8bit+10bit+12bit

x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

x265 [warning]: halving the quality when psy-rd is enabled for 444 input. Setting cbQpOffset = 6 and crQpOffset = 6

x265 [info]: Main 4:4:4 profile, Level-2 (Main tier)

x265 [info]: Thread pool created using 16 threads

x265 [info]: Slices : 1

x265 [info]: frame threads / pool features : 4 / wpp(4 rows)

x265 [warning]: Source height < 720p; disabling lookahead-slices

x265 [info]: Coding QT: max CU size, min CU size : 64 / 8

x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra

x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3

x265 [info]: Keyframe min / max / scenecut / bias : 1 / 250 / 40 / 5.00

x265 [info]: Cb/Cr QP Offset : 6 / 6

x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2

x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0

x265 [info]: References / ref-limit cu / depth : 3 / off / on

x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1

x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60

x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvp

x265 [info]: tools: b-intra strong-intra-smoothing deblock sao

Output #0, null, to '/dev/null':

Metadata:

encoder : Lavf62.19.101

Stream #0:0: Video: hevc, gbrp(pc, gbr/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 1 fps, 1 tbn

Metadata:

encoder : Lavc62.36.101 libx265

Side data:

CPB properties: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A

[out#0/null @ 0x55b818757f40] video:10KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown

frame= 5 fps=0.0 q=25.8 Lsize=N/A time=00:00:03.00 bitrate=N/A speed=15.3x elapsed=0:00:00.19

x265 [info]: frame I: 1, Avg QP:20.35 kb/s: 30.37

x265 [info]: frame P: 2, Avg QP:22.61 kb/s: 10.22

x265 [info]: frame B: 2, Avg QP:25.89 kb/s: 6.65

x265 [info]: Weighted P-Frames: Y:0.0% UV:0.0%

encoded 5 frames in 0.14s (35.74 fps), 12.82 kb/s, Avg QP:23.47

```

_Generated 2026-06-23T16:21:17.419Z_

Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.

This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:

[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.

[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument

[vf#0:0] Task finished with error code: -22 (Invalid argument)

encoded 0 frames

Conversion failed!

Your iPhone .MOV files carry several Apple timed-metadata tracks:

Stream #0:2..6 Data: none (mebx / 0x7862656D)

x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.

This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.

One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the line

Only audio, video, and subtitles are supported for Matroska.

If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!

  • Author

🚀 v2.36.0 - AMD/VAAPI card no longer lost after a fresh-install restart

ghcr.io/masterjb/x265-butler:2.36.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

If your AMD card went missing after restarting on a fresh install - encoding dropping back to CPU until you restarted again - this is the fix. At boot the app was probing for hardware AND starting the queue at the same time, so a real encode could grab the AMD card's single encode session right when the detection probe needed it. The probe failed, the card got marked "broken", and that was cached until the next restart.

Detection is now single-flight: the boot probe and the queue share ONE detection run instead of two competing VAAPI probes, and the first encode only starts after detection finishes on an idle GPU. A failed detection is no longer cached either - the next try re-probes fresh.
• If a card ever drops out, the "Re-detect hardware" button on the /diagnostics page re-runs detection on demand (with a before/after diff) - no restart needed.

No new dependencies, no migrations, encode output byte-identical to v2.35.x.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)

If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.36.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.35.0

🔭 COMING NEXT
• iPhone / .MOV encodes that fail right away - if an iPhone clip dies before frame 1 ("never finishes, always fails near the end"), it's the Apple timed-metadata track the file carries that the MKV container rejects. Next release teaches the encoder to drop those container-incompatible side tracks so the encode just runs.
• Web UI staying snappy under load - better CPU prioritisation so the pages don't get sluggish while several encodes run at once.

Plans can change, but that's what's on the bench.

Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.

This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:

[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.

[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument

[vf#0:0] Task finished with error code: -22 (Invalid argument)

encoded 0 frames

Conversion failed!

Your iPhone .MOV files carry several Apple timed-metadata tracks:

Stream #0:2..6 Data: none (mebx / 0x7862656D)

x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.

This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.

One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the line

Only audio, video, and subtitles are supported for Matroska.

If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!

Unfortunately the "big file" log is truncated on the server, it was not caused by the download.

I'll try the 2.36.0 in the morning and let you know (for the Apple file too :))

Thanks — I captured another process/thread snapshot during the slow UI state with two active QSV encodes on v2.36.0.

The important finding is that ENCODE_NICE is working correctly:

ffmpeg NI 19
ffmpeg NI 19

Both active encodes are using QSV:

-c:v hevc_qsv

However, the Web UI is still sluggish while the two encodes are running.

docker top shows next-server around 100% CPU:

next-server   ~100%
ffmpeg        ~68–70%
ffmpeg        ~68–70%

But the host thread view shows that this is not a single hot JS main thread. The CPU is split across the Node/libuv worker pool:

3698425 3698456 ... 20.1 libuv-worker next-server
3698425 3698455 ... 20.0 libuv-worker next-server
3698425 3698454 ... 20.0 libuv-worker next-server
3698425 3698453 ... 20.0 libuv-worker next-server
3698425 3698425 ... 18.8 next-server

So the ~100% next-server CPU appears to be real process CPU, but mostly from libuv worker threads, not from one hot V8/JS main thread.

That also explains why the previous .cpuprofile was mostly idle / did not show a clear JS hot loop: the expensive work seems to happen outside the JS main thread, likely in native/libuv worker activity.

My current interpretation:

  • ffmpeg priority handling works

  • QSV is being used

  • this does not look like a pure JS/V8 hot loop

  • the remaining bottleneck seems to be libuv/native worker activity inside the Next server process while encodes are active

Possible suspects:

  • frequent fs stat / access / readdir / watch activity

  • progress or queue polling triggering filesystem or DB work

  • native DB/filesystem work in the libuv pool

  • something scaling with active encodes and/or library size

Would it make sense to add diagnostics around libuv-heavy paths, filesystem checks, watcher activity, progress update persistence, and queue polling while encodes are active?

I attached the process/thread samples and the previous diagnostics/profile material.

debug-capture-20260624-090916.zip process-samples.txt x265-node-cpuprofile.tar.gz

I tested different UV_THREADPOOL_SIZE values during the same general scenario: two active QSV encodes on x265-butler v2.36.0.

### Summary

The Web UI gets noticeably worse with UV_THREADPOOL_SIZE=8. With 16 and 32 it is better, but still not really fast/snappy.

### Observations

#### Default / small pool behavior

With the smaller/default-ish pool, next-server was around ~100% CPU, but the visible libuv workers were already heavily loaded:

- next-server: ~100%
- 4 libuv workers: ~20% each
- UI felt sluggish

This suggests the libuv pool is already saturated even before increasing it. :contentReference[oaicite:0]{index=0}

#### UV_THREADPOOL_SIZE=8

With UV8, the UI became noticeably sluggish again.

The sample shows:

- next-server: ~204%
- main thread: ~34%
- 8 libuv workers: ~20.8–20.9% each

So all 8 libuv workers appear busy/saturated. This matches the bad UI responsiveness. :contentReference[oaicite:1]{index=1}

#### UV_THREADPOOL_SIZE=16

With UV16, the UI was better, but still not fast.

The sample shows:

- next-server: ~206–210%
- main thread: ~34–42%
- 16 libuv workers: ~10.2–10.6% each

So the same type of work is spread over more workers. This reduces perceived blocking, but does not reduce the underlying workload. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}

#### UV_THREADPOOL_SIZE=32

With UV32, the UI felt slightly better than UV16, but still not really snappy.

The sample shows:

- next-server: ~192%
- main thread: ~38.5%
- 32 libuv workers: ~4.6–4.7% each

This again suggests the larger pool reduces starvation/queueing, but the server is still doing a lot of libuv-backed work during active encodes. :contentReference[oaicite:4]{index=4}

### Current interpretation

Increasing UV_THREADPOOL_SIZE helps responsiveness somewhat, but it looks like a workaround rather than a real fix.

The key pattern is:

```text
UV8 -> workers saturated, UI clearly sluggish
UV16 -> better, but still not fast
UV32 -> slightly better again, but next-server still burns ~190–200% CPU

So it looks like the app is producing a significant amount of libuv/native/filesystem-style work while encodes are running. The threadpool size changes how badly this blocks the UI, but the actual work remains.

Likely areas to inspect

Possible suspects:

repeated fs.stat / fs.access / path checks during active jobs

progress handling

queue polling

filesystem scans/watchers

SQLite or persistence work triggered too frequently

per-progress-update DB/file operations

request handlers doing filesystem work while encodes are active

Additional note

The ffmpeg children are already nice 19, so encode priority itself seems applied correctly. The remaining bottleneck appears to be inside the next-server process / libuv workload, not just ffmpeg CPU priority.

process-samples-uv4(default).txt process-samples-uv8.txt process-samples-uv16.txt process-samples-uv32.txt

Edited by cmeyer86

Thanks for the detailed report, and good news, your logs already contain the root cause, so I don't need much more from you.

This is not the encoder/hardware path at all (your Test Encode passing and libx265 being functional confirm that). Look at these lines in the small-file log:

[matroska @ ...] Only audio, video, and subtitles are supported for Matroska.

[out#0/matroska @ ...] Could not write header (incorrect codec parameters ?): Invalid argument

[vf#0:0] Task finished with error code: -22 (Invalid argument)

encoded 0 frames

Conversion failed!

Your iPhone .MOV files carry several Apple timed-metadata tracks:

Stream #0:2..6 Data: none (mebx / 0x7862656D)

x265-butler currently copies every input stream into the output. The default output container is MKV (Matroska), and Matroska cannot hold these mebx data streams, so ffmpeg refuses to write the file header and bails before encoding a single frame. That's why it looks like it "fails near the end": the progress bar runs to 100% in ~1 second (speed=256x, frame=0) because ffmpeg only scanned the timestamps, it never actually encoded anything. The fix is on my side: drop the unsupported data streams when muxing to Matroska.

This affects basically all recent iPhone footage (the mebx tracks are standard on iOS). A fix is coming in the next release.

One thing that would help me confirm your big file is the exact same bug (its attached log got truncated): could you check whether that log also contains the line

Only audio, video, and subtitles are supported for Matroska.

If yes, same root cause, same fix, nothing else needed. Thanks again for the great bug reports!

Here are the results of my tests.

4K file : failed

2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}

2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}

2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}

2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}

2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}

2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}

2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}

2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}

2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}

2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}


Job log still truncated : 11.log

Custom (Apple) 4K file : failed

2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}

2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}

2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}

2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}

2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}

2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}

2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}

2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}

2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}

2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}

2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}

2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}

2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}

2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}

2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}

2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}

2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}

2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}

2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}

2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}

Job log still truncated : 12.log

1080p : success

720p : success

-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?

Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...

  • Author
9 hours ago, cmeyer86 said:

Thanks — I captured another process/thread snapshot during the slow UI state with two active QSV encodes on v2.36.0.

The important finding is that ENCODE_NICE is working correctly:

ffmpeg NI 19
ffmpeg NI 19

Both active encodes are using QSV:

-c:v hevc_qsv

However, the Web UI is still sluggish while the two encodes are running.

docker top shows next-server around 100% CPU:

next-server   ~100%
ffmpeg        ~68–70%
ffmpeg        ~68–70%

But the host thread view shows that this is not a single hot JS main thread. The CPU is split across the Node/libuv worker pool:

3698425 3698456 ... 20.1 libuv-worker next-server
3698425 3698455 ... 20.0 libuv-worker next-server
3698425 3698454 ... 20.0 libuv-worker next-server
3698425 3698453 ... 20.0 libuv-worker next-server
3698425 3698425 ... 18.8 next-server

So the ~100% next-server CPU appears to be real process CPU, but mostly from libuv worker threads, not from one hot V8/JS main thread.

That also explains why the previous .cpuprofile was mostly idle / did not show a clear JS hot loop: the expensive work seems to happen outside the JS main thread, likely in native/libuv worker activity.

My current interpretation:

  • ffmpeg priority handling works

  • QSV is being used

  • this does not look like a pure JS/V8 hot loop

  • the remaining bottleneck seems to be libuv/native worker activity inside the Next server process while encodes are active

Possible suspects:

  • frequent fs stat / access / readdir / watch activity

  • progress or queue polling triggering filesystem or DB work

  • native DB/filesystem work in the libuv pool

  • something scaling with active encodes and/or library size

Would it make sense to add diagnostics around libuv-heavy paths, filesystem checks, watcher activity, progress update persistence, and queue polling while encodes are active?

I attached the process/thread samples and the previous diagnostics/profile material.

debug-capture-20260624-090916.zip process-samples.txt x265-node-cpuprofile.tar.gz

I tested different UV_THREADPOOL_SIZE values during the same general scenario: two active QSV encodes on x265-butler v2.36.0.

### Summary

The Web UI gets noticeably worse with UV_THREADPOOL_SIZE=8. With 16 and 32 it is better, but still not really fast/snappy.

### Observations

#### Default / small pool behavior

With the smaller/default-ish pool, next-server was around ~100% CPU, but the visible libuv workers were already heavily loaded:

- next-server: ~100%
- 4 libuv workers: ~20% each
- UI felt sluggish

This suggests the libuv pool is already saturated even before increasing it. :contentReference[oaicite:0]{index=0}

#### UV_THREADPOOL_SIZE=8

With UV8, the UI became noticeably sluggish again.

The sample shows:

- next-server: ~204%
- main thread: ~34%
- 8 libuv workers: ~20.8–20.9% each

So all 8 libuv workers appear busy/saturated. This matches the bad UI responsiveness. :contentReference[oaicite:1]{index=1}

#### UV_THREADPOOL_SIZE=16

With UV16, the UI was better, but still not fast.

The sample shows:

- next-server: ~206–210%
- main thread: ~34–42%
- 16 libuv workers: ~10.2–10.6% each

So the same type of work is spread over more workers. This reduces perceived blocking, but does not reduce the underlying workload. :contentReference[oaicite:2]{index=2} :contentReference[oaicite:3]{index=3}

#### UV_THREADPOOL_SIZE=32

With UV32, the UI felt slightly better than UV16, but still not really snappy.

The sample shows:

- next-server: ~192%
- main thread: ~38.5%
- 32 libuv workers: ~4.6–4.7% each

This again suggests the larger pool reduces starvation/queueing, but the server is still doing a lot of libuv-backed work during active encodes. :contentReference[oaicite:4]{index=4}

### Current interpretation

Increasing UV_THREADPOOL_SIZE helps responsiveness somewhat, but it looks like a workaround rather than a real fix.

The key pattern is:

```text
UV8 -> workers saturated, UI clearly sluggish
UV16 -> better, but still not fast
UV32 -> slightly better again, but next-server still burns ~190–200% CPU

So it looks like the app is producing a significant amount of libuv/native/filesystem-style work while encodes are running. The threadpool size changes how badly this blocks the UI, but the actual work remains.

Likely areas to inspect

Possible suspects:

repeated fs.stat / fs.access / path checks during active jobs

progress handling

queue polling

filesystem scans/watchers

SQLite or persistence work triggered too frequently

per-progress-update DB/file operations

request handlers doing filesystem work while encodes are active

Additional note

The ffmpeg children are already nice 19, so encode priority itself seems applied correctly. The remaining bottleneck appears to be inside the next-server process / libuv workload, not just ffmpeg CPU priority.

process-samples-uv4(default).txt process-samples-uv8.txt process-samples-uv16.txt process-samples-uv32.txt

Thanks a lot for the very detailed captures, the thread samples, the UI-closed test and the diagnostics report together make the picture clear, so I want to confirm the exact cause before changing anything.

Your data points strongly at libuv thread-pool saturation from background filesystem work (not JS, not the database). To nail it down, please run this while the problem is happening, i.e. with your 2 QSV encodes running and the web UI feeling sluggish (not on an idle system, otherwise we miss the exact state we're measuring):

docker exec x265-butler sh -c 'timeout 10 strace -f -c -p 1 2>&1 | head -30'

What it does: attaches to the x265-butler Node process for 10 seconds and prints a summary of which Linux system calls it made and how often. If the top is dominated by newfstatat/statx (file-stat calls), that confirms the file-watcher is the cause; if it's read/pread64, it's a different path. Either way it tells us exactly where to fix it. The command only observes, it changes nothing and doesn't affect your encodes.

Paste me the top lines and I'll take it from there.

  • Author

🚀 v2.37.0 - Output Stream-Mapping Hardening is live

ghcr.io/masterjb/x265-butler:2.37.0 and :latest are up. amd64-only image on a Debian 13 (Trixie) base.

Pull / upgrade:
docker pull ghcr.io/masterjb/x265-butler:latest
docker restart x265-butler

Two encode-output fixes from real footage: iPhone .MOV clips that refused to encode, and long 4K encodes that self-killed hours in.

🎬 IPHONE .MOV NOW ENCODES
Every iPhone .MOV failed instantly, exit 234, 0 frames, "Only audio, video, and subtitles are supported for Matroska". It looked like it failed near the end, but the mux header was actually refused before the first frame. Cause: the iPhone attaches Apple timed-metadata (mebx) data streams that Matroska rejects, and we were copying every stream into the MKV. Now the MKV path maps only video/audio/subtitle and attachment streams (your anime ASS fonts are kept) and drops the incompatible ones. MP4 output is unchanged.

🐢 4K ENCODES NO LONGER SELF-KILL
If you saw a 4K encode run for hours and then die with "encode:stdout exceeded cap" (cause in the job transition log) while 1080p/720p finished fine, this release fixes exactly that. It was duration-bound, not resolution- or log-size-bound: ffmpeg's progress stream emitted ~2 blocks/sec, so a ~5.5h 4K encode piled up ~40k blocks (~8.4 MiB) and tripped an 8 MiB stdout guard, killing the job near the end. (Your hunch that 4K "generates too much log and saturates stdout" was on the right track, it's the machine-readable progress stream specifically, not the x265 console output.) Progress is now throttled to one update every 30s, so the same encode produces ~660 blocks (~140 KiB) and never gets near the cap. Bonus: the job log "copy report" no longer fills up with progress spam, it now shows the real ffmpeg/x265 output, so the truncated-log problem is gone too.

🟢 NVIDIA NVENC - HOST SETUP RECAP (applies to all versions)
If you run an NVIDIA card, NVENC needs the host driver (unRAID NVIDIA-Driver-Plugin or nvidia-container-toolkit) plus these on the container:

Extra Parameters:
--runtime=nvidia

Variables:
NVIDIA_VISIBLE_DEVICES = all
NVIDIA_DRIVER_CAPABILITIES = compute,video,utility

The "video" capability is the one that bites you: the runtime default is compute,utility and WITHOUT video the NVENC session fails to init even though nvidia-smi works fine. utility = the detection probe, compute = CUDA filters, video = NVENC itself.

Verify: docker exec x265-butler nvidia-smi -L → expect a "GPU 0: ..." line.

♻️ ROLLBACK
If v2.37.0 misbehaves on your hardware, roll back to the previous image:

docker stop x265-butler && docker rm x265-butler
docker pull ghcr.io/masterjb/x265-butler:2.36.1

🔭 COMING NEXT
Plans can change, but on the bench right now:
• Sharper diagnosis of UI sluggishness during heavy encodes (CPU attribution sampler, waiting on a QSV capture from an affected host)
• More robust hardware-encoder detection on multi-GPU / mixed Intel+AMD boxes

As always - if something breaks on your hardware, drop the diagnostics copy-report here and I'll dig in.

  • Author
3 hours ago, tbal82 said:

Here are the results of my tests.

4K file : failed

2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}

2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}

2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}

2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}

2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}

2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}

2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}

2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}

2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}

2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}


Job log still truncated : 11.log

Custom (Apple) 4K file : failed

2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}

2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}

2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}

2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}

2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}

2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}

2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}

2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}

2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}

2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}

2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}

2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}

2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}

2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}

2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}

2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}

2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}

2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}

2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}

2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}

Job log still truncated : 12.log

1080p : success

720p : success

-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?

Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...

3 hours ago, tbal82 said:

Here are the results of my tests.

4K file : failed

2026-06-24T06:53:57.512Z INFO job enqueued {"requestId":"829bb608-e3bb-48d6-8fab-47c027be01ee","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":5,"encoder":"libx265"}

2026-06-24T06:53:58.380Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":5,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:53:58.381Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:53:58.386Z INFO preflight_statfs_probe {"jobId":11,"fileId":5,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:06.549Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/Avengers.Endgame.2019.REPACK.2160p.UHD.BLURAY.REMUX.HDR.HEVC.MULTI.VFF.EAC3.x265-EXTREME.mkv","durationMs":8162,"result":"3840:1608:0:276"}

2026-06-24T06:54:06.549Z INFO auto-crop applied {"action":"crop_applied","jobId":11,"fileId":5,"crop":"3840:1608:0:276","source":"auto","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:06.551Z INFO x265: libx265 thread-pool cap resolved {"resolvedPools":16,"source":"operator-override","cpuCount":128,"x265PoolsEnv":"16"}

2026-06-24T07:44:11.445Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:44.047Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:20.438Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:52.239Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:49:59.258Z INFO log SSE stream closed {"requestId":"9f52816f-6ebb-462a-a32e-cd21e26b67b9","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":2394299}

2026-06-24T07:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":44689853,"skippedActive":0}

2026-06-24T08:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":47251325,"skippedActive":0}

2026-06-24T09:50:00.064Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":49813060,"skippedActive":0}

2026-06-24T10:50:00.065Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":52374899,"skippedActive":0}

2026-06-24T11:50:00.066Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":3,"deletedBytes":14083613,"remainingBytes":40853337,"skippedActive":0}

2026-06-24T12:24:20.296Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":5,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T12:31:38.423Z INFO log SSE stream closed {"requestId":"d7b9cbdb-3222-4145-91c7-cf83a1c2f608","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"11","droppedLineCount":0,"lastReadOffset":14109378}


Job log still truncated : 11.log

Custom (Apple) 4K file : failed

2026-06-24T06:54:36.213Z INFO job enqueued {"requestId":"6ecb5b8f-1c27-4261-bbcc-5e56c95ba216","route":"/api/queue","method":"POST","action":"enqueue","jobId":11,"fileId":7,"encoder":"libx265"}

2026-06-24T06:54:36.615Z INFO job transition: queued→encoding {"action":"job_transition","jobId":11,"fileId":7,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T06:54:36.616Z INFO dispatch_preset_resolved {"jobId":11,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T06:54:36.618Z INFO preflight_statfs_probe {"jobId":11,"fileId":7,"encoder":"libx265","paths_probed":[{"path":"/cache/work/11/input","statfs_ok":true},{"path":"/cache/work/11/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/IMG_5450-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T06:54:46.296Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T06:54:46.680Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/IMG_5450.MOV","durationMs":10062,"result":"3840:2160:0:0"}

2026-06-24T06:54:46.680Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":11,"fileId":7,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T06:54:48.444Z INFO job transition: encoding→failed {"action":"job_transition","jobId":11,"fileId":7,"transition":"encoding→failed","cause":"encode_nonzero_exit","exitCode":234}

2026-06-24T06:54:48.526Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:10.687Z INFO SSE stream closed {"requestId":"ddbeb82b-a791-44fc-8856-c49f86446157","route":"/api/events","action":"sse_stream_closed","durationMs":3226541,"deliveredCount":804,"droppedCount":0}

2026-06-24T07:44:10.741Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:12.602Z INFO diagnostics.not-found {"event":"notFoundEncountered","source":"not-found-server-component","kind":"fallback","pathname":"/en/queue","locale":"en","onboardingIncomplete":false}

2026-06-24T07:44:19.288Z INFO storage_page_rendered {"requestId":"c2e87ed7-5f50-42bd-b291-fd39725ab7d5","route":"/storage:server","shareCount":1,"orphanCount":0}

2026-06-24T07:44:19.405Z INFO storage_query_executed {"requestId":"9039594e-3a6a-4146-a217-fd6ae92b117d","route":"/api/storage/shares-table","endpoint":"shares-table","share":"all","duration_ms":1,"rowCount":1}

2026-06-24T07:44:19.411Z INFO storage_query_executed {"requestId":"8090c0e8-8d87-427b-a508-0c873d174f51","route":"/api/storage/kpis","endpoint":"kpis","share":"all","duration_ms":0,"rowCount":1}

2026-06-24T07:44:19.447Z INFO storage_query_executed {"requestId":"d7689331-3bde-4a70-9dac-415c7bd9185d","route":"/api/storage/buckets","endpoint":"buckets","share":"all","duration_ms":0,"rowCount":4}

2026-06-24T07:44:19.452Z INFO storage_query_executed {"requestId":"ccc37d60-8500-46ae-af94-71c461cec4a1","route":"/api/storage/codec-pie","endpoint":"codec-pie","share":"all","duration_ms":0,"rowCount":2}

2026-06-24T07:44:19.457Z INFO storage_query_executed {"requestId":"4e2b003c-c9c9-4cde-bf0c-8a6fb859b4a5","route":"/api/storage/top-folders","endpoint":"top-folders","share":"all","depth":2,"duration_ms":0,"rowCount":0}

2026-06-24T07:45:11.750Z INFO job enqueued {"requestId":"c7e0c370-cb2c-4ab0-861a-d81f32c0ac53","route":"/api/queue","method":"POST","action":"enqueue","jobId":12,"fileId":6,"encoder":"libx265"}

2026-06-24T07:45:12.243Z INFO job transition: queued→encoding {"action":"job_transition","jobId":12,"fileId":6,"transition":"queued→encoding","encoder":"libx265"}

2026-06-24T07:45:12.244Z INFO dispatch_preset_resolved {"jobId":12,"encoder":"libx265","presetResolved":"slow","presetSource":"settings"}

2026-06-24T07:45:12.246Z INFO preflight_statfs_probe {"jobId":12,"fileId":6,"encoder":"libx265","paths_probed":[{"path":"/cache/work/12/input","statfs_ok":true},{"path":"/cache/work/12/output.x265.mkv","statfs_ok":false,"errno":"ENOENT"},{"path":"/media/2026-06-16_Robin des Quoi.x265-x265.mkv","statfs_ok":false,"errno":"ENOENT"}]}

2026-06-24T07:45:26.692Z INFO cropdetect pre-pass complete {"action":"crop_detect","inputPath":"/media/2026-06-16_Robin des Quoi.x265.mkv","durationMs":14446,"result":"3840:2160:0:0"}

2026-06-24T07:45:26.692Z INFO auto-crop: no black bars detected — encoding full frame {"action":"crop_no_op","reason":"full_frame","jobId":12,"fileId":6,"detected":"3840:2160:0:0","srcWidth":3840,"srcHeight":2160}

2026-06-24T07:49:38.913Z INFO log SSE stream closed {"requestId":"0970f024-3c10-44b1-b328-8e05a7597cd5","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":179382}

2026-06-24T07:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":216612,"skippedActive":0}

2026-06-24T08:50:23.455Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":2761594,"skippedActive":0}

2026-06-24T09:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":5315929,"skippedActive":0}

2026-06-24T10:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":7884175,"skippedActive":0}

2026-06-24T11:50:23.456Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":10456545,"skippedActive":0}

2026-06-24T12:50:23.457Z INFO log retention sweep complete {"event":"log_retention_swept","deletedCount":0,"deletedBytes":0,"remainingBytes":13033429,"skippedActive":0}

2026-06-24T13:15:04.474Z INFO job transition: encoding→failed {"action":"job_transition","jobId":12,"fileId":6,"transition":"encoding→failed","cause":"encode:stdout exceeded cap","exitCode":0}

2026-06-24T13:35:22.679Z INFO log SSE stream closed {"requestId":"652b4bd5-81b4-4015-8a07-0526b394ab89","route":"/api/logs/[jobId]","event":"log_sse_closed","jobId":"12","droppedLineCount":0,"lastReadOffset":14086033}

Job log still truncated : 12.log

1080p : success

720p : success

-> Looks like the encoding of 4K files is generating too much logs, which in the end staturates the stdout (stdout exceeded cap) and in the end kills the encoding ?

Even though both 4K log files stopped at ~13MB, when the 1080p log files is 24MB...

Thanks for the detailed test, that's exactly the data I needed, and your read was on the right track.

I shipped v2.37.0 which fixes precisely this. Two things were going on:

1. The 4K "stdout exceeded cap" kill. It wasn't the resolution or the log size, it was duration. ffmpeg's machine-readable progress stream (not the x265 console output) emits ~2 lines/sec, so a ~5.5h 4K encode piled up ~40,000 progress blocks (~8.4 MB) and tripped an 8 MB stdout guard, which killed the job near the end. 1080p/720p finished faster, stayed under the cap, so they succeeded. That's why both 4K logs froze around ~13 MB while the 1080p one reached 24 MB, the 4K jobs were killed mid-stream, the 1080p one ran to completion.

2. The truncated job log. Same root cause, the progress stream was flooding the log, so "copy report" was 99% progress spam.

v2.37.0 throttles progress to one update every 30s (the same 5.5h encode now produces ~660 blocks, ~140 KB, nowhere near the cap), and it no longer dumps the progress stream into the job log, so "copy report" now shows the real ffmpeg/x265 output.

To update:

docker pull ghcr.io/masterjb/x265-butler:latest

docker restart x265-butler

Could you re-run the two 4K files once you're on 2.37.0? They should now run to completion, and the copied job log should be readable. Thanks again for the logs!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.