<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Transcoding on homelab</title>
    <link>https://homelab.nbkelley.com/tags/transcoding/</link>
    <description>Recent content in Transcoding on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/tags/transcoding/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Jellyfin LXC GPU Passthrough &amp; Hardware Acceleration</title>
      <link>https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/jellyfin-gpu-passthrough/</guid>
      <description>&lt;h1 id=&#34;jellyfin-lxc-gpu-passthrough--hardware-acceleration&#34;&gt;Jellyfin LXC GPU Passthrough &amp;amp; Hardware Acceleration&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-lxc-gpu-passthrough--hardware-acceleration&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Successfully configured Intel UHD Graphics 630 GPU passthrough to a Jellyfin LXC container on Proxmox for hardware-accelerated transcoding via Intel QuickSync (QSV).&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU Passthrough Method&lt;/strong&gt;: LXC container-level GPU device mapping (not full VM passthrough)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hardware Acceleration&lt;/strong&gt;: Intel QuickSync (QSV) selected over VAAPI for Jellyfin&amp;rsquo;s native support&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Monitoring Constraints&lt;/strong&gt;: Accepted that LXC container restrictions prevent full GPU monitoring tools (dmesg, intel_gpu_top) from functioning; validated functionality through actual transcoding tests instead&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;host-gpu-details&#34;&gt;Host GPU Details&lt;a class=&#34;anchor&#34; href=&#34;#host-gpu-details&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630]&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;PCI Address&lt;/strong&gt;: 00:02.0&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Driver&lt;/strong&gt;: i915 (loaded)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Related Modules&lt;/strong&gt;: drm_buddy, ttm, drm_display_helper, cec, i2c_algo_bit, video&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lxc-container-gpu-devices&#34;&gt;LXC Container GPU Devices&lt;a class=&#34;anchor&#34; href=&#34;#lxc-container-gpu-devices&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/dri/card0&lt;/code&gt; — character special (major 226, minor 0)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/dev/dri/renderD128&lt;/code&gt; — character special (major 226, minor 128)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Permissions&lt;/strong&gt;: &lt;code&gt;crw-rw---- root:video&lt;/code&gt; (226/0 and 226/128)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;jellyfin-configuration&#34;&gt;Jellyfin Configuration&lt;a class=&#34;anchor&#34; href=&#34;#jellyfin-configuration&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Group Assignment&lt;/strong&gt;: &lt;code&gt;jellyfin&lt;/code&gt; user added to &lt;code&gt;video&lt;/code&gt; group (&lt;code&gt;usermod -a -G video jellyfin&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dashboard → Playback Settings&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Hardware Acceleration: &lt;code&gt;Intel QuickSync (QSV)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable hardware encoding: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable hardware decoding: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enable tone mapping: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Allow encoding in HEVC: &lt;code&gt;Yes&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Allow encoding in AV1: &lt;code&gt;Yes&lt;/code&gt; (if supported)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;validation-commands&#34;&gt;Validation Commands&lt;a class=&#34;anchor&#34; href=&#34;#validation-commands&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Verify GPU device accessibility&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la /dev/dri/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Check if processes are using GPU during playback&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsof /dev/dri/renderD128&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Monitor Jellyfin logs for hardware acceleration&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo journalctl -u jellyfin -f | grep -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hardware\|qsv\|quicksync\|vaapi&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Check active transcoding sessions in Jellyfin UI&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Dashboard → Active Devices → look for (HW) indicator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;dmesg restriction&lt;/strong&gt;: &lt;code&gt;dmesg: read kernel buffer failed: Operation not permitted&lt;/code&gt; — expected in LXC containers without full device access&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;intel_gpu_top limitation&lt;/strong&gt;: GPU monitoring tools that require kernel debugfs access will not work inside the LXC; validated via actual transcoding performance and log inspection instead&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;i915 driver loaded&lt;/strong&gt;: Confirmed via &lt;code&gt;lsmod | grep i915&lt;/code&gt; showing 3,928,064 bytes loaded&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No GPU debug info&lt;/strong&gt;: &lt;code&gt;/sys/kernel/debug/dri&lt;/code&gt; not available in container — accepted limitation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does AV1 hardware encoding actually work on Coffee Lake-S (Gen 9.5) — typically limited to H.264/H.265&lt;/li&gt;&#xA;&lt;li&gt;Performance baseline: what CPU load reduction is observed with QSV vs software transcoding?&lt;/li&gt;&#xA;&lt;li&gt;Can GPU passthrough be extended to other LXC containers (e.g., Plex, if migrated)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Plex Transcoding LXC — similar GPU passthrough patterns for Plex&lt;/li&gt;&#xA;&lt;li&gt;Proxmox LXC Configuration — LXC container setup patterns&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/servarr/&#34;&gt;Servarr - Media Automation Stack&lt;/a&gt; — media server ecosystem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/gluetun-vpn/&#34;&gt;Gluetun VPN Service&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
