Bild-Formate NV12 Speicher-in-Speicher
Bin ich völlig verstehen, über die Größe der NV12 format wie beschrieben in Frage
Lese ich jetzt aus zwei Quellen über die Lagerung von UV-Ebene in diesem format:
man ist https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs. 85).aspx
NV12
Alle von der Y-Proben werden zunächst im Speicher als ein array von unsigned char-Werte mit einer geraden Anzahl von Linien. Die Y-Ebene ist, unmittelbar gefolgt durch ein array von unsigned char-Werte enthält, verpackt U (Cb) und V (Cr) - Proben. Wenn die kombinierte U-V-array angesprochen wird als ein array von little-endian WORD-Werte, die LSBs enthalten, die U-Werte, und die MSBs enthalten die V-Werte. NV12 der am günstigsten gelegene 4:2:0 pixel-format für DirectX VA. Es wird erwartet, dass ein mittelfristiger Voraussetzung für DirectX VA-Beschleuniger unterstützt 4:2:0 video. Die folgende Abbildung zeigt die Y-Ebene, und das array enthält, verpackt U-und V-Proben.
Was ich verstehe ist: in der UV-Ebene jedes U und V werden gespeichert in single-byte -.
Wenn ich lese aus wikipedia dazu:
https://wiki.videolan.org/YUV#NV12
Er sagt:
NV12
Bezug auf I420, NV12 hat eine Luminanz "Helligkeit" Y-Ebene und einer Ebene mit U-und V-Werte interleaved.
In NV12, chroma-Ebenen (blau und rot) sind in einer Unterstichprobe (subsampled) sowohl die horizontalen und vertikalen Dimensionen um einen Faktor von 2.
Für eine 2x2-Gruppe von Pixeln ein, haben Sie 4 Y-Proben und 1 U und 1 V-Probe.
Es kann hilfreich sein, sich NV12 als I420 mit der U-und V-Ebenen verschachtelt.
Hier ist eine grafische Darstellung der NV12. Jeder Buchstabe steht für ein bit:
Für 1 NV12 pixel: YYYYYYYY UVUV
Für einen 2-pixel-NV12-Rahmen: YYYYYYYYYYYYYYYY UVUVUVUV
Für ein 50-pixel-NV12 Rahmen: Y*8*50 (UV)*2*50
Für eine n-pixel-NV12 Rahmen: Y*8*n (UV)*2*n
Dem, was ich verstehe ist hier : jedes U und V sind interleaved bit by bit in jedem byte. Also jedem einzelnen byte der UV-Ebene enthalten 4U bits und 4V bits interleaved.
Kann jemand klären meine Zweifel?
- Es gibt keine bit-interleaving, (nur) bytes interleaving.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR: MSDN ist die richtige
Um dies zu überprüfen (oder zumindest sicherzustellen, dass es kein interleaving auf bit-Ebene), kann man
ffmpeg
, das ist ein weit verbreiteter video-tool. Ich habe das folgende experiment:ffmpeg
es zu Lesen alsI420
video-frame von einigen kleinen Größeffmpeg
konvertierenNV12
formatHier ist eine Beispiel-Kommandozeile für (2) und (3):
Hier ist, was ich habe in der Ausgabe:
Markierte ich die Chrominanz (U und V) Beispiele in Fett. Es ist offensichtlich, dass diese die gleichen Werte (ASCII-Zeichen), nur in Rührei bestellen. Wenn alle bit-interleaving durchgeführt wurden, würde ich unterschiedliche Werte.
Also die Beschreibung im VLC-wiki (BTW es ist nicht Wikipedia) ist falsch. Jemand mit dem Namen "Edwardw", fügte der "illustration" zu erwähnen, Pixel hier, und später geändert, um "bits" hier. Ich hoffe, jemand ändert es weniger irreführend (das wiki ist eine Registrierung erforderlich, so dass ich es nicht Bearbeiten kann).