fix:WriteAnnexB

This commit is contained in:
dexter
2022-04-07 20:13:11 +08:00
parent d8b3cd0444
commit 2c8fdda8e3
3 changed files with 13 additions and 8 deletions

View File

@@ -33,7 +33,9 @@ func NewH264(stream IStream) (vt *H264) {
return return
} }
func (vt *H264) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) { func (vt *H264) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) {
vt.Video.WriteAnnexB(pts, dts, frame) for _, slice := range vt.Video.WriteAnnexB(pts, dts, frame) {
vt.WriteSlice(slice)
}
vt.Flush() vt.Flush()
} }
func (vt *H264) WriteSlice(slice NALUSlice) { func (vt *H264) WriteSlice(slice NALUSlice) {

View File

@@ -31,7 +31,9 @@ func NewH265(stream IStream) (vt *H265) {
return return
} }
func (vt *H265) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) { func (vt *H265) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) {
vt.Video.WriteAnnexB(pts, dts, frame) for _, slice := range vt.Video.WriteAnnexB(pts, dts, frame) {
vt.WriteSlice(slice)
}
vt.Flush() vt.Flush()
} }
func (vt *H265) WriteSlice(slice NALUSlice) { func (vt *H265) WriteSlice(slice NALUSlice) {

View File

@@ -54,26 +54,26 @@ func (t *Video) ComputeGOP() {
t.IDRing = t.Ring t.IDRing = t.Ring
} }
func (vt *Video) writeAnnexBSlice(annexb AnnexBFrame) { func (vt *Video) writeAnnexBSlice(annexb AnnexBFrame, s *[]NALUSlice) {
for len(annexb) > 0 { for len(annexb) > 0 {
before, after, found := bytes.Cut(annexb, codec.NALU_Delimiter1) before, after, found := bytes.Cut(annexb, codec.NALU_Delimiter1)
if !found { if !found {
vt.WriteSlice(NALUSlice{annexb}) *s = append(*s, NALUSlice{annexb})
return return
} }
if len(before) > 0 { if len(before) > 0 {
vt.WriteSlice(NALUSlice{before}) *s = append(*s, NALUSlice{before})
} }
annexb = after annexb = after
} }
} }
func (vt *Video) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) { func (vt *Video) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) (s []NALUSlice) {
// vt.Stream.Tracef("WriteAnnexB:pts %d,dts %d,len %d", pts, dts, len(frame)) // vt.Stream.Tracef("WriteAnnexB:pts %d,dts %d,len %d", pts, dts, len(frame))
for len(frame) > 0 { for len(frame) > 0 {
before, after, found := bytes.Cut(frame, codec.NALU_Delimiter2) before, after, found := bytes.Cut(frame, codec.NALU_Delimiter2)
if !found { if !found {
vt.writeAnnexBSlice(frame) vt.writeAnnexBSlice(frame, &s)
if len(vt.Value.Raw) > 0 { if len(vt.Value.Raw) > 0 {
vt.Value.PTS = pts vt.Value.PTS = pts
vt.Value.DTS = dts vt.Value.DTS = dts
@@ -81,10 +81,11 @@ func (vt *Video) WriteAnnexB(pts uint32, dts uint32, frame AnnexBFrame) {
return return
} }
if len(before) > 0 { if len(before) > 0 {
vt.writeAnnexBSlice(AnnexBFrame(before)) vt.writeAnnexBSlice(AnnexBFrame(before), &s)
} }
frame = after frame = after
} }
return
} }
func (vt *Video) WriteAVCC(ts uint32, frame AVCCFrame) { func (vt *Video) WriteAVCC(ts uint32, frame AVCCFrame) {
vt.Media.WriteAVCC(ts, frame) vt.Media.WriteAVCC(ts, frame)