From b7c588a988272ce840f488f2f907ba3737247f82 Mon Sep 17 00:00:00 2001 From: gz0119 Date: Mon, 3 Mar 2025 15:16:44 +0800 Subject: [PATCH] Expand the metadata to 16 bytes, 13-16 is the screen direction --- .DS_Store | Bin 0 -> 6148 bytes app/.DS_Store | Bin 0 -> 6148 bytes app/src/demuxer.c | 15 +++++++++------ .../main/java/com/genymobile/scrcpy/Server.java | 4 ++-- .../com/genymobile/scrcpy/device/Device.java | 2 +- .../com/genymobile/scrcpy/device/Streamer.java | 16 ++++++++++++---- 6 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 .DS_Store create mode 100644 app/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2b0d21d73170425fc9a394a026c80e2cb5eb5bad GIT binary patch literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8zOq>i@0Z1N%F(jFwA}k>DKxPydB<18MF)%RfOe%oN zjZ%X<1VC}e%#g@Xz)+A>jvRkEnZ+dr2G;i=7gS zqCvcn{QR6G7&|d3EHkw{UO>b-Kd&S)GcUCWq$D^qB{eCrC?-5JFD1X+DZex?r5LOi zD#5|Y!5J?gSzT>pY^I}NXkbyRqfl*VWMHDBU~Xn!Tg%BIs;qAv6rY`wo0s1W2~9>u z2+hC?rD0SL0|NupJ7vK|c{%xc>5#<9z{XI_kjhZRPzEB0i&s%Rh2~*ckc`r!Aut*O zqalD90?kXDcykX8^4(#pUHVu9tsS{WFjS{cFJ5C#TDaF+x`gS9g-GJv%+FfxF(Gr(GY zj1cV%j8K~yp*<8vP>%*=K14eMBSbscZKK3!2#kgRA_SNrOaV~+@5;b{tN#yCHA;?# zz-R~z%Mf5>aS3*D0#%wgya%dlLG@_@R323OgQ{ajP(6(h16RdNkO4&rs4%Fy2WbV- Y;HsFB0aBBXHUwZHG)j+#0R2M%0D@tMt^fc4 literal 0 HcmV?d00001 diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b65ed92e7f2ce66779fb6000d44e8432cd0205a2 GIT binary patch literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8zj35RBCIAV8Fop~hR0Kpbg3Kr`NXp4iVqjp{nN$Fk z8|)Ow?aU0t3`GpdN#)4y&&ez!A4ToZP(pZb*1CGD2tu zUMLNtdKefOpx!A9F3QWv&r1hIHcWby9u0xf5Eu=C(GVC70R{$WCBnfy8W^J?Fd71* zA%GSFpz=Wh+I)0?(hU$ABn2uzK+R_m%>vU3?gv2BfV6_-Kw3dGNGk&)hy|7hYh_?$ zfM{g|cSAsB5~xc8qQTl37#YCY85kMB+8JOiUq*;_21bZ>23Y5X5u%-e5u%-e5uzRD zyis~I1V%#u8UoA^S^!l4yE4GD5JYs891Vfd5Ev05z{uhf?BWEjl(G94RM&#)(*&qA zsP>0c$DoRu0VEBo*1=UV6J$V90;&`w4$=yu!BsIM1EeM&Z3w_ZXp|le0s4mk0IwlQ Axc~qF literal 0 HcmV?d00001 diff --git a/app/src/demuxer.c b/app/src/demuxer.c index 885cd6ee..0eb1a171 100644 --- a/app/src/demuxer.c +++ b/app/src/demuxer.c @@ -9,7 +9,7 @@ #include "util/binary.h" #include "util/log.h" -#define SC_PACKET_HEADER_SIZE 12 +#define SC_PACKET_HEADER_SIZE 16 #define SC_PACKET_FLAG_CONFIG (UINT64_C(1) << 63) #define SC_PACKET_FLAG_KEY_FRAME (UINT64_C(1) << 62) @@ -82,11 +82,11 @@ sc_demuxer_recv_packet(struct sc_demuxer *demuxer, AVPacket *packet) { // The video and audio streams contain a sequence of raw packets (as // provided by MediaCodec), each prefixed with a "meta" header. // - // The "meta" header length is 12 bytes: - // [. . . . . . . .|. . . .]. . . . . . . . . . . . . . . ... - // <-------------> <-----> <-----------------------------... - // PTS packet raw packet - // size + // The "meta" header length is 16 bytes: + // [. . . . . . . .|. . . .][. . . .]. . . . . . . . . . . . . . . ... + // <-------------> <------> <------> <-----------------------------... + // PTS packet screen raw packet + // size orientation // // It is followed by bytes containing the packet/frame. // @@ -107,6 +107,8 @@ sc_demuxer_recv_packet(struct sc_demuxer *demuxer, AVPacket *packet) { uint64_t pts_flags = sc_read64be(header); uint32_t len = sc_read32be(&header[8]); + uint32_t screen_orientation = sc_read32be(&header[12]); + LOGD("Screen Orientation: %u", screen_orientation); assert(len); if (av_new_packet(packet, len)) { @@ -131,6 +133,7 @@ sc_demuxer_recv_packet(struct sc_demuxer *demuxer, AVPacket *packet) { } packet->dts = packet->pts; + return true; } diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 09cfd6cf..b40632f0 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -132,7 +132,7 @@ public final class Server { audioCapture = new AudioPlaybackCapture(options.getAudioDup()); } - Streamer audioStreamer = new Streamer(connection.getAudioFd(), audioCodec, options.getSendCodecMeta(), options.getSendFrameMeta()); + Streamer audioStreamer = new Streamer(connection.getAudioFd(), audioCodec, options.getSendCodecMeta(), options.getSendFrameMeta(), options.getDisplayId()); AsyncProcessor audioRecorder; if (audioCodec == AudioCodec.RAW) { audioRecorder = new AudioRawRecorder(audioCapture, audioStreamer); @@ -144,7 +144,7 @@ public final class Server { if (video) { Streamer videoStreamer = new Streamer(connection.getVideoFd(), options.getVideoCodec(), options.getSendCodecMeta(), - options.getSendFrameMeta()); + options.getSendFrameMeta(), options.getDisplayId()); SurfaceCapture surfaceCapture; if (options.getVideoSource() == VideoSource.DISPLAY) { NewDisplay newDisplay = options.getNewDisplay(); diff --git a/server/src/main/java/com/genymobile/scrcpy/device/Device.java b/server/src/main/java/com/genymobile/scrcpy/device/Device.java index 3553dc27..687ec4a4 100644 --- a/server/src/main/java/com/genymobile/scrcpy/device/Device.java +++ b/server/src/main/java/com/genymobile/scrcpy/device/Device.java @@ -210,7 +210,7 @@ public final class Device { } } - private static int getCurrentRotation(int displayId) { + public static int getCurrentRotation(int displayId) { assert displayId != DISPLAY_ID_NONE; if (displayId == 0) { diff --git a/server/src/main/java/com/genymobile/scrcpy/device/Streamer.java b/server/src/main/java/com/genymobile/scrcpy/device/Streamer.java index f54d0567..99cc343c 100644 --- a/server/src/main/java/com/genymobile/scrcpy/device/Streamer.java +++ b/server/src/main/java/com/genymobile/scrcpy/device/Streamer.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; +import com.genymobile.scrcpy.util.Ln; public final class Streamer { @@ -21,14 +22,16 @@ public final class Streamer { private final Codec codec; private final boolean sendCodecMeta; private final boolean sendFrameMeta; + private final int displayId; - private final ByteBuffer headerBuffer = ByteBuffer.allocate(12); + private final ByteBuffer headerBuffer = ByteBuffer.allocate(16); - public Streamer(FileDescriptor fd, Codec codec, boolean sendCodecMeta, boolean sendFrameMeta) { + public Streamer(FileDescriptor fd, Codec codec, boolean sendCodecMeta, boolean sendFrameMeta, int displayId) { this.fd = fd; this.codec = codec; this.sendCodecMeta = sendCodecMeta; this.sendFrameMeta = sendFrameMeta; + this.displayId = displayId; } public Codec getCodec() { @@ -76,11 +79,15 @@ public final class Streamer { } if (sendFrameMeta) { - writeFrameMeta(fd, buffer.remaining(), pts, config, keyFrame); + int screenOrientation = getScreenOrientation(); + writeFrameMeta(fd, buffer.remaining(), pts, config, keyFrame, screenOrientation); } IO.writeFully(fd, buffer); } + private int getScreenOrientation() { + return Device.getCurrentRotation(this.displayId); + } public void writePacket(ByteBuffer codecBuffer, MediaCodec.BufferInfo bufferInfo) throws IOException { long pts = bufferInfo.presentationTimeUs; @@ -89,7 +96,7 @@ public final class Streamer { writePacket(codecBuffer, pts, config, keyFrame); } - private void writeFrameMeta(FileDescriptor fd, int packetSize, long pts, boolean config, boolean keyFrame) throws IOException { + private void writeFrameMeta(FileDescriptor fd, int packetSize, long pts, boolean config, boolean keyFrame, int screenOrientation) throws IOException { headerBuffer.clear(); long ptsAndFlags; @@ -104,6 +111,7 @@ public final class Streamer { headerBuffer.putLong(ptsAndFlags); headerBuffer.putInt(packetSize); + headerBuffer.putInt(screenOrientation); headerBuffer.flip(); IO.writeFully(fd, headerBuffer); }