Jellyfin Forum
SOLVED: Bad transcoding performance using Intel UHD 770 - Printable Version

+- Jellyfin Forum (https://forum.jellyfin.org)
+-- Forum: Support (https://forum.jellyfin.org/f-support)
+--- Forum: Troubleshooting (https://forum.jellyfin.org/f-troubleshooting)
+--- Thread: SOLVED: Bad transcoding performance using Intel UHD 770 (/t-solved-bad-transcoding-performance-using-intel-uhd-770)



Bad transcoding performance using Intel UHD 770 - fl0wfr - 2025-03-19

Hi,

I just change my hardware, from an Intel Xeon E-2186G (iGPU is an Intel  UHD Graphics P630) to an Intel Core i9 14900T (iGPU is an Intel UHD Graphics 770), configured as followed:
  • Host OS is Rocky Linux 9.5 x86_64
  • Kernel version is 6.13.7-1.el9.elrepo.x86_64
  • Jellyfin running in compose on Docker CE
  • GUC is enabled for LP encoding mode (but same issue when not using low power encoding)
  • I'm using RAM FS for storing transcoding temporary files
I'm unable to get a proper transcoding of 4K videos, which worked without an issue before. Did I miss something? I read that an Intel UHD 770 can handle several 4K transcoding at the same time, but I'm not even able to get a single one working, that's strange. Any help would be greatly appreciated Smiling-face

Docker compose:
Code:
  jellyfin:
    image: docker.io/jellyfin/jellyfin
    container_name: jellyfin
    hostname: jellyfin
    restart: unless-stopped
user: 1000:1000
    environment:
      - JELLYFIN_PublishedServerUrl=http://jellyfin.domain.tld
    volumes:
      - /docker/Jellyfin/config:/config
  - /docker/Jellyfin/cache:/cache
      - /volumes/data:/media/data
      - /var/transcoding-temp:/transcoding-temp
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "998" # Add render group
ports:
  - 8096:8096
    networks:
      - jellyfin

My transcoding settings:
   
   
   
   
   

Modules loaded:
Code:
i915                4526080  2
i2c_algo_bit          12288  1 i915
cec                    81920  1 i915
drm_buddy              24576  1 i915
ttm                  102400  1 i915
intel_gtt              24576  1 i915
drm_display_helper    262144  1 i915
drm_kms_helper        245760  2 drm_display_helper,i915
drm                  790528  6 drm_kms_helper,drm_display_helper,drm_buddy,i915,ttm
video                  81920  1 i915

i915 module comes from the installed kernel:
Code:
# modinfo i915
filename:      /lib/modules/6.13.7-1.el9.elrepo.x86_64/updates/i915.ko.xz
license:        GPL and additional rights
description:    Intel Graphics
author:        Intel Corporation
author:        Tungsten Graphics, Inc.

Before using transcoding:
   

When a transcoding is started:
   

ffmpeg process when started:
Code:
flow      606800 13.3  0.3 2454412 249948 ?      Sl  09:23  0:01 /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration 200M -probesize 1G -f matroska -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v hevc_qsv -i file:/media/data/Series/episode.mkv -noautoscale -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 hevc_qsv -tag:v:0 hvc1 -low_power 1 -preset veryfast -b:v 14616000 -maxrate 14616000 -bufsize 29232000 -profile:v:0 main -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,vpp_qsv=format=nv12 -codec:a:0 libfdk_aac -ac 2 -ab 256000 -af volume=2 -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type fmp4 -hls_fmp4_init_filename 7a4fe63ae03c0701e982fcf17b2c4cee-1.mp4 -start_number 0 -hls_segment_filename /transcoding-temp/jellyfin/7a4fe63ae03c0701e982fcf17b2c4cee%d.mp4 -hls_playlist_type vod -hls_list_size 0 -y /transcoding-temp/jellyfin/7a4fe63ae03c0701e982fcf17b2c4cee.m3u8

Jellyfin logs:
Code:
[2025-03-19 09:24:55.426 +01:00] [INF] [20] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for "flow". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2025-03-19 09:24:55.426 +01:00] [INF] [20] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 14000000, RemoteIP: "192.168.0.1", IsInLocalNetwork: True
[2025-03-19 09:24:55.783 +01:00] [INF] [130] Jellyfin.Api.Controllers.DynamicHlsController: Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request
[2025-03-19 09:24:55.784 +01:00] [INF] [130] MediaBrowser.MediaEncoding.Transcoding.TranscodeManager: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-analyzeduration 200M -probesize 1G -f matroska -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v hevc_qsv -i file:\"/media/data/Series/episode.mkv\" -noautoscale -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 hevc_qsv -tag:v:0 hvc1 -low_power 1 -preset veryfast -b:v 14616000 -maxrate 14616000 -bufsize 29232000 -profile:v:0 main -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf \"setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,vpp_qsv=format=nv12\" -codec:a:0 libfdk_aac -ac 2 -ab 256000 -af \"volume=2\" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type fmp4 -hls_fmp4_init_filename \"0ba4000c84531c0cb99ef80f5aae8fe5-1.mp4\" -start_number 0 -hls_segment_filename \"/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5%d.mp4\" -hls_playlist_type vod -hls_list_size 0 -y \"/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5.m3u8\""
[2025-03-19 09:25:05.790 +01:00] [INF] [130] MediaBrowser.Controller.MediaEncoding.TranscodingJob: Stopping ffmpeg process with q command for "/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5.m3u8"
[2025-03-19 09:25:05.792 +01:00] [ERR] [109] Jellyfin.Api.Middleware.ExceptionMiddleware: Error processing request: "A task was canceled". URL "GET" "/videos/73e730ba-cd8c-528d-cf42-64336206b15e/hls1/main/-1.mp4".
[2025-03-19 09:25:07.610 +01:00] [INF] [130] MediaBrowser.MediaEncoding.Transcoding.TranscodeManager: FFmpeg exited with code 0
[2025-03-19 09:25:07.610 +01:00] [INF] [130] Jellyfin.Api.Controllers.DynamicHlsController: Current HLS implementation doesn't support non-keyframe breaks but one is requested, ignoring that request
[2025-03-19 09:25:07.610 +01:00] [INF] [130] MediaBrowser.MediaEncoding.Transcoding.TranscodeManager: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-analyzeduration 200M -probesize 1G -ss 00:06:18.000 -noaccurate_seek -f matroska -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v hevc_qsv -i file:\"/media/data/Series/episode.mkv\" -noautoscale -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 hevc_qsv -tag:v:0 hvc1 -low_power 1 -preset veryfast -b:v 14616000 -maxrate 14616000 -bufsize 29232000 -profile:v:0 main -level 50 -g:v:0 72 -keyint_min:v:0 72 -vf \"setparams=color_primaries=bt709:color_trc=bt709:colorspace=bt709,vpp_qsv=format=nv12\" -codec:a:0 libfdk_aac -ac 2 -ab 256000 -af \"volume=2\" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type fmp4 -hls_fmp4_init_filename \"0ba4000c84531c0cb99ef80f5aae8fe5-1.mp4\" -start_number 126 -hls_segment_filename \"/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5%d.mp4\" -hls_playlist_type vod -hls_list_size 0 -y \"/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5.m3u8\""
[2025-03-19 09:25:24.554 +01:00] [INF] [109] Jellyfin.Plugin.KodiSyncQueue.EntryPoints.UserSyncNotification: Started user data sync
[2025-03-19 09:25:24.647 +01:00] [INF] [109] Jellyfin.Plugin.KodiSyncQueue.EntryPoints.UserSyncNotification: User Data Sync: User "flow" ("205dc7b9aecf4a728811ef76c2c783f9") posted 2 updates
[2025-03-19 09:25:24.647 +01:00] [INF] [109] Jellyfin.Plugin.KodiSyncQueue.EntryPoints.UserSyncNotification: Finished user data sync, taking "00:00:00.0925659"
[2025-03-19 09:25:33.261 +01:00] [INF] [111] MediaBrowser.Controller.MediaEncoding.TranscodingJob: Stopping ffmpeg process with q command for "/transcoding-temp/jellyfin/0ba4000c84531c0cb99ef80f5aae8fe5.m3u8"

ffmpeg logs:

.txt   ffmpeg.txt (Size: 81.92 KB / Downloads: 36)


RE: Bad transcoding performance using Intel UHD 770 - TheDreadPirate - 2025-03-19

What is the output of this command?

Code:
sudo dmesg | grep i915

Unrelated, you should check "Enable tone mapping" and uncheck VPP tone mapping. The OpenCL based tone mapping produces better results than VPP tone mapping.


RE: Bad transcoding performance using Intel UHD 770 - nyanmisaka - 2025-03-19

This appears to be a slowdown caused by I/O. You can try the following command to rule out the problem.

Test QSV decoder:
Code:
/usr/lib/jellyfin-ffmpeg/ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v hevc_qsv -i file:"/media/data/Series/episode.mkv" -an -sn -f null -

Test QSV encoder:
Code:
/usr/lib/jellyfin-ffmpeg/ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -f lavfi -i nullsrc=s=3840x1606,format=nv12 -c:v hevc_qsv -low_power 1 -preset veryfast -b:v 14616000 -maxrate 14616000 -bufsize 29232000 -profile:v main -level 50 -g:v 72 -keyint_min:v 72 -f null -



RE: Bad transcoding performance using Intel UHD 770 - fl0wfr - 2025-03-19

(2025-03-19, 12:42 PM)TheDreadPirate Wrote: What is the output of this command?

Code:
sudo dmesg | grep i915

Unrelated, you should check "Enable tone mapping" and uncheck VPP tone mapping.  The OpenCL based tone mapping produces better results than VPP tone mapping.

Hi, there it is:
Code:
[    1.425485] i915 0000:00:02.0: [drm] VT-d active for gfx access
[    1.425543] i915 0000:00:02.0: vgaarb: deactivate vga console
[    1.425582] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[    1.426222] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[    1.427763] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adls_dmc_ver2_01.bin (v2.1)
[    2.384219] i915 0000:00:02.0: [drm] [ENCODER:235:DDI A/PHY A] failed to retrieve link info, disabling eDP
[    2.558032] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/tgl_guc_70.bin version 70.36.0
[    2.558035] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[    2.561053] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[    2.561804] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[    2.561805] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[    2.562241] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
[    2.594121] [drm] Initialized i915 1.6.0 20230929 for 0000:00:02.0 on minor 0
[    2.658459] fbcon: i915drmfb (fb0) is primary device
[    2.728794] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[    5.210384] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])

