package org.ifsoft.rtp; import org.ifsoft.*; import java.util.ArrayList; public class RTPPacket { private Byte __payload[]; private Byte __payloadType; private Long _contributingSources[]; private Long _extension[]; private Integer _extensionHeader; private Boolean _marker; private Boolean _padding; private Integer _sequenceNumber; private Long _synchronizationSource; private Long _timestamp; public RTPPacket(Byte payload[]) { __payloadType = Byte.valueOf((byte)0); _extensionHeader = Integer.valueOf(0); _marker = Boolean.valueOf(false); _padding = Boolean.valueOf(false); _sequenceNumber = Integer.valueOf(0); _synchronizationSource = Long.valueOf(0L); _timestamp = Long.valueOf(0L); setPayload(payload); } public Byte[] getBytes() { return getBytes(this); } public static Byte[] getBytes(RTPPacket packet) { Boolean flag = Boolean.valueOf(packet.getExtensionHeader().intValue() != 0 || packet.getExtension() != null); ArrayList list = new ArrayList(); Byte num = packet.getContributingSources() != null ? new Byte((byte)(BitAssistant.getShortBytesFromIntegerNetwork(ArrayExtensions.getLength(packet.getContributingSources()))[1].byteValue() & 0xf)) : new Byte((byte)0); list.add(new Byte((new Byte((new Integer(0x80 | (packet.getPadding().booleanValue() ? 0x20 : 0) | (flag.booleanValue() ? 0x10 : 0) | num.byteValue())).byteValue())).byteValue())); list.add(new Byte((new Byte((new Integer((packet.getMarker().booleanValue() ? 0x80 : 0) | packet.getPayloadType().byteValue() & 0x7f)).byteValue())).byteValue())); ArrayListExtensions.addRange(list, BitAssistant.getShortBytesFromIntegerNetwork(packet.getSequenceNumber())); ArrayListExtensions.addRange(list, BitAssistant.getIntegerBytesFromLongNetwork(packet.getTimestamp())); ArrayListExtensions.addRange(list, BitAssistant.getIntegerBytesFromLongNetwork(packet.getSynchronizationSource())); for(Integer num2 = Integer.valueOf(0); num2.intValue() < num.byteValue();) { ArrayListExtensions.addRange(list, BitAssistant.getIntegerBytesFromLongNetwork(packet.getContributingSources()[num2.intValue()])); Integer integer = num2; Integer integer1 = num2 = Integer.valueOf(num2.intValue() + 1); Integer _tmp = integer; } if(flag.booleanValue()) { Integer num3 = Integer.valueOf(packet.getExtension() != null ? ArrayExtensions.getLength(packet.getExtension()).intValue() : 0); ArrayListExtensions.addRange(list, BitAssistant.getShortBytesFromIntegerNetwork(packet.getExtensionHeader())); ArrayListExtensions.addRange(list, BitAssistant.getShortBytesFromIntegerNetwork(num3)); for(Integer num2 = Integer.valueOf(0); num2.intValue() < num3.intValue();) { ArrayListExtensions.addRange(list, BitAssistant.getIntegerBytesFromLongNetwork(packet.getExtension()[num2.intValue()])); Integer integer2 = num2; Integer integer3 = num2 = Integer.valueOf(num2.intValue() + 1); Integer _tmp1 = integer2; } } ArrayListExtensions.addRange(list, packet.getPayload()); return (Byte[])list.toArray(new Byte[0]); } public Long[] getContributingSources() { return _contributingSources; } public Long[] getExtension() { return _extension; } public Integer getExtensionHeader() { return _extensionHeader; } public Boolean getMarker() { return _marker; } public Boolean getPadding() { return _padding; } public Byte[] getPayload() { return __payload; } public Byte getPayloadType() { return __payloadType; } public Integer getSequenceNumber() { return _sequenceNumber; } public Long getSynchronizationSource() { return _synchronizationSource; } public Long getTimestamp() { return _timestamp; } public static RTPPacket parseBytes(Byte bytes[]) throws Exception { if(ArrayExtensions.getLength(bytes).intValue() < 12 || (bytes[0].byteValue() & 0xc0) != 128) return null; Boolean flag = Boolean.valueOf((bytes[0].byteValue() & 0x20) == 32); Boolean flag2 = Boolean.valueOf((bytes[0].byteValue() & 0x10) == 16); Byte num = new Byte((byte)(bytes[0].byteValue() & 0xf)); Boolean flag3 = Boolean.valueOf((bytes[1].byteValue() & 0x80) == 128); Byte num2 = new Byte((byte)(bytes[1].byteValue() & 0x7f)); Integer num3 = BitAssistant.toIntegerFromShortNetwork(bytes, Integer.valueOf(2)); Long num4 = BitAssistant.toLongFromIntegerNetwork(bytes, Integer.valueOf(4)); Long num5 = BitAssistant.toLongFromIntegerNetwork(bytes, Integer.valueOf(8)); Integer startIndex = Integer.valueOf(12); Long numArray[] = null; if(num.byteValue() > 0) { numArray = new Long[num.byteValue()]; for(Integer num7 = Integer.valueOf(0); num7.intValue() < num.byteValue();) { numArray[num7.intValue()] = BitAssistant.toLongFromIntegerNetwork(bytes, startIndex); startIndex = Integer.valueOf(startIndex.intValue() + 4); Integer integer = num7; Integer integer1 = num7 = Integer.valueOf(num7.intValue() + 1); Integer _tmp = integer; } } Integer num8 = Integer.valueOf(0); Long numArray2[] = null; if(flag2.booleanValue()) { num8 = BitAssistant.toIntegerFromShortNetwork(bytes, startIndex); startIndex = Integer.valueOf(startIndex.intValue() + 2); Integer num9 = BitAssistant.toIntegerFromShortNetwork(bytes, startIndex); startIndex = Integer.valueOf(startIndex.intValue() + 2); if(num9.intValue() > 0) { numArray2 = new Long[num9.intValue()]; for(Integer num7 = Integer.valueOf(0); num7.intValue() < num9.intValue();) { numArray2[num7.intValue()] = BitAssistant.toLongFromIntegerNetwork(bytes, startIndex); startIndex = Integer.valueOf(startIndex.intValue() + 4); Integer integer2 = num7; Integer integer3 = num7 = Integer.valueOf(num7.intValue() + 1); Integer _tmp1 = integer2; } } } RTPPacket packet = new RTPPacket(BitAssistant.subArray(bytes, startIndex)); packet.setPayloadType(num2); packet.setPadding(flag); packet.setMarker(flag3); packet.setSequenceNumber(num3); packet.setTimestamp(num4); packet.setSynchronizationSource(num5); packet.setContributingSources(numArray); packet.setExtensionHeader(num8); packet.setExtension(numArray2); return packet; } public void setContributingSources(Long value[]) { _contributingSources = value; } public void setExtension(Long value[]) { _extension = value; } public void setExtensionHeader(Integer value) { _extensionHeader = value; } public void setMarker(Boolean value) { _marker = value; } public void setPadding(Boolean value) { _padding = value; } public void setPayload(Byte value[]) { if(value == null) __payload = new Byte[0]; else __payload = value; } public void setPayloadType(Byte value) throws Exception { if(value.byteValue() < 0) { throw new Exception("Payload type is invalid."); } else { __payloadType = value; return; } } public void setSequenceNumber(Integer value) { _sequenceNumber = value; } public void setSynchronizationSource(Long value) { _synchronizationSource = value; } public void setTimestamp(Long value) { _timestamp = value; } }