package org.ifsoft.rtp; import org.ifsoft.*; import java.util.ArrayList; public abstract class RTCPPacket { private static Short _aPPPayloadType = Short.valueOf((short)0); private static Short _bYEPayloadType = Short.valueOf((short)0); private Byte _firstByte; private Boolean _padding; private Byte _payload[]; private Short _payloadType; private static Short _pSPayloadType = Short.valueOf((short)0); private static Short _rRPayloadType = Short.valueOf((short)0); private static Short _rTPPayloadType = Short.valueOf((short)0); private static Short _sDESPayloadType = Short.valueOf((short)0); private static Short _sRPayloadType = Short.valueOf((short)0); static { _sRPayloadType = new Short((short)200); _rRPayloadType = new Short((short)201); _sDESPayloadType = new Short((short)202); _bYEPayloadType = new Short((short)203); _aPPPayloadType = new Short((short)204); _rTPPayloadType = new Short((short)205); _pSPayloadType = new Short((short)206); } protected abstract void deserialize() throws Exception; protected RTCPPacket() { _firstByte = Byte.valueOf((byte)0); _padding = Boolean.valueOf(false); _payloadType = Short.valueOf((short)0); } public Byte[] getBytes() { return getBytes(this); } public static Byte[] getBytes(RTCPPacket packet) { ArrayList list = new ArrayList(); try { packet.serialize(); } catch(Exception exception1) { return new Byte[0]; } if(packet instanceof RTCPSRPacket) packet.setPayloadType(_sRPayloadType); else if(packet instanceof RTCPRRPacket) packet.setPayloadType(_rRPayloadType); else if(packet instanceof RTCPSDESPacket) packet.setPayloadType(_sDESPayloadType); else if(packet instanceof RTCPBYEPacket) packet.setPayloadType(_bYEPayloadType); else if(packet instanceof RTCPAPPPacket) packet.setPayloadType(_aPPPayloadType); else if(packet instanceof RTCPRTPPacket) packet.setPayloadType(_rTPPayloadType); else if(packet instanceof RTCPPSPacket) packet.setPayloadType(_pSPayloadType); list.add(new Byte((new Byte((new Integer(0x80 | (packet.getPadding().booleanValue() ? 0x20 : 0) | packet.getFirstByte().byteValue() & 0x1f)).byteValue())).byteValue())); list.add(new Byte(BitAssistant.getShortBytesNetwork(packet.getPayloadType())[1].byteValue())); ArrayListExtensions.addRange(list, BitAssistant.getShortBytesNetwork(new Short((new Integer(ArrayExtensions.getLength(packet.getPayload()).intValue() / 4)).shortValue()))); ArrayListExtensions.addRange(list, packet.getPayload()); return (Byte[])list.toArray(new Byte[0]); } public static Byte[] getBytes(RTCPPacket packets[]) { ArrayList list = new ArrayList(); RTCPPacket arr$[] = packets; int len$ = arr$.length; for(int i$ = 0; i$ < len$; i$++) { RTCPPacket packet = arr$[i$]; ArrayListExtensions.addRange(list, packet.getBytes()); } return (Byte[])list.toArray(new Byte[0]); } protected Byte getFirstByte() { return _firstByte; } public Boolean getPadding() { return _padding; } protected Byte[] getPayload() { return _payload; } private Short getPayloadType() { return _payloadType; } public static RTCPPacket[] parseBytes(Byte bytes[]) { ArrayList list = new ArrayList(); do { RTCPPacket item = parseNext(bytes); if(item == null) return (RTCPPacket[])list.toArray(new RTCPPacket[0]); list.add(item); Integer offset = Integer.valueOf(4 + ArrayExtensions.getLength(item.getPayload()).intValue()); Integer _var0 = offset; if(_var0 != null ? _var0.equals(ArrayExtensions.getLength(bytes)) : _var0 == ArrayExtensions.getLength(bytes)) return (RTCPPacket[])list.toArray(new RTCPPacket[0]); bytes = BitAssistant.subArray(bytes, offset); } while(true); } private static RTCPPacket parseNext(Byte bytes[]) { if(ArrayExtensions.getLength(bytes).intValue() >= 4 && (bytes[0].byteValue() & 0xc0) == 128) { Boolean flag = Boolean.valueOf((bytes[0].byteValue() & 0x20) == 32); Byte firstByte = new Byte((byte)(bytes[0].byteValue() & 0x1f)); Short num2 = BitAssistant.toShortNetwork(new Byte[] { Byte.valueOf((byte)0), bytes[1] }, Integer.valueOf(0)); Short num3 = BitAssistant.toShortNetwork(bytes, Integer.valueOf(2)); Byte buffer2[] = BitAssistant.subArray(bytes, Integer.valueOf(4), Integer.valueOf(num3.shortValue() * 4)); RTCPPacket packet = null; Short _var0 = num2; if(_var0 != null ? _var0.equals(_sRPayloadType) : _var0 == _sRPayloadType) packet = new RTCPSRPacket(); Short _var1 = num2; if(_var1 != null ? _var1.equals(_rRPayloadType) : _var1 == _rRPayloadType) packet = new RTCPRRPacket(); Short _var2 = num2; if(_var2 != null ? _var2.equals(_sDESPayloadType) : _var2 == _sDESPayloadType) packet = new RTCPSDESPacket(); Short _var3 = num2; if(_var3 != null ? _var3.equals(_bYEPayloadType) : _var3 == _bYEPayloadType) packet = new RTCPBYEPacket(); Short _var4 = num2; if(_var4 != null ? _var4.equals(_aPPPayloadType) : _var4 == _aPPPayloadType) packet = new RTCPAPPPacket(); Short _var5 = num2; if(_var5 != null ? _var5.equals(_rTPPayloadType) : _var5 == _rTPPayloadType) packet = RTCPRTPPacket.createPacket(firstByte); Short _var6 = num2; if(_var6 != null ? _var6.equals(_pSPayloadType) : _var6 == _pSPayloadType) packet = RTCPPSPacket.createPacket(firstByte); if(packet != null) { packet.setFirstByte(firstByte); packet.setPayload(buffer2); packet.setPayloadType(num2); packet.setPadding(flag); try { packet.deserialize(); } catch(Exception exception1) { return null; } return packet; } } return null; } protected abstract void serialize(); protected void setFirstByte(Byte value) { _firstByte = value; } public void setPadding(Boolean value) { _padding = value; } protected void setPayload(Byte value[]) { _payload = value; } private void setPayloadType(Short value) { _payloadType = value; } }