Эх сурвалжийг харах

Merge pull request #1886 from nextcloud/bugfix/1852/black-screen-or-single-videoframe-for-audiocalls

 Use Transceivers instead of constraints to discard received video tracks
Marcel Hibbe 3 жил өмнө
parent
commit
3e941edc24

+ 16 - 1
app/src/main/java/com/nextcloud/talk/adapters/ParticipantsAdapter.java

@@ -19,6 +19,7 @@ import com.nextcloud.talk.activities.CallActivity;
 import com.nextcloud.talk.utils.DisplayUtils;
 
 import org.webrtc.MediaStream;
+import org.webrtc.MediaStreamTrack;
 import org.webrtc.RendererCommon;
 import org.webrtc.SurfaceViewRenderer;
 import org.webrtc.VideoTrack;
@@ -140,7 +141,21 @@ public class ParticipantsAdapter extends BaseAdapter {
     }
 
     private boolean hasVideoStream(ParticipantDisplayItem participantDisplayItem, MediaStream mediaStream) {
-        return mediaStream != null && mediaStream.videoTracks != null && mediaStream.videoTracks.size() > 0 && participantDisplayItem.isStreamEnabled();
+        if (!participantDisplayItem.isStreamEnabled()) {
+            return false;
+        }
+
+        if (mediaStream == null || mediaStream.videoTracks == null) {
+            return false;
+        }
+
+        for (VideoTrack t : mediaStream.videoTracks) {
+            if (MediaStreamTrack.State.LIVE == t.state()) {
+                return true;
+            }
+        }
+
+        return false;
     }
 
     private int scaleGridViewItemHeight() {

+ 27 - 1
app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java

@@ -44,9 +44,11 @@ import org.webrtc.DataChannel;
 import org.webrtc.IceCandidate;
 import org.webrtc.MediaConstraints;
 import org.webrtc.MediaStream;
+import org.webrtc.MediaStreamTrack;
 import org.webrtc.PeerConnection;
 import org.webrtc.PeerConnectionFactory;
 import org.webrtc.RtpReceiver;
+import org.webrtc.RtpTransceiver;
 import org.webrtc.SdpObserver;
 import org.webrtc.SessionDescription;
 import org.webrtc.VideoTrack;
@@ -256,6 +258,15 @@ public class PeerConnectionWrapper {
         return isMCUPublisher;
     }
 
+    private boolean shouldReceiveVideo() {
+        for (MediaConstraints.KeyValuePair keyValuePair : mediaConstraints.mandatory) {
+            if ("OfferToReceiveVideo".equals(keyValuePair.getKey())) {
+                return !Boolean.parseBoolean(keyValuePair.getValue());
+            }
+        }
+        return false;
+    }
+
     private class MagicDataChannelObserver implements DataChannel.Observer {
 
         @Override
@@ -444,7 +455,22 @@ public class PeerConnectionWrapper {
         public void onSetSuccess() {
             if (peerConnection != null) {
                 if (peerConnection.getLocalDescription() == null) {
-                    peerConnection.createAnswer(magicSdpObserver, mediaConstraints);
+
+                    if (shouldReceiveVideo()) {
+                        for (RtpTransceiver t : peerConnection.getTransceivers()) {
+                            if (t.getMediaType().equals(MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO)) {
+                                t.stop();
+                            }
+                        }
+                        Log.d(TAG, "Stop all Transceivers for MEDIA_TYPE_VIDEO.");
+                    }
+
+                    /*
+                        Passed 'MediaConstraints' will be ignored by WebRTC when using UNIFIED PLAN.
+                        See for details: https://docs.google.com/document/d/1PPHWV6108znP1tk_rkCnyagH9FK205hHeE9k5mhUzOg/edit#heading=h.9dcmkavg608r
+                     */
+                    peerConnection.createAnswer(magicSdpObserver, new MediaConstraints());
+
                 }
 
                 if (peerConnection.getRemoteDescription() != null) {