
org.jitsi.impl.neomedia.RTCPFeedbackMessagePacket 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;
import javax.media.rtp.*;
import org.jitsi.impl.neomedia.rtp.translator.*;
import org.jitsi.service.neomedia.event.*;
/**
* Represents an RTCP feedback message packet as described by RFC 4585
* "Extended RTP Profile for Real-time Transport Control Protocol
* (RTCP)-Based Feedback (RTP/AVPF)".
*
* @author Sebastien Vincent
* @author Lyubomir Marinov
*/
public class RTCPFeedbackMessagePacket
implements Payload
{
/**
* Feedback message type (FMT).
*/
private int fmt;
/**
* Packet type (PT).
*/
private int pt;
/**
* SSRC of packet sender.
*/
private long senderSSRC;
/**
* SSRC of media source.
*/
private long sourceSSRC;
/**
* The (command) sequence number of this Full Intra Request (FIR) RTCP
* feedback message as defined by RFC 5104 "Codec Control Messages in
* the RTP Audio-Visual Profile with Feedback (AVPF)". The sequence
* number space is unique for each pairing of the SSRC of command source and
* the SSRC of the command target. The sequence number SHALL be increased by
* 1 modulo 256 for each new command. A repetition SHALL NOT increase the
* sequence number. The initial value is arbitrary.
*/
private int seqNr;
/**
* Constructor.
*
* @param fmt feedback message type
* @param pt packet type
* @param senderSSRC SSRC of packet sender
* @param sourceSSRC SSRC of media source
*/
public RTCPFeedbackMessagePacket(
int fmt,
int pt,
long senderSSRC,
long sourceSSRC)
{
setFeedbackMessageType(fmt);
setPayloadType(pt);
setSenderSSRC(senderSSRC);
setSourceSSRC(sourceSSRC);
}
/**
* Gets the feedback message type (FMT) of this
* RTCPFeedbackMessagePacket.
*
* @return the feedback message type (FMT) of this
* RTCPFeedbackMessagePacket
*/
public int getFeedbackMessageType()
{
return fmt;
}
/**
* Gets the packet type (PT) of this RTCPFeedbackMessagePacket.
*
* @return the packet type (PT) of this RTCPFeedbackMessagePacket
*/
public int getPayloadType()
{
return pt;
}
/**
* Gets the synchronization source identifier (SSRC) of the originator of
* this packet.
*
* @return the synchronization source identifier (SSRC) of the originator of
* this packet
*/
public long getSenderSSRC()
{
return senderSSRC;
}
/**
* Gets the (command) sequence number of this Full Intra Request (FIR) RTCP
* feedback message as defined by RFC 5104 "Codec Control Messages in
* the RTP Audio-Visual Profile with Feedback (AVPF)". The sequence
* number space is unique for each pairing of the SSRC of command source and
* the SSRC of the command target. The sequence number SHALL be increased by
* 1 modulo 256 for each new command. A repetition SHALL NOT increase the
* sequence number. The initial value is arbitrary.
*
* @return the (command) sequence number of this Full Intra Request (FIR)
* RTCP feedback message
*/
public int getSequenceNumber()
{
return seqNr;
}
/**
* Gets the synchronization source identifier (SSRC) of the media source
* that this piece of feedback information is related to.
*
* @return the synchronization source identifier (SSRC) of the media source
* that this piece of feedback information is related to
*/
public long getSourceSSRC()
{
return sourceSSRC;
}
/**
* Sets the feedback message type (FMT) of this
* RTCPFeedbackMessagePacket.
*
* @param fmt the feedback message type (FMT) to set on this
* RTCPFeedbackMessagePacket
*/
public void setFeedbackMessageType(int fmt)
{
this.fmt = fmt;
}
/**
* Sets the packet type (PT) of this RTCPFeedbackMessagePacket.
*
* @param pt the packet type (PT) to set on this
* RTCPFeedbackMessagePacket
*/
public void setPayloadType(int pt)
{
this.pt = pt;
}
/**
* Sets the synchronization source identifier (SSRC) of the originator of
* this packet.
*
* @param senderSSRC the synchronization source identifier (SSRC) of the
* originator of this packet
*/
public void setSenderSSRC(long senderSSRC)
{
this.senderSSRC = senderSSRC;
}
/**
* Sets the (command) sequence number of this Full Intra Request (FIR) RTCP
* feedback message as defined by RFC 5104 "Codec Control Messages in
* the RTP Audio-Visual Profile with Feedback (AVPF)". The sequence
* number space is unique for each pairing of the SSRC of command source and
* the SSRC of the command target. The sequence number SHALL be increased by
* 1 modulo 256 for each new command.
*
* @param seqNr the (command) sequence number to set on this Full Intra
* Request (FIR) RTCP feedback message
*/
public void setSequenceNumber(int seqNr)
{
this.seqNr = seqNr;
}
/**
* Sets the synchronization source identifier (SSRC) of the media source
* that this piece of feedback information is related to.
*
* @param sourceSSRC the synchronization source identifier (SSRC) of the
* media source that this piece of feedback information is related to
*/
public void setSourceSSRC(long sourceSSRC)
{
this.sourceSSRC = sourceSSRC;
}
/**
* Writes a specific synchronization source identifier (SSRC) into a
* specific byte array starting at a specific offset.
*
* @param ssrc the synchronization source identifier (SSRC) to write into
* buf starting at off
* @param buf the byte array to write the specified ssrc
* into starting at off
* @param off the offset in buf at which the writing of
* ssrc is to start
*/
public static void writeSSRC(long ssrc, byte[] buf, int off)
{
buf[off++] = (byte) (ssrc >> 24);
buf[off++] = (byte) ((ssrc >> 16) & 0xFF);
buf[off++] = (byte) ((ssrc >> 8) & 0xFF);
buf[off] = (byte) (ssrc & 0xFF);
}
/**
* Write the RTCP packet representation of this instance into a specific
* OutputDataStream.
*
* @param out the OutputDataStream into which the RTCP packet
* representation of this instance is to be written
*/
public void writeTo(OutputDataStream out)
{
/*
* The length of this RTCP packet in 32-bit words minus one, including
* the header and any padding.
*/
int fmt = getFeedbackMessageType();
int pt = getPayloadType();
boolean fir = pt == RTCPFeedbackMessageEvent.PT_PS
&& fmt == RTCPFeedbackMessageEvent.FMT_FIR;
int rtcpPacketLength = 2;
if (fir)
{
/*
* RFC 5104 "Codec Control Messages in the RTP Audio-Visual Profile
* with Feedback (AVPF)" defines that The length of the FIR feedback
* message MUST be set to 2 + 2 * N, where N is the number of FCI
* entries.
*/
rtcpPacketLength += 2 * /* N */ 1;
}
int len = (rtcpPacketLength + 1) * 4;
byte[] buf = new byte[len];
int off = 0;
/*
* version (V): 2 bits,
* padding (P): 1 bit,
* feedback message type (FMT): 5 bits.
*/
buf[off++] = (byte) (0x80 /* RTP version */ | (fmt & 0x1F));
// packet type (PT): 8 bits
buf[off++] = (byte) pt;
// length: 16 bits
buf[off++] = (byte) ((rtcpPacketLength & 0xFF00) >> 8);
buf[off++] = (byte) (rtcpPacketLength & 0x00FF);
// SSRC of packet sender: 32 bits
writeSSRC(getSenderSSRC(), buf, off);
off += 4;
// SSRC of media source: 32 bits
long sourceSSRC = getSourceSSRC();
/*
* RFC 5104 "Codec Control Messages in the RTP Audio-Visual Profile with
* Feedback (AVPF)" defines that the "SSRC of media source" is not used
* by the FIR feedback message and SHALL be set to 0.
*/
writeSSRC(
fir ? 0 : sourceSSRC,
buf,
off);
off += 4;
// FCI entries
if (fir)
{
/*
* SSRC: 32 bits. The SSRC value of the media sender that is
* requested to send a decoder refresh point.
*/
writeSSRC(sourceSSRC, buf, off);
off += 4;
// Seq nr.: 8 bits
buf[off++] = (byte) (getSequenceNumber() % 256);
/*
* Reserved: 24 bits. All bits SHALL be set to 0 by the sender and
* SHALL be ignored on reception.
*/
buf[off++] = 0;
buf[off++] = 0;
buf[off++] = 0;
}
out.write(buf, 0, len);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy