@@ -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