In questo post cercherò di tenere gli aggiornamenti allo script su cui sto lavorando.
Ultima versione del 28/06/2014 - ore 20.30 Codice: Seleziona tutto"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -i "input.mov" -y -filter_complex "extractplanes=y+u+v[y][u][v]; [u] scale=w=iw*2:h=2160:in_range=full:flags=print_info+neighbor+bitexact [us]; [v] scale=w=iw*2:h=2160:in_range=full:flags=print_info+neighbor+bitexact [vs]; [y][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p10le,scale=w=iw/2:h=1080:in_range=tv:flags=print_info+bicubic+full_chroma_inp+full_chroma_int" -sws_dither none -q 0 -quant_mat hq -c:v prores_ks -profile:v 4 -c:a copy -c:s copy -c:d copy -map 0 "output.mov"
in xml per anothergui:
Codice: Seleziona tutto<?xml version="1.0" encoding="utf-16"?>
<AnotherGUI_Presets_ver.03>
<Preset>
<UUID>d495ae17-099d-40bb-afa3-ebb8cbde247e</UUID>
<Executable>ffmpeg.exe</Executable>
<Name>GH4 UHD to 1080p 4:4:4 </Name>
<Category><![CDATA[FCP]]></Category>
<Description><![CDATA[Converte dai 4K UHD della GH4 in 4:2:0 a 1080p 444 10 bit prores]]></Description>
<Arguments><![CDATA[-i "<SourceFileName>"
-filter_complex "extractplanes=y+u+v[y][u][v]; [u] scale=w=iw*2:h=2160:in_range=full:flags=print_info+neighbor+bitexact [us]; [v] scale=w=iw*2:h=2160:in_range=full:flags=print_info+neighbor+bitexact [vs]; [y][us][vs]mergeplanes=0x001020:yuv444p,format=pix_fmts=yuv444p10le,scale=w=iw/2:h=1080:flags=print_info+bicubic+full_chroma_inp+full_chroma_int"
-sws_dither none
-q 0 -quant_mat hq
-c:v prores_ks -profile:v 4
-c:a copy
-c:d copy
-map 0
"<OutputPath><OutputFileName>_0.mov"
//Viene usato il ProRes_Kostya perchè ha il 4.4:4:4,
// il timecode è da verificare
]]></Arguments>
<Arguments2><![CDATA[]]></Arguments2>
</Preset>
</AnotherGUI_Presets_ver.03>
Per chi si volesse cimentare, spiego cosa fa lo script e quali sono gli aggiornamenti:
Noi abbiamo in ingresso un 4:2:0, ciò significa che la risoluzione del canale Y è completa (ad esempio 3840 X 2160), mentre la risoluzione delle componenti u e v è più bassa, e praticamente nel caso citato sarebbe 1920 X 1080, povvero un pixel di chroma ogni 4 (mentre nel 4:2:2 avremmo 1920 X 2160, tanto per capirci).
Inoltre, il nostro input è a 8 bit.
La prima operazione che fa lo script è di separare i piani Y, u e v, scala MA SENZA INTERPOLAZIONI u e v alla piena risoluzione, rimette insieme i piani in un formato 4:4:4 e poi riscalando a 1920 X 1080 in pratica riavremo i canali u e v alla risoluzione originale ma stavolta in una file 1920 X 1080 e non più 3840 X 2160. Questo fa si che il 4:4:4 sia REALE e non fittizio come un upscaling.
Il rescale inoltre viene effettuato a 32 bit, e re-inpacchettato in un file a 10 bit. Praticamente, sul canale di luminanza viene fatta una media tra 4 pixel a 8 bit ottenendo un REALE valore a 10 bit. Ad esempio, se ho 4 pixel di cui 2 hanno il valore 127 e due hanno il valore 128, facendo la media a 8 bit perderei la virgola (il risultato sarebbe 127,5 ma a 8 bit viene troncato) mentre a 10 bit otterrò un risultato pari a 510 (su una scala che non va più da 0 a 255 ma da 0 a 1023) che essendo un valore intero non verrà troncato.
Per cui avrò una REALE precisione a 10 bit in uscita, peraltro aiutati anche dal noise che crea del dithering ma questo è un discorso ancora più complesso.
Gli aggiornamenti fatti in questo script (28/06/2014):
1) lo scale orizzontale non è più fisso a 3840 ma è parametrizzato all'ingresso, per poter usare lo stesso script al 4K cinema che non è 3840 ma 4096.
2) E' stato aggiunto un parametro (in_range=full) perchè senza questo avevo notato che lo script dava un risultato leggermente sovrasaturato.
ATTENZIONE: al momento lo script è stato testato con il settaggio macchina impostato a 16-235. Con l'impostazione 16-255 dovrebbe funzionare comunque correttamente, forse anche meglio, ma con il settaggio 0-255 NON FUNZIONA CORRETTAMENTE, perchè vengono "clippati" i valori sotto al 16, creando una immagine molto più scura dell'originale. Se qualcuno ha consigli me li faccia sapere che aggiorniamo man mano lo script.
EDIT 28/06 h 20.30
Ho modificato gli script nelle ultime righe, ora funziona anche il timecode.