From 10ce0f376a89579408337b084be3e05ebcd18d92 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Mon, 6 Feb 2023 14:52:09 +0100 Subject: [PATCH] Make streamer independent of codec type Rename VideoStreamer to Streamer, and extract a Codec interface which will also support audio codecs. PR #3757 --- .../main/java/com/genymobile/scrcpy/Codec.java | 16 ++++++++++++++++ .../com/genymobile/scrcpy/ScreenEncoder.java | 6 +++--- .../main/java/com/genymobile/scrcpy/Server.java | 6 +++--- .../scrcpy/{VideoStreamer.java => Streamer.java} | 8 ++++---- .../java/com/genymobile/scrcpy/VideoCodec.java | 14 +++++++++++++- 5 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 server/src/main/java/com/genymobile/scrcpy/Codec.java rename server/src/main/java/com/genymobile/scrcpy/{VideoStreamer.java => Streamer.java} (89%) diff --git a/server/src/main/java/com/genymobile/scrcpy/Codec.java b/server/src/main/java/com/genymobile/scrcpy/Codec.java new file mode 100644 index 00000000..50e8acad --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/Codec.java @@ -0,0 +1,16 @@ +package com.genymobile.scrcpy; + +public interface Codec { + + enum Type { + VIDEO, + } + + Type getType(); + + int getId(); + + String getName(); + + String getMimeType(); +} diff --git a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java index 6f47c7f0..a79ce079 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java @@ -32,7 +32,7 @@ public class ScreenEncoder implements Device.RotationListener { private final AtomicBoolean rotationChanged = new AtomicBoolean(); private final Device device; - private final VideoStreamer streamer; + private final Streamer streamer; private final String encoderName; private final List codecOptions; private final int bitRate; @@ -42,7 +42,7 @@ public class ScreenEncoder implements Device.RotationListener { private boolean firstFrameSent; private int consecutiveErrors; - public ScreenEncoder(Device device, VideoStreamer streamer, int bitRate, int maxFps, List codecOptions, String encoderName, + public ScreenEncoder(Device device, Streamer streamer, int bitRate, int maxFps, List codecOptions, String encoderName, boolean downsizeOnError) { this.device = device; this.streamer = streamer; @@ -164,7 +164,7 @@ public class ScreenEncoder implements Device.RotationListener { return 0; } - private boolean encode(MediaCodec codec, VideoStreamer streamer) throws IOException { + private boolean encode(MediaCodec codec, Streamer streamer) throws IOException { boolean eof = false; MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 85234c4e..d570a9fb 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -100,9 +100,9 @@ public final class Server { device.setClipboardListener(text -> controllerRef.getSender().pushClipboardText(text)); } - VideoStreamer videoStreamer = new VideoStreamer(connection.getVideoFd(), codec, options.getSendCodecId(), options.getSendFrameMeta()); - ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getBitRate(), options.getMaxFps(), codecOptions, - options.getEncoderName(), options.getDownsizeOnError()); + Streamer videoStreamer = new Streamer(connection.getVideoFd(), codec, options.getSendCodecId(), options.getSendFrameMeta()); + ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getBitRate(), options.getMaxFps(), + codecOptions, options.getEncoderName(), options.getDownsizeOnError()); try { // synchronous screenEncoder.streamScreen(); diff --git a/server/src/main/java/com/genymobile/scrcpy/VideoStreamer.java b/server/src/main/java/com/genymobile/scrcpy/Streamer.java similarity index 89% rename from server/src/main/java/com/genymobile/scrcpy/VideoStreamer.java rename to server/src/main/java/com/genymobile/scrcpy/Streamer.java index 24f48082..d6bf6780 100644 --- a/server/src/main/java/com/genymobile/scrcpy/VideoStreamer.java +++ b/server/src/main/java/com/genymobile/scrcpy/Streamer.java @@ -6,26 +6,26 @@ import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; -public final class VideoStreamer { +public final class Streamer { private static final long PACKET_FLAG_CONFIG = 1L << 63; private static final long PACKET_FLAG_KEY_FRAME = 1L << 62; private final FileDescriptor fd; - private final VideoCodec codec; + private final Codec codec; private final boolean sendCodecId; private final boolean sendFrameMeta; private final ByteBuffer headerBuffer = ByteBuffer.allocate(12); - public VideoStreamer(FileDescriptor fd, VideoCodec codec, boolean sendCodecId, boolean sendFrameMeta) { + public Streamer(FileDescriptor fd, Codec codec, boolean sendCodecId, boolean sendFrameMeta) { this.fd = fd; this.codec = codec; this.sendCodecId = sendCodecId; this.sendFrameMeta = sendFrameMeta; } - public VideoCodec getCodec() { + public Codec getCodec() { return codec; } diff --git a/server/src/main/java/com/genymobile/scrcpy/VideoCodec.java b/server/src/main/java/com/genymobile/scrcpy/VideoCodec.java index e19b27f0..43531f1e 100644 --- a/server/src/main/java/com/genymobile/scrcpy/VideoCodec.java +++ b/server/src/main/java/com/genymobile/scrcpy/VideoCodec.java @@ -3,7 +3,7 @@ package com.genymobile.scrcpy; import android.annotation.SuppressLint; import android.media.MediaFormat; -public enum VideoCodec { +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 21 @@ -19,10 +19,22 @@ public enum VideoCodec { this.mimeType = mimeType; } + @Override + public Type getType() { + return Type.VIDEO; + } + + @Override public int getId() { return id; } + @Override + public String getName() { + return name; + } + + @Override public String getMimeType() { return mimeType; }