Browse Source

fix DTS error in case of H264 NALUs without POC

pull/1003/head
aler9 4 years ago
parent
commit
3e5f62156d
  1. 20
      internal/core/rtmp_conn.go
  2. 20
      internal/hls/muxer_variant_fmp4_segmenter.go
  3. 20
      internal/hls/muxer_variant_mpegts_segmenter.go

20
internal/core/rtmp_conn.go

@ -353,7 +353,21 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
} }
pts := data.h264PTS - *videoInitialPTS pts := data.h264PTS - *videoInitialPTS
idrPresent := h264.IDRPresent(data.h264NALUs)
idrPresent := false
nonIDRPresent := false
for _, nalu := range data.h264NALUs {
typ := h264.NALUType(nalu[0] & 0x1F)
switch typ {
case h264.NALUTypeIDR:
idrPresent = true
case h264.NALUTypeNonIDR:
nonIDRPresent = true
}
}
var dts time.Duration var dts time.Duration
// wait until we receive an IDR // wait until we receive an IDR
@ -375,6 +389,10 @@ func (c *rtmpConn) runRead(ctx context.Context) error {
dts = 0 dts = 0
pts -= videoStartDTS pts -= videoStartDTS
} else { } else {
if !idrPresent && !nonIDRPresent {
continue
}
var err error var err error
dts, err = videoDTSExtractor.Extract(data.h264NALUs, pts) dts, err = videoDTSExtractor.Extract(data.h264NALUs, pts)
if err != nil { if err != nil {

20
internal/hls/muxer_variant_fmp4_segmenter.go

@ -122,13 +122,29 @@ func (m *muxerVariantFMP4Segmenter) adjustPartDuration(du time.Duration) {
} }
func (m *muxerVariantFMP4Segmenter) writeH264(pts time.Duration, nalus [][]byte) error { func (m *muxerVariantFMP4Segmenter) writeH264(pts time.Duration, nalus [][]byte) error {
idrPresent := false
nonIDRPresent := false
for _, nalu := range nalus {
typ := h264.NALUType(nalu[0] & 0x1F)
switch typ {
case h264.NALUTypeIDR:
idrPresent = true
case h264.NALUTypeNonIDR:
nonIDRPresent = true
}
}
if !idrPresent && !nonIDRPresent {
return nil
}
avcc, err := h264.AVCCEncode(nalus) avcc, err := h264.AVCCEncode(nalus)
if err != nil { if err != nil {
return err return err
} }
idrPresent := h264.IDRPresent(nalus)
return m.writeH264Entry(&fmp4VideoSample{ return m.writeH264Entry(&fmp4VideoSample{
pts: pts, pts: pts,
nalus: nalus, nalus: nalus,

20
internal/hls/muxer_variant_mpegts_segmenter.go

@ -79,7 +79,21 @@ func newMuxerVariantMPEGTSSegmenter(
func (m *muxerVariantMPEGTSSegmenter) writeH264(pts time.Duration, nalus [][]byte) error { func (m *muxerVariantMPEGTSSegmenter) writeH264(pts time.Duration, nalus [][]byte) error {
now := time.Now() now := time.Now()
idrPresent := h264.IDRPresent(nalus)
idrPresent := false
nonIDRPresent := false
for _, nalu := range nalus {
typ := h264.NALUType(nalu[0] & 0x1F)
switch typ {
case h264.NALUTypeIDR:
idrPresent = true
case h264.NALUTypeNonIDR:
nonIDRPresent = true
}
}
var dts time.Duration var dts time.Duration
if m.currentSegment == nil { if m.currentSegment == nil {
@ -105,6 +119,10 @@ func (m *muxerVariantMPEGTSSegmenter) writeH264(pts time.Duration, nalus [][]byt
m.currentSegment = newMuxerVariantMPEGTSSegment(now, m.segmentMaxSize, m.currentSegment = newMuxerVariantMPEGTSSegment(now, m.segmentMaxSize,
m.videoTrack, m.audioTrack, m.writer.WriteData) m.videoTrack, m.audioTrack, m.writer.WriteData)
} else { } else {
if !idrPresent && !nonIDRPresent {
return nil
}
var err error var err error
dts, err = m.videoDTSExtractor.Extract(nalus, pts) dts, err = m.videoDTSExtractor.Extract(nalus, pts)
if err != nil { if err != nil {

Loading…
Cancel
Save