From 3e67e44c61438c508c9bf99c9a0081442e09b5f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Wed, 8 Dec 2021 20:01:47 +0100 Subject: [PATCH] initial h265 implementation. --- server/internal/gst/gst.go | 9 +++++++++ server/internal/types/config/remote.go | 7 +++++++ server/internal/webrtc/webrtc.go | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/server/internal/gst/gst.go b/server/internal/gst/gst.go index 72837c63..fac94722 100644 --- a/server/internal/gst/gst.go +++ b/server/internal/gst/gst.go @@ -133,6 +133,15 @@ func CreateAppPipeline(codecName string, pipelineDevice string, pipelineSrc stri } pipelineStr = fmt.Sprintf(videoSrc+"video/x-raw,format=NV12 ! x264enc threads=4 bitrate=%d key-int-max=60 vbv-buf-capacity=%d byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream"+pipelineStr, pipelineDevice, fps, bitrate, vbvbuf) + case "H265": + // https://gstreamer.freedesktop.org/documentation/vpx/vp9enc.html?gi-language=c + // gstreamer1.0-plugins-good + // vp9enc + if err := CheckPlugins([]string{"ximagesrc", "x265"}); err != nil { + return nil, err + } + + pipelineStr = fmt.Sprintf(videoSrc+"x265enc bitrate=%d key-int-max=60 tune=zerolatency speed-preset=veryfast ! video/x-h265,stream-format=byte-stream"+pipelineStr, pipelineDevice, fps, bitrate) case "Opus": // https://gstreamer.freedesktop.org/documentation/opus/opusenc.html // gstreamer1.0-plugins-base diff --git a/server/internal/types/config/remote.go b/server/internal/types/config/remote.go index a48c3677..8f776bde 100644 --- a/server/internal/types/config/remote.go +++ b/server/internal/types/config/remote.go @@ -80,6 +80,11 @@ func (Remote) Init(cmd *cobra.Command) error { return err } + cmd.PersistentFlags().Bool("h265", false, "use H265 video codec") + if err := viper.BindPFlag("h265", cmd.PersistentFlags().Lookup("h265")); err != nil { + return err + } + // audio codecs cmd.PersistentFlags().Bool("opus", false, "use Opus audio codec") if err := viper.BindPFlag("opus", cmd.PersistentFlags().Lookup("opus")); err != nil { @@ -112,6 +117,8 @@ func (s *Remote) Set() { videoCodec = "VP9" } else if viper.GetBool("h264") { videoCodec = "H264" + } else if viper.GetBool("h265") { + videoCodec = "H265" } audioCodec := "Opus" diff --git a/server/internal/webrtc/webrtc.go b/server/internal/webrtc/webrtc.go index 78978ab0..e3dbb214 100644 --- a/server/internal/webrtc/webrtc.go +++ b/server/internal/webrtc/webrtc.go @@ -317,6 +317,10 @@ func (manager *WebRTCManager) createTrack(codecName string) (*webrtc.TrackLocalS case "H264": codec = webrtc.RTPCodecParameters{RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH264, ClockRate: 90000, Channels: 0, SDPFmtpLine: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f", RTCPFeedback: fb}, PayloadType: 102} id = "video" + case "H265": + // TODO: Fix this (correct payload type and SDPFmtpLine if needed). + codec = webrtc.RTPCodecParameters{RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: "video/H265", ClockRate: 90000, Channels: 0, SDPFmtpLine: "", RTCPFeedback: fb}, PayloadType: 0} + id = "video" case "Opus": codec = webrtc.RTPCodecParameters{RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeOpus, ClockRate: 48000, Channels: 2, SDPFmtpLine: "", RTCPFeedback: fb}, PayloadType: 111} id = "audio"