/*
NAME
  rtmp_headers.go

DESCRIPTION
  See Readme.md

AUTHORS
  Saxon Nelson-Milton <saxon@ausocean.org>

LICENSE
  rtmp_headers.go is Copyright (C) 2017 the Australian Ocean Lab (AusOcean)

  It is free software: you can redistribute it and/or modify them
  under the terms of the GNU General Public License as published by the
  Free Software Foundation, either version 3 of the License, or (at your
  option) any later version.

  It is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License
  along with revid in gpl.txt.  If not, see http://www.gnu.org/licenses.

	Derived from librtmp under the GNU Lesser General Public License 2.1
	Copyright (C) 2005-2008 Team XBMC http://www.xbmc.org
	Copyright (C) 2008-2009 Andrej Stepanchuk
	Copyright (C) 2009-2010 Howard Chu
*/
package rtmp

import "net"

const (
	RTMPT_OPEN = iota
	RTMPT_SEND
	RTMPT_IDLE
	RTMPT_CLOSE
)

const (
	RTMP_PACKET_TYPE_CHUNK_SIZE         = 0x01
	RTMP_PACKET_TYPE_BYTES_READ_REPORT  = 0x03
	RTMP_PACKET_TYPE_CONTROL            = 0x04
	RTMP_PACKET_TYPE_SERVER_BW          = 0x05
	RTMP_PACKET_TYPE_CLIENT_BW          = 0x06
	RTMP_PACKET_TYPE_AUDIO              = 0x08
	RTMP_PACKET_TYPE_VIDEO              = 0x09
	RTMP_PACKET_TYPE_FLEX_STREAM_SEND   = 0x0F
	RTMP_PACKET_TYPE_FLEX_SHARED_OBJECT = 0x10
	RTMP_PACKET_TYPE_FLEX_MESSAGE       = 0x11
	RTMP_PACKET_TYPE_INFO               = 0x12
	RTMP_PACKET_TYPE_INVOKE             = 0x14
	RTMP_PACKET_TYPE_FLASH_VIDEO        = 0x16
)

const (
	RTMP_PACKET_SIZE_LARGE   = 0
	RTMP_PACKET_SIZE_MEDIUM  = 1
	RTMP_PACKET_SIZE_SMALL   = 2
	RTMP_PACKET_SIZE_MINIMUM = 3
)
const (
	RTMP_READ_HEADER    = 0x01
	RTMP_READ_RESUME    = 0x02
	RTMP_READ_NO_IGNORE = 0x04
	RTMP_READ_GOTKF     = 0x08
	RTMP_READ_GOTFLVK   = 0x10
	RTMP_READ_SEEKING   = 0x20
	RTMP_READ_COMPLETE  = -3
	RTMP_READ_ERROR     = -2
	RTMP_READ_EOF       = -1
	RTMP_READ_IGNORE    = 0
)

const (
	RTMP_LF_AUTH = 0x0001 /* using auth param */
	RTMP_LF_LIVE = 0x0002 /* stream is live */
	RTMP_LF_SWFV = 0x0004 /* do SWF verification */
	RTMP_LF_PLST = 0x0008 /* send playlist before play */
	RTMP_LF_BUFX = 0x0010 /* toggle stream on BufferEmpty msg */
	RTMP_LF_FTCU = 0x0020 /* free tcUrl on close */
	RTMP_LF_FAPU = 0x0040 /* free app on close */
)

const (
	RTMP_FEATURE_HTTP  = 0x01
	RTMP_FEATURE_ENC   = 0x02
	RTMP_FEATURE_SSL   = 0x04
	RTMP_FEATURE_MFP   = 0x08 /* not yet supported */
	RTMP_FEATURE_WRITE = 0x10 /* publish, not play */
	RTMP_FEATURE_HTTP2 = 0x20 /* server-side rtmpt */
)

