Files
go-rtmp/message/user_control_event_decoder.go
T
2018-07-28 17:40:33 +09:00

159 lines
3.4 KiB
Go

//
// Copyright (c) 2018- yutopp (yutopp@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
//
package message
import (
"encoding/binary"
"github.com/pkg/errors"
"io"
)
type UserControlEventDecoder struct {
r io.Reader
}
func NewUserControlEventDecoder(r io.Reader) *UserControlEventDecoder {
return &UserControlEventDecoder{
r: r,
}
}
func (dec *UserControlEventDecoder) Decode(msg *UserCtrlEvent) error {
buf := make([]byte, 2)
if _, err := io.ReadAtLeast(dec.r, buf, 2); err != nil {
return err
}
eventType := binary.BigEndian.Uint16(buf)
switch eventType {
case 0: // UserCtrlEventStreamBegin
return dec.decodeStreamBegin(msg)
case 1: // UserCtrlEventStreamEOF
return dec.decodeStreamEOF(msg)
case 2: // UserCtrlEventStreamDry
return dec.decodeStreamDry(msg)
case 3: // UserCtrlEventSetBufferLength
return dec.decodeSetBufferLength(msg)
case 4: // UserCtrlEventStreamIsRecorded
return dec.decodeStreamIsRecorded(msg)
case 6: // UserCtrlEventPingRequest
return dec.decodePingRequest(msg)
case 7: // UserCtrlEventPingResponse
return dec.decodePingResponse(msg)
default:
return errors.Errorf("Unsupported type for UserCtrl: TypeID = %d", eventType)
}
}
func (dec *UserControlEventDecoder) decodeStreamBegin(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
streamID := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventStreamBegin{
StreamID: streamID,
}
return nil
}
func (dec *UserControlEventDecoder) decodeStreamEOF(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
streamID := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventStreamEOF{
StreamID: streamID,
}
return nil
}
func (dec *UserControlEventDecoder) decodeStreamDry(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
streamID := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventStreamDry{
StreamID: streamID,
}
return nil
}
func (dec *UserControlEventDecoder) decodeSetBufferLength(msg *UserCtrlEvent) error {
buf := make([]byte, 8)
if _, err := io.ReadAtLeast(dec.r, buf, 8); err != nil {
return err
}
streamID := binary.BigEndian.Uint32(buf[0:4])
lengthMs := binary.BigEndian.Uint32(buf[4:8])
*msg = &UserCtrlEventSetBufferLength{
StreamID: streamID,
LengthMs: lengthMs,
}
return nil
}
func (dec *UserControlEventDecoder) decodeStreamIsRecorded(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
streamID := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventStreamIsRecorded{
StreamID: streamID,
}
return nil
}
func (dec *UserControlEventDecoder) decodePingRequest(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
timestamp := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventPingRequest{
Timestamp: timestamp,
}
return nil
}
func (dec *UserControlEventDecoder) decodePingResponse(msg *UserCtrlEvent) error {
buf := make([]byte, 4)
if _, err := io.ReadAtLeast(dec.r, buf, 4); err != nil {
return err
}
timestamp := binary.BigEndian.Uint32(buf)
*msg = &UserCtrlEventPingResponse{
Timestamp: timestamp,
}
return nil
}