(2025-03-19, 03:03 PM)nyanmisaka Wrote: This appears to be a slowdown caused by I/O. You can try the following command to rule out the problem.

Test QSV decoder:
Code:
/usr/lib/jellyfin-ffmpeg/ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -hwaccel qsv -hwaccel_output_format qsv -noautorotate -c:v hevc_qsv -i file:"/media/data/Series/episode.mkv" -an -sn -f null -

Test QSV encoder:
Code:
/usr/lib/jellyfin-ffmpeg/ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD -init_hw_device qsv=qs@va -filter_hw_device qs -f lavfi -i nullsrc=s=3840x1606,format=nv12 -c:v hevc_qsv -low_power 1 -preset veryfast -b:v 14616000 -maxrate 14616000 -bufsize 29232000 -profile:v main -level 50 -g:v 72 -keyint_min:v 72 -f null -
I don't see any bottleneck:
Code:
Linux 5.14.0-503.31.1.el9_5.x86_64 (bunker.fl0w.lan)    03/19/2025      _x86_64_        (32 CPU)

avg-cpu:  %user  %nice %system %iowait  %steal  %idle
          5.05    0.31    2.47    1.35    0.00  90.80

Device            tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
dm-0              6.42      296.53        21.10        0.00    350512      24945          0
dm-1              5.33      113.72        59.84        0.00    134418      70737          0
dm-2            386.78      9975.27      2180.59        0.00  11791366    2577590          0
md125            0.40        4.84        0.00        0.00      5716          0          0
md126          371.50    10387.48      2261.54        0.00  12278624    2673273          0
md127            0.20        3.71        0.01        0.00      4383        14          0
nvme0n1        340.35      7197.99      2275.79        0.00    8508459    2690122          0
nvme1n1        196.54      3200.39      2275.79        0.00    3783051    2690122          0
sda              0.62        9.24        1.73        0.00      10920      2048          0
sdb              1.61      519.25        1.73        0.00    613784      2048          0
sdc              1.85      563.72        1.73        0.00    666356      2048          0
sdd              3.01      1848.08        1.73        0.00    2184536      2048          0
sde              1.97      714.93        1.81        0.00    845084      2136          0
sdf              2.17      1269.86        1.73        0.00    1501052      2048          0
sdg              0.71        15.63        1.86        0.00      18472      2204          0
sdh              0.74        10.28        1.73        0.00      12156      2048          0
sdi              0.64        38.01        1.86        0.00      44928      2204          0
sdj              1.26      252.45        2.14        0.00    298408      2532          0

