From 24658ed1aad18142e9adccfbf35894d0b48d0174 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 11 Dec 2017 15:24:49 +1030 Subject: [PATCH] Creating the files I need for repacketisation --- packet/MpegTs.go | 6 ++ packet/RtpToTsConverter.go | 20 +++++ {rtp => packet}/rtp.go | 29 +++---- revid/repacketTest.go | 165 ++++++++++++++++--------------------- 4 files changed, 113 insertions(+), 107 deletions(-) create mode 100644 packet/MpegTs.go create mode 100644 packet/RtpToTsConverter.go rename {rtp => packet}/rtp.go (90%) diff --git a/packet/MpegTs.go b/packet/MpegTs.go new file mode 100644 index 00000000..6e91ae5c --- /dev/null +++ b/packet/MpegTs.go @@ -0,0 +1,6 @@ +package packet + + +type MpegTsPacket struct { + +} diff --git a/packet/RtpToTsConverter.go b/packet/RtpToTsConverter.go new file mode 100644 index 00000000..52e74c90 --- /dev/null +++ b/packet/RtpToTsConverter.go @@ -0,0 +1,20 @@ +package packet + +type RtpToTsConverter interface { + New() *rtpToTsConverter +} + +type rtpToTsConverter struct { + TsOutChan <-chan MpegTsPacket + RtpInChan chan<- RtpPacket +} + +func New() c *rtpToTsConverter { + c = new(rtpToTsConverter) + c.TsOutChan = make(chan, MpegTsPacket) + c.RtpInChan = make(chan, RtpPacket) +} + +func (c* RtpToTsConverter) convert() { + +} diff --git a/rtp/rtp.go b/packet/rtp.go similarity index 90% rename from rtp/rtp.go rename to packet/rtp.go index c7d8ce8d..1422e212 100644 --- a/rtp/rtp.go +++ b/packet/rtp.go @@ -29,11 +29,11 @@ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISE OF THE POSSIBILITY OF SUCH DAMAGE. */ -package rtp +package packet import ( - "net" "fmt" + "net" ) const ( @@ -43,26 +43,28 @@ const ( const ( hasRtpPadding = 1 << 5 hasRtpExt = 1 << 4 + hasMarker = 1 << 7 ) type RtpPacket struct { Version byte Padding bool Ext bool + CC byte Marker bool PayloadType byte SequenceNumber uint Timestamp uint SyncSource uint - CSRC []uint - ExtHeader uint - ExtData []byte - Payload []byte + CSRC []uint + ExtHeader uint + ExtData []byte + Payload []byte } type Session struct { - Rtp net.PacketConn - Rtcp net.PacketConn + Rtp net.PacketConn + Rtcp net.PacketConn RtpChan <-chan RtpPacket RtcpChan <-chan []byte rtpChan chan<- RtpPacket @@ -122,23 +124,22 @@ func (s *Session) HandleRtcpConn(conn net.PacketConn) { func (s *Session) handleRtp(buf []byte) { fmt.Println(buf) packet := RtpPacket{ - Version: (buf[0] & 0xC0)>>6, + Version: (buf[0] & 0xC0) >> 6, Padding: buf[0]&hasRtpPadding != 0, Ext: buf[0]&hasRtpExt != 0, - Marker: buf[1]&1 != 0, - PayloadType: buf[1] >> 1, + CC: buf[0] & 0x0F, + Marker: buf[1]&hasMarker != 0, + PayloadType: buf[1] & 0x7F, SequenceNumber: toUint(buf[2:4]), Timestamp: toUint(buf[4:8]), SyncSource: toUint(buf[8:12]), - CSRC: make([]uint, buf[0]>>4), + CSRC: make([]uint, buf[0]&0x0F), } if packet.Version != RTP_VERSION { - fmt.Printf("Packet version: %v", packet.Version) panic("Unsupported version") } - i := 12 for j := range packet.CSRC { diff --git a/revid/repacketTest.go b/revid/repacketTest.go index f79de478..bc832f6a 100644 --- a/revid/repacketTest.go +++ b/revid/repacketTest.go @@ -9,7 +9,7 @@ import ( "net" "time" - "../rtp" + "../packet" "github.com/beatgammit/rtsp" ) @@ -18,108 +18,87 @@ func init() { flag.Parse() } - -const sampleRequest = `OPTIONS rtsp://example.com/media.mp4 RTSP/1.0 -CSeq: 1 -Require: implicit-play -Proxy-Require: gzipped-messages - -` - -const sampleResponse = `RTSP/1.0 200 OK -CSeq: 1 -Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE - -` - func main() { if len(flag.Args()) >= 1 { - rtspUrl := flag.Args()[0] - rtpUrl := flag.Args()[1] + rtspUrl := flag.Args()[0] + rtpUrl := flag.Args()[1] - sess := rtsp.NewSession() - res, err := sess.Options(rtspUrl) - if err != nil { - log.Fatalln(err) - } - fmt.Println("Options:") - fmt.Println(res) + sess := rtsp.NewSession() + res, err := sess.Options(rtspUrl) + if err != nil { + log.Fatalln(err) + } + fmt.Println("Options:") + fmt.Println(res) - res, err = sess.Describe(rtspUrl) - if err != nil { - log.Fatalln(err) - } - fmt.Println("Describe:") - fmt.Println(res) + res, err = sess.Describe(rtspUrl) + if err != nil { + log.Fatalln(err) + } + fmt.Println("Describe:") + fmt.Println(res) - p, err := rtsp.ParseSdp(&io.LimitedReader{R: res.Body, N: res.ContentLength}) - if err != nil { - log.Fatalln(err) - } - log.Printf("%+v", p) + p, err := rtsp.ParseSdp(&io.LimitedReader{R: res.Body, N: res.ContentLength}) + if err != nil { + log.Fatalln(err) + } + log.Printf("%+v", p) fmt.Println("Setting up!") - rtpPort, rtcpPort := 17300, 17319 - res, err = sess.Setup(rtpUrl, fmt.Sprintf("RTP/AVP;unicast;client_port=%d-%d", rtpPort, rtcpPort)) - if err != nil { - log.Fatalln(err) - } - log.Println(res) + rtpPort, rtcpPort := 17300, 17319 + res, err = sess.Setup(rtpUrl, fmt.Sprintf("RTP/AVP;unicast;client_port=%d-%d", rtpPort, rtcpPort)) + if err != nil { + log.Fatalln(err) + } + log.Println(res) fmt.Println("Playing !") - res, err = sess.Play(rtspUrl, res.Header.Get("Session")) - if err != nil { - log.Fatalln(err) - } - log.Println(res) + res, err = sess.Play(rtspUrl, res.Header.Get("Session")) + if err != nil { + log.Fatalln(err) + } + log.Println(res) - // create udp connection for rtp stuff - rtpLaddr, err := net.ResolveUDPAddr("udp","192.168.0.109:17300") - if err != nil {fmt.Println("Local rtp addr not set!")} - rtpAddr, err := net.ResolveUDPAddr("udp","192.168.0.50:17300") - if err != nil { fmt.Println( "Resolving rtp address didn't work!")} - rtpConn, err := net.DialUDP("udp",rtpLaddr,rtpAddr) - if err != nil {fmt.Println("Rtp dial didn't work!")} + // create udp connection for rtp stuff + rtpLaddr, err := net.ResolveUDPAddr("udp", "192.168.0.109:17300") + if err != nil { + fmt.Println("Local rtp addr not set!") + } + rtpAddr, err := net.ResolveUDPAddr("udp", "192.168.0.50:17300") + if err != nil { + fmt.Println("Resolving rtp address didn't work!") + } + rtpConn, err := net.DialUDP("udp", rtpLaddr, rtpAddr) + if err != nil { + fmt.Println("Rtp dial didn't work!") + } + + // Create udp connection for rtcp stuff + rtcpLaddr, err := net.ResolveUDPAddr("udp", "192.168.0.109:17319") + if err != nil { + fmt.Println("Local ") + } + rtcpAddr, err := net.ResolveUDPAddr("udp", "192.168.0.50:17301") + if err != nil { + fmt.Println("resolving rtcp address didn't work!") + } + rtcpConn, err := net.DialUDP("udp", rtcpLaddr, rtcpAddr) + if err != nil { + fmt.Println("Rtcp dial didnt't work!") + } + + // let's create a session that will store useful stuff from the connections + rtpSession := rtp.New(rtpConn, rtcpConn) - // Create udp connection for rtcp stuff - rtcpLaddr, err := net.ResolveUDPAddr("udp","192.168.0.109:17319") - if err != nil {fmt.Println("Local ")} - rtcpAddr, err := net.ResolveUDPAddr("udp","192.168.0.50:17301") - if err != nil {fmt.Println("resolving rtcp address didn't work!")} - rtcpConn, err := net.DialUDP("udp",rtcpLaddr, rtcpAddr) - if err != nil {fmt.Println("Rtcp dial didnt't work!")} - - - // let's create a session that will store useful stuff from the connections - rtpSession := rtp.New(rtpConn,rtcpConn) - - // Loop here until we get something in the channels - for{ - fmt.Printf("Length of rtpChan: %v\n", len(rtpSession.RtpChan)) - time.Sleep(1*time.Second ) - select{ - case rtpPacket := <-rtpSession.RtpChan: - fmt.Println(rtpPacket) - default: - } - - } - - - } else { - r, err := rtsp.ReadRequest(bytes.NewBufferString(sampleRequest)) - if err != nil { - fmt.Println(err) - } else { - fmt.Println(r) - } - - res, err := rtsp.ReadResponse(bytes.NewBufferString(sampleResponse)) - if err != nil { - fmt.Println(err) - } else { - fmt.Println(res) - } - } + // Loop here until we get something in the channels + for { + fmt.Printf("Length of rtpChan: %v\n", len(rtpSession.RtpChan)) + time.Sleep(1 * time.Second) + select { + case rtpPacket := <-rtpSession.RtpChan: + default: + } + } + } }