martedì 25 giugno 2013

Abilitare il formato video h.264 in Chromium con Fedora

Chromium così come il suo derivato proprietario Chrome supporta pienamente i codec previsti dal sempre più popolare tag <video> introdotto con l'avvento di HTML5: Theora, WebM e h.264.
Tuttavia nella versione fornita da Fedora il formato video h.264 è stato disabilitato, perché trattasi di una tecnologia ancora coperta da brevetti software, nonostante il suo utilizzo sia di fatto gratuito ed esente da royalties (come dichiarato dalla MPEG LA, l'azienda che gestisce le licenze relative agli standard MPEG).
Questo "limite" del pacchetto di Fedora rientra comunque in un discorso più vasto e complesso della distribuzione di non voler supportare il codec h.264 a livello generale, decisione che è stata ed è tuttora oggetto di pesanti critiche e feroci diatribe. 
Celebre in tal senso, tra le altre, questa discussione dell'anno scorso nella mailing list di Fedora.
Tornando a Chromium, come avrete certamente già immaginato, per abilitare il supporto a H.264 occorre per forza di cose ricompilare il programma. L'operazione è in sé piuttosto semplice, il rovescio della medaglia è che la ricompilazione del browser, a secondo dell'hardware della vostra macchina, può richiedere anche diverse ore.
Quello che ad oggi è l'rpm ufficiale per Fedora non è adatto ai nostri scopi,  poiché il pacchetto non si basa sui sorgenti "vanilla" del browser ma bensì su una versione "clean", ripulita cioè di alcuni componenti, tra cui le preziose librerie richieste da h.264
Fortunatamente in rete ho trovato nei repository di Russian Fedora (un'interessantissima derivata) un pacchetto che fa proprio al caso nostro: esente dal difetto di cui sopra e che, con pochissime modifiche, può essere facilmente ricompilato.
Andiamo quindi sul sito del servizio Koji di Russian Fedora e preleviamo l'ultimo source rpm disponibile per Fedora 18. Alla data in qui sto scrivendo il pacchetto più recente è chromium-28.0.1500.52-1.fc18.R.src.rpm (attenzione che si tratta di un rpm di oltre 1GB!!)
Terminato il download, andiamo ad scompattare il pacchetto:
$ rpm -ihv chromium-28.0.1500.52-1.fc18.R.src.rpm
Entriamo ora nella cartella ~/rpmbuild/SPECS/ e con un editor di testo (nano, vim, gedit, kwrite, ecc.) apriamo il file chromium.spec, dopodichè localizziamo la seguente porzione di testo:
%build
export GYP_GENERATORS=make
build/gyp_chromium --depth=. \
-D linux_sandbox_path=%{_libdir}/%{name}/chrome-sandbox \
-D linux_sandbox_chrome_path=%{_libdir}/%{name}/chrome \
-D linux_link_gnome_keyring=0 \
-D use_gconf=0 \
-D werror='' \
-D use_system_sqlite=0 \
-D use_system_libxml=0 \
-D use_system_zlib=0 \
-D use_system_bzip2=1 \
-D use_system_libbz2=1 \
-D use_system_libpng=0 \
-D use_system_libjpeg=1 \
-D use_system_libevent=1 \
-D use_system_flac=1 \
-D use_system_vpx=1 \
-D use_system_speex=1 \
-D use_system_libusb=1 \
-D use_system_libexif=1 \
-D use_system_libsrtp=1 \
-D use_system_libmtp=1 \
-D use_system_opus=0 \
-D use_system_libwebp=1 \
-D use_system_harfbuzz=0 \
-D use_system_minizip=1 \
-D use_system_yasm=1 \
-D use_system_xdg_utils=1 \
-D build_ffmpegsumo=1 \
-D use_system_ffmpeg=0 \
-D use_pulseaudio=1 \
-D use_system_v8=0 \
-D linux_link_libpci=1 \
-D linux_link_gsettings=1 \
-D linux_link_libspeechd=1 \
-D linux_link_kerberos=1 \
-D linux_link_libgps=1 \
        -Dgoogle_api_key='AIzaSyD1hTe85_a14kr1Ks8T3Ce75rvbR1_Dx7Q' \
-Dgoogle_default_client_id='4139804441.apps.googleusercontent.com' \
-Dgoogle_default_client_secret='KDTRKEZk2jwT_7CDpcmMA--P' \
Come dicevo prima, le modifiche che occorre fare per attivare il fase di compilazione il supporto al codec h.264 sono tutt'altro che complicate; è sufficiente aggiungere i seguenti parametri al comando gyp_chromium:
        -D ffmpeg_branding=Chrome \
        -D proprietary_codecs=1 \
Fatta questa operazione il risultato finale sarà di questo tipo:
build/gyp_chromium --depth=. \
-D linux_sandbox_path=%{_libdir}/%{name}/chrome-sandbox \
-D linux_sandbox_chrome_path=%{_libdir}/%{name}/chrome \
-D linux_link_gnome_keyring=0 \
-D use_gconf=0 \
-D werror='' \
-D use_system_sqlite=0 \
-D use_system_libxml=0 \
-D use_system_zlib=0 \
-D use_system_bzip2=1 \
-D use_system_libbz2=1 \
-D use_system_libpng=0 \
-D use_system_libjpeg=1 \
-D use_system_libevent=1 \
-D use_system_flac=1 \
-D use_system_vpx=1 \
-D use_system_speex=1 \
-D use_system_libusb=1 \
-D use_system_libexif=1 \
-D use_system_libsrtp=1 \
-D use_system_libmtp=1 \
-D use_system_opus=0 \
-D use_system_libwebp=1 \
-D use_system_harfbuzz=0 \
-D use_system_minizip=1 \
-D use_system_yasm=1 \
-D use_system_xdg_utils=1 \
-D build_ffmpegsumo=1 \
-D use_system_ffmpeg=0 \
-D use_pulseaudio=1 \
-D use_system_v8=0 \
-D linux_link_libpci=1 \
-D linux_link_gsettings=1 \
-D linux_link_libspeechd=1 \
-D linux_link_kerberos=1 \
-D linux_link_libgps=1 \
-D ffmpeg_branding=Chrome \
-D proprietary_codecs=1 \
        -Dgoogle_api_key='AIzaSyD1hTe85_a14kr1Ks8T3Ce75rvbR1_Dx7Q' \
-Dgoogle_default_client_id='4139804441.apps.googleusercontent.com' \
-Dgoogle_default_client_secret='KDTRKEZk2jwT_7CDpcmMA--P' \
Salvate e chiudete il file. Se siete utilizzatori di chromium-pepper-flash e volete continuare ad usarlo con questo pacchetto alternativo di Chromium dovete sostituire il file  ~/rpmbuild/SOURCES/chromium-wrapper con la versione da me modificata e scaricabile da qui. In caso contrario ignorante tranquillamente questo passaggio.

Terminate le attività di modifica, passiamo alla compilazione; innanzitutto scarichiamo le dipendenze necessarie:
 $ sudo yum-builddep chromium.spec
Se siete su Fedora a 64 bit e il precedente comando vi restituisce l'errore:
Nessun pacchetto trovato per /lib/libz.so.1
installate il pacchetto zlib.i686 per risolverlo, dopodiché ripetete l'esecuzione del comando yum-builddep.
Fatto questo lanciamo finalmente la vera e propria compilazione del pacchetto:
$ rpmbuild -ba chromium.spec
Come detto in precedenza l'operazione potrebbe richiedere parecchio tempo, quindi mettetevi comodi :-)
Al termine, se tutto è andato per il verso giusto, troverete il pacchetto rpm di Chromiun in  ~/rpmbuild/RPMS/i686 o ~/rpmbuild/RPMS/x68_64, a seconda dell'architettura del vostro pc, pronto per essere installato.
Effettuiamo ora qualche test per verificare l'effettiva disponibilità del codec h.264; iniziamo con l'aprire la pagina della versione di prova HTML5 di youtube.
Ora in corrispondenza della voce h.264 dovrebbe esserci un segno di spunta verde e non più un punto esclamativo rosso.

Collegandovi alla pagina  HTML5 tests - video su quirksmode.org potete provare la riproduzione di uno spezzone di Big Buck Bunny in formato h.264 (oltre che WebM e Theora)
Vimeo dovrebbe ora consentirvi l'utilizzo del player HTML5 al posto di Flash. Aprite un qualunque video (ad esempio questo) e cliccate su Switch to HTML5 Player. Enjoy! :-)

P.s.
Per chi volesse provare questo pacchetto alternativo di Chromium, risparmiandosi l'avventura della ricompilazione, potete trovare nel mio repository personale (e sperimentale) il pacchetto compilato a 64 bit

EDIT:
Ho appena aggiunto anche la versione 32 bit. Non posso invece caricare nel repo (creato all'intero di un account dropbox free) il source rpm per ovvi motivi di spazio, sorry!

EDIT2 (27/07/13):
Aggiungo alcune informazioni che ritengo molto utili da sapere:
- Per la compilazione su x86_64 è richiesta una dipendenza che non è indicata nel file spec e senza la quale  la compilazione stessa fallisce: libstdc++.i686. Installate il pacchetto prima di procedere con rpmbuild.
- A partire da chromium-28.0.1500.71-1.1.fc19.R il team di Russian Fedora ha deciso di utilizzare di default Aura, la nuova interfaccia utente progettata per ChromeOS. In attesa che Aura diventi più maturo consiglio caldamente di disattivarne la compilazione: è sufficiente all'interno del file spec sostituire  use_aura=1 in use_aura=0.
Se invece volete provate Aura, sappiate che la vostra scelta causerà parecchi problemi a chromium: nessun plugin (eccetto chromium-pepper-flash) verrà caricato, non sarà possibile riprodurre video HTML5 a schermo intero e l'icona di chromium non verrà visualizzata nella barra delle finestre.