diff --git a/client.go b/client.go index 0fcd0660..1e6d503c 100644 --- a/client.go +++ b/client.go @@ -768,9 +768,8 @@ func (c *Client) runReader() { TrackID: trackID, Packet: pkt, } - c.processPacketRTP(&ctx) - ct := c.tracks[trackID] + c.processPacketRTP(ct, &ctx) if ct.h264Decoder != nil { if ct.h264Encoder == nil && len(payload) > udpReadBufferSize { @@ -1902,18 +1901,17 @@ func (c *Client) runWriter() { } } -func (c *Client) processPacketRTP(ctx *ClientOnPacketRTPCtx) { +func (c *Client) processPacketRTP(ct *clientTrack, ctx *ClientOnPacketRTPCtx) { // remove padding ctx.Packet.Header.Padding = false ctx.Packet.PaddingSize = 0 // decode - ct := c.tracks[ctx.TrackID] if ct.h264Decoder != nil { nalus, pts, err := ct.h264Decoder.DecodeUntilMarker(ctx.Packet) if err == nil { ctx.PTSEqualsDTS = h264.IDRPresent(nalus) - ctx.H264NALUs = append([][]byte(nil), nalus...) + ctx.H264NALUs = nalus ctx.H264PTS = pts } else { ctx.PTSEqualsDTS = false diff --git a/clientudpl.go b/clientudpl.go index a87939c9..21907de4 100644 --- a/clientudpl.go +++ b/clientudpl.go @@ -186,8 +186,9 @@ func (u *clientUDPListener) processPlayRTP(now time.Time, payload []byte) { TrackID: u.trackID, Packet: pkt, } - u.c.processPacketRTP(&ctx) - u.c.tracks[u.trackID].rtcpReceiver.ProcessPacketRTP(time.Now(), pkt, ctx.PTSEqualsDTS) + ct := u.c.tracks[u.trackID] + u.c.processPacketRTP(ct, &ctx) + ct.rtcpReceiver.ProcessPacketRTP(time.Now(), pkt, ctx.PTSEqualsDTS) u.c.OnPacketRTP(&ctx) } diff --git a/pkg/rtph264/decoder.go b/pkg/rtph264/decoder.go index ce19bc2b..2df7df76 100644 --- a/pkg/rtph264/decoder.go +++ b/pkg/rtph264/decoder.go @@ -123,8 +123,6 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { } start := pkt.Payload[1] >> 7 - end := (pkt.Payload[1] >> 6) & 0x01 - if start == 1 { d.isDecodingFragmented = false return nil, 0, fmt.Errorf("invalid FU-A packet (decoded two starting packets in a row)") @@ -132,6 +130,7 @@ func (d *Decoder) Decode(pkt *rtp.Packet) ([][]byte, time.Duration, error) { d.fragmentedBuffer = append(d.fragmentedBuffer, pkt.Payload[2:]...) + end := (pkt.Payload[1] >> 6) & 0x01 if end != 1 { return nil, 0, ErrMorePacketsNeeded } diff --git a/serverconn.go b/serverconn.go index 7b503ab3..d8739af6 100644 --- a/serverconn.go +++ b/serverconn.go @@ -263,9 +263,8 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { TrackID: trackID, Packet: pkt, } - sc.session.processPacketRTP(&ctx) - at := sc.session.announcedTracks[trackID] + sc.session.processPacketRTP(at, &ctx) if at.h264Decoder != nil { if at.h264Encoder == nil && len(payload) > udpReadBufferSize { diff --git a/serversession.go b/serversession.go index 4bce0b6f..d8fd6093 100644 --- a/serversession.go +++ b/serversession.go @@ -1214,18 +1214,17 @@ func (ss *ServerSession) runWriter() { } } -func (ss *ServerSession) processPacketRTP(ctx *ServerHandlerOnPacketRTPCtx) { +func (ss *ServerSession) processPacketRTP(at *ServerSessionAnnouncedTrack, ctx *ServerHandlerOnPacketRTPCtx) { // remove padding ctx.Packet.Header.Padding = false ctx.Packet.PaddingSize = 0 // decode - at := ss.announcedTracks[ctx.TrackID] if at.h264Decoder != nil { nalus, pts, err := at.h264Decoder.DecodeUntilMarker(ctx.Packet) if err == nil { ctx.PTSEqualsDTS = h264.IDRPresent(nalus) - ctx.H264NALUs = append([][]byte(nil), nalus...) + ctx.H264NALUs = nalus ctx.H264PTS = pts } else { ctx.PTSEqualsDTS = false diff --git a/serverudpl.go b/serverudpl.go index e120e2c8..6c4b4971 100644 --- a/serverudpl.go +++ b/serverudpl.go @@ -212,8 +212,10 @@ func (u *serverUDPListener) processRTP(clientData *clientData, payload []byte) { TrackID: clientData.trackID, Packet: pkt, } - clientData.ss.processPacketRTP(&ctx) - clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTP(now, ctx.Packet, ctx.PTSEqualsDTS) + at := clientData.ss.announcedTracks[clientData.trackID] + clientData.ss.processPacketRTP(at, &ctx) + + at.rtcpReceiver.ProcessPacketRTP(now, ctx.Packet, ctx.PTSEqualsDTS) if h, ok := clientData.ss.s.Handler.(ServerHandlerOnPacketRTP); ok { h.OnPacketRTP(&ctx) }