Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 34 additions & 26 deletions examples/http_mjpeg_streamer/webcam.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
)

const (
V4L2_PIX_FMT_MJPG = 0x47504A4D
V4L2_PIX_FMT_PJPG = 0x47504A50
V4L2_PIX_FMT_YUYV = 0x56595559
)
Expand All @@ -44,6 +45,7 @@ func (slice FrameSizes) Swap(i, j int) {
}

var supportedFormats = map[webcam.PixelFormat]bool{
V4L2_PIX_FMT_MJPG: true,
V4L2_PIX_FMT_PJPG: true,
V4L2_PIX_FMT_YUYV: true,
}
Expand Down Expand Up @@ -200,33 +202,40 @@ func encodeToImage(wc *webcam.Webcam, back chan struct{}, fi chan []byte, li cha
)
for {
bframe := <-fi
// copy frame
if len(frame) < len(bframe) {
frame = make([]byte, len(bframe))
}
copy(frame, bframe)
back <- struct{}{}

switch format {
case V4L2_PIX_FMT_YUYV:
yuyv := image.NewYCbCr(image.Rect(0, 0, int(w), int(h)), image.YCbCrSubsampleRatio422)
for i := range yuyv.Cb {
ii := i * 4
yuyv.Y[i*2] = frame[ii]
yuyv.Y[i*2+1] = frame[ii+2]
yuyv.Cb[i] = frame[ii+1]
yuyv.Cr[i] = frame[ii+3]

var buf *bytes.Buffer

if format == V4L2_PIX_FMT_MJPG {
buf = bytes.NewBuffer(bframe)
back <- struct{}{}
} else {
// copy frame
if len(frame) < len(bframe) {
frame = make([]byte, len(bframe))
}
copy(frame, bframe)
back <- struct{}{}

switch format {
case V4L2_PIX_FMT_YUYV:
yuyv := image.NewYCbCr(image.Rect(0, 0, int(w), int(h)), image.YCbCrSubsampleRatio422)
for i := range yuyv.Cb {
ii := i * 4
yuyv.Y[i*2] = frame[ii]
yuyv.Y[i*2+1] = frame[ii+2]
yuyv.Cb[i] = frame[ii+1]
yuyv.Cr[i] = frame[ii+3]
}
img = yuyv
default:
log.Fatal("invalid format ?")
}
//convert to jpeg
buf := &bytes.Buffer{}
if err := jpeg.Encode(buf, img, nil); err != nil {
log.Fatal(err)
return
}
img = yuyv
default:
log.Fatal("invalid format ?")
}
//convert to jpeg
buf := &bytes.Buffer{}
if err := jpeg.Encode(buf, img, nil); err != nil {
log.Fatal(err)
return
}

const N = 50
Expand All @@ -243,7 +252,6 @@ func encodeToImage(wc *webcam.Webcam, back chan struct{}, fi chan []byte, li cha
if nn == 0 {
li <- buf
}

}
}

Expand Down