I used data channel in gstreamer to send only text messages between webrtc connections but when i closed pipeline and webrtcbin , all ports that opened for ICE Candidates was still open , how can i close them?
I try to disconnect all listeners and dispose objects.
GstUtil.initGst();
Pipeline pipeline = new Pipeline();
Bus bus = pipeline.getBus();
Bus.EOS busEOS = (Bus.EOS) source -> {
log.info("********* Reached end of stream: " + source.toString());
};
bus.connect(busEOS);
Bus.ERROR busERROR = (Bus.ERROR) (source, code, m) -> {
log.error("Error from source: '{}', with code: {}, and message '{}'", source, code, m);
disconnect();
};
bus.connect(busERROR);
webRTCBin = new WebRTCBin("webrtcbin");
webRTCBin.setTurnServer("turn://**********:3478");
webRTCBin.setBundlePolicy(WebRTCBundlePolicy.MAX_BUNDLE);
webRTCBin.set("ice-transport-policy","1");
pipeline.add(webRTCBin);
AtomicBoolean once = new AtomicBoolean(true);
final WebRTCBin.CREATE_ANSWER[] listenerANSWER = new WebRTCBin.CREATE_ANSWER[1];
WebRTCBin.ON_NEGOTIATION_NEEDED webRTCBinON_NEGOTIATION_NEEDED = (WebRTCBin.ON_NEGOTIATION_NEEDED) elem -> {
if (once.get()) {
log.info("onNegotiationNeeded: " + elem.getName());
SDPMessage sdpMessage = new SDPMessage();
sdpMessage.parseBuffer(sdpOffer);
WebRTCSessionDescription description = new WebRTCSessionDescription(WebRTCSDPType.OFFER, sdpMessage);
webRTCBin.setRemoteDescription(description);
listenerANSWER[0] = answer -> {
String sdp = answer.getSDPMessage().toString();
webRTCBin.setLocalDescription(answer);
try {
SdpAnswerResponse sdpAnswerResponse = new SdpAnswerResponse("PROCESS_SDP_ANSWER", sdp);
webSocket.convertAndSend("/topic/messages", sdpAnswerResponse);
} catch (Exception e) {
log.error("Exception", e);
}
};
webRTCBin.createAnswer(listenerANSWER[0]);
once.set(false);
}
};
webRTCBin.connect(webRTCBinON_NEGOTIATION_NEEDED);
pipeline.play();
WebRTCBin.ON_ICE_CANDIDATE iceListener = (sdpMLineIndex, candidate) -> {
log.info("ON_ICE_CANDIDATE {}", candidate);
IceCandidateResponse iceCandidateResponse = new IceCandidateResponse("ADD_ICE_CANDIDATE",
new IceCandidate(candidate, "", sdpMLineIndex));
webSocket.convertAndSend("/topic/messages", iceCandidateResponse);
};
webRTCBin.connect(iceListener);
loop.await();
webRTCBin.stop();
webRTCBin.disconnect( WebRTCBin.CREATE_ANSWER.class, listenerANSWER[0]);
webRTCBin.disconnect(WebRTCBin.ON_NEGOTIATION_NEEDED.class,webRTCBinON_NEGOTIATION_NEEDED);
webRTCBin.disconnect(WebRTCBin.ON_ICE_CANDIDATE.class,iceListener);
webRTCBin.getElements().forEach(Element::dispose);
webRTCBin.dispose();
pipeline.stop();
bus.disconnect(busEOS);
bus.disconnect(busERROR);
pipeline.getElements().forEach(Element::dispose);
pipeline.dispose();