Fix memory usage for RTSP processing
This commit is contained in:
+24
-18
@@ -15,7 +15,7 @@ func RTPDepay(track *streamer.Track) streamer.WrapperFunc {
|
|||||||
sps, pps := GetParameterSet(track.Codec.FmtpLine)
|
sps, pps := GetParameterSet(track.Codec.FmtpLine)
|
||||||
ps := EncodeAVC(sps, pps)
|
ps := EncodeAVC(sps, pps)
|
||||||
|
|
||||||
var buffer []byte
|
buf := make([]byte, 0, 512*1024) // 512K
|
||||||
|
|
||||||
return func(push streamer.WriterFunc) streamer.WriterFunc {
|
return func(push streamer.WriterFunc) streamer.WriterFunc {
|
||||||
return func(packet *rtp.Packet) error {
|
return func(packet *rtp.Packet) error {
|
||||||
@@ -34,35 +34,41 @@ func RTPDepay(track *streamer.Track) streamer.WrapperFunc {
|
|||||||
if packet.Marker {
|
if packet.Marker {
|
||||||
switch NALUType(payload) {
|
switch NALUType(payload) {
|
||||||
case NALUTypeSPS, NALUTypePPS:
|
case NALUTypeSPS, NALUTypePPS:
|
||||||
packet.Marker = false
|
buf = append(buf, payload...)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ffmpeg with `-tune zerolatency` enable option `-x264opts sliced-threads=1`
|
|
||||||
// and every NALU will be sliced to multiple NALUs
|
|
||||||
if !packet.Marker {
|
|
||||||
buffer = append(buffer, payload...)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if buffer != nil {
|
|
||||||
payload = append(buffer, payload...)
|
|
||||||
buffer = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//fmt.Printf("[AVC] %v, len: %d\n", Types(payload), len(payload))
|
if len(buf) == 0 {
|
||||||
|
|
||||||
switch NALUType(payload) {
|
switch NALUType(payload) {
|
||||||
case NALUTypeIFrame:
|
case NALUTypeIFrame:
|
||||||
payload = Join(ps, payload)
|
// fix IFrame without SPS,PPS
|
||||||
|
buf = append(buf, ps...)
|
||||||
case NALUTypeSEI:
|
case NALUTypeSEI:
|
||||||
// ffmpeg with transcoding
|
// fix ffmpeg with transcoding first frame
|
||||||
i := 4 + binary.BigEndian.Uint32(payload)
|
i := 4 + binary.BigEndian.Uint32(payload)
|
||||||
payload = payload[i:]
|
payload = payload[i:]
|
||||||
if NALUType(payload) == NALUTypeIFrame {
|
if NALUType(payload) == NALUTypeIFrame {
|
||||||
payload = Join(ps, payload)
|
buf = append(buf, ps...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// collect all NALs for Access Unit
|
||||||
|
if !packet.Marker {
|
||||||
|
buf = append(buf, payload...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(buf) > 0 {
|
||||||
|
payload = append(buf, payload...)
|
||||||
|
buf = buf[:0]
|
||||||
|
}
|
||||||
|
|
||||||
|
//fmt.Printf(
|
||||||
|
// "[AVC] %v, len: %d, %v\n", Types(payload), len(payload),
|
||||||
|
// reflect.ValueOf(buf).Pointer() == reflect.ValueOf(payload).Pointer(),
|
||||||
|
//)
|
||||||
|
|
||||||
clone := *packet
|
clone := *packet
|
||||||
clone.Version = RTPPacketVersionAVC
|
clone.Version = RTPPacketVersionAVC
|
||||||
|
|||||||
Reference in New Issue
Block a user