Files
go2rtc/pkg/h265/rtp.go
T
2022-09-18 20:24:21 +03:00

58 lines
1.5 KiB
Go

package h265
import (
"encoding/binary"
"github.com/AlexxIT/go2rtc/pkg/h264"
"github.com/AlexxIT/go2rtc/pkg/streamer"
"github.com/deepch/vdk/codec/h265parser"
"github.com/pion/rtp"
)
func RTPDepay(track *streamer.Track) streamer.WrapperFunc {
var buffer []byte
return func(push streamer.WriterFunc) streamer.WriterFunc {
return func(packet *rtp.Packet) error {
naluType := (packet.Payload[0] >> 1) & 0x3f
//fmt.Printf(
// "[RTP] codec: %s, nalu: %2d, size: %6d, ts: %10d, pt: %2d, ssrc: %d, seq: %d\n",
// track.Codec.Name, naluType, len(packet.Payload), packet.Timestamp,
// packet.PayloadType, packet.SSRC, packet.SequenceNumber,
//)
switch naluType {
case h265parser.NAL_UNIT_CODED_SLICE_TRAIL_R:
case h265parser.NAL_UNIT_VPS:
case h265parser.NAL_UNIT_SPS:
case h265parser.NAL_UNIT_PPS:
case h265parser.NAL_UNIT_UNSPECIFIED_49:
data := packet.Payload
switch data[2] >> 6 {
case 2: // begin
buffer = []byte{
(data[0] & 0x81) | (data[2] & 0x3f << 1), data[1],
}
buffer = append(buffer, data[3:]...)
return nil
case 0: // continue
buffer = append(buffer, data[3:]...)
return nil
case 1: // end
packet.Payload = append(buffer, data[3:]...)
}
default:
//panic("not implemented")
}
size := make([]byte, 4)
binary.BigEndian.PutUint32(size, uint32(len(packet.Payload)))
clone := *packet
clone.Version = h264.RTPPacketVersionAVC
clone.Payload = append(size, packet.Payload...)
return push(&clone)
}
}
}