From 46d1c009d8ce559dc1ac1cdfceb234f1c7728498 Mon Sep 17 00:00:00 2001 From: wenxiaomao1023 Date: Thu, 5 Mar 2020 16:42:05 +0800 Subject: [PATCH] Add Android 4.4 support and dump hierarchy --- scrcpy-server.jar | Bin 763565 -> 706729 bytes server/build.gradle | 2 +- .../scrcpy/AccessibilityNodeInfoDumper.java | 360 +++++++++++++++ .../scrcpy/AccessibilityNodeInfoHelper.java | 44 ++ .../java/com/genymobile/scrcpy/Common.java | 18 + .../scrcpy/ControlMessageReader.java | 10 +- .../genymobile/scrcpy/DesktopConnection.java | 82 ++-- .../java/com/genymobile/scrcpy/Device.java | 6 + .../main/java/com/genymobile/scrcpy/IO.java | 22 +- .../com/genymobile/scrcpy/JpegEncoder.java | 13 +- .../java/com/genymobile/scrcpy/Options.java | 26 ++ .../com/genymobile/scrcpy/ScreenEncoder.java | 427 +++++++++++------- .../java/com/genymobile/scrcpy/Server.java | 94 +++- .../main/java/com/genymobile/scrcpy/Size.java | 3 +- 14 files changed, 856 insertions(+), 251 deletions(-) create mode 100644 server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoDumper.java create mode 100644 server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoHelper.java create mode 100644 server/src/main/java/com/genymobile/scrcpy/Common.java diff --git a/scrcpy-server.jar b/scrcpy-server.jar index 4fd3129af34cd8de6c321e3a2df0a4662edb390a..8ffbdc19e14786561228a4e4a82114e197c21378 100644 GIT binary patch delta 73229 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 F7y#ckSHb`Q delta 68971 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 `yARb9qMud!x%td2CS-|*Y4`i;`*3*I*M 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 diff --git a/server/build.gradle b/server/build.gradle index 299f0e60..4aa6111d 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion 29 defaultConfig { applicationId "com.genymobile.scrcpy" - minSdkVersion 21 + minSdkVersion 19 targetSdkVersion 29 versionCode 14 versionName "1.12.1" diff --git a/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoDumper.java b/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoDumper.java new file mode 100644 index 00000000..8c5be4e9 --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoDumper.java @@ -0,0 +1,360 @@ +package com.genymobile.scrcpy; + +import android.util.Xml; +import android.view.accessibility.AccessibilityNodeInfo; + +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; +import java.io.OutputStream; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import android.os.Build; + +import android.app.UiAutomation; +import android.os.Looper; +import android.os.HandlerThread; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityWindowInfo; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +import java.io.ByteArrayOutputStream; +import java.io.FileDescriptor; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import android.os.Handler; + +public class AccessibilityNodeInfoDumper { + private UiAutomation mUiAutomation; + private HandlerThread mHandlerThread; + + private Handler handler; + private final Device device; + private final DesktopConnection connection; + private AccessibilityEventListenerImpl accessibilityEventListenerImpl; + + private static final String[] NAF_EXCLUDED_CLASSES = new String[]{ + android.widget.GridView.class.getName(), android.widget.GridLayout.class.getName(), + android.widget.ListView.class.getName(), android.widget.TableLayout.class.getName() + }; + + public AccessibilityNodeInfoDumper(Handler handler, Device device, DesktopConnection connection) { + this.handler = handler; + this.device = device; + this.connection = connection; + this.accessibilityEventListenerImpl = new AccessibilityEventListenerImpl(); + } + + private class AccessibilityEventListenerImpl implements UiAutomation.OnAccessibilityEventListener { + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { +// Ln.i("EventType: " + AccessibilityEvent.eventTypeToString(event.getEventType())); + switch (event.getEventType()) { + case AccessibilityEvent.TYPE_ANNOUNCEMENT: + case AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT: + case AccessibilityEvent.TYPE_GESTURE_DETECTION_END: + case AccessibilityEvent.TYPE_GESTURE_DETECTION_START: + case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: + case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END: + case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START: + case AccessibilityEvent.TYPE_TOUCH_INTERACTION_END: + case AccessibilityEvent.TYPE_TOUCH_INTERACTION_START: + case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: + case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: + case AccessibilityEvent.TYPE_VIEW_CLICKED: + case AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED: + case AccessibilityEvent.TYPE_VIEW_FOCUSED: + case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: + case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: + case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: + case AccessibilityEvent.TYPE_VIEW_SCROLLED: + case AccessibilityEvent.TYPE_VIEW_SELECTED: + case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: + case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: + case AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY: + case AccessibilityEvent.TYPE_WINDOWS_CHANGED: +// case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: + case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try { + dumpWindowHierarchy(device, bos); + } catch (IOException e) { + e.printStackTrace(); + Ln.e("onAccessibilityEvent error: " + e.getMessage()); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + } + } + } + Ln.i("dumpHierarchy size: " + bos.toByteArray().length); + ByteBuffer b = ByteBuffer.allocate(4 + bos.toByteArray().length); + b.order(ByteOrder.LITTLE_ENDIAN); + b.putInt(bos.toByteArray().length); + b.put(bos.toByteArray()); + byte[] hierarchy = b.array(); + try { + IO.writeFully(connection.getVideoChannel(), hierarchy, 0, hierarchy.length);// IOException + } catch (IOException e) { + Common.stopScrcpy(handler, "hierarchy"); + } + break; + } + } + } + + public void start() { + Object connection = null; + mHandlerThread = new HandlerThread("ScrcpyUiAutomationHandlerThread"); + mHandlerThread.start(); + try { + Class UiAutomationConnection = Class.forName("android.app.UiAutomationConnection"); + Constructor newInstance = UiAutomationConnection.getDeclaredConstructor(); + newInstance.setAccessible(true); + connection = newInstance.newInstance(); + Class IUiAutomationConnection = Class.forName("android.app.IUiAutomationConnection"); + Constructor newUiAutomation = UiAutomation.class.getDeclaredConstructor(Looper.class, IUiAutomationConnection); + mUiAutomation = (UiAutomation) newUiAutomation.newInstance(mHandlerThread.getLooper(), connection); + Method connect = UiAutomation.class.getDeclaredMethod("connect"); + connect.invoke(mUiAutomation); + Ln.i("mUiAutomation: " + mUiAutomation); + if (mUiAutomation != null) { + mUiAutomation.setOnAccessibilityEventListener(accessibilityEventListenerImpl); + } + } catch (Exception e) { + e.printStackTrace(); + Ln.e("AccessibilityNodeInfoDumper start: " + e.getMessage()); + stop(); + } + } + + public void stop() { + if (mUiAutomation != null) { + mUiAutomation.setOnAccessibilityEventListener(null); + try { + Method disconnect = UiAutomation.class.getDeclaredMethod("disconnect"); + disconnect.invoke(mUiAutomation); + } catch (Exception e) { + e.printStackTrace(); + Ln.e("disconnect: " + e.getMessage()); + } + mUiAutomation = null; + } + if (mHandlerThread != null) { + mHandlerThread.quit(); + } + } + + private void restart() { + stop(); + start(); + } + + public void dumpWindowHierarchy(Device device, OutputStream out) throws IOException { + XmlSerializer serializer = Xml.newSerializer(); +// serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + serializer.setOutput(out, "UTF-8"); + + serializer.startDocument("UTF-8", true); + serializer.startTag("", "hierarchy"); // TODO(allenhair): Should we use a namespace? + serializer.attribute("", "rotation", Integer.toString(device.getRotation())); + + int width = device.getScreenInfo().getContentRect().width(); + int height = device.getScreenInfo().getContentRect().height(); + + if (mUiAutomation == null) { + restart(); + } + + if (mUiAutomation != null) { + Set roots = new HashSet(); + // Start with the active window, which seems to sometimes be missing from the list returned + // by the UiAutomation. + AccessibilityNodeInfo activeRoot = mUiAutomation.getRootInActiveWindow(); + if (activeRoot != null) { + roots.add(activeRoot); + } + // Support multi-window searches for API level 21 and up. + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + for (AccessibilityWindowInfo window : mUiAutomation.getWindows()) { + AccessibilityNodeInfo root = window.getRoot(); + if (root == null) { + Ln.w(String.format("Skipping null root node for window: %s", window.toString())); + continue; + } + roots.add(root); + } + } + AccessibilityNodeInfo[] nodeInfos = roots.toArray(new AccessibilityNodeInfo[roots.size()]); + for (int i = 0; i < nodeInfos.length; i++) { + dumpNodeRec(nodeInfos[i], serializer, 0, width, height, nodeInfos.length - 1 - i); + } + } + + serializer.endTag("", "hierarchy"); + serializer.endDocument(); + } + + private static void dumpNodeRec(AccessibilityNodeInfo node, XmlSerializer serializer, int index, + int width, int height, int zIndex) throws IOException { + serializer.startTag("", "node"); + if (!nafExcludedClass(node) && !nafCheck(node)) + serializer.attribute("", "NAF", Boolean.toString(true)); + serializer.attribute("", "index", Integer.toString(index)); + serializer.attribute("", "text", safeCharSeqToString(node.getText())); + serializer.attribute("", "resource-id", safeCharSeqToString(node.getViewIdResourceName())); + serializer.attribute("", "class", safeCharSeqToString(node.getClassName())); + serializer.attribute("", "package", safeCharSeqToString(node.getPackageName())); + serializer.attribute("", "content-desc", safeCharSeqToString(node.getContentDescription())); + serializer.attribute("", "checkable", Boolean.toString(node.isCheckable())); + serializer.attribute("", "checked", Boolean.toString(node.isChecked())); + serializer.attribute("", "clickable", Boolean.toString(node.isClickable())); + serializer.attribute("", "enabled", Boolean.toString(node.isEnabled())); + serializer.attribute("", "focusable", Boolean.toString(node.isFocusable())); + serializer.attribute("", "focused", Boolean.toString(node.isFocused())); + serializer.attribute("", "scrollable", Boolean.toString(node.isScrollable())); + serializer.attribute("", "long-clickable", Boolean.toString(node.isLongClickable())); + serializer.attribute("", "password", Boolean.toString(node.isPassword())); + serializer.attribute("", "selected", Boolean.toString(node.isSelected())); + serializer.attribute("", "visible-to-user", Boolean.toString(node.isVisibleToUser())); + serializer.attribute("", "bounds", AccessibilityNodeInfoHelper.getVisibleBoundsInScreen( + node, width, height).toShortString()); + serializer.attribute("", "z-index", Integer.toString(zIndex)); + int count = node.getChildCount(); + for (int i = 0; i < count; i++) { + AccessibilityNodeInfo child = node.getChild(i); + if (child != null) { + if (child.isVisibleToUser()) { + dumpNodeRec(child, serializer, i, width, height, zIndex); + child.recycle(); + } +// else { +// Ln.i(String.format("Skipping invisible child: %s", child.toString())); +// } + } else { + Ln.i(String.format("Null child %d/%d, parent: %s", i, count, node.toString())); + } + } + serializer.endTag("", "node"); + } + + /** + * The list of classes to exclude my not be complete. We're attempting to + * only reduce noise from standard layout classes that may be falsely + * configured to accept clicks and are also enabled. + * + * @param node + * @return true if node is excluded. + */ + private static boolean nafExcludedClass(AccessibilityNodeInfo node) { + String className = safeCharSeqToString(node.getClassName()); + for (String excludedClassName : NAF_EXCLUDED_CLASSES) { + if (className.endsWith(excludedClassName)) + return true; + } + return false; + } + + /** + * We're looking for UI controls that are enabled, clickable but have no + * text nor content-description. Such controls configuration indicate an + * interactive control is present in the UI and is most likely not + * accessibility friendly. We refer to such controls here as NAF controls + * (Not Accessibility Friendly) + * + * @param node + * @return false if a node fails the check, true if all is OK + */ + private static boolean nafCheck(AccessibilityNodeInfo node) { + boolean isNaf = node.isClickable() && node.isEnabled() + && safeCharSeqToString(node.getContentDescription()).isEmpty() + && safeCharSeqToString(node.getText()).isEmpty(); + + if (!isNaf) + return true; + + // check children since sometimes the containing element is clickable + // and NAF but a child's text or description is available. Will assume + // such layout as fine. + return childNafCheck(node); + } + + /** + * This should be used when it's already determined that the node is NAF and + * a further check of its children is in order. A node maybe a container + * such as LinerLayout and may be set to be clickable but have no text or + * content description but it is counting on one of its children to fulfill + * the requirement for being accessibility friendly by having one or more of + * its children fill the text or content-description. Such a combination is + * considered by this dumper as acceptable for accessibility. + * + * @param node + * @return false if node fails the check. + */ + private static boolean childNafCheck(AccessibilityNodeInfo node) { + int childCount = node.getChildCount(); + for (int x = 0; x < childCount; x++) { + AccessibilityNodeInfo childNode = node.getChild(x); + if (childNode != null) {//wen add childNode null + if (!safeCharSeqToString(childNode.getContentDescription()).isEmpty() + || !safeCharSeqToString(childNode.getText()).isEmpty()) + return true; + + if (childNafCheck(childNode)) + return true; + } + } + return false; + } + + private static String safeCharSeqToString(CharSequence cs) { + if (cs == null) + return ""; + else { + return stripInvalidXMLChars(cs); + } + } + + private static String stripInvalidXMLChars(CharSequence cs) { + StringBuffer ret = new StringBuffer(); + char ch; + /* http://www.w3.org/TR/xml11/#charsets + [#x1-#x8], [#xB-#xC], [#xE-#x1F], [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF], + [#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF], + [#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF], + [#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF], + [#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF], + [#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF], + [#x10FFFE-#x10FFFF]. + */ + for (int i = 0; i < cs.length(); i++) { + ch = cs.charAt(i); + + if ((ch >= 0x1 && ch <= 0x8) || (ch >= 0xB && ch <= 0xC) || (ch >= 0xE && ch <= 0x1F) || + (ch >= 0x7F && ch <= 0x84) || (ch >= 0x86 && ch <= 0x9f) || + (ch >= 0xFDD0 && ch <= 0xFDDF) || (ch >= 0x1FFFE && ch <= 0x1FFFF) || + (ch >= 0x2FFFE && ch <= 0x2FFFF) || (ch >= 0x3FFFE && ch <= 0x3FFFF) || + (ch >= 0x4FFFE && ch <= 0x4FFFF) || (ch >= 0x5FFFE && ch <= 0x5FFFF) || + (ch >= 0x6FFFE && ch <= 0x6FFFF) || (ch >= 0x7FFFE && ch <= 0x7FFFF) || + (ch >= 0x8FFFE && ch <= 0x8FFFF) || (ch >= 0x9FFFE && ch <= 0x9FFFF) || + (ch >= 0xAFFFE && ch <= 0xAFFFF) || (ch >= 0xBFFFE && ch <= 0xBFFFF) || + (ch >= 0xCFFFE && ch <= 0xCFFFF) || (ch >= 0xDFFFE && ch <= 0xDFFFF) || + (ch >= 0xEFFFE && ch <= 0xEFFFF) || (ch >= 0xFFFFE && ch <= 0xFFFFF) || + (ch >= 0x10FFFE && ch <= 0x10FFFF)) + ret.append("."); + else + ret.append(ch); + } + return ret.toString(); + } +} diff --git a/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoHelper.java b/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoHelper.java new file mode 100644 index 00000000..3daea9df --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/AccessibilityNodeInfoHelper.java @@ -0,0 +1,44 @@ +package com.genymobile.scrcpy; + +import android.graphics.Rect; +import android.os.Build; +import android.view.accessibility.AccessibilityNodeInfo; + +public class AccessibilityNodeInfoHelper { + /** + * Returns the node's bounds clipped to the size of the display + * + * @param node + * @param width pixel width of the display + * @param height pixel height of the display + * @return null if node is null, else a Rect containing visible bounds + */ + static Rect getVisibleBoundsInScreen(AccessibilityNodeInfo node, int width, int height) { + if (node == null) { + return null; + } + // targeted node's bounds + Rect nodeRect = new Rect(); + node.getBoundsInScreen(nodeRect); + + Rect displayRect = new Rect(); + displayRect.top = 0; + displayRect.left = 0; + displayRect.right = width; + displayRect.bottom = height; + + nodeRect.intersect(displayRect); + + // On platforms that give us access to the node's window + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + // Trim any portion of the bounds that are outside the window + Rect window = new Rect(); + if (node.getWindow() != null) { + node.getWindow().getBoundsInScreen(window); + nodeRect.intersect(window); + } + } + + return nodeRect; + } +} diff --git a/server/src/main/java/com/genymobile/scrcpy/Common.java b/server/src/main/java/com/genymobile/scrcpy/Common.java new file mode 100644 index 00000000..7717b598 --- /dev/null +++ b/server/src/main/java/com/genymobile/scrcpy/Common.java @@ -0,0 +1,18 @@ +package com.genymobile.scrcpy; + +import android.os.Message; +import android.os.Handler; + +public class Common { + + public static void stopScrcpy(Handler handler, String obj) { + Message msg = Message.obtain(); + msg.what = 1; + msg.obj = obj; + try { + handler.sendMessage(msg); + } catch (java.lang.IllegalStateException e) { + + } + } +} \ No newline at end of file diff --git a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java index 4956c9bd..7ed4df00 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java +++ b/server/src/main/java/com/genymobile/scrcpy/ControlMessageReader.java @@ -40,11 +40,11 @@ public class ControlMessageReader { int head = buffer.position(); int r = input.read(rawBuffer, head, rawBuffer.length - head); if (r == -1) { - Ln.i("=========================================>>>"); - Ln.i("head: " + head); - Ln.i("rawBuffer.length: " + rawBuffer.length); - Ln.i("rawBuffer: " + Arrays.toString(rawBuffer)); - Ln.i("=========================================<<<"); +// Ln.i("=========================================>>>"); +// Ln.i("head: " + head); +// Ln.i("rawBuffer.length: " + rawBuffer.length); +// Ln.i("rawBuffer: " + Arrays.toString(rawBuffer)); +// Ln.i("=========================================<<<"); throw new EOFException("Controller socket closed"); } buffer.position(head + r); diff --git a/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java b/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java index f7ec577a..3295c57a 100644 --- a/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java +++ b/server/src/main/java/com/genymobile/scrcpy/DesktopConnection.java @@ -11,28 +11,39 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.net.Socket; +import java.net.ServerSocket; +import java.net.InetSocketAddress; +import java.nio.channels.SocketChannel; +import java.nio.channels.ServerSocketChannel; + public final class DesktopConnection implements Closeable { private static final int DEVICE_NAME_FIELD_LENGTH = 64; private static final String SOCKET_NAME = "scrcpy"; + private static final int SOCKET_PORT = 6612; - private final LocalSocket videoSocket; + private final Socket videoSocket; private final FileDescriptor videoFd; + private final SocketChannel videoChannel; - private final LocalSocket controlSocket; + private final Socket controlSocket; private final InputStream controlInputStream; private final OutputStream controlOutputStream; private final ControlMessageReader reader = new ControlMessageReader(); private final DeviceMessageWriter writer = new DeviceMessageWriter(); - private DesktopConnection(LocalSocket videoSocket, LocalSocket controlSocket) throws IOException { - this.videoSocket = videoSocket; - this.controlSocket = controlSocket; - controlInputStream = controlSocket.getInputStream(); - controlOutputStream = controlSocket.getOutputStream(); - videoFd = videoSocket.getFileDescriptor(); + private DesktopConnection(SocketChannel videoSocket, SocketChannel controlSocket) throws IOException { + this.videoSocket = videoSocket.socket(); + this.controlSocket = controlSocket.socket(); + controlInputStream = controlSocket.socket().getInputStream(); + controlOutputStream = controlSocket.socket().getOutputStream(); +// videoFd = videoSocket.getFileDescriptor(); + videoFd = null;//no use + videoChannel = videoSocket.socket().getChannel(); + Ln.i("videoChannel: " + videoChannel); } private static LocalSocket connect(String abstractName) throws IOException { @@ -42,10 +53,11 @@ public final class DesktopConnection implements Closeable { } public static DesktopConnection open(Device device, boolean tunnelForward) throws IOException { - LocalSocket videoSocket; - LocalSocket controlSocket; + SocketChannel videoSocket = null; + SocketChannel controlSocket = null; if (tunnelForward) { - LocalServerSocket localServerSocket = new LocalServerSocket(SOCKET_NAME); + ServerSocketChannel localServerSocket = ServerSocketChannel.open(); + localServerSocket.socket().bind(new InetSocketAddress(SOCKET_PORT)); try { videoSocket = localServerSocket.accept(); // send one byte so the client may read() to detect a connection error @@ -60,13 +72,13 @@ public final class DesktopConnection implements Closeable { localServerSocket.close(); } } else { - videoSocket = connect(SOCKET_NAME); - try { - controlSocket = connect(SOCKET_NAME); - } catch (IOException | RuntimeException e) { - videoSocket.close(); - throw e; - } +// videoSocket = connect(SOCKET_NAME); +// try { +// controlSocket = connect(SOCKET_NAME); +// } catch (IOException | RuntimeException e) { +// videoSocket.close(); +// throw e; +// } } DesktopConnection connection = new DesktopConnection(videoSocket, controlSocket); @@ -84,26 +96,30 @@ public final class DesktopConnection implements Closeable { controlSocket.close(); } - @SuppressWarnings("checkstyle:MagicNumber") - private void send(String deviceName, int width, int height) throws IOException { - byte[] buffer = new byte[DEVICE_NAME_FIELD_LENGTH + 4]; - - byte[] deviceNameBytes = deviceName.getBytes(StandardCharsets.UTF_8); - int len = StringUtils.getUtf8TruncationIndex(deviceNameBytes, DEVICE_NAME_FIELD_LENGTH - 1); - System.arraycopy(deviceNameBytes, 0, buffer, 0, len); - // byte[] are always 0-initialized in java, no need to set '\0' explicitly - - buffer[DEVICE_NAME_FIELD_LENGTH] = (byte) (width >> 8); - buffer[DEVICE_NAME_FIELD_LENGTH + 1] = (byte) width; - buffer[DEVICE_NAME_FIELD_LENGTH + 2] = (byte) (height >> 8); - buffer[DEVICE_NAME_FIELD_LENGTH + 3] = (byte) height; - IO.writeFully(videoFd, buffer, 0, buffer.length); - } +// @SuppressWarnings("checkstyle:MagicNumber") +// private void send(String deviceName, int width, int height) throws IOException { +// byte[] buffer = new byte[DEVICE_NAME_FIELD_LENGTH + 4]; +// +// byte[] deviceNameBytes = deviceName.getBytes(StandardCharsets.UTF_8); +// int len = StringUtils.getUtf8TruncationIndex(deviceNameBytes, DEVICE_NAME_FIELD_LENGTH - 1); +// System.arraycopy(deviceNameBytes, 0, buffer, 0, len); +// // byte[] are always 0-initialized in java, no need to set '\0' explicitly +// +// buffer[DEVICE_NAME_FIELD_LENGTH] = (byte) (width >> 8); +// buffer[DEVICE_NAME_FIELD_LENGTH + 1] = (byte) width; +// buffer[DEVICE_NAME_FIELD_LENGTH + 2] = (byte) (height >> 8); +// buffer[DEVICE_NAME_FIELD_LENGTH + 3] = (byte) height; +// IO.writeFully(videoFd, buffer, 0, buffer.length); +// } public FileDescriptor getVideoFd() { return videoFd; } + public SocketChannel getVideoChannel() { + return videoChannel; + } + public ControlMessage receiveControlMessage() throws IOException { ControlMessage msg = reader.next(); while (msg == null) { diff --git a/server/src/main/java/com/genymobile/scrcpy/Device.java b/server/src/main/java/com/genymobile/scrcpy/Device.java index 9448098a..98ee3ee5 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Device.java +++ b/server/src/main/java/com/genymobile/scrcpy/Device.java @@ -106,6 +106,8 @@ public final class Device { Size videoSize = screenInfo.getVideoSize(); Size clientVideoSize = position.getScreenSize(); if (!videoSize.equals(clientVideoSize)) { + Ln.i("video width: " + videoSize.getWidth() + ", video height: " + videoSize.getHeight()); + Ln.i("client width: " + clientVideoSize.getWidth() + ", client height: " + clientVideoSize.getHeight()); // The client sends a click relative to a video with wrong dimensions, // the device may have been rotated since the event was generated, so ignore the event return null; @@ -195,4 +197,8 @@ public final class Device { static Rect flipRect(Rect crop) { return new Rect(crop.top, crop.left, crop.bottom, crop.right); } + + public int getRotation() { + return serviceManager.getWindowManager().getRotation(); + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/IO.java b/server/src/main/java/com/genymobile/scrcpy/IO.java index 57c017db..da4098d2 100644 --- a/server/src/main/java/com/genymobile/scrcpy/IO.java +++ b/server/src/main/java/com/genymobile/scrcpy/IO.java @@ -1,40 +1,36 @@ package com.genymobile.scrcpy; -import android.system.ErrnoException; -import android.system.Os; -import android.system.OsConstants; - import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; public final class IO { private IO() { // not instantiable } - public static void writeFully(FileDescriptor fd, ByteBuffer from) throws IOException { + public synchronized static void writeFully(SocketChannel channel, ByteBuffer from) throws IOException { // ByteBuffer position is not updated as expected by Os.write() on old Android versions, so // count the remaining bytes manually. // See . int remaining = from.remaining(); while (remaining > 0) { try { - int w = Os.write(fd, from); + int w = channel.write(from); if (BuildConfig.DEBUG && w < 0) { // w should not be negative, since an exception is thrown on error - throw new AssertionError("Os.write() returned a negative value (" + w + ")"); + throw new AssertionError("write() returned a negative value (" + w + ")"); } remaining -= w; - } catch (ErrnoException e) { - if (e.errno != OsConstants.EINTR) { - throw new IOException(e); - } + } catch (Exception e) { + throw new IOException(e); } } } - public static void writeFully(FileDescriptor fd, byte[] buffer, int offset, int len) throws IOException { - writeFully(fd, ByteBuffer.wrap(buffer, offset, len)); + public synchronized static void writeFully(SocketChannel channel, byte[] buffer, int offset, int len) throws IOException { + writeFully(channel, ByteBuffer.wrap(buffer, offset, len)); } + } diff --git a/server/src/main/java/com/genymobile/scrcpy/JpegEncoder.java b/server/src/main/java/com/genymobile/scrcpy/JpegEncoder.java index c617f8fc..bc2668fe 100644 --- a/server/src/main/java/com/genymobile/scrcpy/JpegEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/JpegEncoder.java @@ -6,9 +6,20 @@ import java.nio.ByteBuffer; public class JpegEncoder { static { - System.loadLibrary("compress"); + try { + System.loadLibrary("compress"); + } catch (UnsatisfiedLinkError e1) { + try { + System.load("/data/local/tmp/libturbojpeg.so"); + System.load("/data/local/tmp/libcompress.so"); + } catch (UnsatisfiedLinkError e2) { + Ln.e("UnsatisfiedLinkError: " + e2.getMessage()); + System.exit(1); + } + } } public static native byte[] compress(ByteBuffer buffer, int width, int pitch, int height, int quality); + public static native void test(); } diff --git a/server/src/main/java/com/genymobile/scrcpy/Options.java b/server/src/main/java/com/genymobile/scrcpy/Options.java index 954af7ab..371b47ec 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Options.java +++ b/server/src/main/java/com/genymobile/scrcpy/Options.java @@ -14,6 +14,9 @@ public class Options { //wen add private int quality; private int scale; + private boolean controlOnly; + private boolean nalu; + private boolean dumpHierarchy; public int getMaxSize() { return maxSize; @@ -87,4 +90,27 @@ public class Options { this.scale = scale; } + public boolean getControlOnly() { + return controlOnly; + } + + public void setControlOnly(boolean controlOnly) { + this.controlOnly = controlOnly; + } + + public boolean getNALU() { + return nalu; + } + + public void setNALU(boolean nalu) { + this.nalu = nalu; + } + + public boolean getDumpHierarchy() { + return dumpHierarchy; + } + + public void setDumpHierarchy(boolean dumpHierarchy) { + this.dumpHierarchy = dumpHierarchy; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java index 1b8d6d5d..67c1ee85 100644 --- a/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java +++ b/server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java @@ -3,9 +3,6 @@ package com.genymobile.scrcpy; import com.genymobile.scrcpy.wrappers.SurfaceControl; import android.graphics.Rect; -import android.media.MediaCodec; -import android.media.MediaCodecInfo; -import android.media.MediaFormat; import android.os.Build; import android.os.IBinder; import android.view.Surface; @@ -14,11 +11,11 @@ import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import android.graphics.ImageFormat; import android.graphics.YuvImage; import android.media.Image; -import android.media.MediaExtractor; import android.util.Log; import java.io.File; @@ -36,12 +33,12 @@ import android.os.Handler; import android.os.Message; import java.util.Arrays; - -import android.os.Looper; - import java.nio.ByteOrder; import android.os.Process; +import android.os.HandlerThread; + +import java.nio.channels.SocketChannel; public class ScreenEncoder implements Device.RotationListener { @@ -51,6 +48,7 @@ public class ScreenEncoder implements Device.RotationListener { private static final int NO_PTS = -1; private final AtomicBoolean rotationChanged = new AtomicBoolean(); + private final AtomicInteger mRotation = new AtomicInteger(0); private final ByteBuffer headerBuffer = ByteBuffer.allocate(12); private int bitRate; @@ -61,9 +59,18 @@ public class ScreenEncoder implements Device.RotationListener { private int quality; private int scale; + private boolean controlOnly; private Handler mHandler; private ImageReader mImageReader; - private ImageListener mImageListener; + private HandlerThread mHandlerThread; + private ImageReader.OnImageAvailableListener imageAvailableListenerImpl; + + private Device device; + private final Object rotationLock = new Object(); + private final Object imageReaderLock = new Object(); + private boolean bImageReaderDisable = true;//Segmentation fault + + private boolean alive = true; public ScreenEncoder(boolean sendFrameMeta, int bitRate, int maxFps, int iFrameInterval) { this.sendFrameMeta = sendFrameMeta; @@ -76,219 +83,285 @@ public class ScreenEncoder implements Device.RotationListener { this(sendFrameMeta, bitRate, maxFps, DEFAULT_I_FRAME_INTERVAL); } - public ScreenEncoder(int quality, int maxFps, int scale) { - this.quality = quality; - this.maxFps = maxFps; - this.scale = scale; + public ScreenEncoder(Options options, Device device/*int rotation*/) { + this.quality = options.getQuality(); + this.maxFps = options.getMaxFps(); + this.scale = options.getScale(); + this.controlOnly = options.getControlOnly(); + this.bitRate = options.getBitRate(); + this.device = device; + mRotation.set(device.getRotation()); + + mHandlerThread = new HandlerThread("ScrcpyImageReaderHandlerThread"); + mHandlerThread.start(); + mHandler = new Handler(mHandlerThread.getLooper()) { + @Override + public void handleMessage(Message msg) { + Ln.i("hander message: " + msg); + if (msg.what == 1) {//exit + setAlive(false); + synchronized (rotationLock) { + rotationLock.notify(); + } + } + } + }; } @Override public void onRotationChanged(int rotation) { + Ln.i("rotation: " + rotation); + mRotation.set(rotation); rotationChanged.set(true); + synchronized (rotationLock) { + rotationLock.notify(); + } } public boolean consumeRotationChange() { return rotationChanged.getAndSet(false); } - private final class ImageListener implements ImageReader.OnImageAvailableListener { + private class ImageAvailableListenerImpl implements ImageReader.OnImageAvailableListener { + Handler handler; + SocketChannel fd; + Device device; + int type = 0;// 0:libjpeg-turbo 1:bitmap + int quality; + int framePeriodMs; + + int count = 0; + long lastTime = System.currentTimeMillis(); + long timeA = lastTime; + + public ImageAvailableListenerImpl(Handler handler, Device device, SocketChannel fd, int frameRate, int quality) { + this.handler = handler; + this.fd = fd; + this.device = device; + this.quality = quality; + this.framePeriodMs = (int) (1000 / frameRate); + } + @Override - public void onImageAvailable(ImageReader reader) { - Ln.i("onImageAvailable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - Ln.i("onImageAvailable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - Ln.i("onImageAvailable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - Ln.i("onImageAvailable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - Ln.i("onImageAvailable !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + public void onImageAvailable(ImageReader imageReader) { + byte[] jpegData = null; + byte[] jpegSize = null; + Image image = null; + + synchronized (imageReaderLock) { + try { + if (bImageReaderDisable) { + Ln.i("bImageReaderDisable !!!!!!!!!"); + return; + } + image = imageReader.acquireLatestImage(); + if (image == null) { + return; + } + + long currentTime = System.currentTimeMillis(); + if (framePeriodMs > currentTime - lastTime) { + return; + } + lastTime = currentTime; + + int width = image.getWidth(); + int height = image.getHeight(); + int format = image.getFormat();//RGBA_8888 0x00000001 + final Image.Plane[] planes = image.getPlanes(); + final ByteBuffer buffer = planes[0].getBuffer(); + int pixelStride = planes[0].getPixelStride(); + int rowStride = planes[0].getRowStride(); + int rowPadding = rowStride - pixelStride * width; + int pitch = width + rowPadding / pixelStride; +// Ln.i("pitch: " + pitch + ", pixelStride: " + pixelStride + ", rowStride: " + rowStride + ", rowPadding: " + rowPadding); + if (type == 0) { + jpegData = JpegEncoder.compress(buffer, width, pitch, height, quality); + } else if (type == 1) { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + Bitmap bitmap = Bitmap.createBitmap(pitch, height, Bitmap.Config.ARGB_8888); + bitmap.copyPixelsFromBuffer(buffer); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream); + jpegData = stream.toByteArray(); + bitmap.recycle(); + } + if (jpegData == null) { + Ln.e("jpegData is null"); + return; + } + ByteBuffer b = ByteBuffer.allocate(4 + jpegData.length); + b.order(ByteOrder.LITTLE_ENDIAN); + b.putInt(jpegData.length); + b.put(jpegData); + jpegSize = b.array(); + try { + IO.writeFully(fd, jpegSize, 0, jpegSize.length);// IOException + } catch (IOException e) { + Common.stopScrcpy(handler, "image"); + } + } catch (Exception e) { + Ln.e("onImageAvailable: " + e.getMessage()); + } finally { + if (image != null) { + image.close(); + } + } + } + + count++; + long timeB = System.currentTimeMillis(); + if (timeB - timeA >= 1000) { + timeA = timeB; + Ln.i("frame rate: " + count + ", jpeg size: " + jpegSize.length); + count = 0; + } } } - public void streamScreen(Device device, FileDescriptor fd) throws IOException { + public Handler getHandler() { + return mHandler; + } + + public void streamScreen(Device device, SocketChannel fd) throws IOException { Workarounds.prepareMainLooper(); Workarounds.fillAppInfo(); device.setRotationListener(this); boolean alive; try { - banner(device, fd); + writeMinicapBanner(device, fd, scale); do { -// mHandler = new Handler(Looper.getMainLooper()); - IBinder display = createDisplay(); - Rect contentRect = device.getScreenInfo().getContentRect(); -// Rect videoRect = device.getScreenInfo().getVideoSize().toRect(); - Rect videoRect = new Rect(0, 0, contentRect.width() / scale, contentRect.height() / scale); - mImageReader = ImageReader.newInstance(videoRect.width(), videoRect.height(), PixelFormat.RGBA_8888, 2); - mImageListener = new ImageListener(); - mImageReader.setOnImageAvailableListener(mImageListener, mHandler); - Surface surface = mImageReader.getSurface(); - setDisplaySurface(display, surface, contentRect, videoRect); - try { - alive = encode(mImageReader, fd); - } finally { + writeRotation(fd); + if (controlOnly) { + synchronized (rotationLock) { + try { + rotationLock.wait(); + } catch (InterruptedException e) { + } + } + } else { + IBinder display = createDisplay(); + Rect contentRect = device.getScreenInfo().getContentRect(); +// Rect videoRect = device.getScreenInfo().getVideoSize().toRect(); + Rect videoRect = getDesiredSize(contentRect, scale); + synchronized (imageReaderLock) { + mImageReader = ImageReader.newInstance(videoRect.width(), videoRect.height(), PixelFormat.RGBA_8888, 2); + bImageReaderDisable = false; + } + if (imageAvailableListenerImpl == null) { + imageAvailableListenerImpl = new ImageAvailableListenerImpl(mHandler, device, fd, maxFps, quality); + } + mImageReader.setOnImageAvailableListener(imageAvailableListenerImpl, mHandler); + Surface surface = mImageReader.getSurface(); + setDisplaySurface(display, surface, contentRect, videoRect); + synchronized (rotationLock) { + try { + rotationLock.wait(); + } catch (InterruptedException e) { + } + } + synchronized (imageReaderLock) { + if (mImageReader != null) { + bImageReaderDisable = true; + mImageReader.close(); + } + } destroyDisplay(display); surface.release(); } + alive = getAlive(); + Ln.i("alive: " + alive); } while (alive); + } catch (Exception e) { + e.printStackTrace(); + Ln.e("streamScreen: " + e.getMessage()); } finally { + if (mHandlerThread != null) { + mHandlerThread.quit(); + } device.setRotationListener(null); } } - private boolean encode(ImageReader imageReader, FileDescriptor fd) throws IOException { - int count = 0; - long current = System.currentTimeMillis(); - int type = 0;// 0:libjpeg-turbo 1:bitmap - int frameRate = this.maxFps; - int quality = this.quality; - int framePeriodMs = (int) (1000 / frameRate); - while (!consumeRotationChange()) { - long timeA = System.currentTimeMillis(); - Image image = null; - int loop = 0; - int wait = 1; - // TODO onImageAvailable这个方法不回调,未找到原因,暂时写成while - while ((image = imageReader.acquireNextImage()) == null && ++loop < 10) { - try { - Thread.sleep(wait++); - } catch (InterruptedException e) { - } - } - if (image == null) { - continue; - } - int width = image.getWidth(); - int height = image.getHeight(); - int format = image.getFormat();//RGBA_8888 0x00000001 - final Image.Plane[] planes = image.getPlanes(); - final ByteBuffer buffer = planes[0].getBuffer(); - int pixelStride = planes[0].getPixelStride(); - int rowStride = planes[0].getRowStride(); - int rowPadding = rowStride - pixelStride * width; - int pitch = width + rowPadding / pixelStride; - byte[] jpegData = null; - byte[] jpegSize = null; - if (type == 0) { - jpegData = JpegEncoder.compress(buffer, width, pitch, height, quality); - } else if (type == 1) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - Bitmap bitmap = Bitmap.createBitmap(pitch, height, Bitmap.Config.ARGB_8888); - bitmap.copyPixelsFromBuffer(buffer); - bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream); - jpegData = stream.toByteArray(); - bitmap.recycle(); - } - image.close(); - if (jpegData == null) { - Ln.e("jpegData is null"); - continue; - } - ByteBuffer b = ByteBuffer.allocate(4); - b.order(ByteOrder.LITTLE_ENDIAN); - b.putInt(jpegData.length); - jpegSize = b.array(); - IO.writeFully(fd, jpegSize, 0, jpegSize.length); - IO.writeFully(fd, jpegData, 0, jpegData.length); - - count++; - long timeB = System.currentTimeMillis(); - if (timeB - current >= 1000) { - current = timeB; - Ln.i("frame rate: " + count + ", jpeg size: " + jpegData.length); - count = 0; - } - - if (framePeriodMs > 0) { - long ms = framePeriodMs - timeB + timeA; - if (ms > 0) { - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - } - } - } + private Rect getDesiredSize(Rect contentRect, int resolution) { + int realWidth = contentRect.width(); + int realHeight = contentRect.height(); + int desiredWidth = realWidth; + int desiredHeight = realHeight; + int h = realHeight; + if (realWidth < realHeight) { + h = realWidth; } - return true; + if (h > resolution) { + desiredWidth = contentRect.width() * resolution / h; + desiredHeight = contentRect.height() * resolution / h; + desiredWidth = (desiredWidth + 4) & ~7; + desiredHeight = (desiredHeight + 4) & ~7; + } else { + desiredWidth &= ~7; + desiredHeight &= ~7; + } + Ln.i("realWidth: " + realWidth + ", realHeight: " + realHeight + ", desiredWidth: " + desiredWidth + ", desiredHeight: " + desiredHeight); + return new Rect(0, 0, desiredWidth, desiredHeight); } - // minicap banner - private void banner(Device device, FileDescriptor fd) throws IOException { + private void writeRotation(SocketChannel fd) { + ByteBuffer r = ByteBuffer.allocate(8); + r.order(ByteOrder.LITTLE_ENDIAN); + r.putInt(4); + r.putInt(mRotation.get()); + byte[] rArray = r.array(); + try { + IO.writeFully(fd, rArray, 0, rArray.length);// IOException + } catch (IOException e) { + Common.stopScrcpy(getHandler(), "rotation"); + } + } + + private void writeMinicapBanner(Device device, SocketChannel fd, int scale) throws IOException { final byte BANNER_SIZE = 24; - Rect videoRect = device.getScreenInfo().getVideoSize().toRect(); - int width = videoRect.width(); - int height = videoRect.height(); + final byte version = 1; + final byte quirks = 2; int pid = Process.myPid(); + Rect contentRect = device.getScreenInfo().getContentRect(); + Rect videoRect = getDesiredSize(contentRect, scale); + int realWidth = contentRect.width(); + int realHeight = contentRect.height(); + int desiredWidth = videoRect.width(); + int desiredHeight = videoRect.height(); + byte orientation = (byte) device.getRotation(); ByteBuffer b = ByteBuffer.allocate(BANNER_SIZE); b.order(ByteOrder.LITTLE_ENDIAN); - b.put((byte) 1);//version + b.put((byte) version);//version b.put(BANNER_SIZE);//banner size b.putInt(pid);//pid - b.putInt(width);//real width - b.putInt(height);//real height - b.putInt(width);//desired width - b.putInt(height);//desired height - b.put((byte) 0);//orientation - b.put((byte) 2);//quirks + b.putInt(realWidth);//real width + b.putInt(realHeight);//real height + b.putInt(desiredWidth);//desired width + b.putInt(desiredHeight);//desired height + b.put((byte) orientation);//orientation + b.put((byte) quirks);//quirks byte[] array = b.array(); - IO.writeFully(fd, array, 0, array.length); - } - - private void writeFrameMeta(FileDescriptor fd, MediaCodec.BufferInfo bufferInfo, int packetSize) throws IOException { - headerBuffer.clear(); - - long pts; - if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) { - pts = NO_PTS; // non-media data packet - } else { - if (ptsOrigin == 0) { - ptsOrigin = bufferInfo.presentationTimeUs; - } - pts = bufferInfo.presentationTimeUs - ptsOrigin; - } - - headerBuffer.putLong(pts); - headerBuffer.putInt(packetSize); - headerBuffer.flip(); - IO.writeFully(fd, headerBuffer); - } - - private static MediaCodec createCodec() throws IOException { - return MediaCodec.createEncoderByType("video/avc"); - } - - @SuppressWarnings("checkstyle:MagicNumber") - private static MediaFormat createFormat(int bitRate, int maxFps, int iFrameInterval) { - MediaFormat format = new MediaFormat(); - format.setString(MediaFormat.KEY_MIME, "video/avc"); - format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); - // must be present to configure the encoder, but does not impact the actual frame rate, which is variable - format.setInteger(MediaFormat.KEY_FRAME_RATE, 60); - format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); - format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); - // display the very first frame, and recover from bad quality when no new frames - format.setLong(MediaFormat.KEY_REPEAT_PREVIOUS_FRAME_AFTER, REPEAT_FRAME_DELAY_US); // µs - if (maxFps > 0) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - format.setFloat(MediaFormat.KEY_MAX_FPS_TO_ENCODER, maxFps); - } else { - Ln.w("Max FPS is only supported since Android 10, the option has been ignored"); - } - } - return format; + IO.writeFully(fd, array, 0, array.length);// IOException + Ln.i("banner\n" + + "{\n" + + " version: " + version + "\n" + + " size: " + BANNER_SIZE + "\n" + + " real width: " + realWidth + "\n" + + " real height: " + realHeight + "\n" + + " desired width: " + desiredWidth + "\n" + + " desired height: " + desiredHeight + "\n" + + " orientation: " + orientation + "\n" + + " quirks: " + quirks + "\n" + + "}\n" + ); } private static IBinder createDisplay() { return SurfaceControl.createDisplay("scrcpy", true); } - private static void configure(MediaCodec codec, MediaFormat format) { - codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); - } - - private static void setSize(MediaFormat format, int width, int height) { - format.setInteger(MediaFormat.KEY_WIDTH, width); - format.setInteger(MediaFormat.KEY_HEIGHT, height); - } - private static void setDisplaySurface(IBinder display, Surface surface, Rect deviceRect, Rect displayRect) { SurfaceControl.openTransaction(); try { @@ -303,4 +376,12 @@ public class ScreenEncoder implements Device.RotationListener { private static void destroyDisplay(IBinder display) { SurfaceControl.destroyDisplay(display); } + + private synchronized boolean getAlive() { + return alive; + } + + private synchronized void setAlive(boolean b) { + alive = b; + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 90199238..0fa73091 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -6,21 +6,30 @@ import android.os.Build; import java.io.File; import java.io.IOException; +import java.lang.System; + +import java.io.ByteArrayOutputStream; +import java.io.FileDescriptor; + +import android.os.Handler; public final class Server { private static final String SERVER_PATH = "/data/local/tmp/scrcpy-server.jar"; + private static Handler handler; private Server() { // not instantiable } private static void scrcpy(Options options) throws IOException { + AccessibilityNodeInfoDumper dumper = null; final Device device = new Device(options); boolean tunnelForward = options.isTunnelForward(); - try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) { - ScreenEncoder screenEncoder = new ScreenEncoder(options.getQuality(), options.getMaxFps(), options.getScale()); + try (DesktopConnection connection = DesktopConnection.open(device, tunnelForward)) { + ScreenEncoder screenEncoder = new ScreenEncoder(options, device); + handler = screenEncoder.getHandler(); if (options.getControl()) { Controller controller = new Controller(device, connection); @@ -29,13 +38,26 @@ public final class Server { startDeviceMessageSender(controller.getSender()); } + if (options.getDumpHierarchy()) { + dumper = new AccessibilityNodeInfoDumper(handler, device, connection); + dumper.start(); + } + try { // synchronous - screenEncoder.streamScreen(device, connection.getVideoFd()); + screenEncoder.streamScreen(device, connection.getVideoChannel()); } catch (IOException e) { + Ln.i("exit: " + e.getMessage()); + //do exit(0) + } finally { + if (options.getDumpHierarchy() && dumper != null) { + dumper.stop(); + } // this is expected on close Ln.d("Screen streaming stopped"); + System.exit(0); } + } } @@ -48,7 +70,7 @@ public final class Server { } catch (IOException e) { // this is expected on close Ln.d("Controller stopped"); - Ln.d("E:" + e.getMessage()); + Common.stopScrcpy(handler, "control"); } } }).start(); @@ -118,7 +140,10 @@ public final class Server { org.apache.commons.cli.Options options = new org.apache.commons.cli.Options(); options.addOption("Q", true, "JPEG quality (0-100)"); options.addOption("r", true, "Frame rate (frames/s)"); - options.addOption("P", true, "Display projection (scale 1,2,4...)"); + options.addOption("P", true, "Display projection (1080, 720, 480...)."); + options.addOption("c", false, "Control only"); + options.addOption("L", false, "Library path"); + options.addOption("D", false, "Dump window hierarchy"); options.addOption("h", false, "Show help"); try { commandLine = parser.parse(options, args); @@ -129,25 +154,39 @@ public final class Server { if (commandLine.hasOption('h')) { System.out.println( - "Usage: %s [-h]\n" + "Usage: [-h]\n\n" + + "jpeg:\n" + + " -r : Frame rate (frames/sec).\n" + + " -P : Display projection (1080, 720, 480, 360...).\n" + " -Q : JPEG quality (0-100).\n" - + " -r : Frame rate (frames/s).\n" - + " -P : Display projection (scale 1,2,4...).\n" + + "\n" + + " -c: Control only.\n" + + " -L: Library path.\n" + + " -D: Dump window hierarchy.\n" + " -h: Show help.\n" ); System.exit(0); } - + if (commandLine.hasOption('L')) { + System.out.println(System.getProperty("java.library.path")); + System.exit(0); + } Options o = new Options(); o.setMaxSize(0); - o.setBitRate(1000000); o.setTunnelForward(true); o.setCrop(null); - o.setSendFrameMeta(true); o.setControl(true); + // global o.setMaxFps(24); - o.setQuality(50); - o.setScale(2); + o.setScale(480); + // jpeg + o.setQuality(60); + o.setBitRate(1000000); + o.setSendFrameMeta(true); + // control + o.setControlOnly(false); + // dump + o.setDumpHierarchy(false); if (commandLine.hasOption('Q')) { int i = 0; try { @@ -178,6 +217,12 @@ public final class Server { o.setScale(i); } } + if (commandLine.hasOption('c')) { + o.setControlOnly(true); + } + if (commandLine.hasOption('D')) { + o.setDumpHierarchy(true); + } return o; } @@ -209,14 +254,14 @@ public final class Server { @SuppressWarnings("checkstyle:MagicNumber") private static void suggestFix(Throwable e) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (e instanceof MediaCodec.CodecException) { - MediaCodec.CodecException mce = (MediaCodec.CodecException) e; - if (mce.getErrorCode() == 0xfffffc0e) { - Ln.e("The hardware encoder is not able to encode at the given definition."); - Ln.e("Try with a lower definition:"); - Ln.e(" scrcpy -m 1024"); - } - } +// if (e instanceof MediaCodec.CodecException) {//api level 21 +// MediaCodec.CodecException mce = (MediaCodec.CodecException) e; +// if (mce.getErrorCode() == 0xfffffc0e) { +// Ln.e("The hardware encoder is not able to encode at the given definition."); +// Ln.e("Try with a lower definition:"); +// Ln.e(" scrcpy -m 1024"); +// } +// } } } @@ -231,10 +276,11 @@ public final class Server { // unlinkSelf(); // Options options = createOptions(args); - Options options = customOptions(args); - Ln.i("Options frame rate: " + options.getMaxFps() + " (1 ~ 100)"); + final Options options = customOptions(args); + Ln.i("Options frame rate: " + options.getMaxFps() + " (1 ~ 60)"); Ln.i("Options quality: " + options.getQuality() + " (1 ~ 100)"); - Ln.i("Options scale: " + options.getScale() + " (1,2,4...)"); + Ln.i("Options projection: " + options.getScale() + " (1080, 720, 480, 360...)"); + Ln.i("Options control only: " + options.getControlOnly() + " (true / false)"); scrcpy(options); } } diff --git a/server/src/main/java/com/genymobile/scrcpy/Size.java b/server/src/main/java/com/genymobile/scrcpy/Size.java index fd4b6971..37f50f63 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Size.java +++ b/server/src/main/java/com/genymobile/scrcpy/Size.java @@ -38,7 +38,8 @@ public final class Size { return false; } Size size = (Size) o; - return width == size.width && height == size.height; +// return width == size.width && height == size.height; + return width == size.width || height == size.height; } @Override