From ecac9d1e4ba566d42b3c4a569bdf797603b9ed1f Mon Sep 17 00:00:00 2001 From: Jeet <113221510+JEETDESAI25@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:12:05 -0800 Subject: [PATCH] Enable ingest of DXV3 and DXV3 HQ videos and transcode to HLS presets --- ffmpeg/presets/hls_1080p.sh | 10 +++++++++- ffmpeg/presets/hls_480p.sh | 10 +++++++++- ffmpeg/presets/hls_720p.sh | 10 +++++++++- src/jobs.go | 39 +++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/ffmpeg/presets/hls_1080p.sh b/ffmpeg/presets/hls_1080p.sh index b42101c..653b78e 100755 --- a/ffmpeg/presets/hls_1080p.sh +++ b/ffmpeg/presets/hls_1080p.sh @@ -2,8 +2,16 @@ set -ex +SCALE_FILTER=${SCALE_FILTER:-scale} + +if [ "$SCALE_FILTER" = "zscale" ]; then + FILTER_OPTS="zscale=-2:1080:min=bt709:m=bt709" +else + FILTER_OPTS="scale=-2:1080" +fi + ffmpeg -i "$input_video" \ --vf "scale=-2:1080" \ +-vf "$FILTER_OPTS" \ -c:v libx264 \ -b:v 4000k \ -maxrate 4000k \ diff --git a/ffmpeg/presets/hls_480p.sh b/ffmpeg/presets/hls_480p.sh index 45bca91..3f3d80e 100755 --- a/ffmpeg/presets/hls_480p.sh +++ b/ffmpeg/presets/hls_480p.sh @@ -2,8 +2,16 @@ set -ex +SCALE_FILTER=${SCALE_FILTER:-scale} + +if [ "$SCALE_FILTER" = "zscale" ]; then + FILTER_OPTS="zscale=-2:480:min=bt709:m=bt709" +else + FILTER_OPTS="scale=-2:480" +fi + ffmpeg -i "$input_video" \ --vf "scale=-2:480" \ +-vf "$FILTER_OPTS" \ -c:v libx264 \ -b:v 700k \ -maxrate 700k \ diff --git a/ffmpeg/presets/hls_720p.sh b/ffmpeg/presets/hls_720p.sh index 4212f74..fd9981e 100755 --- a/ffmpeg/presets/hls_720p.sh +++ b/ffmpeg/presets/hls_720p.sh @@ -2,8 +2,16 @@ set -ex +SCALE_FILTER=${SCALE_FILTER:-scale} + +if [ "$SCALE_FILTER" = "zscale" ]; then + FILTER_OPTS="zscale=-2:720:min=bt709:m=bt709" +else + FILTER_OPTS="scale=-2:720" +fi + ffmpeg -i "$input_video" \ --vf "scale=-2:720" \ +-vf "$FILTER_OPTS" \ -c:v libx264 \ -b:v 1000k \ -maxrate 1000k \ diff --git a/src/jobs.go b/src/jobs.go index 17eaa4d..1b10451 100644 --- a/src/jobs.go +++ b/src/jobs.go @@ -12,6 +12,7 @@ import ( "os" "os/exec" "strconv" + "strings" "sync" "time" ) @@ -101,9 +102,46 @@ func downloadVideo(job Job, videoPath string) error { return downloadFromS3(job.Request.S3VideoURI, videoPath) } +func detectVideoCodec(job Job, videoPath string) (string, error) { + log.Printf("[jid: %s] Detecting video codec...\n", job.JobID) + + cmd := exec.Command("ffprobe", + "-v", "error", + "-select_streams", "v:0", + "-show_entries", "stream=codec_name", + "-of", "default=nw=1:nk=1", + videoPath) + + output, err := cmd.Output() + if err != nil { + return "", fmt.Errorf("failed to detect codec: %v", err) + } + + codec := strings.TrimSpace(string(output)) + log.Printf("[jid: %s] Detected codec: %s\n", job.JobID, codec) + + return codec, nil +} + +func determineScaleFilter(codec string) string { + if codec == "dxv" { + return "zscale" + } + return "scale" +} + func runConversionScript(job Job, inputPath, outputDir string) error { log.Printf("[jid: %s] Running conversion script...\n", job.JobID) + codec, err := detectVideoCodec(job, inputPath) + scaleFilter := "scale" + if err != nil { + log.Printf("[jid: %s] Warning: codec detection failed (%v), defaulting to scale filter\n", job.JobID, err) + } else { + scaleFilter = determineScaleFilter(codec) + log.Printf("[jid: %s] Using %s filter for codec %s\n", job.JobID, scaleFilter, codec) + } + cmd := exec.Command("./ffmpeg/convert-video.sh") cmd.Env = append(os.Environ(), fmt.Sprintf("input_video=%s", inputPath), @@ -111,6 +149,7 @@ func runConversionScript(job Job, inputPath, outputDir string) error { fmt.Sprintf("hls_480p=%d", boolToInt(contains(job.Request.Presets, "hls_480p"))), fmt.Sprintf("hls_720p=%d", boolToInt(contains(job.Request.Presets, "hls_720p"))), fmt.Sprintf("hls_1080p=%d", boolToInt(contains(job.Request.Presets, "hls_1080p"))), + fmt.Sprintf("SCALE_FILTER=%s", scaleFilter), ) if err := cmd.Run(); err != nil {