But yeah, not very quick...
Code:
frame= 5386 fps= 86 q=-0.0 Lsize=N/A time=00:03:44.68 bitrate=N/A speed=3.58x
Code:
frame=  650 fps= 27 q=-0.0 size=N/A time=00:00:25.84 bitrate=N/A speed=1.08x



RE: Bad transcoding performance using Intel UHD 770 - nyanmisaka - 2025-03-20


Linux 5.14.0-503.31.1.el9_5.x86_64


I think I know why. Linux 5.14 kernel is too old for AlderLake-S iGPU. Check these links and you will find that the minimum requirement is 5.17.

https://github.com/intel/media-driver#known-issues-and-limitations

https://jellyfin.org/docs/general/administration/hardware-acceleration/known-issues#intel-on-linux


RE: Bad transcoding performance using Intel UHD 770 - fl0wfr - 2025-03-20

I finally found the cause of the issue, I set the BIOS CPU C-States to C10, it may not be properly implemented in the BIOS.
After setting it to Cpu Default, I get this result:
Decoding (VCS at 50% in intel_gpu-top):
Code:
frame=10207 fps=295 q=-0.0 Lsize=N/A time=00:07:05.75 bitrate=N/A speed=12.3x
Encoding (VCS at 50% in intel_gpu_top):
Code:
frame= 2413 fps=109 q=-0.0 Lsize=N/A time=00:01:36.36 bitrate=N/A speed=4.35x
I guess this matches with the ability to transcode 4 4K videos simultaneously.
Thanks for your help!


