From 47ea158c4c782e2b7d261477efbfecd9646a9af5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 19 Feb 2016 11:27:37 -0500 Subject: [PATCH] Fix random broken video on H265 --- .../nvstream/av/video/VideoDepacketizer.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) 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 51214dc7..45d344fd 100644 --- a/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java +++ b/moonlight-common/src/com/limelight/nvstream/av/video/VideoDepacketizer.java @@ -132,6 +132,26 @@ public class VideoDepacketizer { frameDataLength = 0; } + private static boolean isReferencePictureNalu(byte nalType) { + switch (nalType) { + case 0x20: + case 0x22: + case 0x24: + case 0x26: + case 0x28: + case 0x2A: + // H265 + return true; + + case 0x65: + // H264 + return true; + + default: + return false; + } + } + private void reassembleFrame(int frameNumber) { // This is the start of a new frame @@ -148,18 +168,16 @@ public class VideoDepacketizer { case 0x44: // PPS flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG; break; - case 0x26: // I-frame - flags |= DecodeUnit.DU_FLAG_SYNC_FRAME; - break; // H264 case 0x67: // SPS case 0x68: // PPS flags |= DecodeUnit.DU_FLAG_CODEC_CONFIG; break; - case 0x65: // I-frame + } + + if (isReferencePictureNalu(cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length])) { flags |= DecodeUnit.DU_FLAG_SYNC_FRAME; - break; } } @@ -256,8 +274,7 @@ public class VideoDepacketizer { // Reassemble any pending NAL reassembleFrame(packet.getFrameIndex()); - if (cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length] == 0x65 || // H264 I-Frame - cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length] == 0x26) { // H265 I-Frame + if (isReferencePictureNalu(cachedSpecialDesc.data[cachedSpecialDesc.offset+cachedSpecialDesc.length])) { // This is the NALU code for I-frame data waitingForIdrFrame = false; }