diff options
author | Julian Kast <Julian.kast@livio.io> | 2020-09-21 09:44:52 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-21 09:44:52 -0400 |
commit | c003e108393c51dff1ec4971987ef38c793673f1 (patch) | |
tree | 6941a8e925aaf18759978dbb43925eab3f1a64fc /base/src/main/java/com/smartdevicelink | |
parent | cc044f0869f23fbf3198b0ecf11ffb25f7a56288 (diff) | |
parent | fdfecc14481326bd18dce45b19412d4570e51941 (diff) | |
download | sdl_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.java | 14 |
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(); |