Skip to content

Commit

Permalink
Make streamer independent of codec type
Browse files Browse the repository at this point in the history
Rename VideoStreamer to Streamer, and extract a Codec interface which
will also support audio codecs.

PR #3757 <#3757>
  • Loading branch information
rom1v committed Mar 3, 2023
1 parent af1f00b commit 3c670dc
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 11 deletions.
16 changes: 16 additions & 0 deletions server/src/main/java/com/genymobile/scrcpy/Codec.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.genymobile.scrcpy;

public interface Codec {

enum Type {
VIDEO,
}

Type getType();

int getId();

String getName();

String getMimeType();
}
6 changes: 3 additions & 3 deletions server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<CodecOption> codecOptions;
private final int bitRate;
Expand All @@ -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<CodecOption> codecOptions, String encoderName,
public ScreenEncoder(Device device, Streamer streamer, int bitRate, int maxFps, List<CodecOption> codecOptions, String encoderName,
boolean downsizeOnError) {
this.device = device;
this.streamer = streamer;
Expand Down Expand Up @@ -164,7 +164,7 @@ private static int chooseMaxSizeFallback(Size failedSize) {
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();

Expand Down
6 changes: 3 additions & 3 deletions server/src/main/java/com/genymobile/scrcpy/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,9 @@ private static void scrcpy(Options options) throws IOException, ConfigurationExc
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,26 @@
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;
}

Expand Down
14 changes: 13 additions & 1 deletion server/src/main/java/com/genymobile/scrcpy/VideoCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
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
Expand All @@ -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;
}
Expand Down

0 comments on commit 3c670dc

Please sign in to comment.