Il mio obiettivo era sfruttare l'accelerazione hardware nel playback dei video.
Avendo una GPU Nvidia GT218 (GeForce 210) molto molto basica qundi e anche vechiotta, ci sono due strade:
- provare coi drivers nouveau:
perché sono aggiornati oltre che aperti ecc ecc. Ho provato seguendo l'apposita guida sul sito nouveau, ma nonostante funzionino bene nella gestione ordinaria dell'interfaccia grafica (e direi anche in frambuffer TTY i caratteri sono più che OK), non si riesce ad ottenere una risposta stabile quando si attiva l'accelerazione hardware in vari player. Sia con mplayer che con mpv, selezionando sia VDPAU che VAAPI, ne esce un comportamento apparentemente ottimo durante la riproduzione (con CPU sotto il 5%, segno che sta lavorando la scheda grafica), ma che alla prima occasione manda l'intero sistema in crash, ad esempio basta premere "q" per chiudere il player e tutto si blocca, non si riesce neanche a riavviare con ctrl+alt+canc per capirci, bisogna proprio togliere corrente.
Per provare questa soluzione ho creato una partizione ad hoc e vi ho installato slackware 15.0 pulita, a 64 bit senza multilib o altro. Purtroppo non sembrano esserci soluzioni, a quanto pare sarebbe proprio un limite del driver nouveau, che comunque per sfruttare l'accelerazione hardware necessita di un pezzo di software proprietario installabile col pacchetto nvidia-firmware (disponibile su SBo), questo pacchetto pesca il firmware dal binario dei drivers nvidia, in versione "325.15". Siccome per la mia GPU i driver proprietari Nvidia sono i "340.108", per scrupolo ho provato a creare il pcchetto del firmware anche a partire da questo binario sperando che fosse maggiormente compatibile con la mia GPU, invece non ci sono stati miglioramenti.
Riassumendo, il driver Nouveau per il momento non è adatto per sfruttare l'accelerazione hardware sulla mia cvecchia GPU su slackware 15.0, creando crash del sistema inaccettabili per l'uso quotidiano.
- utilizzare il driver Nvidia, nel caso della mia GPU il "legacy340".
Con questi si riesce ad ottenere una situazione accettabile, ma c'è un dettaglio, un problemino con FFmpeg che non mi torna. Ne avevamo già parlato...
In pratica il problema ruota intorno alla libreria libOpenCL.so da cui dipende FFmpeg:
Codice: Seleziona tutto
# sbbdep --whoneeds /usr/lib64/libOpenCL.so.1.0.0
sync cache /root/.cache/sbbdep.db
cache up to date
ffmpeg-4.4.1-x86_64-2
Codice: Seleziona tutto
# slackpkg file-search libOpenCL
[inst] slackware64 : ocl-icd-2.3.1-x86_64-1
Codice: Seleziona tutto
# sbbdep /usr/lib64/libOpenCL.so.1.0.0
check /usr/lib64/libOpenCL.so.1.0.0, 64bit library (libOpenCL.so.1)
.. from package ocl-icd-2.3.1-x86_64-1
.. from package nvidia-legacy340-driver-340.108-x86_64-2_SBo
Codice: Seleziona tutto
$ ffmpeg -v quiet -codecs|grep '^ \.'
ffmpeg: /usr/lib64/libOpenCL.so.1: no version information available (required by /usr/lib64/libavfilter.so.7)
ffmpeg: /usr/lib64/libOpenCL.so.1: no version information available (required by /usr/lib64/libavfilter.so.7)
ffmpeg: /usr/lib64/libOpenCL.so.1: no version information available (required by /usr/lib64/libavutil.so.56)
ffmpeg: /usr/lib64/libOpenCL.so.1: no version information available (required by /usr/lib64/libavutil.so.56)
si reinstalla il pacchetto "ocl-icd" che va a sovrascrivere nuovamente libOpenCL con la versione di sistema contro cui era stato compilato FFmpeg.
Questo risolve, nel senso che nella pratica l'errore scompare e i vari players riproducono senza troppi problemi sfruttando l'accelerazione hardware VDPAU (che dovrebbe essere il massimo supportato dalla mia GPU).
Però resta qualche dubbio, nel senso che si è messa in piedi una soluzione ibrida, in cui il pacchetto dei drivers proprietari viene modificato facendo lavorare libOpenCL diversa da quella che si aspetterebbe il driver stesso.
Per cui si potrebbe provare anche una seconda strada, ovvero ricompilare FFmpeg in modo che vada a legarsi al libOpenCL del pacchetto Nvidia.
Sembrerebbe semplice, invece la compilazione non va a buon fine, questo è strano perché FFmpeg lamenta proprio qualcosa che non va in libOpenCL.
Intanto per la compilazione ho utilizzato la directory sorgente di ffmpeg presa dal repo ufficiale di slackware64-15.0. E avvio la compilazione come segue.
Codice: Seleziona tutto
# cat ./build.sh
#!/bin/sh
# Copy this into build directory (same of SlackBuild script) and run
x264=yes \
libass=yes \
libaom=yes \
libdav1d=yes \
./ffmpeg.SlackBuild
Codice: Seleziona tutto
MAN doc/libswscale.3
MAN doc/libswresample.3
MAN doc/libavcodec.3
MAN doc/libavformat.3
MAN doc/libavdevice.3
MAN doc/libavfilter.3
LD libswscale/libswscale.so.5
LD libpostproc/libpostproc.so.55
LD libswresample/libswresample.so.3
LD libavresample/libavresample.so.4
LD libavcodec/libavcodec.so.58
LD libavformat/libavformat.so.58
LD libavfilter/libavfilter.so.7
LD libavdevice/libavdevice.so.58
LD ffmpeg_g
LD ffplay_g
LD ffprobe_g
/usr/bin/ld: libavutil/libavutil.so: undefined reference to `clGetExtensionFunctionAddressForPlatform'
/usr/bin/ld: libavutil/libavutil.so: undefined reference to `clGetExtensionFunctionAddressForPlatform'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clEnqueueFillBuffer'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clCreateImage'
/usr/bin/ld: libavfilter/libavfilter.socollect2: error: ld returned 1 exit status
: undefined reference to `clEnqueueFillBuffer'
/usr/bin/ldmake: *** [Makefile:124: ffprobe_g] Errore 1
make: *** Attesa per i processi non terminati....
: libavfilter/libavfilter.so: undefined reference to `clCreateImage'
collect2: error: ld returned 1 exit status
make: *** [Makefile:124: ffmpeg_g] Errore 1
/usr/bin/ld: libavutil/libavutil.so: undefined reference to `clGetExtensionFunctionAddressForPlatform'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clEnqueueFillBuffer'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clCreateImage'
collect2: error: ld returned 1 exit status
make: *** [Makefile:124: ffplay_g] Errore 1
LD ffmpeg_g
/usr/bin/ld: libavutil/libavutil.so: undefined reference to `clGetExtensionFunctionAddressForPlatform'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clEnqueueFillBuffer'
/usr/bin/ld: libavfilter/libavfilter.so: undefined reference to `clCreateImage'
collect2: error: ld returned 1 exit status
make: *** [Makefile:124: ffmpeg_g] Errore 1
Cercando in rete ho trovato qualcosa di molto simile alla mia situazione, anche se lì aggiunge all'operazione il pacchetto cuda-toolkit o qualcosa di simile. Ma dubito che la sua presenza sia risolutiva e considerando che è un malloppo di roba mica da ridere ho preferito chiedere qui prima di tentare con l'installazione di quel pacchetto.
Il link cui mi riferivo comunque è questo:
https://whatdoineed2do.blogspot.com/201 ... clso1.html
Se i warnings di FFmpeg in runtime erano più che comprensibili, questo errore in fase di build non mi è così chiaro.
Può essere che libOpenCL presente nel pacchetto dei drivers Nvidia "legacy340" sia troppo vecchio per poter essere digerito dal nuovo FFmpeg anche in fase di "linking" ?
Vedete qualche possibilità di aggirare questo problema?
Grazie in anticipo!