rtp: finished encoder file - wrote encode function, wrote timestamp function and sequence number function - need to test

This commit is contained in:
saxon 2018-11-17 23:17:08 +10:30
parent ddf25e1fbe
commit 5cc35a77a5
2 changed files with 35 additions and 36 deletions

View File

@ -29,51 +29,52 @@ package rtp
import ( import (
"io" "io"
"math/rand"
"time" "time"
) )
// Time related constants.
const ( const (
rtpVer = 2
yes = 1 yes = 1
no = 0 no = 0
ccCount = 0 defaultPktType = 1
// pcrFreq is the base Program Clock Reference frequency.
timestampFreq = 90000 // Hz timestampFreq = 90000 // Hz
) )
type Encoder struct { type Encoder struct {
dst io.Writer dst io.Writer
ssrc uint32
seqNo uint16
clock time.Duration clock time.Duration
frameInterval time.Duration frameInterval time.Duration
} }
// NewEncoder returns an Encoder with the specified frame rate. // NewEncoder returns a new Encoder type given an io.Writer - the destination
// after encoding and the desired fps
func NewEncoder(dst io.Writer, fps float64) *Encoder { func NewEncoder(dst io.Writer, fps float64) *Encoder {
return &Encoder{ return &Encoder{
dst: dst, dst: dst,
ssrc: rand.Uint32(),
frameInterval: time.Duration(float64(time.Second) / fps), frameInterval: time.Duration(float64(time.Second) / fps),
} }
} }
// Encode takes a nalu unit and encodes it into an rtp packet and
// writes to the io.Writer given in NewEncoder
func (e *Encoder) Encode(nalu []byte) error { func (e *Encoder) Encode(nalu []byte) error {
pkt := Pkt{ pkt := Pkt{
Pkt{
V: rtpVer, // version V: rtpVer, // version
P: no, // padding P: no, // padding
X: no, // header extension X: no, // header extension
CC: ccCount, CC: no, // CSRC count
M: no, // NOTE: need to check if this works (decoders should ignore this) M: no, // NOTE: need to check if this works (decoders should ignore this)
PT: 6, PT: defaultPktType, // NOTE: 1-23 according to rtp-h264 specs (don't think we need this)
SN: 167, SN: e.nxtSeqNo(), // sequence number
TS: 160, TS: e.nxtTimestamp(), // timestamp
SSRC: 10, SSRC: e.ssrc, // source identifier
Payload: []byte{0x00, 0x01, 0x07, 0xf0, 0x56, 0x37, 0x0a, 0x0f}, Payload: nalu,
Padding: 0, Padding: no,
},
} }
// Write rtp packet to
_, err := e.dst.Write(pkt.Bytes()) _, err := e.dst.Write(pkt.Bytes())
if err != nil { if err != nil {
return err return err
@ -89,15 +90,13 @@ func (e *Encoder) tick() {
e.clock += e.frameInterval e.clock += e.frameInterval
} }
// TODO: alter and make this work for rtp // nxtTimestamp gets the next timestamp
func (e *Encoder) pts() uint64 { func (e *Encoder) nxtTimestamp() uint32 {
return uint64((e.clock + e.ptsOffset).Seconds() * pcrFreq) return uint32(e.clock.Seconds() * timestampFreq)
} }
// TODO: alter and apply this to rtp for sequence number // nxtSeqNo gets the next rtp packet sequence number
func (e *Encoder) ccFor(pid int) byte { func (e *Encoder) nxtSeqNo() uint16 {
cc := e.continuity[pid] e.seqNo += 1
const continuityCounterMask = 0xf return e.seqNo - 1
e.continuity[pid] = (cc + 1) & continuityCounterMask
return cc
} }

View File

@ -41,9 +41,9 @@ type Pkt struct {
CC byte // CSRC count CC byte // CSRC count
M byte // Marker bit M byte // Marker bit
PT byte // Packet type PT byte // Packet type
SN int16 // Synch number SN uint16 // Synch number
TS int32 // Timestamp TS uint32 // Timestamp
SSRC int32 // Synchronisation source identifier SSRC uint32 // Synchronisation source identifier
Payload []byte // H264 Payload data Payload []byte // H264 Payload data
Padding int // No of bytes of padding Padding int // No of bytes of padding
} }