2017-04-20 1 views
1

Ich verwende die HEVC Referenzsoftware HM Encoder Version [16.15] (einschließlich RExt) auf einem [Mac OS X] [GCC 4.2.1] [64 Bit] und möchte auf Codiererseite extrahieren: 1) die Bewegungsvektoren für jeden Block 2) die Rahmenpartitionsinformation, dh die Größe und Position jedes Blocks in dem Rahmen, auf den sich ein Bewegungsvektor bezieht.So extrahieren Sie Bewegungsvektoren und Informationen zur Rahmenpartition in HEVC HM 16.15

Hat jemand Hinweise auf welche Variablen diese Informationen für jede Codiereinheit gespeichert sind? Vielen Dank!

+0

Die Antwort [auf diese Frage] (https://stackoverflow.com/questions/40502892/in-hevc-reference-software-hm-16-9-i-need-help-for-generating-details-of- -cus-pu) sollte hilfreich sein. – damjeux

Antwort

0

Alles, was Sie brauchen, ist in der TComDataCU Klasse verfügbar.

1) Für Bewegungsinformationen gibt es die Funktion getCUMvField(), die den Bewegungsvektor zurückgibt. Es ist jedoch nicht einfach damit zu arbeiten.

Um auf fast alle Syntaxelemente der PU/CU-Ebene zugreifen zu können, müssen Sie in der Lage sein, mit dem absoluten Index dieser PU/CU zu arbeiten. Dieser eindeutige Index teilt Ihnen mit, wo sich Ihre PU/CU in der CTU befindet, indem Sie auf den nach oben weisenden 4x4-Block dieses Teils zeigen. Ich erinnere mich, dass dieser Index meistens in der Variablen uiAbsPartIdx gespeichert ist.

Wenn Sie erfahren, wie Sie mit diesem Index arbeiten, können Sie die Informationen zur Blockpartitionierung in der CTU-Ebene abrufen. Also für 2) mein Vorschlag ist, dass Sie auf die Scheibe Ebene gehen, wenn Sie eine Schleife über CUTs haben (ich denke, das ist in der compressSlice() Funktion getan). Und nachdem die compressCtu()-Funktion für jede CTU aufgerufen wurde (was bedeutet, dass alle RDO-Entscheidungen getroffen wurden und die CTU-Partitionierung entschieden ist), legen Sie eine Schleife über alle uiAbsPartIdx s der CTU und erhalten ihre Breite und Höhe. Wenn Ihre CTU-Größe beispielsweise 128 ist, haben Sie 32 * 32 = 1024 eindeutige 4x4-Blöcke in Ihrer CTU. Die Funktion zum Ermitteln der Breite/Höhe der CU, die einer bestimmten uiAbsPartIdx entspricht, ist pCtu->getWidth(uiAbsPartIdx).

Ich hoffe, es war klar.

+0

Danke für Ihre Antwort. Ich bekomme keine Schleife über alle "uiAbsPartIdxs" jeder CTU. In 'compressSlice' bin ich in der for-Schleife ' für (UInt ctuTsAddr = startCtuTsAddr; ctuTsAddr SimonFD

+0

Nehmen wir an, Ihre CTU-Breite beträgt 64, was 256 Einheiten 4x4 ergibt. Wenn Sie dann 'boundingCtuAddr = 256' setzen, durchlaufen Sie alle CUs in der CTU. Und für jede CU können Sie diesen CU-Index ("ctuTsAddr") an die Funktionen "getHeight" und "getWidth" übergeben, um die Größe der aktuellen CU zu ermitteln. –

+0

Aber der sehr wichtige Punkt ist, dass, wenn Ihre CU größer als 4x4 ist, dies bedeutet, dass die CU von mehr als einer 4x4-Einheit abgedeckt ist und Sie darauf achten müssen, solche CU nicht mehr als einmal zu berücksichtigen. Wenn Ihre erste CU beispielsweise 8x8 ist, würde 'ctuTsAddr = 0,1,2,3' auf diese CU zeigen und wenn Sie' getWidth' oder 'getHeight' Funktionen mit diesen Werten verwenden, erhalten Sie die Größe 8x8 viermal . Ich hoffe es war klar! –

Verwandte Themen