2015-07-15 18 views
6

Sono totalmente capire circa le dimensioni del formato NV12, come descritto nella domandaformati di memorizzazione delle immagini NV12 in memoria

NV12 format and UV plane

Ora sto leggendo da due fonti circa la conservazione del piano UV in questo formato: uno è https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx

NV12

Tutti i campioni Y vengono ordinate in memoria, come un array di uns valori di char igned con un numero pari di linee. Il piano Y viene seguito immediatamente da una matrice di valori char non firmati che contiene campioni U (Cb) e V (Cr) impacchettati. Quando l'array U-V combinato viene indirizzato come una matrice di valori WORD little-endian, gli LSB contengono i valori U e gli MSB contengono i valori V. NV12 è il formato di pixel 4: 2: 0 preferito per DirectX VA. Si prevede che sia un requisito a medio termine per gli acceleratori DirectX VA che supportano il video 4: 2: 0. L'illustrazione seguente mostra il piano Y e l'array che contiene campioni U e V compressi.

Quello che ho capito è: nel piano UV ogni U e V sono memorizzati nel singolo byte.

Quando ho letto da wikipedia su questi: https://wiki.videolan.org/YUV#NV12

Si dice:

NV12

relativi a I420, NV12 ha una luma aereo "luminanza" Y e un piano con U e valori V interlacciati. Nella NV12, i piani cromia (blu e rosso) sono sottocampionati in entrambe le dimensioni orizzontale e verticale di un fattore di 2. Per un gruppo di pixel 2x2, sono disponibili 4 campioni Y e 1 campione U e 1 V. Può essere utile pensare a NV12 come I420 con gli aerei U e V interlacciati. Ecco una rappresentazione grafica di NV12. Ogni lettera rappresenta un bit: Per 1 NV12 pixel: YYYYYYYY UVUV Per un 2-pixel NV12 telaio: YYYYYYYYYYYYYYYY UVUVUVUV Per un 50 pixel telaio NV12: Y * 8 * 50 (UV) * 2 * 50 Per un n -pixel NV12 frame: Y * 8 * n (UV) * 2 * n

Quello che capisco qui è: ogni U e V sono interlacciati bit per bit in ogni byte. Quindi ogni byte del piano UV conterrà 4U bit e 4V bit intercalati.

Qualcuno può chiarire il mio dubbio?

+0

Non c'è interlacciamento di bit, (solo) ** byte ** interleaving. – Rotem

risposta

11

TL; DR: MSDN è corretto

Per verificare questa (o almeno verificare che non vi sia interleaving a livello di bit), si può utilizzare ffmpeg, che è uno strumento video ampiamente utilizzato.Ho fatto il seguente esperimento:

  1. Fai un file contenente un testo (ho preso l'esempio Lorem Ipsum testo)
  2. Dillo ffmpeg di leggerlo come cornice I420 il video di qualche piccolo formato
  3. Dillo ffmpeg a convertirlo in formato NV12
  4. Print it

Ecco un esempio di comando per la (2) e (3):

01.235.
ffmpeg -s 96x4 -i example_i420.yuv -pix_fmt nv12 example_nv12.yuv 

Ecco quello che ho ottenuto in uscita:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo conseguat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. sint Excepteur occaecat cupidatat non proident, s utnett uirn acduilppias cqiunig oeflfiitc, io come Edde sdeor uenitu smmooldl Itte mapnoirm iindc iedsitd ulnatb ourtu ml.a bLoorree me ti pdsoulmo rdeo lmoarg NSAI ta laimqeuta ,. cUotn seenci

Ho contrassegnato i campioni di crominanza (U e V) in grassetto. È evidente che questi sono gli stessi valori (lettere ASCII), solo in ordine criptato. Se venissero eseguiti interlacciamenti di bit, otterrei valori diversi.

Quindi la descrizione nel wiki VLC (BTW è non Wikipedia) non è corretta. Qualcuno con il nome "Edwardw" ha aggiunto la "illustrazione" che menziona i pixel here e successivamente lo ha cambiato in "bit" here. Spero che qualcuno lo cambi per essere meno fuorviante (il wiki richiede la registrazione quindi non posso modificarlo).