summaryrefslogtreecommitdiff
path: root/base/src/main/java/com/smartdevicelink
diff options
context:
space:
mode:
authorJulian Kast <Julian.kast@livio.io>2020-09-21 09:44:52 -0400
committerGitHub <noreply@github.com>2020-09-21 09:44:52 -0400
commitc003e108393c51dff1ec4971987ef38c793673f1 (patch)
tree6941a8e925aaf18759978dbb43925eab3f1a64fc /base/src/main/java/com/smartdevicelink
parentcc044f0869f23fbf3198b0ecf11ffb25f7a56288 (diff)
parentfdfecc14481326bd18dce45b19412d4570e51941 (diff)
downloadsdl_android-c003e108393c51dff1ec4971987ef38c793673f1.tar.gz
Merge pull request #1480 from smartdevicelink/bugfix/issue_1398
Fix Issue 1398 - Avoid deadlock from using blocking queues
Diffstat (limited to 'base/src/main/java/com/smartdevicelink')
-rw-r--r--base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java14
1 files changed, 13 insertions, 1 deletions
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 6a98c879e..241186340 100644
--- a/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java
+++ b/base/src/main/java/com/smartdevicelink/streaming/video/RTPH264Packetizer.java
@@ -37,6 +37,7 @@ import com.smartdevicelink.protocol.ProtocolMessage;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.streaming.AbstractPacketizer;
import com.smartdevicelink.streaming.IStreamListener;
+import com.smartdevicelink.util.DebugTool;
import java.io.IOException;
import java.nio.ByteBuffer;
@@ -64,6 +65,8 @@ import java.util.concurrent.LinkedBlockingQueue;
@RestrictTo(RestrictTo.Scope.LIBRARY)
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.
@@ -172,6 +175,10 @@ public class RTPH264Packetizer extends AbstractPacketizer implements IVideoStrea
return;
}
+ if(mOutputQueue != null){
+ mOutputQueue.clear();
+ }
+
mThread = new Thread(this);
mThread.start();
}
@@ -295,13 +302,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();