diff options
author | Joey Grover <joeygrover@gmail.com> | 2020-09-02 15:49:36 -0400 |
---|---|---|
committer | Joey Grover <joeygrover@gmail.com> | 2020-09-02 15:49:36 -0400 |
commit | fdfecc14481326bd18dce45b19412d4570e51941 (patch) | |
tree | 695936ecdc0eef23f29900d393342a7b1b80adbd | |
parent | 707a0a9a0620c79e6e8cfb8c269591c5e4cd9c55 (diff) | |
download | sdl_android-fdfecc14481326bd18dce45b19412d4570e51941.tar.gz |
Fix potential deadlock in media streaming classesbugfix/issue_1398
Fixes #1398
-rw-r--r-- | android/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamPacketizer.java | 8 | ||||
-rw-r--r-- | base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java | 14 |
2 files changed, 20 insertions, 2 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamPacketizer.java b/android/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamPacketizer.java index accb59948..e64b022e4 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamPacketizer.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/streaming/StreamPacketizer.java @@ -102,6 +102,8 @@ public class StreamPacketizer extends AbstractPacketizer implements IVideoStream t = null;
}
+ mOutputQueue.clear();
+
}
public void run() {
@@ -261,6 +263,10 @@ public class StreamPacketizer extends AbstractPacketizer implements IVideoStream throw new ArrayIndexOutOfBoundsException();
}
+ if (data == null || t == null || t.isInterrupted()) {
+ return;
+ }
+
// StreamPacketizer does not need to split a video frame into NAL units
ByteBuffer buffer = ByteBuffer.allocate(length);
buffer.put(data, offset, length);
@@ -274,7 +280,7 @@ public class StreamPacketizer extends AbstractPacketizer implements IVideoStream }
private void sendByteBufferData(ByteBuffer data, CompletionListener completionListener) {
- if (data == null || data.remaining() == 0) {
+ if (data == null || data.remaining() == 0 || t == null || t.isInterrupted()) {
return;
}
diff --git a/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java b/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java index 9236be7a9..0948663aa 100644 --- a/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java +++ b/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java @@ -36,6 +36,7 @@ import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.interfaces.IVideoStreamListener; import com.smartdevicelink.streaming.AbstractPacketizer; import com.smartdevicelink.streaming.IStreamListener; +import com.smartdevicelink.util.DebugTool; import java.io.IOException; import java.nio.ByteBuffer; @@ -62,6 +63,8 @@ import java.util.concurrent.LinkedBlockingQueue; */ public class RTPH264Packetizer extends AbstractPacketizer implements IVideoStreamListener, Runnable { + private static final String TAG = "RTPH264Packetizer"; + // Approximate size of data that mOutputQueue can hold in bytes. // By adding a buffer, we accept underlying transport being stuck for a short time. By setting // a limit of the buffer size, we avoid buffer overflows when underlying transport is too slow. @@ -170,6 +173,10 @@ public class RTPH264Packetizer extends AbstractPacketizer implements IVideoStrea return; } + if(mOutputQueue != null){ + mOutputQueue.clear(); + } + mThread = new Thread(this); mThread.start(); } @@ -293,13 +300,18 @@ public class RTPH264Packetizer extends AbstractPacketizer implements IVideoStrea } private boolean outputRTPFrames(ByteBuffer nalUnit, long ptsInUs, boolean isLast) { + if((mThread == null || mThread.isInterrupted())) { + DebugTool.logError(TAG, "Dropping potential buffer because consumer thread is not alive"); + return false; + } + if (RTP_HEADER_LEN + nalUnit.remaining() > MAX_RTP_PACKET_SIZE) { // Split into multiple Fragmentation Units ([5.8] in RFC 6184) byte firstByte = nalUnit.get(); boolean firstFragment = true; boolean lastFragment = false; - while (nalUnit.remaining() > 0) { + while (nalUnit.remaining() > 0 && mThread != null && !mThread.isInterrupted()) { int payloadLength = MAX_RTP_PACKET_SIZE - (RTP_HEADER_LEN + FU_INDICATOR_LEN + FU_HEADER_LEN); if (nalUnit.remaining() <= payloadLength) { payloadLength = nalUnit.remaining(); |