Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Пакет в SPIF2 выглядит след образом:
- // Сначала идёт 12-ти байтный заголовок, затем данные
- //
- // 0 1 2 3
- // 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
- // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- // | MAGIC = 0xFEED5EED (network order) |
- // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- // | protobuf message size (network order) |
- // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- // | binary data size (network order) |
- // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- // | ****** protobuf data ****** ..|
- // | ****** binary data ******* .. |
- //
- // protobuf data всегда содержат Tag, описанный ниже
- // binary это дополнительные данные, для которых не используется protobuf.
- // Передавать большие (больше 1К) данные, намного лучше передавать
- // в binary data, а не в protobuf сообщении.
- //
- // Последовательность данных:
- // * Первым приходит информация о потоке (stream)
- // * Потом приходят элементарные потоки (es)
- // * Потом идут кадры (unit)
- //
- // ESы нумеруются, в кадрах есть информация о том какому ESу
- // соответствует кадр.
- //
- // Специальные ошибки:
- //
- // * PING (code = 10001)
- // плеер должен ответить сколько секунд видео находится в буфере,
- // используется для настройки адаптивного битрейта
- //
- // * FLUSH (code = 10002)
- // плеер должен скинуть кадровый буффер, после FLUSH должен придти
- // IDR
- //
- // NOTE: binary data используется только для Unit сообщений
- package spif;
- enum Packetization {
- RAW = 1; // SPIFPacketizationRaw
- }
- enum Timebase {
- LOCAL = 0; // SPIFTimebaseLocal
- TB90KHz = 1; // SPIFTimebase90KHz
- TB1KHz = 2; // SPIFTimebase1KHz
- }
- enum IndexType {
- IDR = 1;
- IFRAME = 2;
- }
- message FrameIndex {
- required IndexType ftype = 1;
- required int64 time = 2;
- optional int64 offset = 3; // offset in bytes in spif2 stream
- }
- message Stream {
- required string stream_magic = 1 [ default = "SPIFSTREAM" ];
- required Packetization packetization = 2;
- required Timebase timebase = 3;
- repeated FrameIndex index = 4;
- optional string info = 5; // JSON
- }
- enum ESType {
- MUX = 1;
- AVVIDEO = 2;
- AVAUDIO = 3;
- SUBTITLES = 4;
- SIGNALLING = 5;
- AUX = 6;
- }
- enum ESVideoCodec {
- MPEG2Video = 1;
- H264Video = 2;
- AnnexBH264Video = 3;
- RawYUVPlanes = 4;
- VideoAvcodec = 5;
- }
- enum ESAudioCodec {
- MPEG2Audio = 1;
- ADTSAACAudio = 2;
- RawAACAudio = 3;
- RawPCMAudio = 4;
- WavAudio = 5;
- AudioAvcodec = 6;
- }
- message ES {
- required int32 esno = 1;
- optional int32 version = 2;
- required ESType estype = 3;
- required int32 escodec = 4;
- optional string info = 5; // JSON
- }
- message Unit {
- required int32 esno = 1;
- optional int32 version = 2;
- optional bool rap = 3;
- required uint64 dts = 4;
- required uint64 pts = 5;
- required uint64 length = 7;
- optional int64 duration = 6;
- optional string info = 8; // JSON
- // Shared stuff (data_pipe)
- optional bool shared = 9;
- optional uint32 round = 10;
- optional uint32 offset = 11;
- }
- message Error {
- required int32 code = 1;
- optional string domain = 2;
- optional string strerr = 3;
- }
- message Finished {
- required string finish_magic = 1 [ default = "SPIFFINISH" ];
- optional uint32 chksum = 2;
- }
- message Control {
- required uint32 length = 1;
- optional string cname = 2;
- optional bool cobject = 3; // true, если в данных объект
- }
- enum TagType {
- STREAM = 1;
- ESES = 2;
- UNIT = 3;
- ERROR = 4;
- FINISHED = 5;
- // For SPIF2 extensions
- CONTROL = 6;
- }
- message Tag {
- required TagType type = 1;
- optional Stream stream = 2;
- optional ES es = 3;
- optional Unit unit = 4;
- optional Error error = 5;
- optional Finished finish = 6;
- // For SPIF2 extensions
- optional Control control = 7;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement