diff --git a/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java b/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java index 61feae5e..a102f8ec 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java +++ b/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java @@ -14,7 +14,6 @@ public class VideoDepacketizer { private LinkedList avcNalDataChain = null; private int avcNalDataLength = 0; private int currentlyDecoding = DecodeUnit.TYPE_UNKNOWN; - private boolean splitFrame = false; // Sequencing state private short lastSequenceNumber; @@ -175,15 +174,9 @@ public class VideoDepacketizer { // Remove extra padding location.length = packet.getPayloadLength(); - boolean firstPacket = !splitFrame && packetIndex == 0; - - // Reset split frame state on next frame start - if (packetIndex == 0) { - splitFrame = false; - } - + boolean firstPacket = (packet.getFlags() & VideoPacket.FLAG_SOF) != 0; if (firstPacket) - { + { if (NAL.getSpecialSequenceDescriptor(location, cachedDesc) && NAL.isAvcFrameStart(cachedDesc) && cachedDesc.data[cachedDesc.offset+cachedDesc.length] == 0x67) { @@ -195,12 +188,8 @@ public class VideoDepacketizer { addInputDataFast(packet, location, firstPacket); - if (!splitFrame && packetIndex + 1 == packetsInFrame) { - // Reassemble the frame if this was the last packet and it's not a split frame - if (packet.getPayloadLength() == 968) - splitFrame = true; - else - reassembleAvcNal(); + if ((packet.getFlags() & VideoPacket.FLAG_EOF) != 0) { + reassembleAvcNal(); } } diff --git a/moonlight-common/src/com/limelight/nvstream/av/video/VideoPacket.java b/moonlight-common/src/com/limelight/nvstream/av/video/VideoPacket.java index a74da573..78b21c97 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/video/VideoPacket.java +++ b/moonlight-common/src/com/limelight/nvstream/av/video/VideoPacket.java @@ -12,6 +12,10 @@ public class VideoPacket { private int packetIndex; private int totalPackets; private int payloadLength; + private int flags; + + public static final int FLAG_EOF = 0x2; + public static final int FLAG_SOF = 0x4; public VideoPacket(ByteBufferDescriptor rtpPayload) { @@ -23,12 +27,15 @@ public class VideoPacket { frameIndex = bb.getInt(); packetIndex = bb.getInt(); totalPackets = bb.getInt(); - - bb.position(bb.position()+4); - + flags = bb.getInt(); payloadLength = bb.getInt(); } + public int getFlags() + { + return flags; + } + public int getFrameIndex() { return frameIndex;