daily pastebin goal
74%
SHARE
TWEET

Untitled

a guest Mar 12th, 2014 139 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Пакет в SPIF2 выглядит след образом:
  2. //  Сначала идёт 12-ти байтный заголовок, затем данные
  3. //
  4. //     0                   1                   2                   3  
  5. //     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  6. //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7. //    |             MAGIC = 0xFEED5EED (network order)                |
  8. //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9. //    |             protobuf message size (network order)             |
  10. //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11. //    |              binary data size (network order)                 |
  12. //    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13. //    | ****** protobuf data ****** ..|
  14. //    | ****** binary data ******* .. |
  15. //
  16. //    protobuf data всегда содержат Tag, описанный ниже
  17. //    binary это дополнительные данные, для которых не используется protobuf.
  18. //    Передавать большие (больше 1К) данные, намного лучше передавать
  19. //    в binary data, а не в protobuf сообщении.
  20. //
  21. // Последовательность данных:
  22. //   * Первым приходит информация о потоке (stream)
  23. //   * Потом приходят элементарные потоки  (es)
  24. //   * Потом идут кадры                    (unit)
  25. //
  26. // ESы нумеруются, в кадрах есть информация о том какому ESу
  27. // соответствует кадр.
  28. //
  29. // Специальные ошибки:
  30. //
  31. //   * PING  (code = 10001)
  32. //       плеер должен ответить сколько секунд видео находится в буфере,
  33. //       используется для настройки адаптивного битрейта
  34. //
  35. //   * FLUSH (code = 10002)
  36. //       плеер должен скинуть кадровый буффер, после FLUSH должен придти
  37. //       IDR
  38. //
  39. // NOTE: binary data используется только для Unit сообщений
  40.  
  41. package spif;
  42.  
  43. enum Packetization {
  44.         RAW = 1;                        // SPIFPacketizationRaw
  45. }
  46.  
  47. enum Timebase {
  48.         LOCAL   = 0;                    // SPIFTimebaseLocal
  49.         TB90KHz = 1;                    // SPIFTimebase90KHz
  50.         TB1KHz  = 2;                    // SPIFTimebase1KHz
  51. }
  52.  
  53. enum IndexType {
  54.         IDR = 1;
  55.         IFRAME = 2;
  56. }
  57.  
  58. message FrameIndex {
  59.         required IndexType ftype = 1;
  60.         required int64      time = 2;
  61.         optional int64    offset = 3;   // offset in bytes in spif2 stream
  62. }
  63.  
  64. message Stream {
  65.         required string         stream_magic = 1 [ default = "SPIFSTREAM" ];
  66.         required Packetization packetization = 2;
  67.         required Timebase           timebase = 3;
  68.         repeated FrameIndex            index = 4;
  69.         optional string                 info = 5; // JSON
  70. }
  71.  
  72. enum ESType {
  73.         MUX = 1;
  74.         AVVIDEO = 2;
  75.         AVAUDIO = 3;
  76.         SUBTITLES = 4;
  77.         SIGNALLING = 5;
  78.         AUX = 6;
  79. }
  80.  
  81. enum ESVideoCodec {
  82.         MPEG2Video = 1;
  83.         H264Video = 2;
  84.         AnnexBH264Video = 3;
  85.         RawYUVPlanes = 4;
  86.         VideoAvcodec = 5;
  87. }
  88.  
  89. enum ESAudioCodec {
  90.         MPEG2Audio = 1;
  91.         ADTSAACAudio = 2;
  92.         RawAACAudio = 3;
  93.         RawPCMAudio = 4;
  94.         WavAudio = 5;
  95.         AudioAvcodec = 6;
  96. }
  97.  
  98. message ES {
  99.         required int32       esno = 1;
  100.         optional int32    version = 2;
  101.         required ESType    estype = 3;
  102.         required int32    escodec = 4;
  103.         optional string      info = 5;  // JSON
  104. }
  105.  
  106. message Unit {
  107.         required int32       esno = 1;
  108.         optional int32    version = 2;
  109.         optional bool         rap = 3;
  110.         required uint64       dts = 4;
  111.         required uint64       pts = 5;
  112.         required uint64    length = 7;
  113.         optional int64   duration = 6;
  114.         optional string      info = 8;  // JSON
  115.  
  116.         // Shared stuff (data_pipe)
  117.         optional bool  shared     = 9;
  118.         optional uint32 round     = 10;
  119.         optional uint32 offset    = 11;
  120. }
  121.  
  122. message Error {
  123.         required int32 code       = 1;
  124.         optional string domain    = 2;
  125.         optional string strerr    = 3;
  126. }
  127.  
  128. message Finished {
  129.         required string finish_magic = 1 [ default = "SPIFFINISH" ];
  130.         optional uint32 chksum = 2;
  131. }
  132.  
  133. message Control {
  134.         required uint32 length = 1;
  135.         optional string cname = 2;
  136.         optional bool cobject = 3;      // true, если в данных объект
  137. }
  138.  
  139. enum TagType {
  140.         STREAM   = 1;
  141.         ESES     = 2;
  142.         UNIT     = 3;
  143.         ERROR    = 4;
  144.         FINISHED = 5;
  145.  
  146.         // For SPIF2 extensions
  147.         CONTROL = 6;
  148. }
  149.  
  150. message Tag {
  151.         required TagType    type = 1;
  152.  
  153.         optional Stream   stream = 2;
  154.         optional ES       es     = 3;
  155.         optional Unit     unit   = 4;
  156.         optional Error    error  = 5;
  157.         optional Finished finish = 6;
  158.  
  159.         // For SPIF2 extensions
  160.         optional Control  control = 7;
  161. }
RAW Paste Data
Top