Skip to content

Commit 8f8c232

Browse files
committed
Refactor Ivfwriter.WriteRTP implemention
Break the WriteRTP function into smaller functions for each codec type.
1 parent fd7fe3f commit 8f8c232

File tree

1 file changed

+91
-76
lines changed

1 file changed

+91
-76
lines changed

pkg/media/ivfwriter/ivfwriter.go

Lines changed: 91 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ func (i *IVFWriter) writeFrame(frame []byte, timestamp uint64) error {
158158
}
159159

160160
// WriteRTP adds a new packet and writes the appropriate headers for it.
161-
func (i *IVFWriter) WriteRTP(packet *rtp.Packet) error { //nolint:cyclop,gocyclo,gocognit
161+
func (i *IVFWriter) WriteRTP(packet *rtp.Packet) error {
162162
if i.ioWriter == nil {
163163
return errFileNotOpened
164164
} else if len(packet.Payload) == 0 {
@@ -172,99 +172,114 @@ func (i *IVFWriter) WriteRTP(packet *rtp.Packet) error { //nolint:cyclop,gocyclo
172172

173173
switch i.codec {
174174
case codecVP8:
175-
vp8Packet := codecs.VP8Packet{}
176-
if _, err := vp8Packet.Unmarshal(packet.Payload); err != nil {
177-
return err
178-
}
175+
return i.writeVP8(packet, relativeTstampMs)
176+
case codecVP9:
177+
return i.writeVP9(packet, relativeTstampMs)
178+
case codecAV1:
179+
return i.writeAV1(packet, relativeTstampMs)
180+
default:
181+
return errCodecUnset
182+
}
183+
}
179184

180-
isKeyFrame := (vp8Packet.Payload[0] & 0x01) == 0
181-
switch {
182-
case !i.seenKeyFrame && !isKeyFrame:
183-
return nil
184-
case i.currentFrame == nil && vp8Packet.S != 1:
185-
return nil
186-
}
185+
func (i *IVFWriter) writeVP8(packet *rtp.Packet, timestamp uint64) error {
186+
vp8Packet := codecs.VP8Packet{}
187+
if _, err := vp8Packet.Unmarshal(packet.Payload); err != nil {
188+
return err
189+
}
187190

188-
i.seenKeyFrame = true
189-
i.currentFrame = append(i.currentFrame, vp8Packet.Payload[0:]...)
191+
isKeyFrame := (vp8Packet.Payload[0] & 0x01) == 0
192+
switch {
193+
case !i.seenKeyFrame && !isKeyFrame:
194+
return nil
195+
case i.currentFrame == nil && vp8Packet.S != 1:
196+
return nil
197+
}
190198

191-
if !packet.Marker {
192-
return nil
193-
} else if len(i.currentFrame) == 0 {
194-
return nil
195-
}
199+
i.seenKeyFrame = true
200+
i.currentFrame = append(i.currentFrame, vp8Packet.Payload[0:]...)
196201

197-
if err := i.writeFrame(i.currentFrame, relativeTstampMs); err != nil {
198-
return err
199-
}
200-
i.currentFrame = nil
201-
case codecVP9:
202-
vp9Packet := codecs.VP9Packet{}
203-
if _, err := vp9Packet.Unmarshal(packet.Payload); err != nil {
204-
return err
205-
}
202+
if !packet.Marker {
203+
return nil
204+
} else if len(i.currentFrame) == 0 {
205+
return nil
206+
}
206207

207-
switch {
208-
case !i.seenKeyFrame && vp9Packet.P:
209-
return nil
210-
case i.currentFrame == nil && !vp9Packet.B:
211-
return nil
212-
}
208+
if err := i.writeFrame(i.currentFrame, timestamp); err != nil {
209+
return err
210+
}
211+
i.currentFrame = nil
213212

214-
i.seenKeyFrame = true
215-
i.currentFrame = append(i.currentFrame, vp9Packet.Payload[0:]...)
213+
return nil
214+
}
216215

217-
if !packet.Marker {
218-
return nil
219-
} else if len(i.currentFrame) == 0 {
220-
return nil
221-
}
216+
func (i *IVFWriter) writeVP9(packet *rtp.Packet, timestamp uint64) error {
217+
vp9Packet := codecs.VP9Packet{}
218+
if _, err := vp9Packet.Unmarshal(packet.Payload); err != nil {
219+
return err
220+
}
222221

223-
// the timestamp must be sequential. webrtc mandates a clock rate of 90000
224-
// and we've assumed 30fps in the header.
225-
if err := i.writeFrame(i.currentFrame, relativeTstampMs); err != nil {
226-
return err
227-
}
228-
i.currentFrame = nil
229-
case codecAV1:
230-
if i.av1Depacketizer == nil {
231-
i.av1Depacketizer = &codecs.AV1Depacketizer{}
232-
}
222+
switch {
223+
case !i.seenKeyFrame && vp9Packet.P:
224+
return nil
225+
case i.currentFrame == nil && !vp9Packet.B:
226+
return nil
227+
}
233228

234-
payload, err := i.av1Depacketizer.Unmarshal(packet.Payload)
235-
if err != nil {
236-
return err
237-
}
229+
i.seenKeyFrame = true
230+
i.currentFrame = append(i.currentFrame, vp9Packet.Payload[0:]...)
238231

239-
if !i.seenKeyFrame {
240-
isKeyFrame := i.av1Depacketizer.N || (len(payload) > 0 && obu.Type((payload[0]&0x78)>>3) == obu.OBUSequenceHeader)
241-
if !isKeyFrame {
242-
return nil
243-
}
232+
if !packet.Marker {
233+
return nil
234+
} else if len(i.currentFrame) == 0 {
235+
return nil
236+
}
244237

245-
i.seenKeyFrame = true
246-
}
238+
// the timestamp must be sequential. webrtc mandates a clock rate of 90000
239+
// and we've assumed 30fps in the header.
240+
if err := i.writeFrame(i.currentFrame, timestamp); err != nil {
241+
return err
242+
}
243+
i.currentFrame = nil
244+
245+
return nil
246+
}
247+
248+
func (i *IVFWriter) writeAV1(packet *rtp.Packet, timestamp uint64) error {
249+
if i.av1Depacketizer == nil {
250+
i.av1Depacketizer = &codecs.AV1Depacketizer{}
251+
}
247252

248-
i.currentFrame = append(i.currentFrame, payload...)
253+
payload, err := i.av1Depacketizer.Unmarshal(packet.Payload)
254+
if err != nil {
255+
return err
256+
}
249257

250-
if !packet.Marker {
258+
if !i.seenKeyFrame {
259+
isKeyFrame := i.av1Depacketizer.N || (len(payload) > 0 && obu.Type((payload[0]&0x78)>>3) == obu.OBUSequenceHeader)
260+
if !isKeyFrame {
251261
return nil
252262
}
253263

254-
delimiter := obu.Header{
255-
Type: obu.OBUTemporalDelimiter,
256-
HasSizeField: true,
257-
}
258-
frame := append(delimiter.Marshal(), 0)
259-
frame = append(frame, i.currentFrame...)
264+
i.seenKeyFrame = true
265+
}
260266

261-
if err := i.writeFrame(frame, relativeTstampMs); err != nil {
262-
return err
263-
}
264-
i.currentFrame = nil
265-
default:
266-
return errCodecUnset
267+
i.currentFrame = append(i.currentFrame, payload...)
268+
if !packet.Marker {
269+
return nil
270+
}
271+
272+
delimiter := obu.Header{
273+
Type: obu.OBUTemporalDelimiter,
274+
HasSizeField: true,
275+
}
276+
frame := append(delimiter.Marshal(), 0)
277+
frame = append(frame, i.currentFrame...)
278+
279+
if err := i.writeFrame(frame, timestamp); err != nil {
280+
return err
267281
}
282+
i.currentFrame = nil
268283

269284
return nil
270285
}

0 commit comments

Comments
 (0)