diff --git a/client/video_stream.go b/client/video_stream.go index 94d7f19..39fb713 100644 --- a/client/video_stream.go +++ b/client/video_stream.go @@ -35,7 +35,7 @@ func openCameraFeed(peerConnection *webrtc.PeerConnection, videoTrack *webrtc.Tr fmt.Println("Writing to tracks") vp := NewVideoProcessor() - go vp.writeH264ToTrackAR(videoTrack) + go vp.writeH264ToTrackFFmpegFilters(videoTrack) return nil } @@ -114,3 +114,73 @@ func (vp *VideoProcessor) writeH264ToTrackAR(track *webrtc.TrackLocalStaticSampl } } } + +func (vp *VideoProcessor) writeH264ToTrackFFmpegFilters(track *webrtc.TrackLocalStaticSample) { + defer vp.freeVideoCoding() + vp.initFilters() + + var err error + + ticker := time.NewTicker(h264FrameDuration) + for ; true; <-ticker.C { + if err = vp.inputFormatContext.ReadFrame(vp.decodePacket); err != nil { + if errors.Is(err, astiav.ErrEof) { + break + } + panic(err) + } + vp.decodePacket.RescaleTs(vp.videoStream.TimeBase(), vp.decodeCodecContext.TimeBase()) + + if err = vp.decodeCodecContext.SendPacket(vp.decodePacket); err != nil { + panic(err) + } + + for { + if err = vp.decodeCodecContext.ReceiveFrame(vp.decodeFrame); err != nil { + if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) { + fmt.Println("Error while receiving decoded framed: ", err) + break + } + panic(err) + } + + if err = vp.buffersrcContext.AddFrame(vp.decodeFrame, astiav.NewBuffersrcFlags(astiav.BuffersrcFlagKeepRef)); err != nil { + err = fmt.Errorf("main: adding frame failed: %w", err) + return + } + + for{ + vp.filterFrame.Unref() + if err = vp.buffersinkContext.GetFrame(vp.filterFrame, astiav.NewBuffersinkFlags()); err != nil { + if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) { + break + } + panic(err) + } + + vp.pts++ + vp.filterFrame.SetPts(vp.pts) + + if err = vp.encodeCodecContext.SendFrame(vp.filterFrame); err != nil { + panic(err) + } + + for { + // Read encoded packets + vp.encodePacket = astiav.AllocPacket() + if err = vp.encodeCodecContext.ReceivePacket(vp.encodePacket); err != nil { + if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) { + break + } + panic(err) + } + + // Write H264 to track + if err = track.WriteSample(media.Sample{Data: vp.encodePacket.Data(), Duration: h264FrameDuration}); err != nil { + panic(err) + } + } + } + } + } +} diff --git a/go.sum b/go.sum index 93d7368..7cd4342 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/asticode/go-astiav v0.20.0 h1:Puf++04KDWjhf71Y70zcnu0Nw6SQTVTQdLadT7Gquqs= -github.com/asticode/go-astiav v0.20.0/go.mod h1:K7D8UC6GeQt85FUxk2KVwYxHnotrxuEnp5evkkudc2s= github.com/asticode/go-astiav v0.24.0 h1:qckxt/spFcLYof5kZkLSjlcTYFGcm+luJ5b0zkAGAEM= github.com/asticode/go-astiav v0.24.0/go.mod h1:K7D8UC6GeQt85FUxk2KVwYxHnotrxuEnp5evkkudc2s= github.com/asticode/go-astikit v0.42.0 h1:pnir/2KLUSr0527Tv908iAH6EGYYrYta132vvjXsH5w=