diff options
author | Lyubomir Marinov <lyubomir.marinov@jitsi.org> | 2012-08-18 00:59:58 +0000 |
---|---|---|
committer | Lyubomir Marinov <lyubomir.marinov@jitsi.org> | 2012-08-18 00:59:58 +0000 |
commit | a2bf866ce0c80121019cf3a05b0e0e4a249a9a79 (patch) | |
tree | 29a46b3cbda938aa1fcd6e27ec3f570763de26eb /src/net/java/sip/communicator | |
parent | d100493139446a9fc27e40932b1bb9dabd1e0a8f (diff) | |
download | jitsi-a2bf866ce0c80121019cf3a05b0e0e4a249a9a79.zip jitsi-a2bf866ce0c80121019cf3a05b0e0e4a249a9a79.tar.gz jitsi-a2bf866ce0c80121019cf3a05b0e0e4a249a9a79.tar.bz2 |
Fixes issues with video conferencing such as a failure of the local video to be displayed and a limitation of the conference focus with respect to requiring it to capture video as well.
Diffstat (limited to 'src/net/java/sip/communicator')
17 files changed, 414 insertions, 402 deletions
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/UIVideoHandler.java b/src/net/java/sip/communicator/impl/gui/main/call/UIVideoHandler.java index 60759c3..eef78a0 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/UIVideoHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/UIVideoHandler.java @@ -249,10 +249,9 @@ public class UIVideoHandler if (!isLocalVideoListenerAdded) { + isLocalVideoListenerAdded = true; telephony.addPropertyChangeListener( call, videoTelephonyListener); - - isLocalVideoListenerAdded = true; } synchronized (videoContainers) @@ -381,10 +380,7 @@ public class UIVideoHandler isLocalVideoListenerAdded = false; if (localVideo != null) - { - telephony.disposeLocalVisualComponent(callPeer, localVideo); localVideo = null; - } } synchronized (videoContainers) @@ -976,8 +972,7 @@ public class UIVideoHandler { try { - videoTelephony.createLocalVisualComponent( - callPeer, listener); + videoTelephony.getLocalVisualComponent(callPeer); } catch (OperationFailedException ex) { @@ -989,8 +984,6 @@ public class UIVideoHandler } else if (localVideo != null) { - videoTelephony.disposeLocalVisualComponent( - callPeer, localVideo); handleVideoEvent( callPeer.getCall(), new VideoEvent( @@ -1452,19 +1445,19 @@ public class UIVideoHandler return; } - if(videoType == VideoEvent.LOCAL && localVideo != null) - { - localVideo.addMouseMotionListener( - localVideoListener); - localVideo.addMouseListener( - localVideoListener); - } - else if(videoType == VideoEvent.REMOTE) + switch (videoType) { - if(allowRemoteControl) + case VideoEvent.LOCAL: + if (localVideo != null) { - addMouseAndKeyListeners(); + localVideo.addMouseMotionListener(localVideoListener); + localVideo.addMouseListener(localVideoListener); } + break; + case VideoEvent.REMOTE: + if (allowRemoteControl) + addMouseAndKeyListeners(); + break; } } @@ -1480,13 +1473,10 @@ public class UIVideoHandler { this.localVideoVisible = isVisible; - if (isVisible - != callRenderer.getCallContainer() - .isShowHideVideoButtonSelected()) - { - callRenderer.getCallContainer() - .setShowHideVideoButtonSelected(isVisible); - } + CallPanel callContainer = callRenderer.getCallContainer(); + + if (isVisible != callContainer.isShowHideVideoButtonSelected()) + callContainer.setShowHideVideoButtonSelected(isVisible); int videoContainerCount; diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/AbstractCallPeerMediaHandlerJabberGTalkImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/AbstractCallPeerMediaHandlerJabberGTalkImpl.java index 0600d97..7961a89 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/AbstractCallPeerMediaHandlerJabberGTalkImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/AbstractCallPeerMediaHandlerJabberGTalkImpl.java @@ -11,12 +11,10 @@ import ch.imvs.sdes4j.srtp.*; import java.util.*; import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*; -import net.java.sip.communicator.impl.protocol.jabber.jinglesdp.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.media.*; import net.java.sip.communicator.util.*; -import org.jitsi.impl.neomedia.transform.sdes.*; import org.jitsi.service.neomedia.*; import org.jivesoftware.smack.packet.*; @@ -248,30 +246,21 @@ public abstract class AbstractCallPeerMediaHandlerJabberGTalkImpl SDesControl sDesControl, EncryptionPacketExtension encryptionPacketExtension) { - List<CryptoPacketExtension> cryptoPacketExtensions = - encryptionPacketExtension.getCryptoList(); + List<CryptoPacketExtension> cryptoPacketExtensions + = encryptionPacketExtension.getCryptoList(); Vector<SrtpCryptoAttribute> peerAttributes = new Vector<SrtpCryptoAttribute>(cryptoPacketExtensions.size()); - for(int i = 0; i < cryptoPacketExtensions.size(); ++i) - { - peerAttributes.add( - cryptoPacketExtensions.get(i).toSrtpCryptoAttribute()); - } + for (CryptoPacketExtension cpe : cryptoPacketExtensions) + peerAttributes.add(cpe.toSrtpCryptoAttribute()); - if(peerAttributes == null) - { + if (peerAttributes == null) return null; - } - if(isInitiator) - { + if (isInitiator) return sDesControl.initiatorSelectAttribute(peerAttributes); - } else - { return sDesControl.responderSelectAttribute(peerAttributes); - } } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java index 8444d90..051fe47 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallJabberImpl.java @@ -170,7 +170,7 @@ public class CallJabberImpl CoinPacketExtension.ELEMENT_NAME, CoinPacketExtension.NAMESPACE); - if(coin != null) + if (coin != null) { boolean b = Boolean.parseBoolean( @@ -186,21 +186,23 @@ public class CallJabberImpl // if paranoia is set, to accept the call we need to know that // the other party has support for media encryption - if(getProtocolProvider().getAccountID().getAccountPropertyBoolean( + if (getProtocolProvider().getAccountID().getAccountPropertyBoolean( ProtocolProviderFactory.MODE_PARANOIA, false) - && callPeer.getMediaHandler().getAdvertisedEncryptionMethods().length + && callPeer.getMediaHandler().getAdvertisedEncryptionMethods() + .length == 0) { //send an error response; - String reasonText = - JabberActivator.getResources().getI18NString( - "service.gui.security.encryption.required"); - JingleIQ errResp = JinglePacketFactory.createSessionTerminate( - jingleIQ.getTo(), - jingleIQ.getFrom(), - jingleIQ.getSID(), - Reason.SECURITY_ERROR, - reasonText); + String reasonText + = JabberActivator.getResources().getI18NString( + "service.gui.security.encryption.required"); + JingleIQ errResp + = JinglePacketFactory.createSessionTerminate( + jingleIQ.getTo(), + jingleIQ.getFrom(), + jingleIQ.getSID(), + Reason.SECURITY_ERROR, + reasonText); callPeer.setState(CallPeerState.FAILED, reasonText); getProtocolProvider().getConnection().sendPacket(errResp); @@ -208,13 +210,13 @@ public class CallJabberImpl return null; } - if( callPeer.getState() == CallPeerState.FAILED) + if (callPeer.getState() == CallPeerState.FAILED) return null; callPeer.setState( CallPeerState.INCOMING_CALL ); // in case of attended transfer, auto answer the call - if(autoAnswer) + if (autoAnswer) { /* answer directly */ try @@ -256,35 +258,36 @@ public class CallJabberImpl directions.put(MediaType.AUDIO, MediaDirection.INACTIVE); directions.put(MediaType.VIDEO, MediaDirection.INACTIVE); - for(ContentPacketExtension c : offer) + for (ContentPacketExtension c : offer) { String contentName = c.getName(); MediaDirection remoteDirection = JingleUtils.getDirection(c, callPeer.isInitiator()); - if(MediaType.AUDIO.toString().equals(contentName)) + if (MediaType.AUDIO.toString().equals(contentName)) directions.put(MediaType.AUDIO, remoteDirection); - else if(MediaType.VIDEO.toString().equals(contentName)) + else if (MediaType.VIDEO.toString().equals(contentName)) directions.put(MediaType.VIDEO, remoteDirection); } // if this was the first peer we added in this call then the call is // new and we also need to notify everyone of its creation. - if(this.getCallPeerCount() == 1 && getCallGroup() == null) - parentOpSet.fireCallEvent(CallEvent.CALL_RECEIVED, this, - directions); + if ((getCallPeerCount() == 1) && (getCallGroup() == null)) + { + parentOpSet.fireCallEvent( + CallEvent.CALL_RECEIVED, + this, + directions); + } // Manages auto answer with "audio only", or "audio / video" answer. OperationSetAutoAnswerJabberImpl autoAnswerOpSet = (OperationSetAutoAnswerJabberImpl) - this.getProtocolProvider() - .getOperationSet(OperationSetBasicAutoAnswer.class); + getProtocolProvider().getOperationSet( + OperationSetBasicAutoAnswer.class); - if(autoAnswerOpSet != null) - { + if (autoAnswerOpSet != null) autoAnswerOpSet.autoAnswer(this, directions); - } - return callPeer; } @@ -352,9 +355,11 @@ public class CallJabberImpl /* enable remote-control if it is a desktop sharing session */ mediaHandler.setLocalInputEvtAware(getLocalInputEvtAware()); - //set call state to connecting so that the user interface would start - //playing the tones. we do that here because we may be harvesting - //STUN/TURN addresses in initiateSession() which would take a while. + /* + * Set call state to connecting so that the user interface would start + * playing the tones. We do that here because we may be harvesting + * STUN/TURN addresses in initiateSession() which would take a while. + */ callPeer.setState(CallPeerState.CONNECTING); // if initializing session fails, set peer to failed @@ -375,21 +380,25 @@ public class CallJabberImpl } /** - * Send a <tt>content-modify</tt> message for all current <tt>CallPeer</tt> - * to reflect possible video change in media setup. + * Sends a <tt>content-modify</tt> message to each of the current + * <tt>CallPeer</tt>s to reflect a possible change in the media setup + * related to video. * - * @param allowed if the local video is allowed or not - * @throws OperationFailedException if problem occurred during message - * generation or network problem + * @param allowed <tt>true</tt> if the streaming of the local video to the + * remote peer is allowed; otherwise, <tt>false</tt> + * @throws OperationFailedException if a problem occurred during message + * generation or there was a network problem */ public void modifyVideoContent(boolean allowed) throws OperationFailedException { - if(logger.isInfoEnabled()) - logger.info(allowed ? "Start local video streaming" : - "Stop local video streaming"); + if (logger.isInfoEnabled()) + { + logger.info( + (allowed ? "Start" : "Stop") + " local video streaming"); + } - for(CallPeerJabberImpl peer : getCallPeersVector()) + for (CallPeerJabberImpl peer : getCallPeersVector()) peer.sendModifyVideoContent(allowed); } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerGTalkImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerGTalkImpl.java index 11b3cd1..30e6644 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerGTalkImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerGTalkImpl.java @@ -13,7 +13,6 @@ import net.java.sip.communicator.impl.protocol.jabber.extensions.gtalk.*; import net.java.sip.communicator.impl.protocol.jabber.extensions.jingle.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; -import net.java.sip.communicator.service.protocol.media.*; import net.java.sip.communicator.util.*; import org.jivesoftware.smack.packet.*; diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java index 551e97f..e0eefe8 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerJabberImpl.java @@ -963,7 +963,7 @@ public class CallPeerJabberImpl { logger.warn("Exception occurred during media reinitialization", e); } - } + } /** * Processes the content-add {@link JingleIQ}. @@ -980,8 +980,15 @@ public class CallPeerJabberImpl boolean noCands = false; logger.info("nocand " + noCands); - logger.info("run code"); + + /* + * If a remote peer turns her video on in a conference which is hosted + * by the local peer and the local peer is not streaming her local + * video, reinvite the other remote peers to enable RTP translation. + */ + MediaStream oldVideoStream = mediaHandler.getStream(MediaType.VIDEO); + try { if(!contentAddWithNoCands) @@ -1063,6 +1070,30 @@ public class CallPeerJabberImpl getProtocolProvider().getConnection().sendPacket(contentIQ); mediaHandler.start(); + + /* + * If a remote peer turns her video on in a conference which is hosted + * by the local peer and the local peer is not streaming her local + * video, reinvite the other remote peers to enable RTP translation. + */ + if (oldVideoStream == null) + { + MediaStream newVideoStream + = mediaHandler.getStream(MediaType.VIDEO); + + if ((newVideoStream != null) + && mediaHandler.isRTPTranslationEnabled()) + { + try + { + getCall().modifyVideoContent(true); + } + catch (OperationFailedException ofe) + { + logger.error("Failed to enable RTP translation", ofe); + } + } + } } /** @@ -1111,8 +1142,8 @@ public class CallPeerJabberImpl try { boolean modify = false; - if(ext.getFirstChildOfType(RtpDescriptionPacketExtension.class) != - null) + if(ext.getFirstChildOfType(RtpDescriptionPacketExtension.class) + != null) { modify = true; } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java index a97fefe..5469e92 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/CallPeerMediaHandlerJabberImpl.java @@ -54,7 +54,7 @@ public class CallPeerMediaHandlerJabberImpl * remote side. We use {@link LinkedHashMap}s to make sure that we preserve * the order of the individual content extensions. */ - private Map<String, ContentPacketExtension> localContentMap + private final Map<String, ContentPacketExtension> localContentMap = new LinkedHashMap<String, ContentPacketExtension>(); /** @@ -62,7 +62,7 @@ public class CallPeerMediaHandlerJabberImpl * We use {@link LinkedHashMap}s to make sure that we preserve * the order of the individual content extensions. */ - private Map<String, ContentPacketExtension> remoteContentMap + private final Map<String, ContentPacketExtension> remoteContentMap = new LinkedHashMap<String, ContentPacketExtension>(); /** @@ -77,9 +77,9 @@ public class CallPeerMediaHandlerJabberImpl private boolean supportQualityControls = false; /** - * The current quality controls for this peer media handler if any. + * The <tt>QualityControl</tt> of this <tt>CallPeerMediaHandler</tt>. */ - private QualityControlWrapper qualityControls = null; + private final QualityControlWrapper qualityControls; /** * Creates a new handler that will be managing media streams for @@ -91,6 +91,7 @@ public class CallPeerMediaHandlerJabberImpl public CallPeerMediaHandlerJabberImpl(CallPeerJabberImpl peer) { super(peer); + qualityControls = new QualityControlWrapper(peer); } @@ -196,7 +197,7 @@ public class CallPeerMediaHandlerJabberImpl MediaStreamTarget target, MediaDirection direction, List<RTPExtension> rtpExtensions, - boolean masterStream) + boolean masterStream) throws OperationFailedException { MediaStream stream @@ -209,7 +210,7 @@ public class CallPeerMediaHandlerJabberImpl rtpExtensions, masterStream); - if(stream != null) + if (stream != null) stream.setName(streamName); return stream; @@ -266,8 +267,8 @@ public class CallPeerMediaHandlerJabberImpl // determine the direction that we need to announce. MediaDirection remoteDirection = JingleUtils.getDirection( content, getPeer().isInitiator()); - MediaDirection direction = devDirection - .getDirectionForAnswer(remoteDirection); + MediaDirection direction + = devDirection.getDirectionForAnswer(remoteDirection); // intersect the MediaFormats of our device with remote ones List<MediaFormat> mutuallySupportedFormats @@ -315,14 +316,14 @@ public class CallPeerMediaHandlerJabberImpl : (target != null) ? target.getDataAddress().getPort() : 0; /* - * TODO If the offered transport is not supported, attempt to - * fall back to a supported one using transport-replace. + * TODO If the offered transport is not supported, attempt to fall + * back to a supported one using transport-replace. */ setTransportManager(transport.getNamespace()); if (mutuallySupportedFormats.isEmpty() - || (devDirection == MediaDirection.INACTIVE) - || (targetDataPort == 0)) + || (devDirection == MediaDirection.INACTIVE) + || (targetDataPort == 0)) { // skip stream and continue. contrary to sip we don't seem to // need to send per-stream disabling answer and only one at the @@ -368,8 +369,8 @@ public class CallPeerMediaHandlerJabberImpl description); } - // got an content which have inputevt, it means that peer requests - // a desktop sharing session so tell it we support inputevt + // Got a content which has inputevt. It means that the peer requests + // a desktop sharing session so tell it we support inputevt. if(content.getChildExtensionsOfType(InputEvtPacketExtension.class) != null) { @@ -449,14 +450,17 @@ public class CallPeerMediaHandlerJabberImpl RtpDescriptionPacketExtension> contents = new HashMap<ContentPacketExtension, RtpDescriptionPacketExtension>(); + for(ContentPacketExtension ourContent : sessAccept) { RtpDescriptionPacketExtension description - = JingleUtils.getRtpDescription(ourContent); + = JingleUtils.getRtpDescription(ourContent); + contents.put(ourContent, description); } boolean masterStreamSet = false; + for(Map.Entry<ContentPacketExtension, RtpDescriptionPacketExtension> en : contents.entrySet()) { @@ -480,9 +484,11 @@ public class CallPeerMediaHandlerJabberImpl = JingleUtils.getDirection(ourContent, !peer.isInitiator()); // if we answer with video, tell remote peer that video direction is - // sendrecv, and whether video device can capture(send) - if(type == MediaType.VIDEO && isLocalVideoTransmissionEnabled() - && dev.getDirection().allowsSending()) + // sendrecv, and whether video device can capture/send + if ((type == MediaType.VIDEO) + && (isLocalVideoTransmissionEnabled() + || isRTPTranslationEnabled()) + && dev.getDirection().allowsSending()) { direction = MediaDirection.SENDRECV; ourContent.setSenders(ContentPacketExtension.SendersEnum.both); @@ -503,15 +509,13 @@ public class CallPeerMediaHandlerJabberImpl = JingleUtils.payloadTypeToMediaFormat( payload, getDynamicPayloadTypes()); - if(format != null) break; } if(format == null) { - ProtocolProviderServiceJabberImpl. - throwOperationFailedException( + ProtocolProviderServiceJabberImpl.throwOperationFailedException( "No matching codec.", OperationFailedException.ILLEGAL_ARGUMENT, null, @@ -521,8 +525,9 @@ public class CallPeerMediaHandlerJabberImpl //extract the extensions that we are advertising: // check whether we will be exchanging any RTP extensions. List<RTPExtension> rtpExtensions - = JingleUtils.extractRTPExtensions( - description, this.getRtpExtensionsRegistry()); + = JingleUtils.extractRTPExtensions( + description, + this.getRtpExtensionsRegistry()); Map<String, String> adv = format.getAdvancedAttributes(); if(adv != null) @@ -554,8 +559,15 @@ public class CallPeerMediaHandlerJabberImpl } // create the corresponding stream... - initStream(ourContent.getName(), connector, dev, format, target, - direction, rtpExtensions, masterStream); + initStream( + ourContent.getName(), + connector, + dev, + format, + target, + direction, + rtpExtensions, + masterStream); } return sessAccept; } @@ -573,11 +585,16 @@ public class CallPeerMediaHandlerJabberImpl private ContentPacketExtension createContent(MediaDevice dev) throws OperationFailedException { - MediaDirection direction - = dev.getDirection().and( - getDirectionUserPreference(dev.getMediaType())); + MediaType mediaType = dev.getMediaType(); + MediaDirection direction = dev.getDirection(); - if(isLocallyOnHold()) + /* + * In the case of RTP translation performed by the conference focus, + * the conference focus is not required to capture media. + */ + if (!(MediaType.VIDEO.equals(mediaType) && isRTPTranslationEnabled())) + direction = direction.and(getDirectionUserPreference(mediaType)); + if (isLocallyOnHold()) direction = direction.and(MediaDirection.SENDONLY); QualityPreset sendQualityPreset = null; @@ -585,36 +602,30 @@ public class CallPeerMediaHandlerJabberImpl if(qualityControls != null) { - // the one we will send is the one the other part has announced - // as receive + // the one we will send is the one the remote has announced as + // receive sendQualityPreset = qualityControls.getRemoteReceivePreset(); - // the one we want to receive is the setting that remote - // can send + // the one we want to receive is the one the remote can send receiveQualityPreset = qualityControls.getRemoteSendMaxPreset(); } if(direction != MediaDirection.INACTIVE) { - ContentPacketExtension content = createContentForOffer( - dev.getSupportedFormats(sendQualityPreset, - receiveQualityPreset), direction, - dev.getSupportedExtensions()); - - RtpDescriptionPacketExtension description = - JingleUtils.getRtpDescription(content); + ContentPacketExtension content + = createContentForOffer( + dev.getSupportedFormats( + sendQualityPreset, + receiveQualityPreset), + direction, + dev.getSupportedExtensions()); + RtpDescriptionPacketExtension description + = JingleUtils.getRtpDescription(content); //SDES // It is important to set SDES before ZRTP in order to make GTALK // application able to work with SDES. - setSDesEncryptionToDescription( - dev.getMediaType(), - description, - null); - + setSDesEncryptionToDescription(mediaType, description, null); //ZRTP - setZrtpEncryptionToDescription( - dev.getMediaType(), - description, - null); + setZrtpEncryptionToDescription(mediaType, description, null); return content; } @@ -657,40 +668,41 @@ public class CallPeerMediaHandlerJabberImpl { MediaDevice dev = getDefaultDevice(mediaType); List<ContentPacketExtension> mediaDescs - = new ArrayList<ContentPacketExtension>(); + = new ArrayList<ContentPacketExtension>(); if (dev != null) { ContentPacketExtension content = createContent(dev); - if(content != null) + if (content != null) mediaDescs.add(content); } - //fail if all devices were inactive - if(mediaDescs.isEmpty()) + // Fail if no media is described (e.g. all devices are inactive). + if (mediaDescs.isEmpty()) { - ProtocolProviderServiceJabberImpl - .throwOperationFailedException( + ProtocolProviderServiceJabberImpl.throwOperationFailedException( "We couldn't find any active Audio/Video devices and " + "couldn't create a call", - OperationFailedException.GENERAL_ERROR, null, logger); + OperationFailedException.GENERAL_ERROR, + null, + logger); } - TransportInfoSender transportInfoSender = - getTransportManager().getXmlNamespace().equals( - ProtocolProviderServiceJabberImpl.URN_GOOGLE_TRANSPORT_P2P) + // Describe the transport(s). + TransportInfoSender transportInfoSender + = getTransportManager().getXmlNamespace().equals( + ProtocolProviderServiceJabberImpl.URN_GOOGLE_TRANSPORT_P2P) ? new TransportInfoSender() - { - public void sendTransportInfo( - Iterable<ContentPacketExtension> contents) - { - getPeer().sendTransportInfo(contents); - } - } + { + public void sendTransportInfo( + Iterable<ContentPacketExtension> contents) + { + getPeer().sendTransportInfo(contents); + } + } : null; - //now add the transport elements return harvestCandidates(null, mediaDescs, transportInfoSender); } @@ -709,7 +721,7 @@ public class CallPeerMediaHandlerJabberImpl public List<ContentPacketExtension> createContentList() throws OperationFailedException { - //Audio Media Description + // Describe the media. List<ContentPacketExtension> mediaDescs = new ArrayList<ContentPacketExtension>(); @@ -719,11 +731,19 @@ public class CallPeerMediaHandlerJabberImpl if (dev != null) { - MediaDirection direction - = dev.getDirection().and( - getDirectionUserPreference(mediaType)); + MediaDirection direction = dev.getDirection(); - if(isLocallyOnHold()) + /* + * In the case of RTP translation performed by the conference + * focus, the conference focus is not required to capture media. + */ + if (!(MediaType.VIDEO.equals(mediaType) + && isRTPTranslationEnabled())) + { + direction + = direction.and(getDirectionUserPreference(mediaType)); + } + if (isLocallyOnHold()) direction = direction.and(MediaDirection.SENDONLY); /* @@ -734,16 +754,15 @@ public class CallPeerMediaHandlerJabberImpl if (MediaDirection.RECVONLY.equals(direction)) direction = MediaDirection.INACTIVE; - if(direction != MediaDirection.INACTIVE) + if (direction != MediaDirection.INACTIVE) { ContentPacketExtension content = createContentForOffer( dev.getSupportedFormats(), direction, dev.getSupportedExtensions()); - - RtpDescriptionPacketExtension description = - JingleUtils.getRtpDescription(content); + RtpDescriptionPacketExtension description + = JingleUtils.getRtpDescription(content); //SDES // It is important to set SDES before ZRTP in order to make @@ -752,17 +771,16 @@ public class CallPeerMediaHandlerJabberImpl mediaType, description, null); - //ZRTP setZrtpEncryptionToDescription( mediaType, description, null); - /* we request a desktop sharing session so add the inputevt - * extension in the "video" content - */ - if(description.getMedia().equals(MediaType.VIDEO.toString()) + // we request a desktop sharing session so add the inputevt + // extension in the "video" content + if (description.getMedia().equals( + MediaType.VIDEO.toString()) && getLocalInputEvtAware()) { content.addChildExtension( @@ -774,8 +792,8 @@ public class CallPeerMediaHandlerJabberImpl } } - //fail if all devices were inactive - if(mediaDescs.isEmpty()) + // Fail if no media is described (e.g. all devices are inactive). + if (mediaDescs.isEmpty()) { ProtocolProviderServiceJabberImpl.throwOperationFailedException( "We couldn't find any active Audio/Video devices" @@ -785,6 +803,7 @@ public class CallPeerMediaHandlerJabberImpl logger); } + // Describe the transport(s). TransportInfoSender transportInfoSender = getTransportManager().getXmlNamespace().equals( ProtocolProviderServiceJabberImpl.URN_GOOGLE_TRANSPORT_P2P) @@ -798,7 +817,6 @@ public class CallPeerMediaHandlerJabberImpl } : null; - //now add the transport elements return harvestCandidates(null, mediaDescs, transportInfoSender); } @@ -849,8 +867,8 @@ public class CallPeerMediaHandlerJabberImpl * processing to stop (method setState in CallPeer). */ public void reinitAllContents() - throws OperationFailedException, - IllegalArgumentException + throws OperationFailedException, + IllegalArgumentException { boolean masterStreamSet = false; for(String key : remoteContentMap.keySet()) @@ -982,15 +1000,17 @@ public class CallPeerMediaHandlerJabberImpl * in this operation can synchronize to the mediaHandler instance to wait * processing to stop (method setState in CallPeer). */ - private void processContent(ContentPacketExtension content, boolean modify, - boolean masterStream) + private void processContent( + ContentPacketExtension content, + boolean modify, + boolean masterStream) throws OperationFailedException, IllegalArgumentException { RtpDescriptionPacketExtension description = JingleUtils.getRtpDescription(content); MediaType mediaType - = MediaType.parseString( description.getMedia() ); + = MediaType.parseString(description.getMedia()); //stream target TransportManagerJabberImpl transportManager = getTransportManager(); @@ -1480,32 +1500,34 @@ public class CallPeerMediaHandlerJabberImpl { MediaDirection streamDirection = stream.getDirection(); - if(streamDirection.allowsSending()) + if (streamDirection.allowsSending()) return streamDirection; - //when calculating a direction we need to take into account 1) what - //direction the remote party had asked for before putting us on hold, - //2) what the user preference is for the stream's media type, 3) our - //local hold status, 4) the direction supported by the device this - //stream is reading from. + /* + * When calculating a direction we need to take into account 1) what + * direction the remote party had asked for before putting us on hold, + * 2) what the user preference is for the stream's media type, 3) our + * local hold status, 4) the direction supported by the device this + * stream is reading from. + */ - //1. check what the remote party originally told us (from our persp.) + // 1. what the remote party originally told us (from our perspective) ContentPacketExtension content = remoteContentMap.get(stream.getName()); + MediaDirection postHoldDir + = JingleUtils.getDirection(content, !getPeer().isInitiator()); - MediaDirection postHoldDir = JingleUtils.getDirection(content, - !getPeer().isInitiator()); - - //2. check the user preference. + // 2. the user preference MediaDevice device = stream.getDevice(); + postHoldDir = postHoldDir.and( getDirectionUserPreference(device.getMediaType())); - //3. check our local hold status. - if(isLocallyOnHold()) - postHoldDir.and(MediaDirection.SENDONLY); + // 3. our local hold status + if (isLocallyOnHold()) + postHoldDir = postHoldDir.and(MediaDirection.SENDONLY); - //4. check the device direction. + // 4. the device direction postHoldDir = postHoldDir.and(device.getDirection()); stream.setDirection(postHoldDir); diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/InfoRetreiver.java b/src/net/java/sip/communicator/impl/protocol/jabber/InfoRetreiver.java index d9cf19f..2f6009d 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/InfoRetreiver.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/InfoRetreiver.java @@ -40,10 +40,6 @@ public class InfoRetreiver private static final String TAG_FN_OPEN = "<FN>"; private static final String TAG_FN_CLOSE = "</FN>"; - // the uin of the account using us, - // used when sending commands for user info to the server - private final String ownerUin; - /** * The timeout to wait before considering vcard has time outed. */ @@ -54,7 +50,6 @@ public class InfoRetreiver String ownerUin) { this.jabberProvider = jabberProvider; - this.ownerUin = ownerUin; vcardTimeoutReply = JabberActivator.getConfigurationService().getLong( diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/JingleNodesServiceDiscovery.java b/src/net/java/sip/communicator/impl/protocol/jabber/JingleNodesServiceDiscovery.java index 0e5689b..5b9a59b 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/JingleNodesServiceDiscovery.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/JingleNodesServiceDiscovery.java @@ -178,7 +178,7 @@ public class JingleNodesServiceDiscovery for(Map.Entry<String, TrackerEntry> entry : service.getTrackerEntries().entrySet()) { - service.deepSearch( + SmackServiceNode.deepSearch( xmppConnection, maxEntries, entry.getValue().getJid(), @@ -209,7 +209,7 @@ public class JingleNodesServiceDiscovery return mappedNodes; // Request to Server - service.deepSearch( + SmackServiceNode.deepSearch( xmppConnection, maxEntries, xmppConnection.getHost(), @@ -232,7 +232,7 @@ public class JingleNodesServiceDiscovery final Presence presence = i.next(); if (presence.isAvailable()) { - service.deepSearch( + SmackServiceNode.deepSearch( xmppConnection, maxEntries, presence.getFrom(), @@ -314,7 +314,7 @@ public class JingleNodesServiceDiscovery if( !StringUtils.isNullOrEmpty(pref) && item.getEntityID().startsWith(pref.trim())) { - service.deepSearch( + SmackServiceNode.deepSearch( xmppConnection, maxEntries, item.getEntityID(), @@ -339,7 +339,7 @@ public class JingleNodesServiceDiscovery // we may searched already this node if it starts // with some of the prefixes if(!visited.containsKey(item.getEntityID())) - service.deepSearch( + SmackServiceNode.deepSearch( xmppConnection, maxEntries, item.getEntityID(), diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java index 373d3fe..b17677b 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetBasicTelephonyJabberImpl.java @@ -277,9 +277,9 @@ public class OperationSetBasicTelephonyJabberImpl boolean isGoogle = protocolProvider.isGmailOrGoogleAppsAccount(); boolean isGoogleVoice = false; - if(isGoogle) + if (isGoogle) { - if(!calleeAddress.contains("@")) + if (!calleeAddress.contains("@")) { calleeAddress += "@" + GOOGLE_VOICE_DOMAIN; isGoogleVoice = true; @@ -293,34 +293,30 @@ public class OperationSetBasicTelephonyJabberImpl // if address is not suffixed by @domain, add the default domain // corresponding to account domain or via the OVERRIDE_PHONE_SUFFIX // property if defined - if(calleeAddress.indexOf('@') == -1) + AccountID accountID = getProtocolProvider().getAccountID(); + + if (calleeAddress.indexOf('@') == -1) { + String phoneSuffix + = accountID.getAccountPropertyString("OVERRIDE_PHONE_SUFFIX"); String serviceName = null; - String phoneSuffix = - (String)getProtocolProvider().getAccountID().getAccountProperty( - "OVERRIDE_PHONE_SUFFIX"); - - if(phoneSuffix == null || phoneSuffix.length() == 0) - { - serviceName = "@" + StringUtils.parseServer( - getProtocolProvider().getAccountID().getUserID()); - } + if ((phoneSuffix == null) || (phoneSuffix.length() == 0)) + serviceName = StringUtils.parseServer(accountID.getUserID()); else - { - serviceName = "@" + phoneSuffix; - } - - calleeAddress += serviceName; + serviceName = phoneSuffix; + calleeAddress = calleeAddress + "@" + serviceName; } - AccountID accountID = getProtocolProvider().getAccountID(); String bypassDomain = accountID.getAccountPropertyString( "TELEPHONY_BYPASS_GTALK_CAPS"); - boolean alwaysCallGtalk = ((bypassDomain != null) && - bypassDomain.equals(calleeAddress.substring( - calleeAddress.indexOf('@') + 1))) || isGoogleVoice; + boolean alwaysCallGtalk + = ((bypassDomain != null) + && bypassDomain.equals( + calleeAddress.substring( + calleeAddress.indexOf('@') + 1))) + || isGoogleVoice; // we determine on which resource the remote user is connected if the // resource isn't already provided @@ -337,9 +333,9 @@ public class OperationSetBasicTelephonyJabberImpl OperationFailedException.NOT_FOUND); } - Iterator<Presence> it = - getProtocolProvider().getConnection().getRoster().getPresences( - calleeAddress); + Iterator<Presence> it + = getProtocolProvider().getConnection().getRoster().getPresences( + calleeAddress); String calleeURI = null; boolean isGingle = false; @@ -352,17 +348,19 @@ public class OperationSetBasicTelephonyJabberImpl while(it.hasNext()) { Presence presence = it.next(); - int priority = (presence.getPriority() == Integer.MIN_VALUE) ? 0 : - presence.getPriority(); + int priority + = (presence.getPriority() == Integer.MIN_VALUE) + ? 0 + : presence.getPriority(); calleeURI = presence.getFrom(); DiscoverInfo discoverInfo = null; try { // check if the remote client supports telephony. - discoverInfo = - protocolProvider.getDiscoveryManager(). - discoverInfo(calleeURI); + discoverInfo + = protocolProvider.getDiscoveryManager().discoverInfo( + calleeURI); } catch (XMPPException ex) { @@ -489,7 +487,7 @@ public class OperationSetBasicTelephonyJabberImpl fullCalleeURI, sessionInitiateExtensions); } - else if(di != null) + else if (di != null) { peer = call.initiateSession( @@ -498,7 +496,7 @@ public class OperationSetBasicTelephonyJabberImpl sessionInitiateExtensions); } } - catch(Throwable t) + catch (Throwable t) { /* * The Javadoc on ThreadDeath says: If ThreadDeath is caught by a @@ -626,7 +624,7 @@ public class OperationSetBasicTelephonyJabberImpl throws ClassCastException, OperationFailedException { - this.hangupCallPeer(peer, HANGUP_REASON_NORMAL_CLEARING, null); + hangupCallPeer(peer, HANGUP_REASON_NORMAL_CLEARING, null); } /** @@ -649,14 +647,15 @@ public class OperationSetBasicTelephonyJabberImpl // if we are failing a peer and have a reason, add the reason packet // extension ReasonPacketExtension reasonPacketExt = null; - if(failed && reasonText != null) + + if (failed && (reasonText != null)) { Reason reason = convertReasonCodeToSIPCode(reasonCode); - if(reason != null) + if (reason != null) { - reasonPacketExt = new ReasonPacketExtension( - reason, reasonText, null); + reasonPacketExt + = new ReasonPacketExtension(reason, reasonText, null); } } @@ -892,10 +891,6 @@ public class OperationSetBasicTelephonyJabberImpl */ public void processPacket(Packet packet) { - //this is not supposed to happen because of the filter ... but still - if (! (packet instanceof JingleIQ) && !(packet instanceof SessionIQ)) - return; - if(packet instanceof JingleIQ) { JingleIQ jingleIQ = (JingleIQ)packet; diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java index ac6dbde..4723576 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopSharingServerJabberImpl.java @@ -120,8 +120,8 @@ public class OperationSetDesktopSharingServerJabberImpl public Call createVideoCall(String uri, MediaDevice device) throws OperationFailedException, ParseException { - MediaAwareCall call - = (MediaAwareCall) super.createVideoCall(uri, device); + MediaAwareCall<?,?,?> call + = (MediaAwareCall<?,?,?>) super.createVideoCall(uri, device); size = (((VideoMediaFormat) @@ -149,8 +149,8 @@ public class OperationSetDesktopSharingServerJabberImpl public Call createVideoCall(Contact callee, MediaDevice device) throws OperationFailedException { - MediaAwareCall call - = (MediaAwareCall) super.createVideoCall(callee, device); + MediaAwareCall<?,?,?> call + = (MediaAwareCall<?,?,?>) super.createVideoCall(callee, device); size = ((VideoMediaFormat) @@ -226,8 +226,10 @@ public class OperationSetDesktopSharingServerJabberImpl else { if (logger.isInfoEnabled()) - logger.info(fullCalleeURI + - ": remote-control not supported!"); + { + logger.info( + fullCalleeURI + ": remote-control not supported!"); + } // TODO fail or not? /* @@ -262,8 +264,7 @@ public class OperationSetDesktopSharingServerJabberImpl basicTelephony.createOutgoingCall(call, calleeAddress); - CallPeerJabberImpl callPeer - = new CallPeerJabberImpl(calleeAddress, call); + new CallPeerJabberImpl(calleeAddress, call); return call; } @@ -307,7 +308,7 @@ public class OperationSetDesktopSharingServerJabberImpl boolean allowed) throws OperationFailedException { - ((AbstractCallJabberGTalkImpl) call).setLocalInputEvtAware(allowed); + ((AbstractCallJabberGTalkImpl<?>) call).setLocalInputEvtAware(allowed); super.setLocalVideoAllowed(call, mediaDevice, allowed); } @@ -654,11 +655,13 @@ public class OperationSetDesktopSharingServerJabberImpl public boolean isRemoteControlAvailable(CallPeer callPeer) { DiscoverInfo discoverInfo - = ((AbstractCallPeerJabberGTalkImpl) callPeer).getDiscoverInfo(); - return (this.parentProvider.getDiscoveryManager() - .includesFeature(InputEvtIQ.NAMESPACE_SERVER) - && discoverInfo != null - && discoverInfo.containsFeature( - InputEvtIQ.NAMESPACE_CLIENT)); + = ((AbstractCallPeerJabberGTalkImpl<?,?>) callPeer) + .getDiscoverInfo(); + + return + parentProvider.getDiscoveryManager().includesFeature( + InputEvtIQ.NAMESPACE_SERVER) + && (discoverInfo != null) + && discoverInfo.containsFeature(InputEvtIQ.NAMESPACE_CLIENT); } } diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java index 169f6f0..e88a09c 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetDesktopStreamingJabberImpl.java @@ -122,7 +122,7 @@ public class OperationSetDesktopStreamingJabberImpl { Call call = createOutgoingVideoCall(uri); MediaDevice device - = ((MediaAwareCall) call).getDefaultDevice(MediaType.VIDEO); + = ((MediaAwareCall<?,?,?>) call).getDefaultDevice(MediaType.VIDEO); size = (((VideoMediaFormat)device.getFormat()).getSize()); origin = getOriginForMediaDevice(device); return call; @@ -146,7 +146,7 @@ public class OperationSetDesktopStreamingJabberImpl { Call call = createOutgoingVideoCall(callee.getAddress()); MediaDevice device - = ((MediaAwareCall) call).getDefaultDevice(MediaType.VIDEO); + = ((MediaAwareCall<?,?,?>) call).getDefaultDevice(MediaType.VIDEO); size = (((VideoMediaFormat)device.getFormat()).getSize()); origin = getOriginForMediaDevice(device); return call; @@ -192,8 +192,8 @@ public class OperationSetDesktopStreamingJabberImpl boolean allowed) throws OperationFailedException { - AbstractCallJabberGTalkImpl callImpl - = (AbstractCallJabberGTalkImpl) call; + AbstractCallJabberGTalkImpl<?> callImpl + = (AbstractCallJabberGTalkImpl<?>) call; if (mediaDevice == null) { @@ -228,8 +228,9 @@ public class OperationSetDesktopStreamingJabberImpl */ public boolean isLocalVideoAllowed(Call call) { - return ((MediaAwareCall<?, ?, ?>)call). - isLocalVideoAllowed(MediaUseCase.DESKTOP); + return + ((MediaAwareCall<?, ?, ?>)call).isLocalVideoAllowed( + MediaUseCase.DESKTOP); } /** @@ -275,16 +276,13 @@ public class OperationSetDesktopStreamingJabberImpl */ public boolean isPartialStreaming(Call call) { - MediaAwareCall callImpl = (MediaAwareCall)call; + MediaAwareCall<?,?,?> callImpl = (MediaAwareCall<?,?,?>) call; MediaDevice device = callImpl.getDefaultDevice(MediaType.VIDEO); - if(device != null) - { - MediaService mediaService = JabberActivator.getMediaService(); - return mediaService.isPartialStreaming(device); - } - - return false; + return + (device == null) + ? false + : JabberActivator.getMediaService().isPartialStreaming(device); } /** @@ -297,13 +295,14 @@ public class OperationSetDesktopStreamingJabberImpl */ public void movePartialDesktopStreaming(Call call, int x, int y) { - AbstractCallJabberGTalkImpl callImpl - = (AbstractCallJabberGTalkImpl) call; - AbstractCallPeerJabberGTalkImpl callPeerImpl - = (AbstractCallPeerJabberGTalkImpl) callImpl.getCallPeers().next(); - VideoMediaStream videoStream = (VideoMediaStream) - callPeerImpl.getMediaHandler().getStream( - MediaType.VIDEO); + AbstractCallJabberGTalkImpl<?> callImpl + = (AbstractCallJabberGTalkImpl<?>) call; + AbstractCallPeerJabberGTalkImpl<?,?> callPeerImpl + = (AbstractCallPeerJabberGTalkImpl<?,?>) + callImpl.getCallPeers().next(); + VideoMediaStream videoStream + = (VideoMediaStream) + callPeerImpl.getMediaHandler().getStream(MediaType.VIDEO); if(videoStream != null) { diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java index 657e711..9b85f26 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetTelephonyConferencingJabberImpl.java @@ -462,15 +462,16 @@ public class OperationSetTelephonyConferencingJabberImpl if (!wasConferenceFocus && call.isConferenceFocus()) { /* - * Re-INVITE existing CallPeers to inform them that from now - * the specified call is a conference call. + * Re-INVITE existing CallPeers to inform them that from now the + * specified call is a conference call. */ Iterator<CallPeerJabberImpl> callPeerIter = call.getCallPeers(); while (callPeerIter.hasNext()) { CallPeerJabberImpl callPeer = callPeerIter.next(); - if(callPeer.getState() == CallPeerState.CONNECTED) + + if (callPeer.getState() == CallPeerState.CONNECTED) callPeer.sendCoinSessionInfo(true); } } @@ -551,31 +552,27 @@ public class OperationSetTelephonyConferencingJabberImpl */ public void processPacket(Packet packet) { - CoinIQ coinIQ = (CoinIQ)packet; + CoinIQ coinIQ = (CoinIQ) packet; //first ack all "set" requests. - if(coinIQ.getType() == IQ.Type.SET) + if (coinIQ.getType() == IQ.Type.SET) { IQ ack = IQ.createResultIQ(coinIQ); + parentProvider.getConnection().sendPacket(ack); } String sid = coinIQ.getSID(); - if(sid == null) + if (sid != null) { - return; - } + CallPeerJabberImpl callPeer + = getBasicTelephony().getActiveCallsRepository().findCallPeer( + sid); - CallPeerJabberImpl callPeer - = getBasicTelephony().getActiveCallsRepository().findCallPeer(sid); - - if(callPeer == null) - { - return; + if (callPeer != null) + handleCoin(coinIQ, callPeer); } - - handleCoin(coinIQ, callPeer); } /** diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProviderManagerExt.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProviderManagerExt.java index 0b1721d..a082a97 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProviderManagerExt.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProviderManagerExt.java @@ -390,9 +390,9 @@ public class ProviderManagerExt * @param provider the IQ provider class. */ private void addProvider( - String elementName, - String namespace, - Class provider) + String elementName, + String namespace, + Class<?> provider) { // Attempt to load the provider class and then create // a new instance if it's an IQProvider. Otherwise, if it's @@ -425,8 +425,10 @@ public class ProviderManagerExt * @param namespace the XML namespace. * @param provider the extension provider class. */ - public void addExtProvider(String elementName, String namespace, - Class provider) + public void addExtProvider( + String elementName, + String namespace, + Class<?> provider) { // Attempt to load the provider class and then create // a new instance if it's a Provider. Otherwise, if it's @@ -436,11 +438,12 @@ public class ProviderManagerExt try { // Add the provider to the map. - if (PacketExtensionProvider.class.isAssignableFrom( - provider)) + if (PacketExtensionProvider.class.isAssignableFrom(provider)) { addExtensionProvider( - elementName, namespace, provider.newInstance()); + elementName, + namespace, + provider.newInstance()); } else if (PacketExtension.class.isAssignableFrom( provider)) diff --git a/src/net/java/sip/communicator/service/protocol/OperationSetVideoTelephony.java b/src/net/java/sip/communicator/service/protocol/OperationSetVideoTelephony.java index c9f56d3..d801c85 100644 --- a/src/net/java/sip/communicator/service/protocol/OperationSetVideoTelephony.java +++ b/src/net/java/sip/communicator/service/protocol/OperationSetVideoTelephony.java @@ -42,48 +42,22 @@ public interface OperationSetVideoTelephony public void addVideoListener( CallPeer peer, VideoListener listener); /** - * Creates a visual <tt>Component</tt> which depicts the local video - * being streamed to a specific <tt>CallPeer</tt>. The returned - * visual <tt>Component</tt> should be disposed when it is no longer - * required through {@link #disposeLocalVisualComponent(CallPeer, - * Component) disposeLocalVisualComponent}. + * Gets the visual <tt>Component</tt> which depicts the local video + * being streamed to a specific <tt>CallPeer</tt>. * * @param peer the <tt>CallPeer</tt> to whom the local video which is to be * depicted by the returned visual <tt>Component</tt> is being streamed - * @param listener if not <tt>null</tt>, a <tt>VideoListener</tt> to track - * the progress of the creation in case this telephony chooses to perform it - * asynchronously and to not return the created visual <tt>Component</tt> - * immediately/as the result of this method call - * * @return a visual <tt>Component</tt> which depicts the local video being * streamed to the specified <tt>CallPeer</tt> if this telephony chooses to * carry out the creation synchronously; <tt>null</tt> if this telephony - * chooses to create the requested visual <tt>Component</tt> asynchronously. - * + * chooses to create the requested visual <tt>Component</tt> asynchronously * @throws OperationFailedException if creating the component fails for * whatever reason. */ - public Component createLocalVisualComponent(CallPeer peer, - VideoListener listener) + public Component getLocalVisualComponent(CallPeer peer) throws OperationFailedException; /** - * Disposes of a visual <tt>Component</tt> depicting the local video for - * a specific <tt>CallPeer</tt> (previously obtained through - * {@link #createLocalVisualComponent(CallPeer, VideoListener) - * createLocalVisualComponent}). - * The disposal may include, but is not limited to, releasing the - * <tt>Player</tt> which provides the <tt>component</tt> and renders - * the local video into it, disconnecting from the video capture device. - * - * @param peer the <tt>CallPeer</tt> for whom the visual <tt>Component</tt> - * depicts the local video - * @param component the visual <tt>Component</tt> depicting the local video - * to be disposed - */ - public void disposeLocalVisualComponent(CallPeer peer, Component component); - - /** * Gets the visual/video <tt>Component</tt> available in this telephony for * a specific <tt>CallPeer</tt>. * diff --git a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetVideoTelephony.java b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetVideoTelephony.java index f2f033b..dfbe581 100644 --- a/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetVideoTelephony.java +++ b/src/net/java/sip/communicator/service/protocol/media/AbstractOperationSetVideoTelephony.java @@ -93,37 +93,17 @@ public abstract class AbstractOperationSetVideoTelephony< /** * Implements - * {@link OperationSetVideoTelephony#createLocalVisualComponent(CallPeer, - * VideoListener)}. + * {@link OperationSetVideoTelephony#createLocalVisualComponent(CallPeer)}. * * @param peer the <tt>CallPeer</tt> that we are sending our local video to. - * @param listener the <tt>VideoListener</tt> where we'd like to retrieve - * the <tt>Component</tt> containing the local video. * @return the <tt>Component</tt> containing the local video. * @throws OperationFailedException if we fail extracting the local video. */ @SuppressWarnings("unchecked") // work with MediaAware* in media package - public Component createLocalVisualComponent( - CallPeer peer, - VideoListener listener) + public Component getLocalVisualComponent(CallPeer peer) throws OperationFailedException { - return ((W)peer).getMediaHandler().createLocalVisualComponent(); - } - - /** - * Implements - * {@link OperationSetVideoTelephony#disposeLocalVisualComponent(CallPeer, - * Component)}. - * - * @param peer the <tt>CallPeer</tt> whose local video component we'd like - * to dispose of. - * @param component the <tt>Component</tt> that we'll be disposing of. - */ - @SuppressWarnings("unchecked") // work with MediaAware* in media package - public void disposeLocalVisualComponent(CallPeer peer, Component component) - { - ((W)peer).getMediaHandler().disposeLocalVisualComponent(component); + return ((W)peer).getMediaHandler().getLocalVisualComponent(); } /** diff --git a/src/net/java/sip/communicator/service/protocol/media/CallPeerMediaHandler.java b/src/net/java/sip/communicator/service/protocol/media/CallPeerMediaHandler.java index d7585e5..507b3e2 100644 --- a/src/net/java/sip/communicator/service/protocol/media/CallPeerMediaHandler.java +++ b/src/net/java/sip/communicator/service/protocol/media/CallPeerMediaHandler.java @@ -504,11 +504,12 @@ public abstract class CallPeerMediaHandler MediaDirection newValue = videoDirectionUserPreference; - /* we do not send an event here if video is enabled because we have to - * wait video stream starts to have correct MediaDevice set in - * VideoMediaDeviceSession + /* + * Do not send an event here if the local video is enabled because the + * video stream needs to start before the correct MediaDevice is set in + * VideoMediaDeviceSession. */ - if(!enabled) + if (!enabled) { firePropertyChange( OperationSetVideoTelephony.LOCAL_VIDEO_STREAMING, @@ -709,48 +710,21 @@ public abstract class CallPeerMediaHandler } /** - * Gets local visual <tt>Component</tt> of the local peer. + * Gets the visual <tt>Component</tt>, if any, depicting the video streamed + * from the local peer to the remote peer. * - * @return visual <tt>Component</tt> + * @return the visual <tt>Component</tt> depicting the local video if local + * video is actually being streamed from the local peer to the remote peer; + * otherwise, <tt>null</tt> */ - public Component createLocalVisualComponent() + public Component getLocalVisualComponent() { - boolean flipLocalVideoDisplay = true; - OperationSetDesktopSharingServer desktopOpSet - = peer.getCall().getProtocolProvider().getOperationSet( - OperationSetDesktopSharingServer.class); - // If the call video is a desktop sharing stream, then do not flip the - // local video display. - if (desktopOpSet != null - && desktopOpSet.isLocalVideoAllowed(peer.getCall())) - { - flipLocalVideoDisplay = false; - } - MediaStream videoStream = getStream(MediaType.VIDEO); return ((videoStream == null) || !isLocalVideoTransmissionEnabled()) ? null - : ((VideoMediaStream) videoStream).createLocalVisualComponent( - flipLocalVideoDisplay); - } - - /** - * Disposes of a specific local visual <tt>Component</tt> of the local peer. - * - * @param component the local visual <tt>Component</tt> of the local peer to - * dispose of - */ - public void disposeLocalVisualComponent(Component component) - { - MediaStream videoStream = getStream(MediaType.VIDEO); - - if (videoStream != null) - { - ((VideoMediaStream) videoStream).disposeLocalVisualComponent( - component); - } + : ((VideoMediaStream) videoStream).getLocalVisualComponent(); } /** @@ -919,15 +893,31 @@ public abstract class CallPeerMediaHandler * @throws OperationFailedException if creating the stream fails for any * reason (like, for example, accessing the device or setting the format). */ - protected MediaStream initStream(StreamConnector connector, - MediaDevice device, - MediaFormat format, - MediaStreamTarget target, - MediaDirection direction, - List<RTPExtension> rtpExtensions, - boolean masterStream) + protected MediaStream initStream(StreamConnector connector, + MediaDevice device, + MediaFormat format, + MediaStreamTarget target, + MediaDirection direction, + List<RTPExtension> rtpExtensions, + boolean masterStream) throws OperationFailedException { + MediaType mediaType = device.getMediaType(); + + /* + * Do make sure that no unintentional streaming of media generated by + * the user without prior consent will happen. + */ + direction = direction.and(getDirectionUserPreference(mediaType)); + if (device != null) + { + /* + * If the device does not support a direction, there is really + * nothing to be done at this point to make it use it. + */ + direction = direction.and(device.getDirection()); + } + MediaStream stream = mediaHandler.initStream( this, @@ -939,7 +929,7 @@ public abstract class CallPeerMediaHandler rtpExtensions, masterStream); - switch (device.getMediaType()) + switch (mediaType) { case AUDIO: audioStream = (AudioMediaStream) stream; @@ -1310,8 +1300,7 @@ public abstract class CallPeerMediaHandler */ firePropertyChange( OperationSetVideoTelephony.LOCAL_VIDEO_STREAMING, - null, - this.videoDirectionUserPreference); + null, videoDirectionUserPreference); if(!stream.isStarted()) { @@ -1586,4 +1575,41 @@ public abstract class CallPeerMediaHandler conferenceMember)); } } + + /** + * Determines whether RTP translation is enabled for the <tt>CallPeer</tt> + * represented by this <tt>CallPeerMediaHandler</tt>. + * <p> + * For the sake of simplicity at the time of this writing, the current + * implementation presumes the <tt>MediaType</tt> is <tt>VIDEO</tt>. + * </p> + * + * @return <tt>true</tt> if RTP translation is enabled for the + * <tt>CallPeer</tt> represented by this <tt>CallPeerMediaHandler</tt>; + * otherwise, <tt>false</tt> + */ + public boolean isRTPTranslationEnabled() + { + T peer = getPeer(); + MediaAwareCall<?,?,?> call = peer.getCall(); + + if ((call != null) + && call.isConferenceFocus() + && !call.isLocalVideoStreaming()) + { + Iterator<?> callPeerIt = call.getCallPeers(); + + while (callPeerIt.hasNext()) + { + MediaAwareCallPeer<?,?,?> callPeer + = (MediaAwareCallPeer<?,?,?>) callPeerIt.next(); + MediaStream videoMediaStream + = callPeer.getMediaHandler().getStream(MediaType.VIDEO); + + if (videoMediaStream != null) + return true; + } + } + return false; + } } diff --git a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java index 6d60ad4..8c228b8 100644 --- a/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java +++ b/src/net/java/sip/communicator/service/protocol/media/MediaAwareCall.java @@ -205,7 +205,7 @@ public abstract class MediaAwareCall< if(getCallPeersVector().isEmpty()) { callPeer.getMediaHandler().setLocalUserAudioLevelListener( - localAudioLevelDelegator); + localAudioLevelDelegator); } } |