mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-09-26 20:31:11 +08:00
Add support snapshot for raw image format
This commit is contained in:
@@ -24,6 +24,7 @@ func NewKeyframe() *Keyframe {
|
||||
Direction: core.DirectionSendonly,
|
||||
Codecs: []*core.Codec{
|
||||
{Name: core.CodecJPEG},
|
||||
{Name: core.CodecRAW},
|
||||
{Name: core.CodecH264},
|
||||
{Name: core.CodecH265},
|
||||
},
|
||||
@@ -87,6 +88,15 @@ func (k *Keyframe) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv
|
||||
if track.Codec.IsRTP() {
|
||||
sender.Handler = mjpeg.RTPDepay(sender.Handler)
|
||||
}
|
||||
|
||||
case core.CodecRAW:
|
||||
sender.Handler = func(packet *rtp.Packet) {
|
||||
if n, err := k.wr.Write(packet.Payload); err == nil {
|
||||
k.Send += n
|
||||
}
|
||||
}
|
||||
|
||||
sender.Handler = mjpeg.Encoder(track.Codec, 5, sender.Handler)
|
||||
}
|
||||
|
||||
sender.HandleRTP(track)
|
||||
|
@@ -46,7 +46,7 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv
|
||||
if track.Codec.IsRTP() {
|
||||
sender.Handler = RTPDepay(sender.Handler)
|
||||
} else if track.Codec.Name == core.CodecRAW {
|
||||
sender.Handler = Encoder(track.Codec, sender.Handler)
|
||||
sender.Handler = Encoder(track.Codec, 0, sender.Handler)
|
||||
}
|
||||
|
||||
sender.HandleRTP(track)
|
||||
|
@@ -52,12 +52,19 @@ func FixJPEG(b []byte) []byte {
|
||||
return buf.Bytes()
|
||||
}
|
||||
|
||||
func Encoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc {
|
||||
// Encoder convert YUV frame to Img.
|
||||
// Support skipping empty frames, for example if USB cam needs time to start.
|
||||
func Encoder(codec *core.Codec, skipEmpty int, handler core.HandlerFunc) core.HandlerFunc {
|
||||
newImage := y4m.NewImage(codec.FmtpLine)
|
||||
|
||||
return func(packet *rtp.Packet) {
|
||||
img := newImage(packet.Payload)
|
||||
|
||||
if skipEmpty != 0 && y4m.HasSameColor(img) {
|
||||
skipEmpty--
|
||||
return
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer(nil)
|
||||
if err := jpeg.Encode(buf, img, nil); err != nil {
|
||||
return
|
||||
|
@@ -123,3 +123,27 @@ func NewImage(fmtp string) func(frame []byte) image.Image {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// HasSameColor checks if all pixels has same color
|
||||
func HasSameColor(img image.Image) bool {
|
||||
var pix []byte
|
||||
|
||||
switch img := img.(type) {
|
||||
case *image.Gray:
|
||||
pix = img.Pix
|
||||
case *image.YCbCr:
|
||||
pix = img.Y
|
||||
}
|
||||
|
||||
if len(pix) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
i0 := pix[0]
|
||||
for _, i := range pix {
|
||||
if i != i0 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
Reference in New Issue
Block a user