Skip to content

Commit

Permalink
Code refactoring after #517
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexxIT committed Jul 16, 2023
1 parent d62b1e4 commit 9e15391
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 35 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,6 @@ API examples:

- MJPEG stream: `http://192.168.1.123:1984/api/stream.mjpeg?src=camera1`
- JPEG snapshots: `http://192.168.1.123:1984/api/frame.jpeg?src=camera1`
- JPEG snapshot resized to 100px: `http://192.168.1.123:1984/api/frame.jpeg?src=camera1&h=100`

### Module: Log

Expand Down
18 changes: 0 additions & 18 deletions internal/ffmpeg/helpers.go

This file was deleted.

69 changes: 69 additions & 0 deletions internal/ffmpeg/jpeg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package ffmpeg

import (
"bytes"
"fmt"
"net/url"
"os/exec"

"github.com/AlexxIT/go2rtc/internal/ffmpeg/hardware"
"github.com/AlexxIT/go2rtc/pkg/core"
"github.com/AlexxIT/go2rtc/pkg/ffmpeg"
"github.com/AlexxIT/go2rtc/pkg/shell"
)

func TranscodeToJPEG(b []byte, query url.Values) ([]byte, error) {
ffmpegArgs := parseQuery(query)
cmdArgs := shell.QuoteSplit(ffmpegArgs.String())
cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...)
cmd.Stdin = bytes.NewBuffer(b)
return cmd.Output()
}

func parseQuery(query url.Values) *ffmpeg.Args {
args := &ffmpeg.Args{
Bin: defaults["bin"],
Global: defaults["global"],
Input: "-i -",
Codecs: []string{defaults["mjpeg"]},
Output: defaults["output/mjpeg"],
}

var width = -1
var height = -1
var r, hw string

for k, v := range query {
switch k {
case "width", "w":
width = core.Atoi(v[0])
case "height", "h":
height = core.Atoi(v[0])
case "rotate":
r = v[0]
case "hardware", "hw":
hw = v[0]
}
}

if width > 0 || height > 0 {
args.AddFilter(fmt.Sprintf("scale=%d:%d", width, height))
}

if r != "" {
switch r {
case "90":
args.AddFilter("transpose=1") // 90 degrees clockwise
case "180":
args.AddFilter("transpose=1,transpose=1")
case "-90", "270":
args.AddFilter("transpose=2") // 90 degrees counterclockwise
}
}

if hw != "" {
hardware.MakeHardware(args, hw, defaults)
}

return args
}
23 changes: 23 additions & 0 deletions internal/ffmpeg/jpeg_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ffmpeg

import (
"net/url"
"testing"

"github.com/stretchr/testify/require"
)

func TestParseQuery(t *testing.T) {
args := parseQuery(nil)
require.Equal(t, `ffmpeg -hide_banner -i - -c:v mjpeg -f mjpeg -`, args.String())

query, err := url.ParseQuery("h=480")
require.Nil(t, err)
args = parseQuery(query)
require.Equal(t, `ffmpeg -hide_banner -i - -c:v mjpeg -vf "scale=-1:480" -f mjpeg -`, args.String())

query, err = url.ParseQuery("hw=vaapi")
require.Nil(t, err)
args = parseQuery(query)
require.Equal(t, `ffmpeg -hide_banner -hwaccel vaapi -hwaccel_output_format vaapi -i - -c:v mjpeg_vaapi -vf "format=vaapi|nv12,hwupload" -f mjpeg -`, args.String())
}
19 changes: 3 additions & 16 deletions internal/mjpeg/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,9 @@ func handlerKeyframe(w http.ResponseWriter, r *http.Request) {
case core.CodecH264, core.CodecH265:
ts := time.Now()
var err error
// Resize image if "h" parameter exists
if hParam := r.URL.Query().Get("h"); hParam != "" {
h, err := strconv.Atoi(hParam)
if err != nil {
http.Error(w, "Invalid height parameter", http.StatusBadRequest)
return
}
if data, err = ffmpeg.TranscodeToJPEG(data, h); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
} else {
if data, err = ffmpeg.TranscodeToJPEG(data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if data, err = ffmpeg.TranscodeToJPEG(data, r.URL.Query()); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Debug().Msgf("[mjpeg] transcoding time=%s", time.Since(ts))
}
Expand Down

0 comments on commit 9e15391

Please sign in to comment.