# TL;DR
JellyfinでIntel QSVによるH.264, HEVCエンコードを有効にすると,一部の条件下で動画のストリーミングができなくなった.
これはデフォルトでHuCが有効になっておらず,一部のHWエンコーディングのみが有効となっていることが原因である.
カーネルパラメータにてHuC Firmwareのロードを有効化することで解消する.
# 環境
- OS
- TrueNAS SCALE 24.04
- Jellyfin
- TrueChartでの導入
- TrueChartsのアプリケーションはk3s上で動作
- HW TranscodeのためiGPUを割り当て
- CPU/GPU
- Intel Core i7-9700K
- Intel UHD Graphics 630
# エラー詳細
HEVCやVP9,Apple ProResなどでエンコードした動画を,これらのDirect Playに対応しないクライアントへストリーミングする際に発生(対応形式へのTranscodeが行われるため)
JellyfinのUI上では「サーバー・クライアントが対応した形式にできない」的な文面が表示される(うろ覚えで凄い適当)
以下のようなTranscodeのログが残っていた.
```
...
[h264_qsv @ 0x55f9ad49e8c0] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x55f9ad49e8c0] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
```
調べていると,以下のエントリを発見.
https://www.reddit.com/r/jellyfin/comments/ulw3ct/transcoding_with_intel_quicksync_in_docker/
これによると,カーネルパラメータに `i915.guc_enable=2` を追加することで解消するケースがあるよう.
# GuC/HuC
詳細は[ArchWiki](https://wiki.archlinux.jp/index.php/Intel_graphics#GuC.2FHuC_.E3.83.95.E3.82.A1.E3.83.BC.E3.83.A0.E3.82.A6.E3.82.A7.E3.82.A2.E3.81.AE.E3.83.AD.E3.83.BC.E3.83.89.E3.82.92.E6.9C.89.E5.8A.B9.E3.81.AB.E3.81.99.E3.82.8B)を参照すべし
第9世代 Core以降のGPUに搭載されたgraphics micro controllerとのこと.HEVCなどのエンコードをを専用コントローラへオフロードしたりする.
第12世代 Core以前では,Linuxにおいてこれがデフォルト無効のため,カーネルパラメータで有効化する必要がある.
上記の`i915.guc_enable=2`はHuCファームウェアのロードを有効にするもので,第9世代以降が対応している.
# HuCファームウェアロードの有効化
通常のLinux環境であれば,GRUBなどのbootloaderの設定で上記パラメーターを設定すれば良い.
`/etc/modprobe.d`以下に設定を置いても良いだろう.
TrueNASではGRUBの設定を書き換えても,システム更新があると永続化できないため,少し方法が異なる.
以下のコマンドでデータベースエントリを追加し,再起動
```
midclt call system.advanced.update '{"kernel_extra_options": "`i915.guc_enable=2"}'
```
すると再起動時にこれがGRUBのパラメータへ反映される.
ロードされたかは`dmesg`で確認
```
[ 5.300401] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/kbl_guc_70.1.1.bin version 70.1.1
[ 5.300425] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/kbl_huc_4.0.0.bin version 4.0.0
```
これで問題無くTranscodeが効くようになった.