diff --git a/app/data/bash-completion/scrcpy b/app/data/bash-completion/scrcpy index a49da8ca..79189bb4 100644 --- a/app/data/bash-completion/scrcpy +++ b/app/data/bash-completion/scrcpy @@ -110,7 +110,7 @@ _scrcpy() { case "$prev" in --video-codec) - COMPREPLY=($(compgen -W 'h264 h265 av1' -- "$cur")) + COMPREPLY=($(compgen -W 'h264 h265 av1 vp8 vp9' -- "$cur")) return ;; --audio-codec) diff --git a/app/data/zsh-completion/_scrcpy b/app/data/zsh-completion/_scrcpy index 04ffb8f1..5d9dc57a 100644 --- a/app/data/zsh-completion/_scrcpy +++ b/app/data/zsh-completion/_scrcpy @@ -97,7 +97,7 @@ arguments=( {-v,--version}'[Print the version of scrcpy]' {-V,--verbosity=}'[Set the log level]:verbosity:(verbose debug info warn error)' '--video-buffer=[Add a buffering delay \(in milliseconds\) before displaying video frames]' - '--video-codec=[Select the video codec]:codec:(h264 h265 av1)' + '--video-codec=[Select the video codec]:codec:(h264 h265 av1 vp8 vp9)' '--video-codec-options=[Set a list of comma-separated key\:type=value options for the device video encoder]' '--video-encoder=[Use a specific MediaCodec video encoder]' '--video-source=[Select the video source]:source:(display camera)' diff --git a/app/scrcpy.1 b/app/scrcpy.1 index d6940449..f7801e6e 100644 --- a/app/scrcpy.1 +++ b/app/scrcpy.1 @@ -604,7 +604,7 @@ Default is 0 (no buffering). .TP .BI "\-\-video\-codec " name -Select a video codec (h264, h265 or av1). +Select a video codec (h264, h265, av1, vp8 or vp9). Default is h264. diff --git a/app/src/cli.c b/app/src/cli.c index b2e3e30a..eca462c6 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -987,7 +987,7 @@ static const struct sc_option options[] = { .longopt_id = OPT_VIDEO_CODEC, .longopt = "video-codec", .argdesc = "name", - .text = "Select a video codec (h264, h265 or av1).\n" + .text = "Select a video codec (h264, h265, av1, vp8 or vp9).\n" "Default is h264.", }, { @@ -1994,7 +1994,15 @@ parse_video_codec(const char *optarg, enum sc_codec *codec) { *codec = SC_CODEC_AV1; return true; } - LOGE("Unsupported video codec: %s (expected h264, h265 or av1)", optarg); + if (!strcmp(optarg, "vp8")) { + *codec = SC_CODEC_VP8; + return true; + } + if (!strcmp(optarg, "vp9")) { + *codec = SC_CODEC_VP9; + return true; + } + LOGE("Unsupported video codec: %s (expected h264, h265, av1, vp8 or vp9)", optarg); return false; } diff --git a/app/src/demuxer.c b/app/src/demuxer.c index 885cd6ee..6f56c3e9 100644 --- a/app/src/demuxer.c +++ b/app/src/demuxer.c @@ -20,6 +20,8 @@ static enum AVCodecID sc_demuxer_to_avcodec_id(uint32_t codec_id) { #define SC_CODEC_ID_H264 UINT32_C(0x68323634) // "h264" in ASCII #define SC_CODEC_ID_H265 UINT32_C(0x68323635) // "h265" in ASCII +#define SC_CODEC_ID_VP8 UINT32_C(0x00767038) // "vp8" in ASCII +#define SC_CODEC_ID_VP9 UINT32_C(0x00767039) // "vp9" in ASCII #define SC_CODEC_ID_AV1 UINT32_C(0x00617631) // "av1" in ASCII #define SC_CODEC_ID_OPUS UINT32_C(0x6f707573) // "opus" in ASCII #define SC_CODEC_ID_AAC UINT32_C(0x00616163) // "aac" in ASCII @@ -30,6 +32,10 @@ sc_demuxer_to_avcodec_id(uint32_t codec_id) { return AV_CODEC_ID_H264; case SC_CODEC_ID_H265: return AV_CODEC_ID_HEVC; + case SC_CODEC_ID_VP8: + return AV_CODEC_ID_VP8; + case SC_CODEC_ID_VP9: + return AV_CODEC_ID_VP9; case SC_CODEC_ID_AV1: #ifdef SCRCPY_LAVC_HAS_AV1 return AV_CODEC_ID_AV1; diff --git a/app/src/options.h b/app/src/options.h index 03b42913..337ebb74 100644 --- a/app/src/options.h +++ b/app/src/options.h @@ -43,6 +43,8 @@ enum sc_codec { SC_CODEC_H264, SC_CODEC_H265, SC_CODEC_AV1, + SC_CODEC_VP8, + SC_CODEC_VP9, SC_CODEC_OPUS, SC_CODEC_AAC, SC_CODEC_FLAC, diff --git a/app/src/server.c b/app/src/server.c index 153219c3..db9c38e1 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -109,6 +109,10 @@ sc_server_get_codec_name(enum sc_codec codec) { return "h264"; case SC_CODEC_H265: return "h265"; + case SC_CODEC_VP8: + return "vp8"; + case SC_CODEC_VP9: + return "vp9"; case SC_CODEC_AV1: return "av1"; case SC_CODEC_OPUS: diff --git a/server/src/main/java/com/genymobile/scrcpy/video/VideoCodec.java b/server/src/main/java/com/genymobile/scrcpy/video/VideoCodec.java index 5d528da1..2799de89 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/VideoCodec.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/VideoCodec.java @@ -9,7 +9,9 @@ public enum VideoCodec implements Codec { H264(0x68_32_36_34, "h264", MediaFormat.MIMETYPE_VIDEO_AVC), H265(0x68_32_36_35, "h265", MediaFormat.MIMETYPE_VIDEO_HEVC), @SuppressLint("InlinedApi") // introduced in API 29 - AV1(0x00_61_76_31, "av1", MediaFormat.MIMETYPE_VIDEO_AV1); + AV1(0x00_61_76_31, "av1", MediaFormat.MIMETYPE_VIDEO_AV1), + VP8(0x00_76_70_38, "vp8", MediaFormat.MIMETYPE_VIDEO_VP8), + VP9(0x00_76_70_39, "vp9", MediaFormat.MIMETYPE_VIDEO_VP9); private final int id; // 4-byte ASCII representation of the name private final String name;