RE: Bad transcoding performance using Intel UHD 770 - fl0wfr - 2025-03-20

(2025-03-20, 11:39 AM)nyanmisaka Wrote:
Linux 5.14.0-503.31.1.el9_5.x86_64


I think I know why. Linux 5.14 kernel is too old for AlderLake-S iGPU. Check these links and you will find that the minimum requirement is 5.17.

https://github.com/intel/media-driver#known-issues-and-limitations

https://jellyfin.org/docs/general/administration/hardware-acceleration/known-issues#intel-on-linux

i9 14900T is a Raptor Lake, based on TGLx platform (TGL: Tiger Lake, RKL: Rocket Lake, ADL-S/P/N: Alder Lake, RPL-S/P: Raptor Lake), kernel support since 5.9 Winking-face


RE: Bad transcoding performance using Intel UHD 770 - nyanmisaka - 2025-03-20

Glad you solved the problem. 5.14 seems to be the linux version of your storage server, while the linux version of the transcoding server is 6.13.7.

> i9 14900T is a Raptor Lake, based on TGLx platform (TGL: Tiger Lake, RKL: Rocket Lake, ADL-S/P/N: Alder Lake, RPL-S/P: Raptor Lake), kernel support since 5.9

Even though they share a lot of things, there are still differences in transcoding, such as HuC firmware and GuC submitting, which are disabled on Tiger Lake. They are gradually being enabled on Alder Lake and Raptor Lake, and these are two different code paths. I have seen failures due to it.