# Feature catalog — Genymobile/scrcpy

> Canonical page: https://codevetter.com/unpack/scrcpy/feature-catalog

# Feature catalog — Genymobile/scrcpy

Scanned commit 19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac (2026-09-05). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

Feature surface is almost entirely CLI-driven: cli.c defines a table of ~100 long options (many with short forms) parsed via getopt_long into scrcpy_options. Major features: video mirroring (display or camera, five codecs), audio forwarding (four codecs, many sources), input control via three injection modes (SDK/UHID/AOA), screen recording to several container formats, virtual/flex displays, app launching, file push and APK install by drag-and-drop, clipboard autosync, TCP/IP wireless setup, OTG mode without adb debugging, V4L2 webcam sink, and --list-* introspection commands executed server-side.
- The full CLI surface is a static 'struct sc_option options[]' table in cli.c (~100 entries: --video-codec, --audio-source, --record, --new-display, --otg, --v4l2-sink, --tcpip, --keyboard, --mouse, --gamepad, --start-app, --list-*, etc.) fed to getopt_long by parse_args_with_getopt(). — [app/src/cli.c#L149-220](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/cli.c#L149-L220) [app/src/cli.c#L2492-2498](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/cli.c#L2492-L2498) [app/src/cli.c#L3561-3568](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/cli.c#L3561-L3568)
- Video codecs h264/h265/av1/vp8/vp9 and audio codecs opus/aac/flac/raw are selectable; sc_server_get_codec_name() maps them to server param strings and the demuxer maps wire codec ids to AVCodecID. — [app/src/server.c#L105-130](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L105-L130) [app/src/demuxer.c#L19-58](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/demuxer.c#L19-L58)
- Audio sources include output, playback, mic and mic variants (mic-unprocessed, mic-camcorder, mic-voice-recognition, mic-voice-communication, voice-call[-uplink|-downlink], voice-performance); server-side they map to AudioDirectCapture or AudioPlaybackCapture. — [app/src/server.c#L147-176](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L147-L176) [server/src/main/java/com/genymobile/scrcpy/Server.java#L119-137](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/Server.java#L119-L137)
- Recording (--record) supports mp4, m4a, aac, mkv, mka, opus, flac and wav containers via FFmpeg muxers, with per-stream PTS rescaling and monotonic-PTS fixing. — [app/src/recorder.c#L64-120](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/recorder.c#L64-L120)
- Input injection has three backends per device class: SDK (injectInputEvent via controller), UHID (virtual HID devices created on-device) and AOA over USB (HAVE_USB builds); the union members keyboard_sdk/uhid/aoa, mouse_sdk/uhid/aoa and gamepad_uhid/aoa are selected by --keyboard/--mouse/--gamepad modes. — [app/src/scrcpy.c#L609-738](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/scrcpy.c#L609-L738) [app/src/uhid/keyboard_uhid.c](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/uhid/keyboard_uhid.c) [app/src/usb/keyboard_aoa.c](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/usb/keyboard_aoa.c)
- Virtual display features: --new-display creates a NewDisplayCapture, --start-app sends SC_CONTROL_MSG_TYPE_START_APP, --display-ime-policy/vd_system_decorations/vd_destroy_content/flex_display tune it; requires Android 10+. — [server/src/main/java/com/genymobile/scrcpy/Server.java#L139-160](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/Server.java#L139-L160) [server/src/main/java/com/genymobile/scrcpy/Server.java#L77-86](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/Server.java#L77-L86) [app/src/control_msg.h#L29-53](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/control_msg.h#L29-L53)
- OTG mode (--otg) runs scrcpy_otg() which drives keyboard/mouse/gamepad over Android Open Accessory HID without adb debugging. — [app/src/main.c#L101-105](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/main.c#L101-L105) [app/src/usb/scrcpy_otg.c](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/usb/scrcpy_otg.c)
- V4L2 sink (--v4l2-sink, Linux-only HAVE_V4L2) registers avdevice and pipes decoded frames to a /dev/videoN device through sc_v4l2_sink with an optional v4l2_regulator buffer. — [app/src/scrcpy.c#L812-829](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/scrcpy.c#L812-L829) [app/src/main.c#L83-87](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/main.c#L83-L87) [meson_options.txt](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/meson_options.txt)
- Clipboard autosync is bidirectional: the server registers a primaryClipChanged listener sending DeviceMessage clipboard updates, and the client receiver applies them via SDL_SetClipboardText. — [server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L144-163](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L144-L163) [app/src/receiver.c#L40-60](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/receiver.c#L40-L60) [app/src/device_msg.h#L14-35](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/device_msg.h#L14-L35)
- File drop/APK install: sc_file_pusher runs a thread draining a request queue — 'adb push' files to push_target (default /sdcard/Download/) then sends SC_CONTROL_MSG_TYPE_SCAN_FILE so the device media-scans them, or 'adb install' for APKs. — [app/src/file_pusher.c#L12-180](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/file_pusher.c#L12-L180)
- --tcpip automates wireless setup: get device IP via getprop, 'adb tcpip 5555', poll service.adb.tcp.port until enabled, then 'adb connect ip:port'; '--tcpip=+addr' disconnects first. — [app/src/server.c#L783-953](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L783-L953)
- --list-encoders/--list-displays/--list-cameras/--list-camera-sizes/--list-apps run a short-lived server invocation that prints LogUtils-built lists instead of mirroring. — [server/src/main/java/com/genymobile/scrcpy/Server.java#L247-269](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/Server.java#L247-L269) [app/src/server.c#L443-457](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L443-L457) [app/src/server.c#L1060-1072](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L1060-L1072)
- Camera mirroring (--video-source=camera, Android 12+) uses CameraCapture with facing/size/ar/fps/high-speed/torch/zoom options, and control messages CAMERA_SET_TORCH/ZOOM_IN/ZOOM_OUT are dispatched to the capture. — [server/src/main/java/com/genymobile/scrcpy/Server.java#L72-75](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/Server.java#L72-L75) [server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L422-438](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L422-L438) [app/src/server.c#L345-373](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L345-L373)
- Device-control extras: --turn-screen-off sends SET_DISPLAY_POWER after setup, --stay-awake, --power-off-on-close, --no-power-on, --keep-active (4s simulated user activity thread), and --kill-adb-on-close kills the whole adb server. — [app/src/scrcpy.c#L849-859](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/scrcpy.c#L849-L859) [server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L229-271](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/server/src/main/java/com/genymobile/scrcpy/control/Controller.java#L229-L271) [app/src/server.c#L955-962](https://github.com/Genymobile/scrcpy/blob/19c1261d2e2cbf2b5e6a71a8b64cc1dd3ede06ac/app/src/server.c#L955-L962)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
