
org.jitsi.impl.neomedia.transform.PaddingTermination Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of libjitsi Show documentation
Show all versions of libjitsi Show documentation
libjitsi is an advanced Java media library for secure real-time audio/video
communication
The newest version!
/*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jitsi.impl.neomedia.transform;
import org.jitsi.impl.neomedia.*;
import org.jitsi.utils.*;
import org.jitsi.service.neomedia.*;
import java.util.*;
/**
* De-duplicates RTP packets from incoming RTP streams. A more space-efficient
* implementation using a replay context is possible but one needs to be careful
* with the window size not to drop valid retransmissions
* (https://github.com/jitsi/libjitsi/pull/263#discussion_r100417318).
*
* @author George Politis
*/
public class PaddingTermination
extends SinglePacketTransformerAdapter
implements TransformEngine
{
/**
* The size of the seen sequence numbers set to hold per SSRC. As long as
* Chrome does not probe with ancient packets (> 5 seconds (300 packets per
* second) this size should be a sufficiently large size to prevent padding
* packets.
*/
private static final int SEEN_SET_SZ = 1500;
/**
* Ctor.
*/
public PaddingTermination()
{
super(RTPPacketPredicate.INSTANCE);
}
/**
* The {@code ReplayContext} for every SSRC that this instance has seen.
*/
private final Map> replayContexts = new TreeMap<>();
/**
* {@inheritDoc}
*/
@Override
public PacketTransformer getRTPTransformer()
{
return this;
}
/**
* {@inheritDoc}
*/
@Override
public PacketTransformer getRTCPTransformer()
{
return null;
}
/**
* {@inheritDoc}
*/
@Override
public RawPacket reverseTransform(RawPacket pkt)
{
Long mediaSSRC = pkt.getSSRCAsLong();
// NOTE dropping padding from the main RTP stream is not supported
// because we can't rewrite to hide the gaps. Padding packets in the
// RTX stream are detected and killed in the RtxTransformer, so this
// instance should not see any RTX packets (it's after RTX in the
// chain).
Set replayContext = replayContexts.get(mediaSSRC);
if (replayContext == null)
{
replayContext
= Collections.newSetFromMap(new LRUCache<>(SEEN_SET_SZ));
replayContexts.put(mediaSSRC, replayContext);
}
return replayContext.add(pkt.getSequenceNumber()) ? pkt : null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy