summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Grover <joeygrover@gmail.com>2020-09-02 15:49:36 -0400
committerJoey Grover <joeygrover@gmail.com>2020-09-02 15:49:36 -0400
commitfdfecc14481326bd18dce45b19412d4570e51941 (patch)
tree695936ecdc0eef23f29900d393342a7b1b80adbd
parent707a0a9a0620c79e6e8cfb8c269591c5e4cd9c55 (diff)
downloadsdl_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.java8
-rw-r--r--base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java14
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();