const (
	RTMP_PROTOCOL_RTMP   = 0
	RTMP_PROTOCOL_RTMPE  = RTMP_FEATURE_ENC
	RTMP_PROTOCOL_RTMPT  = RTMP_FEATURE_HTTP
	RTMP_PROTOCOL_RTMPS  = RTMP_FEATURE_SSL
	RTMP_PROTOCOL_RTMPTE = (RTMP_FEATURE_HTTP | RTMP_FEATURE_ENC)
	RTMP_PROTOCOL_RTMPTS = (RTMP_FEATURE_HTTP | RTMP_FEATURE_SSL)
	RTMP_PROTOCOL_RTMFP  = RTMP_FEATURE_MFP
)

const (
	RTMP_DEFAULT_CHUNKSIZE = 128
	RTMP_BUFFER_CACHE_SIZE = (16 * 1024)
	RTMP_SIG_SIZE          = 1536
	RTMP_LARGE_HEADER_SIZE = 12
	RTMP_MAX_HEADER_SIZE   = 18
)

// typedef struct RTMPChunk
// rtmp.h +105
type C_RTMPChunk struct {
	c_headerSize int32
	c_chunk      []byte
	c_header     [RTMP_MAX_HEADER_SIZE]byte
}

// typedef struct RTMPPacket
// rtmp.h +113
type C_RTMPPacket struct {
	m_headerType      uint8
	m_packetType      uint8
	m_hasAbsTimestamp bool
	m_nChannel        int32
	m_nTimeStamp      uint32
	m_nInfoField2     int32
	m_nBodySize       uint32
	m_nBytesRead      uint32
	m_chunk           *C_RTMPChunk
	m_header          []byte
	m_body            []byte
}

// typedef struct RTMPSockBuf
// rtmp.h +127
type C_RTMPSockBuf struct {
	conn        *net.TCPConn
	sb_size     int
	sb_start    int
	sb_buf      [RTMP_BUFFER_CACHE_SIZE]byte // port const
	sb_timedout bool
}

// RTMPPacket_IsReady(a)
// rtmp.h +142
func C_RTMPPacket_IsReady(p *C_RTMPPacket) bool {
	return p.m_nBytesRead == p.m_nBodySize
}

// typedef struct RTMP_LNK
// rtmp.h +144
type C_RTMP_LNK struct {
	hostname  string
	sockshost string
	playpath0 string
	playpath  string
	tcUrl     string
	swfUrl    string
	pageUrl   string
	app       string
	auth      string
	flashVer  string
	token     string
	extras    C_AMFObject
	seekTime  int32
	lFlags    int32
	swfAge    int32
	protocol  int32
	timeout   int32
	socksport uint16
	port      uint16
}

// typedef struct RTMPMethod
// rtmp.h +231
type C_RTMP_METHOD struct {
	name string
	num  int32
}

// typedef struct RTMP
// rtmp.h +237
type C_RTMP struct {
	m_inChunkSize          int32
	m_outChunkSize         int32
	m_nBWCheckCounter      int32
	m_nBytesIn             int32
	m_nBytesInSent         int32
	m_nBufferMS            int32
	m_stream_id            int32
	m_mediaChannel         int32
	m_pausing              int32
	m_nServerBW            int32
	m_nClientBW            int32
	m_nClientBW2           uint8
	m_bPlaying             bool
	m_bSendEncoding        bool
	m_bSendCounter         bool
	m_numInvokes           int32
	m_methodCalls          []C_RTMP_METHOD
	m_channelsAllocatedIn  int32
	m_channelsAllocatedOut int32
	m_vecChannelsIn        []*C_RTMPPacket
	m_vecChannelsOut       []*C_RTMPPacket
	m_channelTimestamp     []int32
	m_fAudioCodecs         float64
	m_fVideoCodecs         float64
	m_fEncoding            float64
	m_fDuration            float64
	m_msgCounter           int32
	m_resplen              int32
	m_unackd               int32
	m_write                C_RTMPPacket
	m_sb                   C_RTMPSockBuf
	Link                   C_RTMP_LNK
}