FullCircle/Datenformat

Aus C3MAWiki
Zur Navigation springenZur Suche springen
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.
Dies ist ein Projekt, an dem momentan aktiv gearbeitet wird. Wenn du Fragen hast oder mitarbeiten möchtest, wende dich an Gonium.


Das Datenformat sollte eine Abfolge von Frames sowie einige Metadaten beinhalten. Es sollte zudem plattform- und programmiersprachenunabhängig sein. Die 'libfullcircle' definiert das Datenformat. Als Serialisierung wird Protocol Buffers zum Einsatz kommen - das hebt dafür locker und ist recht einfach zu benutzen. Die Frameabfolge (Sequence) soll in einer einzigen Datei gespeichert werden, damit man flexibel damit arbyten kann.

Brainstorming

  • Metadaten pro Datei
    • Framerate zum Abspielen (Frames/s)
    • Dimensionen der Frames (X/Y)
    • Generator (Name des generierenden Plugins inklusive Versionsnummer) -> Debugging!
  • Abfolge von Frames: Sequence
    • FrameID
    • Matrix von Farbwerten
    • Ein Farbwert wird als RGB gespeichert, je 8 Bit pro Kanal

Ein Frame mit 16:9 Pixeln kommt also auf 16*9*3 = 432 Byte. Mit 10 Frames pro Sekunde macht das 4320 Bytes pro Sekunde, bei 2 Minuten Visualisierungen also 120*4320=507 KB. Das erscheint handhabbar, wenn man ein recht kompaktes Format wählt. Das generiert Protocol Buffers aber automatisch ziemlich effizient.

Ein Frame fängt oben links mit dem Pixel (0,0) an und hört unten rechts mit dem Pixel (x_dim, y_dim) auf.


Definition des Datenformats

Das Datenformat ist in /libfullcircle/sequence.proto definiert. Die Datei im Git hat Recht(TM), hier nur eine Kopie des Zwischenstands (V0.1.0) zur Veranschaulichung:

 package fullcircle;
 message BinarySequenceMetadata {
   required uint32 frames_per_second = 1;
   required uint32 x_dim = 2;
   required uint32 y_dim = 3;
   required string generator_name = 4;
   required string generator_version = 5;
 }
 message RGB_Value {
   required uint32 red = 1;
   required uint32 green = 2;
   required uint32 blue = 3;
   required uint32 x = 4;
   required uint32 y = 5;
 }
 message BinaryFrame {
   repeated RGB_Value pixel = 1;
 }
 message BinarySequence {
   required BinarySequenceMetadata metadata = 1;
   repeated BinaryFrame frame = 2;
 }

Das ist eine Protobuf-Definition - die Bibliothek macht daraus Bindings zu C++, Java und Python. Weitere Bibliotheken für Ruby etc. können das auch. Alle Implementationen komprimieren die Daten und speichern Typinformationen mit ab - eine korrupte Datei wird so sofort erkannt.

Known Bugs

keine.