Switch commoncpp2 to ucommon to solve dependency conflicts.
libccrtp was depending on commoncpp2, and have been replaced by a version
depending on ucommon as well.
diff --git a/jni/libccrtp/sources/src/ccrtp/.cvsignore b/jni/libccrtp/sources/src/ccrtp/.cvsignore
new file mode 100644
index 0000000..22a4e72
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+Makefile.in
+
diff --git a/jni/libccrtp/sources/src/ccrtp/CMakeLists.txt b/jni/libccrtp/sources/src/ccrtp/CMakeLists.txt
new file mode 100644
index 0000000..1fc563d
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/CMakeLists.txt
@@ -0,0 +1,20 @@
+set(ccrtp1_headers base.h
+ formats.h
+ rtppkt.h
+ rtcppkt.h
+ sources.h
+ channel.h
+ queuebase.h
+ iqueue.h
+ oqueue.h
+ ioqueue.h
+ cqueue.h
+ ext.h
+ rtp.h
+ pool.h
+ CryptoContext.h
+ CryptoContextCtrl.h)
+
+########### install files ###############
+
+install(FILES ${ccrtp1_headers} DESTINATION include/ccrtp)
diff --git a/jni/libccrtp/sources/src/ccrtp/CryptoContext.h b/jni/libccrtp/sources/src/ccrtp/CryptoContext.h
index 7d25770..3367e81 100644
--- a/jni/libccrtp/sources/src/ccrtp/CryptoContext.h
+++ b/jni/libccrtp/sources/src/ccrtp/CryptoContext.h
@@ -21,14 +21,13 @@
#ifndef CRYPTOCONTEXT_H
#define CRYPTOCONTEXT_H
-#include <cc++/config.h>
+#include <commoncpp/config.h>
#include <ccrtp/rtppkt.h>
#define REPLAY_WINDOW_SIZE 64
-
const int SrtpAuthenticationNull = 0;
const int SrtpAuthenticationSha1Hmac = 1;
const int SrtpAuthenticationSkeinHmac = 2;
@@ -39,13 +38,17 @@
const int SrtpEncryptionTWOCM = 3;
const int SrtpEncryptionTWOF8 = 4;
+#ifndef CRYPTOCONTEXTCTRL_H
+
+#include <stdint.h>
+
#ifdef SRTP_SUPPORT
-#include <ccrtp/crypto/AesSrtp.h>
+#include <ccrtp/crypto/SrtpSymCrypto.h>
#endif
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+class SrtpSymCrypto;
+
+NAMESPACE_COMMONCPP
class RTPPacket;
@@ -78,330 +81,330 @@
*/
class __EXPORT CryptoContext {
- public:
- /**
- * Constructor for empty SRTP cryptographic context.
- *
- * This constructor creates an empty SRTP cryptographic context were
- * all algorithms are set to the null algorithm, that is no SRTP processing
- * is performed.
- *
- * @param ssrc The RTP SSRC that this SRTP cryptographic context protects.
- */
- CryptoContext( uint32 ssrc );
+ public:
+ /**
+ * Constructor for empty SRTP cryptographic context.
+ *
+ * This constructor creates an empty SRTP cryptographic context were
+ * all algorithms are set to the null algorithm, that is no SRTP processing
+ * is performed.
+ *
+ * @param ssrc The RTP SSRC that this SRTP cryptographic context protects.
+ */
+ CryptoContext( uint32 ssrc );
- /**
- * Constructor for an active SRTP cryptographic context.
- *
- * This constructor creates an active SRTP cryptographic context were
- * algorithms are enabled, keys are computed and so on. This SRTP
- * cryptographic context can protect a RTP SSRC stream.
- *
- * @param ssrc
- * The RTP SSRC that this SRTP cryptographic context protects.
- *
- * @param roc
- * The initial Roll-Over-Counter according to RFC 3711. These are the
- * upper 32 bit of the overall 48 bit SRTP packet index. Refer to
- * chapter 3.2.1 of the RFC.
- *
- * @param keyDerivRate
- * The key derivation rate defines when to recompute the SRTP session
- * keys. Refer to chapter 4.3.1 in the RFC.
- *
- * @param ealg
- * The encryption algorithm to use. Possible values are <code>
- * SrtpEncryptionNull, SrtpEncryptionAESCM, SrtpEncryptionAESF8
- * </code>. See chapter 4.1.1 for AESCM (Counter mode) and 4.1.2
- * for AES F8 mode.
- *
- * @param aalg
- * The authentication algorithm to use. Possible values are <code>
- * SrtpEncryptionNull, SrtpAuthenticationSha1Hmac</code>. The only
- * active algorithm here is SHA1 HMAC, a SHA1 based hashed message
- * authentication code as defined in RFC 2104.
- *
- * @param masterKey
- * Pointer to the master key for this SRTP cryptographic context.
- * Must point to <code>masterKeyLength</code> bytes. Refer to chapter
- * 3.2.1 of the RFC about the role of the master key.
- *
- * @param masterKeyLength
- * The length in bytes of the master key in bytes. The length must
- * match the selected encryption algorithm. Because SRTP uses AES
- * based encryption only, then master key length may be 16 or 32
- * bytes (128 or 256 bit master key)
- *
- * @param masterSalt
- * SRTP uses the master salt to computer the initialization vector
- * that in turn is input to compute the session key, session
- * authentication key and the session salt.
- *
- * @param masterSaltLength
- * The length in bytes of the master salt data in bytes. SRTP uses
- * AES as encryption algorithm. AES encrypts 16 byte blocks
- * (independent of the key length). According to RFC3711 the standard
- * value for the master salt length should be 112 bit (14 bytes).
- *
- * @param ekeyl
- * The length in bytes of the session encryption key that SRTP shall
- * compute and use. Usually the same length as for the master key
- * length. But you may use a different length as well. Be carefull
- * that the key management mechanisms supports different key lengths.
- *
- * @param akeyl
- * The length in bytes of the session authentication key. SRTP
- * computes this key and uses it as input to the authentication
- * algorithm.
- * The standard value is 160 bits (20 bytes).
- *
- * @param skeyl
- * The length in bytes of the session salt. SRTP computes this salt
- * key and uses it as input during encryption. The length usually
- * is the same as the master salt length.
- *
- * @param tagLength
- * The length is bytes of the authentication tag that SRTP appends
- * to the RTP packet. Refer to chapter 4.2. in the RFC 3711.
- */
- CryptoContext( uint32 ssrc, int32 roc,
- int64 keyDerivRate,
- const int32 ealg,
- const int32 aalg,
- uint8* masterKey,
- int32 masterKeyLength,
- uint8* masterSalt,
- int32 masterSaltLength,
- int32 ekeyl,
- int32 akeyl,
- int32 skeyl,
- int32 tagLength );
- /**
- * Destructor.
- *
- * Cleans the SRTP cryptographic context.
- */
- ~CryptoContext();
+ /**
+ * Constructor for an active SRTP cryptographic context.
+ *
+ * This constructor creates an active SRTP cryptographic context were
+ * algorithms are enabled, keys are computed and so on. This SRTP
+ * cryptographic context can protect a RTP SSRC stream.
+ *
+ * @param ssrc
+ * The RTP SSRC that this SRTP cryptographic context protects.
+ *
+ * @param roc
+ * The initial Roll-Over-Counter according to RFC 3711. These are the
+ * upper 32 bit of the overall 48 bit SRTP packet index. Refer to
+ * chapter 3.2.1 of the RFC.
+ *
+ * @param keyDerivRate
+ * The key derivation rate defines when to recompute the SRTP session
+ * keys. Refer to chapter 4.3.1 in the RFC.
+ *
+ * @param ealg
+ * The encryption algorithm to use. Possible values are <code>
+ * SrtpEncryptionNull, SrtpEncryptionAESCM, SrtpEncryptionAESF8
+ * </code>. See chapter 4.1.1 for AESCM (Counter mode) and 4.1.2
+ * for AES F8 mode.
+ *
+ * @param aalg
+ * The authentication algorithm to use. Possible values are <code>
+ * SrtpEncryptionNull, SrtpAuthenticationSha1Hmac</code>. The only
+ * active algorithm here is SHA1 HMAC, a SHA1 based hashed message
+ * authentication code as defined in RFC 2104.
+ *
+ * @param masterKey
+ * Pointer to the master key for this SRTP cryptographic context.
+ * Must point to <code>masterKeyLength</code> bytes. Refer to chapter
+ * 3.2.1 of the RFC about the role of the master key.
+ *
+ * @param masterKeyLength
+ * The length in bytes of the master key in bytes. The length must
+ * match the selected encryption algorithm. Because SRTP uses AES
+ * based encryption only, then master key length may be 16 or 32
+ * bytes (128 or 256 bit master key)
+ *
+ * @param masterSalt
+ * SRTP uses the master salt to computer the initialization vector
+ * that in turn is input to compute the session key, session
+ * authentication key and the session salt.
+ *
+ * @param masterSaltLength
+ * The length in bytes of the master salt data in bytes. SRTP uses
+ * AES as encryption algorithm. AES encrypts 16 byte blocks
+ * (independent of the key length). According to RFC3711 the standard
+ * value for the master salt length should be 112 bit (14 bytes).
+ *
+ * @param ekeyl
+ * The length in bytes of the session encryption key that SRTP shall
+ * compute and use. Usually the same length as for the master key
+ * length. But you may use a different length as well. Be carefull
+ * that the key management mechanisms supports different key lengths.
+ *
+ * @param akeyl
+ * The length in bytes of the session authentication key. SRTP
+ * computes this key and uses it as input to the authentication
+ * algorithm.
+ * The standard value is 160 bits (20 bytes).
+ *
+ * @param skeyl
+ * The length in bytes of the session salt. SRTP computes this salt
+ * key and uses it as input during encryption. The length usually
+ * is the same as the master salt length.
+ *
+ * @param tagLength
+ * The length is bytes of the authentication tag that SRTP appends
+ * to the RTP packet. Refer to chapter 4.2. in the RFC 3711.
+ */
+ CryptoContext( uint32 ssrc, int32 roc,
+ int64 keyDerivRate,
+ const int32 ealg,
+ const int32 aalg,
+ uint8* masterKey,
+ int32 masterKeyLength,
+ uint8* masterSalt,
+ int32 masterSaltLength,
+ int32 ekeyl,
+ int32 akeyl,
+ int32 skeyl,
+ int32 tagLength );
+ /**
+ * Destructor.
+ *
+ * Cleans the SRTP cryptographic context.
+ */
+ ~CryptoContext();
- /**
- * Set the Roll-Over-Counter.
- *
- * Ths method sets the upper 32 bit of the 48 bit SRTP packet index
- * (the roll-over-part)
- *
- * @param r
- * The roll-over-counter
- */
- inline void
- setRoc(uint32 r)
- {roc = r;}
+ /**
+ * Set the Roll-Over-Counter.
+ *
+ * Ths method sets the upper 32 bit of the 48 bit SRTP packet index
+ * (the roll-over-part)
+ *
+ * @param r
+ * The roll-over-counter
+ */
+ inline void
+ setRoc(uint32 r)
+ {roc = r;}
- /**
- * Get the Roll-Over-Counter.
- *
- * Ths method get the upper 32 bit of the 48 bit SRTP packet index
- * (the roll-over-part)
- *
- * @return The roll-over-counter
- */
- inline uint32
- getRoc() const
- {return roc;}
+ /**
+ * Get the Roll-Over-Counter.
+ *
+ * Ths method get the upper 32 bit of the 48 bit SRTP packet index
+ * (the roll-over-part)
+ *
+ * @return The roll-over-counter
+ */
+ inline uint32
+ getRoc() const
+ {return roc;}
- /**
- * Perform SRTP encryption.
- *
- * This method encrypts <em>and</em> decrypts SRTP payload data. Plain
- * data gets encrypted, encrypted data get decrypted.
- *
- * @param rtp
- * The RTP packet that contains the data to encrypt.
- *
- * @param index
- * The 48 bit SRTP packet index. See the <code>guessIndex</code>
- * method.
- *
- * @param ssrc
- * The RTP SSRC data in <em>host</em> order.
- */
- void srtpEncrypt( RTPPacket* rtp, uint64 index, uint32 ssrc );
+ /**
+ * Perform SRTP encryption.
+ *
+ * This method encrypts <em>and</em> decrypts SRTP payload data. Plain
+ * data gets encrypted, encrypted data get decrypted.
+ *
+ * @param rtp
+ * The RTP packet that contains the data to encrypt.
+ *
+ * @param index
+ * The 48 bit SRTP packet index. See the <code>guessIndex</code>
+ * method.
+ *
+ * @param ssrc
+ * The RTP SSRC data in <em>host</em> order.
+ */
+ void srtpEncrypt( RTPPacket* rtp, uint64 index, uint32 ssrc );
- /**
- * Compute the authentication tag.
- *
- * Compute the authentication tag according the the paramters in the
- * SRTP Cryptograhic context.
- *
- * @param rtp
- * The RTP packet that contains the data to authenticate.
- *
- * @param roc
- * The 32 bit SRTP roll-over-counter.
- *
- * @param tag
- * Points to a buffer that hold the computed tag. This buffer must
- * be able to hold <code>tagLength</code> bytes.
- */
- void srtpAuthenticate(RTPPacket* rtp, uint32 roc, uint8* tag );
+ /**
+ * Compute the authentication tag.
+ *
+ * Compute the authentication tag according the the paramters in the
+ * SRTP Cryptograhic context.
+ *
+ * @param rtp
+ * The RTP packet that contains the data to authenticate.
+ *
+ * @param roc
+ * The 32 bit SRTP roll-over-counter.
+ *
+ * @param tag
+ * Points to a buffer that hold the computed tag. This buffer must
+ * be able to hold <code>tagLength</code> bytes.
+ */
+ void srtpAuthenticate(RTPPacket* rtp, uint32 roc, uint8* tag );
- /**
- * Perform key derivation according to SRTP specification
- *
- * This method computes the session key, session authentication key and the
- * session salt key. This method must be called at least once after the
- * SRTP Cryptograhic context was set up.
- *
- * @param index
- * The 48 bit SRTP packet index. See the <code>guessIndex</code>
- * method.
- */
- void deriveSrtpKeys(uint64 index);
+ /**
+ * Perform key derivation according to SRTP specification
+ *
+ * This method computes the session key, session authentication key and the
+ * session salt key. This method must be called at least once after the
+ * SRTP Cryptograhic context was set up.
+ *
+ * @param index
+ * The 48 bit SRTP packet index. See the <code>guessIndex</code>
+ * method.
+ */
+ void deriveSrtpKeys(uint64 index);
- /**
- * Compute (guess) the new SRTP index based on the sequence number of
- * a received RTP packet.
- *
- * The method uses the algorithm show in RFC3711, Appendix A, to compute
- * the new index.
- *
- * @param newSeqNumber
- * The sequence number of the received RTP packet in host order.
- *
- * @return The new SRTP packet index
- */
- uint64 guessIndex(uint16 newSeqNumber);
+ /**
+ * Compute (guess) the new SRTP index based on the sequence number of
+ * a received RTP packet.
+ *
+ * The method uses the algorithm show in RFC3711, Appendix A, to compute
+ * the new index.
+ *
+ * @param newSeqNumber
+ * The sequence number of the received RTP packet in host order.
+ *
+ * @return The new SRTP packet index
+ */
+ uint64 guessIndex(uint16 newSeqNumber);
- /**
- * Check for packet replay.
- *
- * The method check if a received packet is either to old or was already
- * received.
- *
- * The method supports a 64 packet history relative the the given
- * sequence number.
- *
- * @param newSeqNumber
- * The sequence number of the received RTP packet in host order.
- *
- * @return <code>true</code> if no replay, <code>false</code> if packet
- * is too old ar was already received.
- */
- bool checkReplay(uint16 newSeqNumber);
+ /**
+ * Check for packet replay.
+ *
+ * The method check if a received packet is either to old or was already
+ * received.
+ *
+ * The method supports a 64 packet history relative the the given
+ * sequence number.
+ *
+ * @param newSeqNumber
+ * The sequence number of the received RTP packet in host order.
+ *
+ * @return <code>true</code> if no replay, <code>false</code> if packet
+ * is too old ar was already received.
+ */
+ bool checkReplay(uint16 newSeqNumber);
- /**
- * Update the SRTP packet index.
- *
- * Call this method after all checks were successful. See chapter
- * 3.3.1 in the RFC when to update the ROC and ROC processing.
- *
- * @param newSeqNumber
- * The sequence number of the received RTP packet in host order.
- */
- void update( uint16 newSeqNumber );
+ /**
+ * Update the SRTP packet index.
+ *
+ * Call this method after all checks were successful. See chapter
+ * 3.3.1 in the RFC when to update the ROC and ROC processing.
+ *
+ * @param newSeqNumber
+ * The sequence number of the received RTP packet in host order.
+ */
+ void update( uint16 newSeqNumber );
- /**
- * Get the length of the SRTP authentication tag in bytes.
- *
- * @return the length of the authentication tag.
- */
- inline int32
- getTagLength() const
- {return tagLength;}
+ /**
+ * Get the length of the SRTP authentication tag in bytes.
+ *
+ * @return the length of the authentication tag.
+ */
+ inline int32
+ getTagLength() const
+ {return tagLength;}
- /**
- * Get the length of the MKI in bytes.
- *
- * @return the length of the MKI.
- */
- inline int32
- getMkiLength() const
- {return mkiLength;}
+ /**
+ * Get the length of the MKI in bytes.
+ *
+ * @return the length of the MKI.
+ */
+ inline int32
+ getMkiLength() const
+ {return mkiLength;}
- /**
- * Get the SSRC of this SRTP Cryptograhic context.
- *
- * @return the SSRC.
- */
- inline uint32
- getSsrc() const
- {return ssrc;}
+ /**
+ * Get the SSRC of this SRTP Cryptograhic context.
+ *
+ * @return the SSRC.
+ */
+ inline uint32
+ getSsrc() const
+ {return ssrcCtx;}
- /**
- * Derive a new Crypto Context for use with a new SSRC
- *
- * This method returns a new Crypto Context initialized with the data
- * of this crypto context. Replacing the SSRC, Roll-over-Counter, and
- * the key derivation rate the application cab use this Crypto Context
- * to encrypt / decrypt a new stream (Synchronization source) inside
- * one RTP session.
- *
- * Before the application can use this crypto context it must call
- * the <code>deriveSrtpKeys</code> method.
- *
- * @param ssrc
- * The SSRC for this context
- * @param roc
- * The Roll-Over-Counter for this context
- * @param keyDerivRate
- * The key derivation rate for this context
- * @return
- * a new CryptoContext with all relevant data set.
- */
+ /**
+ * Derive a new Crypto Context for use with a new SSRC
+ *
+ * This method returns a new Crypto Context initialized with the data
+ * of this crypto context. Replacing the SSRC, Roll-over-Counter, and
+ * the key derivation rate the application cab use this Crypto Context
+ * to encrypt / decrypt a new stream (Synchronization source) inside
+ * one RTP session.
+ *
+ * Before the application can use this crypto context it must call
+ * the <code>deriveSrtpKeys</code> method.
+ *
+ * @param ssrc
+ * The SSRC for this context
+ * @param roc
+ * The Roll-Over-Counter for this context
+ * @param keyDerivRate
+ * The key derivation rate for this context
+ * @return
+ * a new CryptoContext with all relevant data set.
+ */
+ CryptoContext* newCryptoContextForSSRC(uint32 ssrc, int roc, int64 keyDerivRate);
- CryptoContext* newCryptoContextForSSRC(uint32 ssrc, int roc, int64 keyDerivRate);
+ private:
- private:
+ uint32 ssrcCtx;
+ bool using_mki;
+ uint32 mkiLength;
+ uint8* mki;
- uint32 ssrc;
- bool using_mki;
- uint32 mkiLength;
- uint8* mki;
+ uint32 roc;
+ uint32 guessed_roc;
+ uint16 s_l;
+ int64 key_deriv_rate;
- uint32 roc;
- uint32 guessed_roc;
- uint16 s_l;
- int64 key_deriv_rate;
+ /* bitmask for replay check */
+ uint64 replay_window;
- /* bitmask for replay check */
- uint64 replay_window;
+ uint8* master_key;
+ uint32 master_key_length;
+ uint32 master_key_srtp_use_nb;
+ uint32 master_key_srtcp_use_nb;
+ uint8* master_salt;
+ uint32 master_salt_length;
- uint8* master_key;
- uint32 master_key_length;
- uint32 master_key_srtp_use_nb;
- uint32 master_key_srtcp_use_nb;
- uint8* master_salt;
- uint32 master_salt_length;
+ /* Session Encryption, Authentication keys, Salt */
+ int32 n_e;
+ uint8* k_e;
+ int32 n_a;
+ uint8* k_a;
+ int32 n_s;
+ uint8* k_s;
- /* Session Encryption, Authentication keys, Salt */
- int32 n_e;
- uint8* k_e;
- int32 n_a;
- uint8* k_a;
- int32 n_s;
- uint8* k_s;
-
- int32 ealg;
- int32 aalg;
- int32 ekeyl;
- int32 akeyl;
- int32 skeyl;
- int32 tagLength;
- bool seqNumSet;
+ int32 ealg;
+ int32 aalg;
+ int32 ekeyl;
+ int32 akeyl;
+ int32 skeyl;
+ int32 tagLength;
+ bool seqNumSet;
void* macCtx;
#ifdef SRTP_SUPPORT
- AesSrtp* cipher;
- AesSrtp* f8Cipher;
+ SrtpSymCrypto* cipher;
+ SrtpSymCrypto* f8Cipher;
#else
- void* cipher;
- void* f8Cipher;
+ void* cipher;
+ void* f8Cipher;
#endif
};
-#ifdef CCXX_NAMESPACES
-}
+
+END_NAMESPACE
+
#endif
#endif
diff --git a/jni/libccrtp/sources/src/ccrtp/CryptoContextCtrl.h b/jni/libccrtp/sources/src/ccrtp/CryptoContextCtrl.h
new file mode 100644
index 0000000..10a50e7
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/CryptoContextCtrl.h
@@ -0,0 +1,341 @@
+/*
+ Copyright (C) 2004-2006 the Minisip Team
+ Copyright (C) 2011 Werner Dittmann for the SRTCP support
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+
+#ifndef CRYPTOCONTEXTCTRL_H
+#define CRYPTOCONTEXTCTRL_H
+
+#include <commoncpp/config.h>
+
+#define REPLAY_WINDOW_SIZE 64
+
+#ifdef SRTP_SUPPORT
+#include <ccrtp/crypto/SrtpSymCrypto.h>
+#endif
+
+NAMESPACE_COMMONCPP
+
+ /**
+ * The implementation for a SRTCP cryptographic context.
+ *
+ * This class holds data and provides functions that implement a
+ * cryptographic context for SRTP, Refer to RFC 3711, chapter 3.2 for some
+ * more detailed information about the SRTP cryptographic context.
+ *
+ * Each SRTP cryptographic context maintains a RTP source identified by
+ * its SSRC. Thus you can independently protect each source inside a RTP
+ * session.
+ *
+ * Key management mechanisms negotiate the parameters for the SRTP
+ * cryptographic context, such as master key, key length, authentication
+ * length and so on. The key management mechanisms are not part of
+ * SRTP. Refer to MIKEY (RFC 3880) or to Phil Zimmermann's ZRTP protocol
+ * (draft-zimmermann-avt-zrtp-01). After key management negotiated the
+ * data the application can setup the SRTCP cryptographic context and
+ * enable SRTCP processing.
+ *
+ *
+ * @author Israel Abad <i_abad@terra.es>
+ * @author Erik Eliasson <eliasson@it.kth.se>
+ * @author Johan Bilien <jobi@via.ecp.fr>
+ * @author Joachim Orrblad <joachim@orrblad.com>
+ * @author Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+
+ class __EXPORT CryptoContextCtrl {
+ public:
+ /**
+ * Constructor for empty SRTP cryptographic context.
+ *
+ * This constructor creates an empty SRTP cryptographic context were
+ * all algorithms are set to the null algorithm, that is no SRTP processing
+ * is performed.
+ *
+ * @param ssrc The RTP SSRC that this SRTP cryptographic context protects.
+ */
+ CryptoContextCtrl( uint32 ssrc );
+
+ /**
+ * Constructor for an active SRTP cryptographic context.
+ *
+ * This constructor creates an active SRTP cryptographic context were
+ * algorithms are enabled, keys are computed and so on. This SRTP
+ * cryptographic context can protect a RTP SSRC stream.
+ *
+ * @param ssrc
+ * The RTP SSRC that this SRTP cryptographic context protects.
+ *
+ * @param ealg
+ * The encryption algorithm to use. Possible values are <code>
+ * SrtpEncryptionNull, SrtpEncryptionAESCM, SrtpEncryptionAESF8
+ * </code>. See chapter 4.1.1 for AESCM (Counter mode) and 4.1.2
+ * for AES F8 mode.
+ *
+ * @param aalg
+ * The authentication algorithm to use. Possible values are <code>
+ * SrtpEncryptionNull, SrtpAuthenticationSha1Hmac</code>. The only
+ * active algorithm here is SHA1 HMAC, a SHA1 based hashed message
+ * authentication code as defined in RFC 2104.
+ *
+ * @param masterKey
+ * Pointer to the master key for this SRTP cryptographic context.
+ * Must point to <code>masterKeyLength</code> bytes. Refer to chapter
+ * 3.2.1 of the RFC about the role of the master key.
+ *
+ * @param masterKeyLength
+ * The length in bytes of the master key in bytes. The length must
+ * match the selected encryption algorithm. Because SRTP uses AES
+ * based encryption only, then master key length may be 16 or 32
+ * bytes (128 or 256 bit master key)
+ *
+ * @param masterSalt
+ * SRTP uses the master salt to computer the initialization vector
+ * that in turn is input to compute the session key, session
+ * authentication key and the session salt.
+ *
+ * @param masterSaltLength
+ * The length in bytes of the master salt data in bytes. SRTP uses
+ * AES as encryption algorithm. AES encrypts 16 byte blocks
+ * (independent of the key length). According to RFC3711 the standard
+ * value for the master salt length should be 112 bit (14 bytes).
+ *
+ * @param ekeyl
+ * The length in bytes of the session encryption key that SRTP shall
+ * compute and use. Usually the same length as for the master key
+ * length. But you may use a different length as well. Be carefull
+ * that the key management mechanisms supports different key lengths.
+ *
+ * @param akeyl
+ * The length in bytes of the session authentication key. SRTP
+ * computes this key and uses it as input to the authentication
+ * algorithm.
+ * The standard value is 160 bits (20 bytes).
+ *
+ * @param skeyl
+ * The length in bytes of the session salt. SRTP computes this salt
+ * key and uses it as input during encryption. The length usually
+ * is the same as the master salt length.
+ *
+ * @param tagLength
+ * The length is bytes of the authentication tag that SRTP appends
+ * to the RTP packet. Refer to chapter 4.2. in the RFC 3711.
+ */
+ CryptoContextCtrl( uint32 ssrc,
+ const int32 ealg,
+ const int32 aalg,
+ uint8* masterKey,
+ int32 masterKeyLength,
+ uint8* masterSalt,
+ int32 masterSaltLength,
+ int32 ekeyl,
+ int32 akeyl,
+ int32 skeyl,
+ int32 tagLength );
+ /**
+ * Destructor.
+ *
+ * Cleans the SRTP cryptographic context.
+ */
+ ~CryptoContextCtrl();
+
+ /**
+ * Perform SRTP encryption.
+ *
+ * This method encrypts <em>and</em> decrypts SRTP payload data. Plain
+ * data gets encrypted, encrypted data get decrypted.
+ *
+ * @param rtp
+ * The RTP packet that contains the data to encrypt.
+ *
+ * @param index
+ * The 48 bit SRTP packet index. See the <code>guessIndex</code>
+ * method.
+ *
+ * @param ssrc
+ * The RTP SSRC data in <em>host</em> order.
+ */
+ void srtcpEncrypt( uint8* rtp, size_t len, uint64 index, uint32 ssrc );
+
+ /**
+ * Compute the authentication tag.
+ *
+ * Compute the authentication tag according the the paramters in the
+ * SRTP Cryptograhic context.
+ *
+ * @param rtp
+ * The RTP packet that contains the data to authenticate.
+ *
+ * @param roc
+ * The 32 bit SRTP roll-over-counter.
+ *
+ * @param tag
+ * Points to a buffer that hold the computed tag. This buffer must
+ * be able to hold <code>tagLength</code> bytes.
+ */
+ void srtcpAuthenticate(uint8* rtp, size_t len, uint32 roc, uint8* tag );
+
+ /**
+ * Perform key derivation according to SRTP specification
+ *
+ * This method computes the session key, session authentication key and the
+ * session salt key. This method must be called at least once after the
+ * SRTP Cryptograhic context was set up.
+ *
+ * @param index
+ * The 48 bit SRTP packet index. See the <code>guessIndex</code>
+ * method.
+ */
+ void deriveSrtcpKeys();
+
+ /**
+ * Check for packet replay.
+ *
+ * The method check if a received packet is either to old or was already
+ * received.
+ *
+ * The method supports a 64 packet history relative the the given
+ * sequence number.
+ *
+ * @param newSeqNumber
+ * The sequence number of the received RTP packet in host order.
+ *
+ * @return <code>true</code> if no replay, <code>false</code> if packet
+ * is too old ar was already received.
+ */
+ bool checkReplay(uint32 newSeqNumber);
+
+ /**
+ * Update the SRTP packet index.
+ *
+ * Call this method after all checks were successful. See chapter
+ * 3.3.1 in the RFC when to update the ROC and ROC processing.
+ *
+ * @param newSeqNumber
+ * The sequence number of the received RTCP packet in host order.
+ */
+ void update( uint32 newSeqNumber );
+
+ /**
+ * Get the length of the SRTP authentication tag in bytes.
+ *
+ * @return the length of the authentication tag.
+ */
+ inline int32
+ getTagLength() const
+ {return tagLength;}
+
+
+ /**
+ * Get the length of the MKI in bytes.
+ *
+ * @return the length of the MKI.
+ */
+ inline int32
+ getMkiLength() const
+ {return mkiLength;}
+
+ /**
+ * Get the SSRC of this SRTP Cryptograhic context.
+ *
+ * @return the SSRC.
+ */
+ inline uint32
+ getSsrc() const
+ {return ssrcCtx;}
+
+ /**
+ * Derive a new Crypto Context for use with a new SSRC
+ *
+ * This method returns a new Crypto Context initialized with the data
+ * of this crypto context. Replacing the SSRC, Roll-over-Counter, and
+ * the key derivation rate the application cab use this Crypto Context
+ * to encrypt / decrypt a new stream (Synchronization source) inside
+ * one RTP session.
+ *
+ * Before the application can use this crypto context it must call
+ * the <code>deriveSrtpKeys</code> method.
+ *
+ * @param ssrc
+ * The SSRC for this context
+ * @param roc
+ * The Roll-Over-Counter for this context
+ * @param keyDerivRate
+ * The key derivation rate for this context
+ * @return
+ * a new CryptoContext with all relevant data set.
+ */
+ CryptoContextCtrl* newCryptoContextForSSRC(uint32 ssrc);
+
+ private:
+
+ uint32 ssrcCtx;
+ bool using_mki;
+ uint32 mkiLength;
+ uint8* mki;
+
+ uint32 s_l;
+
+ /* bitmask for replay check */
+ uint64 replay_window;
+
+ uint8* master_key;
+ uint32 master_key_length;
+ uint8* master_salt;
+ uint32 master_salt_length;
+
+ /* Session Encryption, Authentication keys, Salt */
+ int32 n_e;
+ uint8* k_e;
+ int32 n_a;
+ uint8* k_a;
+ int32 n_s;
+ uint8* k_s;
+
+ int32 ealg;
+ int32 aalg;
+ int32 ekeyl;
+ int32 akeyl;
+ int32 skeyl;
+ int32 tagLength;
+
+ void* macCtx;
+
+#ifdef SRTP_SUPPORT
+ SrtpSymCrypto* cipher;
+ SrtpSymCrypto* f8Cipher;
+#else
+ void* cipher;
+ void* f8Cipher;
+#endif
+
+ };
+
+END_NAMESPACE
+
+#endif
+
+/** EMACS **
+ * Local variables:
+ * mode: c++
+ * c-default-style: ellemtel
+ * c-basic-offset: 4
+ * End:
+ */
+
diff --git a/jni/libccrtp/sources/src/ccrtp/Makefile b/jni/libccrtp/sources/src/ccrtp/Makefile
index 4c1c3d6..a74f4d3 100644
--- a/jni/libccrtp/sources/src/ccrtp/Makefile
+++ b/jni/libccrtp/sources/src/ccrtp/Makefile
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
# src/ccrtp/Makefile. Generated from Makefile.in by configure.
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -27,6 +26,51 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/ccrtp
pkgincludedir = $(includedir)/ccrtp
pkglibdir = $(libdir)/ccrtp
@@ -44,11 +88,11 @@
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = x86_64-unknown-linux-gnu
-host_triplet = arm-unknown-linux-androideabi
-target_triplet = arm-unknown-linux-androideabi
+host_triplet = x86_64-unknown-linux-gnu
+target_triplet = x86_64-unknown-linux-gnu
subdir = src/ccrtp
-DIST_COMMON = $(ccxxinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(ccxxinclude_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libgcrypt_local.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
@@ -59,13 +103,30 @@
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_HEADER = $(top_builddir)/ccrtp-config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_$(V))
+am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+am__v_at_1 =
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -87,76 +148,99 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(ccxxincludedir)"
HEADERS = $(ccxxinclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run aclocal-1.11
-AMTAR = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run tar
-AR = arm-linux-androideabi-ar
-AUTOCONF = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run automake-1.11
+ACLOCAL = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing aclocal-1.13
+AMTAR = $${TAR-tar}
+AM_DEFAULT_VERBOSITY = 1
+AR = ar
+AUTOCONF = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing autoconf
+AUTOHEADER = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing autoheader
+AUTOMAKE = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing automake-1.13
AWK = gawk
-CC = arm-linux-androideabi-gcc
+CC = gcc
CCDEPMODE = depmode=none
CFLAGS = -g -O2
-COMMON_CFLAGS = -D_GNU_SOURCE
-COMMON_LIBS = -pthread -lccgnu2 -ldl -lrt
-CPP = arm-linux-androideabi-gcc -E
+COMMONCPP_CFLAGS = -Wno-long-long -fexceptions -DNEW_STDCPP -pthread -fno-check-new -finline -fvisibility=hidden -DUCOMMON_VISIBILITY=1
+COMMONCPP_LIBS = -lcommoncpp -lucommon -lrt -ldl -lpthread
+CPP = gcc -E
CPPFLAGS =
-CXX = arm-linux-androideabi-g++
-CXXCPP = arm-linux-androideabi-g++ -E
+CXX = g++
+CXXCPP = g++ -E
CXXDEPMODE = depmode=none
-CXXFLAGS = -g -O2 -D_GNU_SOURCE
+CXXFLAGS = -g -O2 -Wno-long-long -fexceptions -DNEW_STDCPP -pthread -fno-check-new -finline -fvisibility=hidden -DUCOMMON_VISIBILITY=1
CYGPATH_W = echo
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
DLLTOOL = false
-DOXYGEN = no
+DOXYGEN = /usr/bin/doxygen
DSYMUTIL =
DUMPBIN =
ECHO_C =
ECHO_N = -n
ECHO_T =
-EGREP = /bin/grep -E
+EGREP = /usr/bin/grep -E
EXEEXT =
-FGREP = /bin/grep -F
+FGREP = /usr/bin/grep -F
FTPDIR =
-GNULIBS = -L/usr/lib -pthread -lccgnu2 -ldl -lrt
-GREP = /bin/grep
+GNULIBS = -lcommoncpp -lucommon -lrt -ldl -lpthread -lgcrypt -ldl -lgpg-error
+GREP = /usr/bin/grep
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
KDOC_DIR = $(top_srcdir)/doc
-LD = /home/evigier/android-14b-toolchain/arm-linux-androideabi/bin/ld
+LD = /usr/bin/ld -m elf_x86_64
LDFLAGS =
LIBGCRYPT_CFLAGS =
-LIBGCRYPT_CONFIG =
-LIBGCRYPT_LIBS =
+LIBGCRYPT_CONFIG = /usr/bin/libgcrypt-config
+LIBGCRYPT_LIBS = -lgcrypt -ldl -lgpg-error
LIBOBJS =
-LIBS =
+LIBS = -lgcrypt -ldl -lgpg-error
LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIB_MAJOR = 0
-LIB_VERSION = 1_8
LIPO =
LN_S = ln -s
LTLIBOBJS =
-LT_CCXX_VERSION = -version-info 0:0
-LT_MAJOR = 0
+LT_CCXX_VERSION = -version-info 2:2:0
+LT_MAJOR = 2
LT_MINOR = 0
-LT_RELEASE = 1.8
-LT_SUBVER = 0.0
+LT_RELEASE =
+LT_SUBVER = 2.0
+LT_VERSION = 2:2:0
MAINT = #
-MAKEINFO = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing makeinfo
MANIFEST_TOOL = :
-MKDIR_P = /bin/mkdir -p
-NM = /home/evigier/android-14b-toolchain/bin/arm-linux-androideabi-nm -B
+MKDIR_P = /usr/bin/mkdir -p
+NM = /usr/bin/nm -B
NMEDIT =
-OBJDUMP = arm-linux-androideabi-objdump
+OBJDUMP = objdump
OBJEXT = o
OTOOL =
OTOOL64 =
@@ -170,27 +254,27 @@
PATH_SEPARATOR = :
PKG_CONFIG = /usr/bin/pkg-config
PKG_CONFIG_LIBDIR =
-PKG_CONFIG_PATH = /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/lib/pkgconfig:/usr/local/lib/pkgconfig
-RANLIB = arm-linux-androideabi-ranlib
-SED = /bin/sed
+PKG_CONFIG_PATH = /usr/local/lib/pkgconfig
+RANLIB = ranlib
+SED = /usr/bin/sed
SET_MAKE =
-SHELL = /bin/bash
-STRIP = arm-linux-androideabi-strip
-VERSION = 1.8.0
+SHELL = /bin/sh
+STRIP = strip
+VERSION = 2.0.4
WARN_FLAGS = -fno-strict-aliasing -Wall -ansi -pedantic
-abs_builddir = /home/evigier/git/ccrtp-1.8.0-android/src/ccrtp
-abs_srcdir = /home/evigier/git/ccrtp-1.8.0-android/src/ccrtp
-abs_top_builddir = /home/evigier/git/ccrtp-1.8.0-android
-abs_top_srcdir = /home/evigier/git/ccrtp-1.8.0-android
-ac_ct_AR =
-ac_ct_CC =
-ac_ct_CXX =
+abs_builddir = /home/lisional/git/sflphone-android/jni/libccrtp/sources/src/ccrtp
+abs_srcdir = /home/lisional/git/sflphone-android/jni/libccrtp/sources/src/ccrtp
+abs_top_builddir = /home/lisional/git/sflphone-android/jni/libccrtp/sources
+abs_top_srcdir = /home/lisional/git/sflphone-android/jni/libccrtp/sources
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
ac_ct_DUMPBIN =
am__include = include
am__leading_dot = .
am__quote =
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
+am__tar = $${TAR-tar} chof - "$$tardir"
+am__untar = $${TAR-tar} xf -
bindir = ${exec_prefix}/bin
build = x86_64-unknown-linux-gnu
build_alias =
@@ -203,34 +287,34 @@
docdir = ${datarootdir}/doc/${PACKAGE}
dvidir = ${docdir}
exec_prefix = ${prefix}
-host = arm-unknown-linux-androideabi
-host_alias = arm-linux-androideabi
-host_cpu = arm
-host_os = linux-androideabi
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
host_vendor = unknown
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/install-sh
+install_sh = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
localstatedir = ${prefix}/var
mandir = ${datarootdir}/man
-mkdir_p = /bin/mkdir -p
+mkdir_p = $(MKDIR_P)
oldincludedir = /usr/include
pdfdir = ${docdir}
-prefix = /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr
+prefix = /usr/local
program_transform_name = s,x,x,
psdir = ${docdir}
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
srcdir = .
sysconfdir = ${prefix}/etc
-target = arm-unknown-linux-androideabi
+target = x86_64-unknown-linux-gnu
target_alias =
-target_cpu = arm
-target_os = linux-androideabi
+target_cpu = x86_64
+target_os = linux-gnu
target_vendor = unknown
top_build_prefix = ../../
top_builddir = ../..
@@ -239,10 +323,10 @@
ccxxincludedir = $(includedir)/ccrtp
ccxxinclude_HEADERS = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h rtp.h pool.h \
- CryptoContext.h
+ CryptoContext.h CryptoContextCtrl.h
kdoc_headers = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
- queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h
+ queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h CryptoContextCtrl.h
all: all-am
@@ -285,8 +369,11 @@
-rm -rf .libs _libs
install-ccxxincludeHEADERS: $(ccxxinclude_HEADERS)
@$(NORMAL_INSTALL)
- test -z "$(ccxxincludedir)" || $(MKDIR_P) "$(DESTDIR)$(ccxxincludedir)"
@list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(ccxxincludedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(ccxxincludedir)" || exit 1; \
+ fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
@@ -300,30 +387,17 @@
@$(NORMAL_UNINSTALL)
@list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(ccxxincludedir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(ccxxincludedir)" && rm -f $$files
+ dir='$(DESTDIR)$(ccxxincludedir)'; $(am__uninstall_files_from_dir)
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -335,15 +409,11 @@
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -352,6 +422,21 @@
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -403,10 +488,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -486,10 +576,10 @@
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
install-ccxxincludeHEADERS install-data install-data-am \
install-dvi install-dvi-am install-exec install-exec-am \
install-html install-html-am install-info install-info-am \
@@ -497,7 +587,7 @@
install-ps-am install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags uninstall uninstall-am \
+ ps ps-am tags tags-am uninstall uninstall-am \
uninstall-ccxxincludeHEADERS
diff --git a/jni/libccrtp/sources/src/ccrtp/Makefile.am b/jni/libccrtp/sources/src/ccrtp/Makefile.am
index bab1a4d..ca6e4a4 100644
--- a/jni/libccrtp/sources/src/ccrtp/Makefile.am
+++ b/jni/libccrtp/sources/src/ccrtp/Makefile.am
@@ -14,10 +14,10 @@
ccxxinclude_HEADERS = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h rtp.h pool.h \
- CryptoContext.h
+ CryptoContext.h CryptoContextCtrl.h
kdoc_headers = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
- queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h
+ queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h CryptoContextCtrl.h
kdoc:
kdoc -f html -d $(KDOC_DIR) -L$(KDOC_DIR) -n ccrtp $(kdoc_headers)
diff --git a/jni/libccrtp/sources/src/ccrtp/Makefile.in b/jni/libccrtp/sources/src/ccrtp/Makefile.in
index 1e1c4e3..f32459f 100644
--- a/jni/libccrtp/sources/src/ccrtp/Makefile.in
+++ b/jni/libccrtp/sources/src/ccrtp/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -27,6 +26,51 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -47,8 +91,8 @@
host_triplet = @host@
target_triplet = @target@
subdir = src/ccrtp
-DIST_COMMON = $(ccxxinclude_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(ccxxinclude_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libgcrypt_local.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
@@ -59,13 +103,30 @@
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_HEADER = $(top_builddir)/ccrtp-config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -87,13 +148,37 @@
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(ccxxincludedir)"
HEADERS = $(ccxxinclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -102,8 +187,8 @@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-COMMON_CFLAGS = @COMMON_CFLAGS@
-COMMON_LIBS = @COMMON_LIBS@
+COMMONCPP_CFLAGS = @COMMONCPP_CFLAGS@
+COMMONCPP_LIBS = @COMMONCPP_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
@@ -140,8 +225,6 @@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
-LIB_MAJOR = @LIB_MAJOR@
-LIB_VERSION = @LIB_VERSION@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
@@ -150,6 +233,7 @@
LT_MINOR = @LT_MINOR@
LT_RELEASE = @LT_RELEASE@
LT_SUBVER = @LT_SUBVER@
+LT_VERSION = @LT_VERSION@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
@@ -239,10 +323,10 @@
ccxxincludedir = $(includedir)/ccrtp
ccxxinclude_HEADERS = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h rtp.h pool.h \
- CryptoContext.h
+ CryptoContext.h CryptoContextCtrl.h
kdoc_headers = base.h formats.h rtppkt.h rtcppkt.h sources.h channel.h \
- queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h
+ queuebase.h iqueue.h oqueue.h ioqueue.h cqueue.h ext.h CryptoContext.h CryptoContextCtrl.h
all: all-am
@@ -285,8 +369,11 @@
-rm -rf .libs _libs
install-ccxxincludeHEADERS: $(ccxxinclude_HEADERS)
@$(NORMAL_INSTALL)
- test -z "$(ccxxincludedir)" || $(MKDIR_P) "$(DESTDIR)$(ccxxincludedir)"
@list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(ccxxincludedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(ccxxincludedir)" || exit 1; \
+ fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
@@ -300,30 +387,17 @@
@$(NORMAL_UNINSTALL)
@list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(ccxxincludedir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(ccxxincludedir)" && rm -f $$files
+ dir='$(DESTDIR)$(ccxxincludedir)'; $(am__uninstall_files_from_dir)
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -335,15 +409,11 @@
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -352,6 +422,21 @@
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -403,10 +488,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -486,10 +576,10 @@
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
install-ccxxincludeHEADERS install-data install-data-am \
install-dvi install-dvi-am install-exec install-exec-am \
install-html install-html-am install-info install-info-am \
@@ -497,7 +587,7 @@
install-ps-am install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags uninstall uninstall-am \
+ ps ps-am tags tags-am uninstall uninstall-am \
uninstall-ccxxincludeHEADERS
diff --git a/jni/libccrtp/sources/src/ccrtp/base.h b/jni/libccrtp/sources/src/ccrtp/base.h
index a162f46..a248f6a 100644
--- a/jni/libccrtp/sources/src/ccrtp/base.h
+++ b/jni/libccrtp/sources/src/ccrtp/base.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001-2005 Federico Montesino Pouzols <fedemp@altern.org>.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,28 +35,27 @@
// If you do not wish that, delete this exception notice.
//
-#ifndef CCXX_RTP_BASE_H_
+#ifndef CCXX_RTP_BASE_H_
#define CCXX_RTP_BASE_H_
-#ifndef CCXX_SOCKET_H_
-#include <cc++/config.h>
-#include <cc++/socket.h>
+#ifndef CCXX_SOCKET_H_
+#include <commoncpp/config.h>
+#include <commoncpp/socket.h>
+#include <commoncpp/udp.h>
#endif
-#ifndef CCXX_PACKING
+#ifndef CCXX_PACKING
#if defined(__GNUC__)
#define CCXX_PACKED
#elif !defined(__hpux) && !defined(_AIX)
-#define CCXX_PACKED
-#endif
+#define CCXX_PACKED
+#endif
#endif
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
-/**
- * @file base.h
+/**
+ * @file base.h
*
* @short Base elements for RTP stacks: constants, types and global
* functions.
@@ -78,7 +77,7 @@
* @param to time interval, in microseconds.
* @return the same time interval, as a timeval value.
**/
-__EXPORT timeval
+__EXPORT timeval
microtimeout2Timeval(microtimeout_t to);
/**
@@ -103,8 +102,8 @@
inline microtimeout_t
timevalDiff2microtimeout(const timeval& t1, const timeval& t2)
{
- return ((t1.tv_sec - t2.tv_sec) * 1000000ul) +
- (t1.tv_usec - t2.tv_usec);
+ return ((t1.tv_sec - t2.tv_sec) * 1000000ul) +
+ (t1.tv_usec - t2.tv_usec);
}
/// registered default RTP data transport port
@@ -113,16 +112,7 @@
/// registered default RTCP transport port
const tpport_t DefaultRTCPPort = 5005;
-#ifndef HAVE_GETTIMEOFDAY
-#ifdef WIN32
-__EXPORT int
-gettimeofday(struct timeval *tv_, void *tz_);
-#endif
-#endif
-
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif // ndef CCXX_RTP_BASE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/channel.h b/jni/libccrtp/sources/src/ccrtp/channel.h
index c451d3e..7216823 100644
--- a/jni/libccrtp/sources/src/ccrtp/channel.h
+++ b/jni/libccrtp/sources/src/ccrtp/channel.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001-2005 Federico Montesino Pouzols <fedemp@altern.org>
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,29 +35,28 @@
// If you do not wish that, delete this exception notice.
//
-#ifndef CCRTP_CHANNEL_H_
+#ifndef CCRTP_CHANNEL_H_
#define CCRTP_CHANNEL_H_
#include <ccrtp/base.h>
+#include <commoncpp/socket.h>
-#ifndef WIN32
+#ifndef _MSWINDOWS_
#include <sys/ioctl.h>
-inline size_t ccioctl(SOCKET so, int request, size_t& len)
-{ return ::ioctl(so,request,&len); }
+inline size_t ccioctl(int so, int request, size_t& len)
+ { return ioctl(so,request,&len); }
#else
inline size_t ccioctl(SOCKET so, int request, size_t& len )
-{
- unsigned long l;
- size_t result = 0;
- ::ioctlsocket(so,request,&l);
- len = l;
- return result;
+{
+ unsigned long l;
+ size_t result = 0;
+ ::ioctlsocket(so,request,&l);
+ len = l;
+ return result;
}
#endif
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @file channel.h
@@ -96,73 +95,73 @@
class RTPBaseUDPIPv4Socket : private UDPSocket
{
public:
- /**
- * Constructor for receiver.
- **/
- RTPBaseUDPIPv4Socket(const InetAddress& ia, tpport_t port) :
- UDPSocket(ia,port)
- { }
-
- inline ~RTPBaseUDPIPv4Socket()
- { endSocket(); }
-
- inline bool
- isPendingRecv(microtimeout_t timeout)
- { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
+ /**
+ * Constructor for receiver.
+ **/
+ RTPBaseUDPIPv4Socket(const InetAddress& ia, tpport_t port) :
+ UDPSocket(ia,port)
+ { }
- inline InetHostAddress
- getSender(tpport_t& port) const
- { return UDPSocket::getSender(&port); }
+ inline ~RTPBaseUDPIPv4Socket()
+ { endSocket(); }
- inline size_t
- recv(unsigned char* buffer, size_t len)
- { return UDPSocket::receive(buffer, len); }
+ inline bool
+ isPendingRecv(microtimeout_t timeout)
+ { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
- /**
- * Get size of next datagram waiting to be read.
- **/
- inline size_t
- getNextPacketSize() const
- { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
+ inline InetHostAddress
+ getSender(tpport_t& port) const
+ { return UDPSocket::getSender(&port); }
- Socket::Error
- setMulticast(bool enable)
- { return UDPSocket::setMulticast(enable); }
+ inline size_t
+ recv(unsigned char* buffer, size_t len)
+ { return UDPSocket::receive(buffer, len); }
- inline Socket::Error
- join(const InetMcastAddress& ia, uint32 iface)
- { return UDPSocket::join(ia,iface); }
+ /**
+ * Get size of next datagram waiting to be read.
+ **/
+ inline size_t
+ getNextPacketSize() const
+ { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
- inline Socket::Error
- drop(const InetMcastAddress& ia)
- { return UDPSocket::drop(ia); }
+ Socket::Error
+ setMulticast(bool enable)
+ { return UDPSocket::setMulticast(enable); }
- inline Socket::Error
- setTimeToLive(unsigned char ttl)
- { return UDPSocket::setTimeToLive(ttl); }
-
- /**
- * Constructor for transmitter.
- **/
- RTPBaseUDPIPv4Socket() :
- UDPSocket()
- { }
+ inline Socket::Error
+ join(const InetMcastAddress& ia, uint32 iface)
+ { return UDPSocket::join(ia,iface); }
- inline void
- setPeer(const InetAddress &ia, tpport_t port)
- {UDPSocket::setPeer((InetHostAddress&)ia, port);}
+ inline Socket::Error
+ drop(const InetMcastAddress& ia)
+ { return UDPSocket::drop(ia); }
- inline size_t
- send(const unsigned char* const buffer, size_t len)
- { return UDPSocket::send(buffer, len); }
+ inline Socket::Error
+ setTimeToLive(unsigned char ttl)
+ { return UDPSocket::setTimeToLive(ttl); }
- inline SOCKET getRecvSocket() const
- { return UDPSocket::so; }
+ /**
+ * Constructor for transmitter.
+ **/
+ RTPBaseUDPIPv4Socket() :
+ UDPSocket()
+ { }
- // common
- inline void
- endSocket()
- { UDPSocket::endSocket(); }
+ inline void
+ setPeer(const InetAddress &ia, tpport_t port)
+ {UDPSocket::setPeer((InetHostAddress&)ia, port);}
+
+ inline size_t
+ send(const unsigned char* const buffer, size_t len)
+ { return UDPSocket::send(buffer, len); }
+
+ inline SOCKET getRecvSocket() const
+ { return UDPSocket::so; }
+
+ // common
+ inline void
+ endSocket()
+ { UDPSocket::endSocket(); }
};
/**
@@ -189,71 +188,71 @@
class DualRTPChannel
{
public:
- DualRTPChannel(const InetAddress& ia, tpport_t port)
- {
- recvSocket = new BaseSocket(ia,port);
- sendSocket = new BaseSocket;
- }
+ DualRTPChannel(const InetAddress& ia, tpport_t port)
+ {
+ recvSocket = new BaseSocket(ia,port);
+ sendSocket = new BaseSocket;
+ }
- inline ~DualRTPChannel()
- { delete sendSocket; delete recvSocket; }
-
- inline bool
- isPendingRecv(microtimeout_t timeout) const
- { return recvSocket->isPendingRecv(timeout); }
+ inline ~DualRTPChannel()
+ { delete sendSocket; delete recvSocket; }
- inline InetHostAddress
- getSender(tpport_t& port) const
- { return recvSocket->getSender(port); }
+ inline bool
+ isPendingRecv(microtimeout_t timeout) const
+ { return recvSocket->isPendingRecv(timeout); }
- inline size_t
- recv(unsigned char* buffer, size_t len)
- { return recvSocket->recv(buffer, len); }
+ inline InetHostAddress
+ getSender(tpport_t& port) const
+ { return recvSocket->getSender(port); }
- inline size_t
- getNextPacketSize() const
- { return recvSocket->getNextPacketSize(); }
+ inline size_t
+ recv(unsigned char* buffer, size_t len)
+ { return recvSocket->recv(buffer, len); }
- inline Socket::Error
- setMulticast(bool enable)
- { Socket::Error error = recvSocket->setMulticast(enable);
- if (error) return error;
- return sendSocket->setMulticast(enable); }
+ inline size_t
+ getNextPacketSize() const
+ { return recvSocket->getNextPacketSize(); }
- inline Socket::Error
- join(const InetMcastAddress& ia, uint32 iface)
- { return recvSocket->join(ia,iface); }
+ inline Socket::Error
+ setMulticast(bool enable)
+ { Socket::Error error = recvSocket->setMulticast(enable);
+ if (error) return error;
+ return sendSocket->setMulticast(enable); }
- inline Socket::Error
- drop(const InetMcastAddress& ia)
- { return recvSocket->drop(ia); }
+ inline Socket::Error
+ join(const InetMcastAddress& ia, uint32 iface)
+ { return recvSocket->join(ia,iface); }
- inline Socket::Error
- setTimeToLive(unsigned char ttl)
- { return sendSocket->setTimeToLive(ttl); }
-
- inline void
- setPeer(const InetAddress& host, tpport_t port)
- { sendSocket->setPeer(host,port); }
+ inline Socket::Error
+ drop(const InetMcastAddress& ia)
+ { return recvSocket->drop(ia); }
- inline size_t
- send(const unsigned char* const buffer, size_t len)
- { return sendSocket->send(buffer, len); }
+ inline Socket::Error
+ setTimeToLive(unsigned char ttl)
+ { return sendSocket->setTimeToLive(ttl); }
- inline SOCKET getRecvSocket() const
- { return recvSocket->getRecvSocket(); }
+ inline void
+ setPeer(const InetAddress& host, tpport_t port)
+ { sendSocket->setPeer(host,port); }
- // common.
- inline void
- endSocket()
- { sendSocket->endSocket(); recvSocket->endSocket(); }
+ inline size_t
+ send(const unsigned char* const buffer, size_t len)
+ { return sendSocket->send(buffer, len); }
+
+ inline SOCKET getRecvSocket() const
+ { return recvSocket->getRecvSocket(); }
+
+ // common.
+ inline void
+ endSocket()
+ { sendSocket->endSocket(); recvSocket->endSocket(); }
private:
- BaseSocket* sendSocket;
- BaseSocket* recvSocket;
+ BaseSocket* sendSocket;
+ BaseSocket* recvSocket;
};
-#ifdef CCXX_IPV6
+#ifdef CCXX_IPV6
/**
* @class RTPBaseUDPIPv4Socket
@@ -279,73 +278,73 @@
class RTPBaseUDPIPv6Socket : private UDPSocket
{
public:
- /**
- * Constructor for receiver.
- **/
- RTPBaseUDPIPv6Socket(const IPV6Address& ia, tpport_t port) :
- UDPSocket(ia,port)
- { }
-
- inline ~RTPBaseUDPIPv6Socket()
- { endSocket(); }
-
- inline bool
- isPendingRecv(microtimeout_t timeout)
- { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
+ /**
+ * Constructor for receiver.
+ **/
+ RTPBaseUDPIPv6Socket(const IPV6Address& ia, tpport_t port) :
+ UDPSocket(ia,port)
+ { }
- inline IPV6Host
- getSender(tpport_t& port) const
- { return UDPSocket::getIPV6Sender(&port); }
+ inline ~RTPBaseUDPIPv6Socket()
+ { endSocket(); }
- inline size_t
- recv(unsigned char* buffer, size_t len)
- { return UDPSocket::receive(buffer, len); }
+ inline bool
+ isPendingRecv(microtimeout_t timeout)
+ { return UDPSocket::isPending(UDPSocket::pendingInput, timeout); }
- /**
- * Get size of next datagram waiting to be read.
- **/
- inline size_t
- getNextPacketSize() const
- { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
+ inline IPV6Host
+ getSender(tpport_t& port) const
+ { return UDPSocket::getIPV6Sender(&port); }
- Socket::Error
- setMulticast(bool enable)
- { return UDPSocket::setMulticast(enable); }
+ inline size_t
+ recv(unsigned char* buffer, size_t len)
+ { return UDPSocket::receive(buffer, len); }
- inline Socket::Error
- join(const IPV6Multicast& ia, uint32 iface)
- { return Socket::join(ia); }
+ /**
+ * Get size of next datagram waiting to be read.
+ **/
+ inline size_t
+ getNextPacketSize() const
+ { size_t len; ccioctl(UDPSocket::so,FIONREAD,len); return len; }
- inline Socket::Error
- drop(const IPV6Multicast& ia)
- { return UDPSocket::drop(ia); }
+ Socket::Error
+ setMulticast(bool enable)
+ { return UDPSocket::setMulticast(enable); }
- inline Socket::Error
- setTimeToLive(unsigned char ttl)
- { return UDPSocket::setTimeToLive(ttl); }
-
- /**
- * Constructor for transmitter.
- **/
- RTPBaseUDPIPv6Socket() :
- UDPSocket()
- { }
+ inline Socket::Error
+ join(const IPV6Multicast& ia, uint32 iface)
+ { return Socket::join(ia); }
- inline void
- setPeer(const IPV6Host &ia, tpport_t port)
- {UDPSocket::setPeer(ia, port);}
+ inline Socket::Error
+ drop(const IPV6Multicast& ia)
+ { return UDPSocket::drop(ia); }
- inline size_t
- send(const unsigned char* const buffer, size_t len)
- { return UDPSocket::send(buffer, len); }
+ inline Socket::Error
+ setTimeToLive(unsigned char ttl)
+ { return UDPSocket::setTimeToLive(ttl); }
- inline SOCKET getRecvSocket() const
- { return UDPSocket::so; }
+ /**
+ * Constructor for transmitter.
+ **/
+ RTPBaseUDPIPv6Socket() :
+ UDPSocket()
+ { }
- // common
- inline void
- endSocket()
- { UDPSocket::endSocket(); }
+ inline void
+ setPeer(const IPV6Host &ia, tpport_t port)
+ {UDPSocket::setPeer(ia, port);}
+
+ inline size_t
+ send(const unsigned char* const buffer, size_t len)
+ { return UDPSocket::send(buffer, len); }
+
+ inline SOCKET getRecvSocket() const
+ { return UDPSocket::so; }
+
+ // common
+ inline void
+ endSocket()
+ { UDPSocket::endSocket(); }
};
/**
@@ -372,73 +371,73 @@
class DualRTPChannelIPV6
{
public:
- DualRTPChannelIPV6(const IPV6Host& ia, tpport_t port)
- {
- recvSocket = new BaseSocket(ia,port);
- sendSocket = new BaseSocket;
- }
+ DualRTPChannelIPV6(const IPV6Host& ia, tpport_t port)
+ {
+ recvSocket = new BaseSocket(ia,port);
+ sendSocket = new BaseSocket;
+ }
- inline ~DualRTPChannelIPV6()
- { delete sendSocket; delete recvSocket; }
-
- inline bool
- isPendingRecv(microtimeout_t timeout) const
- { return recvSocket->isPendingRecv(timeout); }
+ inline ~DualRTPChannelIPV6()
+ { delete sendSocket; delete recvSocket; }
- inline IPV6Host
- getSender(tpport_t& port) const
- { return recvSocket->getIPV6Sender(port); }
+ inline bool
+ isPendingRecv(microtimeout_t timeout) const
+ { return recvSocket->isPendingRecv(timeout); }
- inline size_t
- recv(unsigned char* buffer, size_t len)
- { return recvSocket->recv(buffer, len); }
+ inline IPV6Host
+ getSender(tpport_t& port) const
+ { return recvSocket->getIPV6Sender(port); }
- inline size_t
- getNextPacketSize() const
- { return recvSocket->getNextPacketSize(); }
+ inline size_t
+ recv(unsigned char* buffer, size_t len)
+ { return recvSocket->recv(buffer, len); }
- inline Socket::Error
- setMulticast(bool enable)
- { Socket::Error error = recvSocket->setMulticast(enable);
- if (error) return error;
- return sendSocket->setMulticast(enable); }
+ inline size_t
+ getNextPacketSize() const
+ { return recvSocket->getNextPacketSize(); }
- inline Socket::Error
- join(const IPV6Multicast& ia, uint32 iface)
- { return recvSocket->join(ia,iface); }
+ inline Socket::Error
+ setMulticast(bool enable)
+ { Socket::Error error = recvSocket->setMulticast(enable);
+ if (error) return error;
+ return sendSocket->setMulticast(enable); }
- inline Socket::Error
- drop(const IPV6Multicast& ia)
- { return recvSocket->drop(ia); }
+ inline Socket::Error
+ join(const IPV6Multicast& ia, uint32 iface)
+ { return recvSocket->join(ia,iface); }
- inline Socket::Error
- setTimeToLive(unsigned char ttl)
- { return sendSocket->setTimeToLive(ttl); }
-
- inline void
- setPeer(const IPV6Host& host, tpport_t port)
- { sendSocket->setPeer(host,port); }
+ inline Socket::Error
+ drop(const IPV6Multicast& ia)
+ { return recvSocket->drop(ia); }
- inline size_t
- send(const unsigned char* const buffer, size_t len)
- { return sendSocket->send(buffer, len); }
+ inline Socket::Error
+ setTimeToLive(unsigned char ttl)
+ { return sendSocket->setTimeToLive(ttl); }
- inline SOCKET getRecvSocket() const
- { return recvSocket->getRecvSocket(); }
+ inline void
+ setPeer(const IPV6Host& host, tpport_t port)
+ { sendSocket->setPeer(host,port); }
- // common.
- inline void
- endSocket()
- { sendSocket->endSocket(); recvSocket->endSocket(); }
+ inline size_t
+ send(const unsigned char* const buffer, size_t len)
+ { return sendSocket->send(buffer, len); }
+
+ inline SOCKET getRecvSocket() const
+ { return recvSocket->getRecvSocket(); }
+
+ // common.
+ inline void
+ endSocket()
+ { sendSocket->endSocket(); recvSocket->endSocket(); }
private:
- BaseSocket* sendSocket;
- BaseSocket* recvSocket;
+ BaseSocket* sendSocket;
+ BaseSocket* recvSocket;
};
-typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
-typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
+typedef DualRTPChannelIPV6<RTPBaseUDPIPv6Socket> DualRTPUDPIPv6Channel;
+typedef RTPBaseUDPIPv6Socket SingleRTPChannelIPV6;
typedef SingleRTPChannelIPV6 SymmetricRTPChannelIPV6;
#endif
@@ -458,9 +457,7 @@
/** @}*/ // sockets
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCRTP_CHANNEL_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/cqueue.h b/jni/libccrtp/sources/src/ccrtp/cqueue.h
index eebd21e..6187b7e 100644
--- a/jni/libccrtp/sources/src/ccrtp/cqueue.h
+++ b/jni/libccrtp/sources/src/ccrtp/cqueue.h
@@ -41,14 +41,14 @@
* @short Generic RTCP control queues.
**/
-#ifndef CCXX_RTP_CQUEUE_H_
+#ifndef CCXX_RTP_CQUEUE_H_
#define CCXX_RTP_CQUEUE_H_
#include <ccrtp/ioqueue.h>
+#include <ccrtp/CryptoContextCtrl.h>
+#include <list>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup cqueue Generic RTCP control queues.
@@ -78,545 +78,625 @@
* @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT QueueRTCPManager : public RTPDataQueue,
- protected RTCPCompoundHandler
+ protected RTCPCompoundHandler
{
public:
- /**
- * Get the most recent sender report received from a
- * synchronization source.
- *
- * @param src Synchronization source of the sender info.
- * @return Most recent sender info received from src.
- * @retval NULL when no sender report has been received from
- * the specified source.
- **/
- RTCPSenderInfo* getMRSenderInfo(SyncSource& src);
+ /**
+ * Get the most recent sender report received from a
+ * synchronization source.
+ *
+ * @param src Synchronization source of the sender info.
+ * @return Most recent sender info received from src.
+ * @retval NULL when no sender report has been received from
+ * the specified source.
+ **/
+ RTCPSenderInfo* getMRSenderInfo(SyncSource& src);
- /**
- * Ask for the info in the most recent receiver report about
- * the local source received from the source given as
- * parameter.
- *
- * @param srcFrom Source of the receiver info.
- * @return most recent receiver info received from src.
- * @retval NULL when no receiver report has been received from
- * the specified source.
- */
- RTCPReceiverInfo* getMRReceiverInfo(SyncSource& srcFrom);
+ /**
+ * Ask for the info in the most recent receiver report about
+ * the local source received from the source given as
+ * parameter.
+ *
+ * @param srcFrom Source of the receiver info.
+ * @return most recent receiver info received from src.
+ * @retval NULL when no receiver report has been received from
+ * the specified source.
+ */
+ RTCPReceiverInfo* getMRReceiverInfo(SyncSource& srcFrom);
- /**
- * Set how much time the stack will wait before deleting a
- * synchronization source that has sent an RTCP BYE packet.
- *
- * @param delay delay in microseconds.
- *
- * @note The default delay is 1000000 microseconds
- **/
- void setLeavingDelay(microtimeout_t delay)
- { leavingDelay = delay; }
+ /**
+ * Set how much time the stack will wait before deleting a
+ * synchronization source that has sent an RTCP BYE packet.
+ *
+ * @param delay delay in microseconds.
+ *
+ * @note The default delay is 1000000 microseconds
+ **/
+ void setLeavingDelay(microtimeout_t delay)
+ { leavingDelay = delay; }
- /**
- * This method sets the maximum end to end delay allowed. If
- * the processing delay plus the trip time for a packet is
- * greater than the end to end delay, the packet is discarded,
- * and the application cannot get it.
- *
- * This is a way of setting an upper bound to the end to end
- * delay, computed as the elapsed time between the packet
- * timestamping at the sender side, and the picking of the
- * packet at the receiver side.
- *
- * @param t maximum end to end delay allowed. A value of 0
- * implies there is no limit and is the default
- */
- inline void
- setEnd2EndDelay(microtimeout_t t)
- { end2EndDelay = t; }
+ /**
+ * This method sets the maximum end to end delay allowed. If
+ * the processing delay plus the trip time for a packet is
+ * greater than the end to end delay, the packet is discarded,
+ * and the application cannot get it.
+ *
+ * This is a way of setting an upper bound to the end to end
+ * delay, computed as the elapsed time between the packet
+ * timestamping at the sender side, and the picking of the
+ * packet at the receiver side.
+ *
+ * @param t maximum end to end delay allowed. A value of 0
+ * implies there is no limit and is the default
+ */
+ inline void
+ setEnd2EndDelay(microtimeout_t t)
+ { end2EndDelay = t; }
- inline microtimeout_t
- getDefaultEnd2EndDelay() const
- { return defaultEnd2EndDelay; }
+ inline microtimeout_t
+ getDefaultEnd2EndDelay() const
+ { return defaultEnd2EndDelay; }
- inline microtimeout_t
- getEnd2EndDelay() const
- { return end2EndDelay; }
+ inline microtimeout_t
+ getEnd2EndDelay() const
+ { return end2EndDelay; }
- /**
- * Specify the fraction of the total control bandwith to be
- * dedicated to senders reports.
- *
- * @param fraction fraction of bandwidth, must be between 0 an 1.
- *
- * This method sets the fraction of the global control
- * bandwidth that will be dedicated to senders reports. Of
- * course, <code>1 - fraction</code> will be dedicated to
- * receivers reports.
- *
- * @see setControlBandwidth
- */
- inline void
- setSendersControlFraction(float fraction)
- { sendControlBwFract = fraction; recvControlBwFract = 1 - fraction;}
+ /**
+ * Specify the fraction of the total control bandwith to be
+ * dedicated to senders reports.
+ *
+ * @param fraction fraction of bandwidth, must be between 0 an 1.
+ *
+ * This method sets the fraction of the global control
+ * bandwidth that will be dedicated to senders reports. Of
+ * course, <code>1 - fraction</code> will be dedicated to
+ * receivers reports.
+ *
+ * @see setControlBandwidth
+ */
+ inline void
+ setSendersControlFraction(float fraction)
+ { sendControlBwFract = fraction; recvControlBwFract = 1 - fraction;}
- /**
- * Manually set the minimum interval for sending RTP compound
- * packets
- *
- * @param interval minimum interval between RTCP packets, in
- * microseconds.
- *
- * @see computeRTCPInterval()
- **/
- void
- setMinRTCPInterval(microtimeout_t interval)
- { rtcpMinInterval = interval; }
+ /**
+ * Manually set the minimum interval for sending RTP compound
+ * packets
+ *
+ * @param interval minimum interval between RTCP packets, in
+ * microseconds.
+ *
+ * @see computeRTCPInterval()
+ **/
+ void
+ setMinRTCPInterval(microtimeout_t interval)
+ { rtcpMinInterval = interval; }
- /**
- * Get the total number of RTCP packets sent until now
- **/
- inline uint32
- getSendRTCPPacketCount() const
- { return ctrlSendCount; }
+ /**
+ * Get the total number of RTCP packets sent until now
+ **/
+ inline uint32
+ getSendRTCPPacketCount() const
+ { return ctrlSendCount; }
+
+ /**
+ * Set ouput queue CryptoContext.
+ *
+ * The endQueue method (provided by RTPQueue) deletes all
+ * registered CryptoContexts.
+ *
+ * @param cc Pointer to initialized CryptoContext.
+ */
+ void
+ setOutQueueCryptoContextCtrl(CryptoContextCtrl* cc);
+
+ /**
+ * Remove output queue CryptoContext.
+ *
+ * The endQueue method (provided by RTPQueue) also deletes all
+ * registered CryptoContexts.
+ *
+ * @param cc Pointer to initialized CryptoContext to remove.
+ */
+ void
+ removeOutQueueCryptoContextCtrl(CryptoContextCtrl* cc);
+
+ /**
+ * Get an output queue CryptoContext identified by SSRC
+ *
+ * @param ssrc Request CryptoContext for this incoming SSRC
+ * @return Pointer to CryptoContext of the SSRC of NULL if no context
+ * available for this SSRC.
+ */
+ CryptoContextCtrl*
+ getOutQueueCryptoContextCtrl(uint32 ssrc);
+
+
+ /**
+ * Set input queue CryptoContext.
+ *
+ * The endQueue method (provided by RTPQueue) deletes all
+ * registered CryptoContexts.
+ *
+ * @param cc Pointer to initialized CryptoContext.
+ */
+ void
+ setInQueueCryptoContextCtrl(CryptoContextCtrl* cc);
+
+ /**
+ * Remove input queue CryptoContext.
+ *
+ * The endQueue method (provided by RTPQueue) also deletes all
+ * registered CryptoContexts.
+ *
+ * @param cc
+ * Pointer to initialized CryptoContext to remove. If pointer
+ * if <code>NULL</code> then delete the whole queue
+ */
+ void
+ removeInQueueCryptoContextCtrl(CryptoContextCtrl* cc);
+
+ /**
+ * Get an input queue CryptoContext identified by SSRC
+ *
+ * @param ssrc Request CryptoContext for this incoming SSRC
+ * @return Pointer to CryptoContext of the SSRC of NULL if no context
+ * available for this SSRC.
+ */
+ CryptoContextCtrl*
+ getInQueueCryptoContextCtrl(uint32 ssrc);
protected:
- QueueRTCPManager(uint32 size = RTPDataQueue::defaultMembersHashSize,
- RTPApplication& app = defaultApplication());
+ QueueRTCPManager(uint32 size = RTPDataQueue::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication());
- QueueRTCPManager(uint32 ssrc,
- uint32 size = RTPDataQueue::defaultMembersHashSize,
- RTPApplication& app = defaultApplication());
+ QueueRTCPManager(uint32 ssrc,
+ uint32 size = RTPDataQueue::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication());
- virtual
- ~QueueRTCPManager();
+ virtual
+ ~QueueRTCPManager();
- const RTPApplication&
- getApplication()
- { return queueApplication; }
+ const RTPApplication&
+ getApplication()
+ { return queueApplication; }
- inline void
- setControlBandwidth(float fraction)
- { controlBwFract = fraction; }
+ inline void
+ setControlBandwidth(float fraction)
+ { controlBwFract = fraction; }
- float
- getControlBandwidth() const
- { return controlBwFract; }
+ float
+ getControlBandwidth() const
+ { return controlBwFract; }
- /**
- * Build and send RTCP packets following timing rules
- * (including the "timer reconsideration" algorithm).
- **/
- void
- controlTransmissionService();
+ /**
+ * Build and send RTCP packets following timing rules
+ * (including the "timer reconsideration" algorithm).
+ **/
+ void
+ controlTransmissionService();
- /**
- * Process incoming RTCP packets pending in the control
- * reception socket.
- **/
- void
- controlReceptionService();
+ /**
+ * Process incoming RTCP packets pending in the control
+ * reception socket.
+ **/
+ void
+ controlReceptionService();
- /**
- * Appy collision and loop detection and correction algorithm
- * when receiving RTCP packets. Follows section 8.2 in
- * draft-ietf-avp-rtp-new.
- *
- * @param sourceLink link to the source object.
- * @param is_new whether the source has been just recorded.
- * @param na RTCP packet network address.
- * @param tp RTCP packet source transport port.
- *
- * @return whether the packet must not be discarded.
- **/
- bool checkSSRCInRTCPPkt(SyncSourceLink& sourceLink, bool is_new,
- InetAddress& na, tpport_t tp);
+ /**
+ * Appy collision and loop detection and correction algorithm
+ * when receiving RTCP packets. Follows section 8.2 in
+ * draft-ietf-avp-rtp-new.
+ *
+ * @param sourceLink link to the source object.
+ * @param is_new whether the source has been just recorded.
+ * @param na RTCP packet network address.
+ * @param tp RTCP packet source transport port.
+ *
+ * @return whether the packet must not be discarded.
+ **/
+ bool checkSSRCInRTCPPkt(SyncSourceLink& sourceLink, bool is_new,
+ InetAddress& na, tpport_t tp);
- void
- endQueueRTCPManager();
+ void
+ endQueueRTCPManager();
- /**
- * Plug-in for processing (acquire information carried in) an
- * incoming RTCP Sender Report. The default implementation in
- * this class only processes the sender information and the
- * receiver report blocks about the local source.
- *
- * @param source Synchronization source this report comes from.
- * @param SR Sender report structure.
- * @param blocks Number of report blocks in the packet.
- **/
- virtual void
- onGotSR(SyncSource& source, SendReport& SR, uint8 blocks);
+ /**
+ * Plug-in for processing (acquire information carried in) an
+ * incoming RTCP Sender Report. The default implementation in
+ * this class only processes the sender information and the
+ * receiver report blocks about the local source.
+ *
+ * @param source Synchronization source this report comes from.
+ * @param SR Sender report structure.
+ * @param blocks Number of report blocks in the packet.
+ **/
+ virtual void
+ onGotSR(SyncSource& source, SendReport& SR, uint8 blocks);
- /**
- * Plug-in for processing (acquire information carried in) an
- * incoming RTCP Receiver Report. The default implementation
- * in this class only processes the receiver report blocks
- * about the local source.
- *
- * @param source Synchronization source this report comes from.
- * @param RR Receiver report structure
- * @param blocks Number of report blocks in the packet
- **/
- virtual void
- onGotRR(SyncSource& source, RecvReport& RR, uint8 blocks);
+ /**
+ * Plug-in for processing (acquire information carried in) an
+ * incoming RTCP Receiver Report. The default implementation
+ * in this class only processes the receiver report blocks
+ * about the local source.
+ *
+ * @param source Synchronization source this report comes from.
+ * @param RR Receiver report structure
+ * @param blocks Number of report blocks in the packet
+ **/
+ virtual void
+ onGotRR(SyncSource& source, RecvReport& RR, uint8 blocks);
- /**
- * @param source Synchronization source of SDES RTCP packet.
- * @param pkt SDES RTCP packet received.
- **/
- bool
- onGotSDES(SyncSource& source, RTCPPacket& pkt);
+ /**
+ * @param source Synchronization source of SDES RTCP packet.
+ * @param pkt SDES RTCP packet received.
+ **/
+ bool
+ onGotSDES(SyncSource& source, RTCPPacket& pkt);
- /**
- * Plug-in for handling of SDES chunks.
- *
- * @param source Synchronization source of SDES chunk.
- * @param chunk SDES chunk structure.
- * @param len Length of chunk, in octets.
- *
- * @return whether there was a CNAME.
- **/
- virtual bool
- onGotSDESChunk(SyncSource& source, SDESChunk& chunk, size_t len);
+ /**
+ * Plug-in for handling of SDES chunks.
+ *
+ * @param source Synchronization source of SDES chunk.
+ * @param chunk SDES chunk structure.
+ * @param len Length of chunk, in octets.
+ *
+ * @return whether there was a CNAME.
+ **/
+ virtual bool
+ onGotSDESChunk(SyncSource& source, SDESChunk& chunk, size_t len);
- /**
- * Plug-in for handling of APP (application specific) RTCP
- * packets.
- *
- * @param - Synchronization source of this packet.
- * @param - RTCP APP packet struct.
- * @param - Length of the app data packet, including ssrc.
- * name and app. specific data.
- **/
- inline virtual void
- onGotAPP(SyncSource&, RTCPCompoundHandler::APPPacket&,
- size_t)
- { return; }
+ /**
+ * Plug-in for handling of APP (application specific) RTCP
+ * packets.
+ *
+ * @param - Synchronization source of this packet.
+ * @param - RTCP APP packet struct.
+ * @param - Length of the app data packet, including ssrc.
+ * name and app. specific data.
+ **/
+ inline virtual void
+ onGotAPP(SyncSource&, RTCPCompoundHandler::APPPacket&,
+ size_t)
+ { return; }
- inline timeval
- getRTCPCheckInterval()
- { return rtcpCheckInterval; }
+ inline timeval
+ getRTCPCheckInterval()
+ { return rtcpCheckInterval; }
- /**
- * Get the number of data packets sent at the time the last SR
- * was generated.
- **/
- uint32
- getLastSendPacketCount() const
- { return lastSendPacketCount; }
+ /**
+ * Get the number of data packets sent at the time the last SR
+ * was generated.
+ **/
+ uint32
+ getLastSendPacketCount() const
+ { return lastSendPacketCount; }
- /**
- * @param n Number of members.
- **/
- inline void
- setPrevMembersNum(uint32 n)
- { reconsInfo.rtcpPMembers = n; }
+ /**
+ * @param n Number of members.
+ **/
+ inline void
+ setPrevMembersNum(uint32 n)
+ { reconsInfo.rtcpPMembers = n; }
- inline uint32
- getPrevMembersCount() const
- { return reconsInfo.rtcpPMembers; }
+ inline uint32
+ getPrevMembersCount() const
+ { return reconsInfo.rtcpPMembers; }
- /**
- * This method is used to send an RTCP BYE packet. An RTCP
- * BYE packet is sent when one of the the following
- * circumstances occur:
- * - when leaving the session
- * - when we have detected that another synchronization source
- * in the same session is using the same SSRC identifier as
- * us.
- *
- * Try to post a BYE message. It will send a BYE packet as
- * long as at least one RTP or RTCP packet has been sent
- * before. If the number of members in the session is more
- * than 50, the algorithm described in section 6.3.7 of
- * RFC 3550 is applied in order to avoid a flood
- * of BYE messages.
- *
- * @param reason reason to specify in the BYE packet.
- **/
- size_t
- dispatchBYE(const std::string& reason);
+ /**
+ * This method is used to send an RTCP BYE packet. An RTCP
+ * BYE packet is sent when one of the the following
+ * circumstances occur:
+ * - when leaving the session
+ * - when we have detected that another synchronization source
+ * in the same session is using the same SSRC identifier as
+ * us.
+ *
+ * Try to post a BYE message. It will send a BYE packet as
+ * long as at least one RTP or RTCP packet has been sent
+ * before. If the number of members in the session is more
+ * than 50, the algorithm described in section 6.3.7 of
+ * RFC 3550 is applied in order to avoid a flood
+ * of BYE messages.
+ *
+ * @param reason reason to specify in the BYE packet.
+ **/
+ size_t
+ dispatchBYE(const std::string& reason);
- size_t
- sendControlToDestinations(unsigned char* buffer, size_t len);
+ size_t
+ sendControlToDestinations(unsigned char* buffer, size_t len);
private:
- QueueRTCPManager(const QueueRTCPManager &o);
+ QueueRTCPManager(const QueueRTCPManager &o);
- QueueRTCPManager&
- operator=(const QueueRTCPManager &o);
+ QueueRTCPManager&
+ operator=(const QueueRTCPManager &o);
- /**
- * Posting of RTCP messages.
- *
- * @return std::size_t number of octets sent
- */
- size_t
- dispatchControlPacket();
+ /**
+ * Posting of RTCP messages.
+ *
+ * @return std::size_t number of octets sent
+ */
+ size_t
+ dispatchControlPacket();
- /**
- * For picking up incoming RTCP packets if they are waiting. A
- * timeout for the maximum interval since the last RTCP packet
- * had been received is also returned. This is checked every
- * rtcpCheckInterval seconds.
- *
- * This method decomposes all incoming RTCP compound packets
- * pending in the control socket and processes each RTCP
- * packet.
- *
- **/
- void
- takeInControlPacket();
+ /**
+ * For picking up incoming RTCP packets if they are waiting. A
+ * timeout for the maximum interval since the last RTCP packet
+ * had been received is also returned. This is checked every
+ * rtcpCheckInterval seconds.
+ *
+ * This method decomposes all incoming RTCP compound packets
+ * pending in the control socket and processes each RTCP
+ * packet.
+ *
+ **/
+ void
+ takeInControlPacket();
- /**
- * Computes the interval for sending RTCP compound packets,
- * based on the average size of RTCP packets sent and
- * received, and the current estimated number of participants
- * in the session.
- *
- * @note This currently follows the rules in section 6 of
- * RFC 3550
- * @todo make it more flexible as recommended in the draft. For now,
- * we have setMinRTCPInterval.
- *
- * @return interval for sending RTCP compound packets
- **/
- virtual timeval
- computeRTCPInterval();
+ /**
+ * Computes the interval for sending RTCP compound packets,
+ * based on the average size of RTCP packets sent and
+ * received, and the current estimated number of participants
+ * in the session.
+ *
+ * @note This currently follows the rules in section 6 of
+ * RFC 3550
+ * @todo make it more flexible as recommended in the draft. For now,
+ * we have setMinRTCPInterval.
+ *
+ * @return interval for sending RTCP compound packets
+ **/
+ virtual timeval
+ computeRTCPInterval();
- /**
- * Choose which should be the type of the next SDES item
- * sent. This method is called when packing SDES chunks in a
- * new RTCP packet.
- *
- * @return type of the next SDES item to be sent
- **/
- virtual SDESItemType
- scheduleSDESItem();
+ /**
+ * Choose which should be the type of the next SDES item
+ * sent. This method is called when packing SDES chunks in a
+ * new RTCP packet.
+ *
+ * @return type of the next SDES item to be sent
+ **/
+ virtual SDESItemType
+ scheduleSDESItem();
- /**
- * Plug-in for SSRC collision handling.
- *
- * @param - previously identified source.
- **/
- inline virtual void
- onSSRCCollision(const SyncSource&)
- { }
+ /**
+ * Plug-in for SSRC collision handling.
+ *
+ * @param - previously identified source.
+ **/
+ inline virtual void
+ onSSRCCollision(const SyncSource&)
+ { }
- /**
- * Virtual reimplemented from RTPDataQueue
- **/
- virtual bool
- end2EndDelayed(IncomingRTPPktLink& p);
+ /**
+ * Virtual reimplemented from RTPDataQueue
+ **/
+ virtual bool
+ end2EndDelayed(IncomingRTPPktLink& p);
- /**
- * Plug-in for processing of SR/RR RTCP packet
- * profile-specific extensions (third part of SR reports or
- * second part of RR reports).
- *
- * @param - Content of the profile extension.
- * @param - Length of the extension, in octets.
- **/
- inline virtual void
- onGotRRSRExtension(unsigned char*, size_t)
- { return; }
+ /**
+ * Plug-in for processing of SR/RR RTCP packet
+ * profile-specific extensions (third part of SR reports or
+ * second part of RR reports).
+ *
+ * @param - Content of the profile extension.
+ * @param - Length of the extension, in octets.
+ **/
+ inline virtual void
+ onGotRRSRExtension(unsigned char*, size_t)
+ { return; }
- /**
- * A plugin point for goodbye message. Called when a BYE RTCP
- * packet has been received from a valid synchronization
- * source.
- *
- * @param - synchronization source from what a BYE RTCP
- * packet has been just received.
- * @param - reason string the source has provided.
- **/
- inline virtual void
- onGotGoodbye(const SyncSource&, const std::string&)
- { return; }
+ /**
+ * A plugin point for goodbye message. Called when a BYE RTCP
+ * packet has been received from a valid synchronization
+ * source.
+ *
+ * @param - synchronization source from what a BYE RTCP
+ * packet has been just received.
+ * @param - reason string the source has provided.
+ **/
+ inline virtual void
+ onGotGoodbye(const SyncSource&, const std::string&)
+ { return; }
- /**
- * Process a BYE packet just received and identified.
- *
- * @param pkt previously identified RTCP BYE packet
- * @param pointer octet number in the RTCP reception buffer
- * where the packet is stored
- * @param len total length of the compount RTCP packet the BYE
- * packet to process is contained
- *
- * @bug if the bye packet contains several SSRCs,
- * eventSourceLeaving is only called for the last one
- **/
- bool
- getBYE(RTCPPacket &pkt, size_t &pointer, size_t len);
+ /**
+ * Process a BYE packet just received and identified.
+ *
+ * @param pkt previously identified RTCP BYE packet
+ * @param pointer octet number in the RTCP reception buffer
+ * where the packet is stored
+ * @param len total length of the compount RTCP packet the BYE
+ * packet to process is contained
+ *
+ * @bug if the bye packet contains several SSRCs,
+ * eventSourceLeaving is only called for the last one
+ **/
+ bool
+ getBYE(RTCPPacket &pkt, size_t &pointer, size_t len);
- /**
- * @return number of Report Blocks packed
- **/
- uint8
- packReportBlocks(RRBlock* blocks, uint16& len, uint16& available);
+ /**
+ * @return number of Report Blocks packed
+ **/
+ uint8
+ packReportBlocks(RRBlock* blocks, uint16& len, uint16& available);
- /**
- * Builds an SDES RTCP packet. Each chunk is built following
- * appendix A.4 in draft-ietf-avt-rtp-new.
- *
- * @param len provisionary length of the RTCP compound packet
- *
- * @return
- **/
- void
- packSDES(uint16& len);
+ /**
+ * Builds an SDES RTCP packet. Each chunk is built following
+ * appendix A.4 in draft-ietf-avt-rtp-new.
+ *
+ * @param len provisionary length of the RTCP compound packet
+ *
+ * @return
+ **/
+ void
+ packSDES(uint16& len);
- /**
- * This must be called in order to update the average RTCP compound
- * packet size estimation when:
- *
- * a compoung RTCP packet is received (6.3.3).
- *
- * a compound RTCP packet is transmitted (6.3.6).
- *
- * @param len length in octets of the compound RTCP packet
- * just received/transmitted.
- **/
- void
- updateAvgRTCPSize(size_t len);
+ /**
+ * This must be called in order to update the average RTCP compound
+ * packet size estimation when:
+ *
+ * a compoung RTCP packet is received (6.3.3).
+ *
+ * a compound RTCP packet is transmitted (6.3.6).
+ *
+ * @param len length in octets of the compound RTCP packet
+ * just received/transmitted.
+ **/
+ void
+ updateAvgRTCPSize(size_t len);
- /**
- * Apply reverse reconsideration adjustment to timing
- * parameters when receiving BYE packets and not waiting to
- * send a BYE.
- **/
- void
- reverseReconsideration();
+ /**
+ * Apply reverse reconsideration adjustment to timing
+ * parameters when receiving BYE packets and not waiting to
+ * send a BYE.
+ **/
+ void
+ reverseReconsideration();
- bool
- timerReconsideration();
+ bool
+ timerReconsideration();
- /**
- * Purge sources that do not seem active any more.
- *
- * @note MUST be perform at least every RTCP transmission
- * interval
- * @todo implement it. It may be dangerous and anyway should
- * be optional.
- **/
- void
- expireSSRCs();
+ /**
+ * Purge sources that do not seem active any more.
+ *
+ * @note MUST be perform at least every RTCP transmission
+ * interval
+ * @todo implement it. It may be dangerous and anyway should
+ * be optional.
+ **/
+ void
+ expireSSRCs();
- /**
- * To be executed when whe are leaving the session.
- **/
- void
- getOnlyBye();
+ /**
+ * To be executed when whe are leaving the session.
+ **/
+ void
+ getOnlyBye();
- /**
- * Set item value from a string without null termination (as
- * it is transported in RTCP packets).
- **/
- void
- setSDESItem(Participant* part, SDESItemType type,
- const char* const value, size_t len);
+ /**
+ * Set item value from a string without null termination (as
+ * it is transported in RTCP packets).
+ **/
+ void
+ setSDESItem(Participant* part, SDESItemType type,
+ const char* const value, size_t len);
- /**
- * Set PRIV item previx value from a string without null
- * termination (as it is transported in RTCP packets).
- **/
- void
- setPRIVPrefix(Participant* part, const char* const value, size_t len);
+ /**
+ * Set PRIV item previx value from a string without null
+ * termination (as it is transported in RTCP packets).
+ **/
+ void
+ setPRIVPrefix(Participant* part, const char* const value, size_t len);
- /**
- * For certain control calculations in RTCP, the size of the
- * underlying network and transport protocols is needed. This
- * method provides the size of the network level header for
- * the default case of IP (20 octets). In case other protocol
- * with different header size is used, this method should be
- * redefined in a new specialized class.
- *
- * @return size of the headers of the network level. IP (20) by
- * default.
- **/
- inline virtual uint16
- networkHeaderSize()
- { return 20; }
+ /**
+ * For certain control calculations in RTCP, the size of the
+ * underlying network and transport protocols is needed. This
+ * method provides the size of the network level header for
+ * the default case of IP (20 octets). In case other protocol
+ * with different header size is used, this method should be
+ * redefined in a new specialized class.
+ *
+ * @return size of the headers of the network level. IP (20) by
+ * default.
+ **/
+ inline virtual uint16
+ networkHeaderSize()
+ { return 20; }
- /**
- * For certain control calculations in RTCP, the size of the
- * underlying network and transport protocols is needed. This
- * method provides the size of the transport level header for
- * the default case of UDP (8 octets). In case other protocol
- * with different header size is used, this method should be
- * redefined in a new specialized class.
- *
- * return size of the headers of the transport level. UDP (8)
- * by default
- **/
- inline virtual uint16
- transportHeaderSize()
- { return 8; }
+ /**
+ * For certain control calculations in RTCP, the size of the
+ * underlying network and transport protocols is needed. This
+ * method provides the size of the transport level header for
+ * the default case of UDP (8 octets). In case other protocol
+ * with different header size is used, this method should be
+ * redefined in a new specialized class.
+ *
+ * return size of the headers of the transport level. UDP (8)
+ * by default
+ **/
+ inline virtual uint16
+ transportHeaderSize()
+ { return 8; }
- SDESItemType
- nextSDESType(SDESItemType t);
- virtual size_t
- sendControl(const unsigned char* const buffer, size_t len) = 0;
+ int32 protect(uint8* pkt, size_t len, CryptoContextCtrl* cc);
+ int32 unprotect(uint8* pkt, size_t len, CryptoContextCtrl* cc);
+
+
+ SDESItemType
+ nextSDESType(SDESItemType t);
- virtual size_t
- recvControl(unsigned char* buffer, size_t len,
- InetHostAddress& na, tpport_t& tp) = 0;
+ virtual size_t
+ sendControl(const unsigned char* const buffer, size_t len) = 0;
- virtual bool
- isPendingControl(microtimeout_t timeout) = 0;
+ virtual size_t
+ recvControl(unsigned char* buffer, size_t len,
+ InetHostAddress& na, tpport_t& tp) = 0;
- // whether the RTCP service is active
- volatile bool controlServiceActive;
- float controlBwFract, sendControlBwFract, recvControlBwFract;
- // number of RTCP packets sent since the beginning
- uint32 ctrlSendCount;
+ virtual bool
+ isPendingControl(microtimeout_t timeout) = 0;
- // Network + transport headers size, typically size of IP +
- // UDP headers
- uint16 lowerHeadersSize;
+ // whether the RTCP service is active
+ volatile bool controlServiceActive;
+ float controlBwFract, sendControlBwFract, recvControlBwFract;
+ // number of RTCP packets sent since the beginning
+ uint32 ctrlSendCount;
- SDESItemType nextScheduledSDESItem;
- static const SDESItemType firstSchedulable;
- static const SDESItemType lastSchedulable;
+ // Network + transport headers size, typically size of IP +
+ // UDP headers
+ uint16 lowerHeadersSize;
- // state for rtcp timing. Its meaning is defined in
- // draft-ietf-avt-rtp-new, 6.3.
+ SDESItemType nextScheduledSDESItem;
+ static const SDESItemType firstSchedulable;
+ static const SDESItemType lastSchedulable;
- // Parameters for timer reconsideration algorithm
- struct {
- timeval rtcpTp, rtcpTc, rtcpTn;
- uint32 rtcpPMembers;
- } reconsInfo;
- bool rtcpWeSent;
- uint16 rtcpAvgSize;
- bool rtcpInitial;
- // last time we checked if there were incoming RTCP packets
- timeval rtcpLastCheck;
- // interval to check if there are incoming RTCP packets
- timeval rtcpCheckInterval;
- // next time to check if there are incoming RTCP packets
- timeval rtcpNextCheck;
+ // state for rtcp timing. Its meaning is defined in
+ // draft-ietf-avt-rtp-new, 6.3.
- // number of RTP data packets sent at the time of the last
- // RTCP packet transmission.
- uint32 lastSendPacketCount;
+ // Parameters for timer reconsideration algorithm
+ struct {
+ timeval rtcpTp, rtcpTc, rtcpTn;
+ uint32 rtcpPMembers;
+ } reconsInfo;
+ bool rtcpWeSent;
+ uint16 rtcpAvgSize;
+ bool rtcpInitial;
+ // last time we checked if there were incoming RTCP packets
+ timeval rtcpLastCheck;
+ // interval to check if there are incoming RTCP packets
+ timeval rtcpCheckInterval;
+ // next time to check if there are incoming RTCP packets
+ timeval rtcpNextCheck;
- // minimum interval for transmission of RTCP packets. The
- // result of computeRTCPInterval will always be >= (times a
- // random number between 0.5 and 1.5).
- microtimeout_t rtcpMinInterval;
+ // number of RTP data packets sent at the time of the last
+ // RTCP packet transmission.
+ uint32 lastSendPacketCount;
- microtimeout_t leavingDelay;
- static const microtimeout_t defaultEnd2EndDelay;
- // Maximum delay allowed between packet timestamping and
- // packet availability for the application.
- microtimeout_t end2EndDelay;
- // Application this queue is bound to.
- RTPApplication& queueApplication;
+ // minimum interval for transmission of RTCP packets. The
+ // result of computeRTCPInterval will always be >= (times a
+ // random number between 0.5 and 1.5).
+ microtimeout_t rtcpMinInterval;
- // an empty RTPData
- static const uint16 TIMEOUT_MULTIPLIER;
- static const double RECONSIDERATION_COMPENSATION;
+ microtimeout_t leavingDelay;
+ static const microtimeout_t defaultEnd2EndDelay;
+ // Maximum delay allowed between packet timestamping and
+ // packet availability for the application.
+ microtimeout_t end2EndDelay;
+ // Application this queue is bound to.
+ RTPApplication& queueApplication;
+
+ // an empty RTPData
+ static const uint16 TIMEOUT_MULTIPLIER;
+ static const double RECONSIDERATION_COMPENSATION;
+
+ mutable Mutex outCryptoMutex;
+ std::list<CryptoContextCtrl *> outCryptoContexts;
+ uint32 srtcpIndex;
+
+ mutable Mutex inCryptoMutex;
+ std::list<CryptoContextCtrl *> inCryptoContexts;
+
};
/**
@@ -626,55 +706,53 @@
*
* @author Federico Montesino Pouzols <fedemp@altern.org>
**/
-class AVPQueue : public QueueRTCPManager
+class __EXPORT AVPQueue : public QueueRTCPManager
{
public:
- /**
- * Specify the bandwith available for control (RTCP) packets.
- * This method sets the global control bandwidth for both
- * sender and receiver reports. As recommended in RFC 1890,
- * 1/4 of the total control bandwidth is dedicated to senders,
- * whereas 3/4 are dedicated to receivers.
- *
- * @param fraction fraction of the session bandwidth, between
- * 0 and 1
- *
- * @note If this method is not called, it is assumed that the
- * control bandwidth is equal to 5% of the session
- * bandwidth. Note also that the RFC RECOMMENDS the 5%.
- *
- **/
- inline void
- setControlBandwidth(float fraction)
- { QueueRTCPManager::setControlBandwidth(fraction); }
+ /**
+ * Specify the bandwith available for control (RTCP) packets.
+ * This method sets the global control bandwidth for both
+ * sender and receiver reports. As recommended in RFC 1890,
+ * 1/4 of the total control bandwidth is dedicated to senders,
+ * whereas 3/4 are dedicated to receivers.
+ *
+ * @param fraction fraction of the session bandwidth, between
+ * 0 and 1
+ *
+ * @note If this method is not called, it is assumed that the
+ * control bandwidth is equal to 5% of the session
+ * bandwidth. Note also that the RFC RECOMMENDS the 5%.
+ *
+ **/
+ inline void
+ setControlBandwidth(float fraction)
+ { QueueRTCPManager::setControlBandwidth(fraction); }
- float
- getControlBandwidth() const
- { return QueueRTCPManager::getControlBandwidth(); }
+ float
+ getControlBandwidth() const
+ { return QueueRTCPManager::getControlBandwidth(); }
protected:
- AVPQueue(uint32 size = RTPDataQueue::defaultMembersHashSize,
- RTPApplication& app = defaultApplication()) :
- QueueRTCPManager(size,app)
- { }
+ AVPQueue(uint32 size = RTPDataQueue::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication()) :
+ QueueRTCPManager(size,app)
+ { }
- /**
- * Local SSRC is given instead of computed by the queue.
- **/
- AVPQueue(uint32 ssrc, uint32 size =
- RTPDataQueue::defaultMembersHashSize,
- RTPApplication& app = defaultApplication()) :
- QueueRTCPManager(ssrc,size,app)
- { }
- inline virtual ~AVPQueue()
- { }
+ /**
+ * Local SSRC is given instead of computed by the queue.
+ **/
+ AVPQueue(uint32 ssrc, uint32 size =
+ RTPDataQueue::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication()) :
+ QueueRTCPManager(ssrc,size,app)
+ { }
+ inline virtual ~AVPQueue()
+ { }
};
/** @}*/ // cqueue
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_CQUEUE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/AesSrtp.h b/jni/libccrtp/sources/src/ccrtp/crypto/AesSrtp.h
deleted file mode 100644
index 5566be4..0000000
--- a/jni/libccrtp/sources/src/ccrtp/crypto/AesSrtp.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- * In addition, as a special exception, the copyright holders give
- * permission to link the code of portions of this program with the
- * OpenSSL library under certain conditions as described in each
- * individual source file, and distribute linked combinations
- * including the two.
- * You must obey the GNU General Public License in all respects
- * for all of the code used other than OpenSSL. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you
- * do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source
- * files in the program, then also delete it here.
-*/
-
-/**
- * Implments the SRTP encryption modes as defined in RFC3711
- *
- * The SRTP specification defines two encryption modes, AES-CTR
- * (AES Counter mode) and AES-F8 mode. The AES-CTR is required,
- * AES-F8 is optional.
- *
- * Both modes are desinged to encrypt/decrypt data of arbitrary length
- * (with a specified upper limit, refer to RFC 3711). These modes do
- * <em>not</em> require that the amount of data to encrypt is a multiple
- * of the AES blocksize (128byte), no padding is necessary.
- *
- * The implementation uses the openSSL library as its cryptographic
- * backend.
- *
- * @author Erik Eliasson <eliasson@it.kth.se>
- * @author Johan Bilien <jobi@via.ecp.fr>
- * @author Werner Dittmann <Werner.Dittmann@t-online.de>
- */
-
-
-#ifndef AESSRTP_H
-#define AESSRTP_H
-
-#include <cc++/config.h>
-
-#include <ccrtp/CryptoContext.h>
-
-#ifndef SRTP_BLOCK_SIZE
-#define SRTP_BLOCK_SIZE 16
-#endif
-
-typedef struct _f8_ctx {
- unsigned char *S;
- unsigned char *ivAccent;
- uint32_t J;
-} F8_CIPHER_CTX;
-
-
-class __EXPORT AesSrtp {
-public:
- AesSrtp(int algo = SrtpEncryptionAESCM);
- AesSrtp(uint8* key, int32 key_length, int algo = SrtpEncryptionAESCM);
- ~AesSrtp();
-
- /**
- * Encrypts the inpout to the output.
- *
- * Encrypts one input block to one output block. Each block
- * is 16 bytes according to the AES encryption algorithm used.
- *
- * @param input
- * Pointer to input block, must be 16 bytes
- *
- * @param output
- * Pointer to output block, must be 16 bytes
- */
- void encrypt( const uint8* input, uint8* output );
-
- /**
- * Set new key
- *
- * @param key
- * Pointer to key data, must have at least a size of keyLength
- *
- * @param keyLength
- * Length of the key in bytes, must be 16, 24, or 32
- *
- * @return
- * false if key could not set.
- */
- bool setNewKey(const uint8* key, int32 keyLength);
-
- /**
- * Computes the cipher stream for AES CM mode.
- *
- * @param output
- * Pointer to a buffer that receives the cipher stream. Must be
- * at least <code>length</code> bytes long.
- *
- * @param length
- * Number of cipher stream bytes to produce. Usually the same
- * length as the data to be encrypted.
- *
- * @param iv
- * The initialization vector as input to create the cipher stream.
- * Refer to chapter 4.1.1 in RFC 3711.
- */
- void get_ctr_cipher_stream(uint8* output, uint32 length, uint8* iv);
-
- /**
- * Counter-mode encryption.
- *
- * This method performs the AES CM encryption.
- *
- * @param input
- * Pointer to input buffer, must be <code>inputLen</code> bytes.
- *
- * @param inputLen
- * Number of bytes to process.
- *
- * @param output
- * Pointer to output buffer, must be <code>inputLen</code> bytes.
- *
- * @param iv
- * The initialization vector as input to create the cipher stream.
- * Refer to chapter 4.1.1 in RFC 3711.
- */
- void ctr_encrypt( const uint8* input,
- uint32 inputLen,
- uint8* output, uint8* iv );
-
- /**
- * Counter-mode encryption, in place.
- *
- * This method performs the AES CM encryption.
- *
- * @param data
- * Pointer to input and output block, must be <code>dataLen</code>
- * bytes.
- *
- * @param dataLen
- * Number of bytes to process.
- *
- * @param iv
- * The initialization vector as input to create the cipher stream.
- * Refer to chapter 4.1.1 in RFC 3711.
- */
- void ctr_encrypt( uint8* data,
- uint32 data_length,
- uint8* iv );
-
- /**
- * AES F8 mode encryption, in place.
- *
- * This method performs the AES F8 encryption, see chapter 4.1.2
- * in RFC 3711.
- *
- * @param data
- * Pointer to input and output block, must be <code>dataLen</code>
- * bytes.
- *
- * @param dataLen
- * Number of bytes to process.
- *
- * @param iv
- * The initialization vector as input to create the cipher stream.
- * Refer to chapter 4.1.1 in RFC 3711.
- *
- * @param key
- * Pointer to the computed SRTP session key.
- *
- * @param keyLen
- * The length in bytes of the computed SRTP session key.
- *
- * @param salt
- * pointer to the computed session salt.
- *
- * @param saltLen
- * The length in bytes of the computed SRTP session salt.
- *
- * @param f8Cipher
- * An AES cipher context used for intermediate f8 AES encryption.
- */
- void f8_encrypt( const uint8* data,
- uint32 dataLen,
- uint8* iv,
- uint8* key,
- int32 keyLen,
- uint8* salt,
- int32 saltLen,
- AesSrtp* f8Cipher);
-
- /**
- * AES F8 mode encryption.
- *
- * This method performs the AES F8 encryption, see chapter 4.1.2
- * in RFC 3711.
- *
- * @param data
- * Pointer to input and output block, must be <code>dataLen</code>
- * bytes.
- *
- * @param dataLen
- * Number of bytes to process.
- *
- * @param out
- * Pointer to output buffer, must be <code>dataLen</code> bytes.
- *
- * @param iv
- * The initialization vector as input to create the cipher stream.
- * Refer to chapter 4.1.1 in RFC 3711.
- *
- * @param key
- * Pointer to the computed SRTP session key.
- *
- * @param keyLen
- * The length in bytes of the computed SRTP session key.
- *
- * @param salt
- * pointer to the computed session salt.
- *
- * @param saltLen
- * The length in bytes of the computed SRTP session salt.
- */
- void f8_encrypt(const uint8* data,
- uint32 dataLen,
- uint8* out,
- uint8* iv,
- uint8* key,
- int32 keyLen,
- uint8* salt,
- int32 saltLen,
- AesSrtp* f8Cipher);
-
-
-private:
- int processBlock(F8_CIPHER_CTX *f8ctx,
- const uint8* in,
- int32 length,
- uint8* out);
- void* key;
- int32_t algorithm;
-};
-
-#endif
-
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-default-style: ellemtel
- * c-basic-offset: 4
- * End:
- */
-
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile
index 3134e9e..d5364bc 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
# src/ccrtp/crypto/Makefile. Generated from Makefile.in by configure.
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -26,6 +25,51 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/ccrtp
pkgincludedir = $(includedir)/ccrtp
pkglibdir = $(libdir)/ccrtp
@@ -43,11 +87,11 @@
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = x86_64-unknown-linux-gnu
-host_triplet = arm-unknown-linux-androideabi
-target_triplet = arm-unknown-linux-androideabi
+host_triplet = x86_64-unknown-linux-gnu
+target_triplet = x86_64-unknown-linux-gnu
subdir = src/ccrtp/crypto
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(noinst_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libgcrypt_local.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
@@ -58,82 +102,116 @@
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_HEADER = $(top_builddir)/ccrtp-config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_$(V))
+am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+am__v_at_1 =
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run aclocal-1.11
-AMTAR = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run tar
-AR = arm-linux-androideabi-ar
-AUTOCONF = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run automake-1.11
+ACLOCAL = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing aclocal-1.13
+AMTAR = $${TAR-tar}
+AM_DEFAULT_VERBOSITY = 1
+AR = ar
+AUTOCONF = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing autoconf
+AUTOHEADER = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing autoheader
+AUTOMAKE = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing automake-1.13
AWK = gawk
-CC = arm-linux-androideabi-gcc
+CC = gcc
CCDEPMODE = depmode=none
CFLAGS = -g -O2
-COMMON_CFLAGS = -D_GNU_SOURCE
-COMMON_LIBS = -pthread -lccgnu2 -ldl -lrt
-CPP = arm-linux-androideabi-gcc -E
+COMMONCPP_CFLAGS = -Wno-long-long -fexceptions -DNEW_STDCPP -pthread -fno-check-new -finline -fvisibility=hidden -DUCOMMON_VISIBILITY=1
+COMMONCPP_LIBS = -lcommoncpp -lucommon -lrt -ldl -lpthread
+CPP = gcc -E
CPPFLAGS =
-CXX = arm-linux-androideabi-g++
-CXXCPP = arm-linux-androideabi-g++ -E
+CXX = g++
+CXXCPP = g++ -E
CXXDEPMODE = depmode=none
-CXXFLAGS = -g -O2 -D_GNU_SOURCE
+CXXFLAGS = -g -O2 -Wno-long-long -fexceptions -DNEW_STDCPP -pthread -fno-check-new -finline -fvisibility=hidden -DUCOMMON_VISIBILITY=1
CYGPATH_W = echo
DEFS = -DHAVE_CONFIG_H
DEPDIR = .deps
DLLTOOL = false
-DOXYGEN = no
+DOXYGEN = /usr/bin/doxygen
DSYMUTIL =
DUMPBIN =
ECHO_C =
ECHO_N = -n
ECHO_T =
-EGREP = /bin/grep -E
+EGREP = /usr/bin/grep -E
EXEEXT =
-FGREP = /bin/grep -F
+FGREP = /usr/bin/grep -F
FTPDIR =
-GNULIBS = -L/usr/lib -pthread -lccgnu2 -ldl -lrt
-GREP = /bin/grep
+GNULIBS = -lcommoncpp -lucommon -lrt -ldl -lpthread -lgcrypt -ldl -lgpg-error
+GREP = /usr/bin/grep
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
KDOC_DIR = $(top_srcdir)/doc
-LD = /home/evigier/android-14b-toolchain/arm-linux-androideabi/bin/ld
+LD = /usr/bin/ld -m elf_x86_64
LDFLAGS =
LIBGCRYPT_CFLAGS =
-LIBGCRYPT_CONFIG =
-LIBGCRYPT_LIBS =
+LIBGCRYPT_CONFIG = /usr/bin/libgcrypt-config
+LIBGCRYPT_LIBS = -lgcrypt -ldl -lgpg-error
LIBOBJS =
-LIBS =
+LIBS = -lgcrypt -ldl -lgpg-error
LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIB_MAJOR = 0
-LIB_VERSION = 1_8
LIPO =
LN_S = ln -s
LTLIBOBJS =
-LT_CCXX_VERSION = -version-info 0:0
-LT_MAJOR = 0
+LT_CCXX_VERSION = -version-info 2:2:0
+LT_MAJOR = 2
LT_MINOR = 0
-LT_RELEASE = 1.8
-LT_SUBVER = 0.0
+LT_RELEASE =
+LT_SUBVER = 2.0
+LT_VERSION = 2:2:0
MAINT = #
-MAKEINFO = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/missing makeinfo
MANIFEST_TOOL = :
-MKDIR_P = /bin/mkdir -p
-NM = /home/evigier/android-14b-toolchain/bin/arm-linux-androideabi-nm -B
+MKDIR_P = /usr/bin/mkdir -p
+NM = /usr/bin/nm -B
NMEDIT =
-OBJDUMP = arm-linux-androideabi-objdump
+OBJDUMP = objdump
OBJEXT = o
OTOOL =
OTOOL64 =
@@ -147,27 +225,27 @@
PATH_SEPARATOR = :
PKG_CONFIG = /usr/bin/pkg-config
PKG_CONFIG_LIBDIR =
-PKG_CONFIG_PATH = /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr/lib/pkgconfig:/usr/local/lib/pkgconfig
-RANLIB = arm-linux-androideabi-ranlib
-SED = /bin/sed
+PKG_CONFIG_PATH = /usr/local/lib/pkgconfig
+RANLIB = ranlib
+SED = /usr/bin/sed
SET_MAKE =
-SHELL = /bin/bash
-STRIP = arm-linux-androideabi-strip
-VERSION = 1.8.0
+SHELL = /bin/sh
+STRIP = strip
+VERSION = 2.0.4
WARN_FLAGS = -fno-strict-aliasing -Wall -ansi -pedantic
-abs_builddir = /home/evigier/git/ccrtp-1.8.0-android/src/ccrtp/crypto
-abs_srcdir = /home/evigier/git/ccrtp-1.8.0-android/src/ccrtp/crypto
-abs_top_builddir = /home/evigier/git/ccrtp-1.8.0-android
-abs_top_srcdir = /home/evigier/git/ccrtp-1.8.0-android
-ac_ct_AR =
-ac_ct_CC =
-ac_ct_CXX =
+abs_builddir = /home/lisional/git/sflphone-android/jni/libccrtp/sources/src/ccrtp/crypto
+abs_srcdir = /home/lisional/git/sflphone-android/jni/libccrtp/sources/src/ccrtp/crypto
+abs_top_builddir = /home/lisional/git/sflphone-android/jni/libccrtp/sources
+abs_top_srcdir = /home/lisional/git/sflphone-android/jni/libccrtp/sources
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
ac_ct_DUMPBIN =
am__include = include
am__leading_dot = .
am__quote =
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
+am__tar = $${TAR-tar} chof - "$$tardir"
+am__untar = $${TAR-tar} xf -
bindir = ${exec_prefix}/bin
build = x86_64-unknown-linux-gnu
build_alias =
@@ -180,44 +258,44 @@
docdir = ${datarootdir}/doc/${PACKAGE}
dvidir = ${docdir}
exec_prefix = ${prefix}
-host = arm-unknown-linux-androideabi
-host_alias = arm-linux-androideabi
-host_cpu = arm
-host_os = linux-androideabi
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
host_vendor = unknown
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/evigier/git/ccrtp-1.8.0-android/autoconf/install-sh
+install_sh = ${SHELL} /home/lisional/git/sflphone-android/jni/libccrtp/sources/autoconf/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
localstatedir = ${prefix}/var
mandir = ${datarootdir}/man
-mkdir_p = /bin/mkdir -p
+mkdir_p = $(MKDIR_P)
oldincludedir = /usr/include
pdfdir = ${docdir}
-prefix = /home/evigier/android-ndk-r8b/platforms/android-14/arch-arm/usr
+prefix = /usr/local
program_transform_name = s,x,x,
psdir = ${docdir}
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
srcdir = .
sysconfdir = ${prefix}/etc
-target = arm-unknown-linux-androideabi
+target = x86_64-unknown-linux-gnu
target_alias =
-target_cpu = arm
-target_os = linux-androideabi
+target_cpu = x86_64
+target_os = linux-gnu
target_vendor = unknown
top_build_prefix = ../../../
top_builddir = ../../..
top_srcdir = ../../..
AUTOMAKE_OPTIONS = no-dependencies dist-shar
ccxxincludedir = $(includedir)/ccrtp/crypto
-noinst_HEADERS = AesSrtp.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
- brg_endian.h brg_types.h
+noinst_HEADERS = SrtpSymCrypto.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
+ brg_endian.h brg_types.h twofish.h
-kdoc_headers = AesSrtp.h hmac.h
+kdoc_headers = SrtpSymCrypto.h hmac.h
all: all-am
.SUFFIXES:
@@ -258,26 +336,15 @@
clean-libtool:
-rm -rf .libs _libs
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -289,15 +356,11 @@
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -306,6 +369,21 @@
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -354,10 +432,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -437,17 +520,17 @@
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
uninstall-am
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.am b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.am
index f42591e..b101cf8 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.am
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.am
@@ -11,10 +11,10 @@
AUTOMAKE_OPTIONS = no-dependencies dist-shar
ccxxincludedir=$(includedir)/ccrtp/crypto
-noinst_HEADERS = AesSrtp.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
- brg_endian.h brg_types.h
+noinst_HEADERS = SrtpSymCrypto.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
+ brg_endian.h brg_types.h twofish.h
-kdoc_headers = AesSrtp.h hmac.h
+kdoc_headers = SrtpSymCrypto.h hmac.h
kdoc:
kdoc -f html -d $(KDOC_DIR) -L$(KDOC_DIR) -n ccrtp $(kdoc_headers)
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.in b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.in
index fdce98e..de39e2f 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.in
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -26,6 +25,51 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -46,8 +90,8 @@
host_triplet = @host@
target_triplet = @target@
subdir = src/ccrtp/crypto
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(noinst_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libgcrypt_local.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
@@ -58,19 +102,54 @@
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_HEADER = $(top_builddir)/ccrtp-config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
depcomp =
am__depfiles_maybe =
SOURCES =
DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -79,8 +158,8 @@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
-COMMON_CFLAGS = @COMMON_CFLAGS@
-COMMON_LIBS = @COMMON_LIBS@
+COMMONCPP_CFLAGS = @COMMONCPP_CFLAGS@
+COMMONCPP_LIBS = @COMMONCPP_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
@@ -117,8 +196,6 @@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
-LIB_MAJOR = @LIB_MAJOR@
-LIB_VERSION = @LIB_VERSION@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
@@ -127,6 +204,7 @@
LT_MINOR = @LT_MINOR@
LT_RELEASE = @LT_RELEASE@
LT_SUBVER = @LT_SUBVER@
+LT_VERSION = @LT_VERSION@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
@@ -214,10 +292,10 @@
top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = no-dependencies dist-shar
ccxxincludedir = $(includedir)/ccrtp/crypto
-noinst_HEADERS = AesSrtp.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
- brg_endian.h brg_types.h
+noinst_HEADERS = SrtpSymCrypto.h hmac.h macSkein.h skein.h skein_iv.h skein_port.h skeinApi.h \
+ brg_endian.h brg_types.h twofish.h
-kdoc_headers = AesSrtp.h hmac.h
+kdoc_headers = SrtpSymCrypto.h hmac.h
all: all-am
.SUFFIXES:
@@ -258,26 +336,15 @@
clean-libtool:
-rm -rf .libs _libs
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -289,15 +356,11 @@
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -306,6 +369,21 @@
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -354,10 +432,15 @@
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -437,17 +520,17 @@
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libtool ctags distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
uninstall-am
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/SrtpSymCrypto.h b/jni/libccrtp/sources/src/ccrtp/crypto/SrtpSymCrypto.h
new file mode 100644
index 0000000..b14d46e
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/SrtpSymCrypto.h
@@ -0,0 +1,398 @@
+/*
+ Copyright (C) 2005, 2004, 2010, 2012 Erik Eliasson, Johan Bilien, Werner Dittmann
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+*/
+
+
+
+#ifndef SRTPSYMCRYPTO_H
+#define SRTPSYMCRYPTO_H
+
+/**
+ * @file SrtpSymCrypto.h
+ * @brief Class which implements SRTP AES cryptographic functions
+ *
+ * @ingroup GNU_ZRTP
+ * @{
+ */
+
+#include <stdint.h>
+#include <CryptoContext.h>
+
+#ifndef SRTP_BLOCK_SIZE
+#define SRTP_BLOCK_SIZE 16
+#endif
+
+typedef struct _f8_ctx {
+ unsigned char *S; ///< Intermetiade buffer
+ unsigned char *ivAccent; ///< second IV
+ uint32_t J; ///< Counter
+} F8_CIPHER_CTX;
+
+/**
+ * Implments the SRTP encryption modes as defined in RFC3711
+ *
+ * The SRTP specification defines two encryption modes, AES-CTR
+ * (AES Counter mode) and AES-F8 mode. The AES-CTR is required,
+ * AES-F8 is optional.
+ *
+ * Both modes are desinged to encrypt/decrypt data of arbitrary length
+ * (with a specified upper limit, refer to RFC 3711). These modes do
+ * <em>not</em> require that the amount of data to encrypt is a multiple
+ * of the AES blocksize (16 bytes), no padding is necessary.
+ *
+ * The implementation uses the openSSL library as its cryptographic
+ * backend.
+ *
+ * @author Erik Eliasson <eliasson@it.kth.se>
+ * @author Johan Bilien <jobi@via.ecp.fr>
+ * @author Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+class SrtpSymCrypto {
+public:
+ SrtpSymCrypto(int algo = SrtpEncryptionAESCM);
+
+ /**
+ * Constructor that initializes key data
+ *
+ * @param key
+ * Pointer to key bytes.
+ * @param key_length
+ * Number of key bytes.
+ */
+ SrtpSymCrypto(uint8_t* key, int32_t key_length, int algo = SrtpEncryptionAESCM);
+
+ ~SrtpSymCrypto();
+
+ /**
+ * Encrypts the inpout to the output.
+ *
+ * Encrypts one input block to one output block. Each block
+ * is 16 bytes according to the AES encryption algorithm used.
+ *
+ * @param input
+ * Pointer to input block, must be 16 bytes
+ *
+ * @param output
+ * Pointer to output block, must be 16 bytes
+ */
+ void encrypt( const uint8_t* input, uint8_t* output );
+
+ /**
+ * Set new key
+ *
+ * @param key
+ * Pointer to key data, must have at least a size of keyLength
+ *
+ * @param keyLength
+ * Length of the key in bytes, must be 16, 24, or 32
+ *
+ * @return
+ * false if key could not set.
+ */
+ bool setNewKey(const uint8_t* key, int32_t keyLength);
+
+ /**
+ * Computes the cipher stream for AES CM mode.
+ *
+ * @param output
+ * Pointer to a buffer that receives the cipher stream. Must be
+ * at least <code>length</code> bytes long.
+ *
+ * @param length
+ * Number of cipher stream bytes to produce. Usually the same
+ * length as the data to be encrypted.
+ *
+ * @param iv
+ * The initialization vector as input to create the cipher stream.
+ * Refer to chapter 4.1.1 in RFC 3711.
+ */
+ void get_ctr_cipher_stream(uint8_t* output, uint32_t length, uint8_t* iv);
+
+ /**
+ * Counter-mode encryption.
+ *
+ * This method performs the AES CM encryption.
+ *
+ * @param input
+ * Pointer to input buffer, must be <code>inputLen</code> bytes.
+ *
+ * @param inputLen
+ * Number of bytes to process.
+ *
+ * @param output
+ * Pointer to output buffer, must be <code>inputLen</code> bytes.
+ *
+ * @param iv
+ * The initialization vector as input to create the cipher stream.
+ * Refer to chapter 4.1.1 in RFC 3711.
+ */
+ void ctr_encrypt(const uint8_t* input, uint32_t inputLen, uint8_t* output, uint8_t* iv );
+
+ /**
+ * Counter-mode encryption, in place.
+ *
+ * This method performs the AES CM encryption.
+ *
+ * @param data
+ * Pointer to input and output block, must be <code>dataLen</code>
+ * bytes.
+ *
+ * @param data_length
+ * Number of bytes to process.
+ *
+ * @param iv
+ * The initialization vector as input to create the cipher stream.
+ * Refer to chapter 4.1.1 in RFC 3711.
+ */
+ void ctr_encrypt(uint8_t* data, uint32_t data_length, uint8_t* iv );
+
+ /**
+ * Derive a AES context to compute the IV'.
+ *
+ * See chapter 4.1.2.1 in RFC 3711.
+ *
+ * @param f8Cipher
+ * Pointer to the AES context that will be used to encrypt IV to IV'
+ *
+ * @param key
+ * The master key
+ *
+ * @param keyLen
+ * Length of the master key.
+ *
+ * @param salt
+ * Master salt.
+ *
+ * @param saltLen
+ * length of master salt.
+ */
+ void f8_deriveForIV(SrtpSymCrypto* f8Cipher, uint8_t* key, int32_t keyLen, uint8_t* salt, int32_t saltLen);
+
+ /**
+ * AES F8 mode encryption, in place.
+ *
+ * This method performs the AES F8 encryption, see chapter 4.1.2
+ * in RFC 3711.
+ *
+ * @param data
+ * Pointer to input and output block, must be <code>dataLen</code>
+ * bytes.
+ *
+ * @param dataLen
+ * Number of bytes to process.
+ *
+ * @param iv
+ * The initialization vector as input to create the cipher stream.
+ * Refer to chapter 4.1.1 in RFC 3711.
+ *
+ * @param f8Cipher
+ * An AES cipher context used to encrypt IV to IV'.
+ */
+ void f8_encrypt(const uint8_t* data, uint32_t dataLen, uint8_t* iv, SrtpSymCrypto* f8Cipher);
+
+ /**
+ * AES F8 mode encryption.
+ *
+ * This method performs the AES F8 encryption, see chapter 4.1.2
+ * in RFC 3711.
+ *
+ * @param data
+ * Pointer to input and output block, must be <code>dataLen</code>
+ * bytes.
+ *
+ * @param dataLen
+ * Number of bytes to process.
+ *
+ * @param out
+ * Pointer to output buffer, must be <code>dataLen</code> bytes.
+ *
+ * @param iv
+ * The initialization vector as input to create the cipher stream.
+ * Refer to chapter 4.1.1 in RFC 3711.
+ *
+ * @param f8Cipher
+ * An AES cipher context used to encrypt IV to IV'.
+ */
+ void f8_encrypt(const uint8_t* data, uint32_t dataLen, uint8_t* out, uint8_t* iv, SrtpSymCrypto* f8Cipher);
+
+private:
+ int processBlock(F8_CIPHER_CTX* f8ctx, const uint8_t* in, int32_t length, uint8_t* out);
+ void* key;
+ int32_t algorithm;
+};
+
+#pragma GCC visibility push(default)
+int testF8();
+#pragma GCC visibility pop
+
+/* Only SrtpSymCrypto functions define the MAKE_F8_TEST */
+#ifdef MAKE_F8_TEST
+
+#include <cstring>
+#include <iostream>
+#include <cstdio>
+
+#if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
+#include <windows.h>
+#else
+#include <arpa/inet.h>
+#endif
+
+using namespace std;
+
+static void hexdump(const char* title, const unsigned char *s, int l)
+{
+ int n=0;
+
+ if (s == NULL) return;
+
+ fprintf(stderr, "%s",title);
+ for( ; n < l ; ++n) {
+ if((n%16) == 0)
+ fprintf(stderr, "\n%04x",n);
+ fprintf(stderr, " %02x",s[n]);
+ }
+ fprintf(stderr, "\n");
+}
+
+/*
+ * The F8 test vectors according to RFC3711
+ */
+static unsigned char salt[] = {0x32, 0xf2, 0x87, 0x0d};
+
+static unsigned char iv[] = { 0x00, 0x6e, 0x5c, 0xba, 0x50, 0x68, 0x1d, 0xe5,
+ 0x5c, 0x62, 0x15, 0x99, 0xd4, 0x62, 0x56, 0x4a};
+
+static unsigned char key[]= { 0x23, 0x48, 0x29, 0x00, 0x84, 0x67, 0xbe, 0x18,
+ 0x6c, 0x3d, 0xe1, 0x4a, 0xae, 0x72, 0xd6, 0x2c};
+
+static unsigned char payload[] = {
+ 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x72, 0x61,
+ 0x6e, 0x64, 0x6f, 0x6d, 0x6e, 0x65, 0x73, 0x73,
+ 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6e, 0x65, 0x78, 0x74, 0x20, 0x62, 0x65, 0x73,
+ 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67}; // 39 bytes
+
+static unsigned char cipherText[] = {
+ 0x01, 0x9c, 0xe7, 0xa2, 0x6e, 0x78, 0x54, 0x01,
+ 0x4a, 0x63, 0x66, 0xaa, 0x95, 0xd4, 0xee, 0xfd,
+ 0x1a, 0xd4, 0x17, 0x2a, 0x14, 0xf9, 0xfa, 0xf4,
+ 0x55, 0xb7, 0xf1, 0xd4, 0xb6, 0x2b, 0xd0, 0x8f,
+ 0x56, 0x2c, 0x0e, 0xef, 0x7c, 0x48, 0x02}; // 39 bytes
+
+// static unsigned char rtpPacketHeader[] = {
+// 0x80, 0x6e, 0x5c, 0xba, 0x50, 0x68, 0x1d, 0xe5,
+// 0x5c, 0x62, 0x15, 0x99};
+
+static unsigned char rtpPacket[] = {
+ 0x80, 0x6e, 0x5c, 0xba, 0x50, 0x68, 0x1d, 0xe5,
+ 0x5c, 0x62, 0x15, 0x99, // header
+ 0x70, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x72, 0x61, // payload
+ 0x6e, 0x64, 0x6f, 0x6d, 0x6e, 0x65, 0x73, 0x73,
+ 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x6e, 0x65, 0x78, 0x74, 0x20, 0x62, 0x65, 0x73,
+ 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67};
+static uint32_t ROC = 0xd462564a;
+
+int testF8()
+{
+ SrtpSymCrypto* aesCipher = new SrtpSymCrypto(SrtpEncryptionAESF8);
+ SrtpSymCrypto* f8AesCipher = new SrtpSymCrypto(SrtpEncryptionAESF8);
+
+ aesCipher->setNewKey(key, sizeof(key));
+
+ /* Create the F8 IV (refer to chapter 4.1.2.2 in RFC 3711):
+ *
+ * IV = 0x00 || M || PT || SEQ || TS || SSRC || ROC
+ * 8Bit 1bit 7bit 16bit 32bit 32bit 32bit
+ * ------------\ /--------------------------------------------------
+ * XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
+ */
+
+ unsigned char derivedIv[16];
+ uint32_t* ui32p = (uint32_t*)derivedIv;
+
+ memcpy(derivedIv, rtpPacket, 12);
+ derivedIv[0] = 0;
+
+ // set ROC in network order into IV
+ ui32p[3] = htonl(ROC);
+
+ int32_t pad = 0;
+
+ if (memcmp(iv, derivedIv, 16) != 0) {
+ cerr << "Wrong IV constructed" << endl;
+ hexdump("derivedIv", derivedIv, 16);
+ hexdump("test vector Iv", iv, 16);
+ return -1;
+ }
+
+ aesCipher->f8_deriveForIV(f8AesCipher, key, sizeof(key), salt, sizeof(salt));
+
+ // now encrypt the RTP payload data
+ aesCipher->f8_encrypt(rtpPacket + 12, sizeof(rtpPacket)-12+pad,
+ derivedIv, f8AesCipher);
+
+ // compare with test vector cipher data
+ if (memcmp(rtpPacket+12, cipherText, sizeof(rtpPacket)-12+pad) != 0) {
+ cerr << "cipher data mismatch" << endl;
+ hexdump("computed cipher data", rtpPacket+12, sizeof(rtpPacket)-12+pad);
+ hexdump("Test vcetor cipher data", cipherText, sizeof(cipherText));
+ return -1;
+ }
+
+ // Now decrypt the data to get the payload data again
+ aesCipher->f8_encrypt(rtpPacket+12, sizeof(rtpPacket)-12+pad, derivedIv, f8AesCipher);
+
+ // compare decrypted data with test vector payload data
+ if (memcmp(rtpPacket+12, payload, sizeof(rtpPacket)-12+pad) != 0) {
+ cerr << "payload data mismatch" << endl;
+ hexdump("computed payload data", rtpPacket+12, sizeof(rtpPacket)-12+pad);
+ hexdump("Test vector payload data", payload, sizeof(payload));
+ return -1;
+ }
+ return 0;
+}
+#endif
+
+/**
+ * @}
+ */
+
+#endif
+
+/** EMACS **
+ * Local variables:
+ * mode: c++
+ * c-default-style: ellemtel
+ * c-basic-offset: 4
+ * End:
+ */
+
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cxx b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cpp
similarity index 90%
rename from jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cxx
rename to jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cpp
index 6d23d08..78fad51 100755
--- a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cxx
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/InitializeGcrypt.cpp
@@ -1,10 +1,10 @@
/*
- Copyright (C) 2006 Werner Dittmann
+ Copyright (C) 2006-2007 Werner Dittmann
- This program is free software; you can redistribute it and/or modify
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -12,13 +12,12 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Boston, MA 02111.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
-#include <stdlib.h>
+#include <malloc.h>
#include <pthread.h>
#include <errno.h>
#include <gcrypt.h>
@@ -75,7 +74,7 @@
{
if (initialized) {
- return 1;
+ return 1;
}
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
gcry_check_version(NULL);
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptAesSrtp.cxx b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptAesSrtp.cxx
deleted file mode 100644
index 1188633..0000000
--- a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptAesSrtp.cxx
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- * In addition, as a special exception, the copyright holders give
- * permission to link the code of portions of this program with the
- * OpenSSL library under certain conditions as described in each
- * individual source file, and distribute linked combinations
- * including the two.
- * You must obey the GNU General Public License in all respects
- * for all of the code used other than OpenSSL. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you
- * do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source
- * files in the program, then also delete it here.
-*/
-
-/**
- * @author Erik Eliasson <eliasson@it.kth.se>
- * @author Johan Bilien <jobi@via.ecp.fr>
- * @author Werner Dittmann <Werner.Dittmann@t-online.de>
- */
-
-extern void initializeGcrypt();
-
-#include <gcrypt.h> // the include of gcrypt
-#include <stdlib.h>
-#include <ccrtp/crypto/AesSrtp.h>
-
-#include <stdio.h>
-
-AesSrtp::AesSrtp(int algo) : key(NULL), algorithm(algo) {
- initializeGcrypt();
-}
-
-AesSrtp::AesSrtp( uint8* k, int32 keyLength, int algo) :
- key(NULL), algorithm(algo) {
-
- initializeGcrypt();
- setNewKey(k, keyLength);
-}
-
-AesSrtp::~AesSrtp() {
- if (key) {
- gcry_cipher_close(static_cast<gcry_cipher_hd_t>(key));
- key = NULL;
- }
-}
-
-bool AesSrtp::setNewKey(const uint8* k, int32 keyLength) {
-
- // release an existing key before setting a new one
- if (key != NULL) {
- gcry_cipher_close(static_cast<gcry_cipher_hd_t>(key));
- key = NULL;
- }
-
- int algo = 0;
- if (keyLength == 16) {
- algo = GCRY_CIPHER_AES;
- }
- else if (keyLength == 32) {
- algo = GCRY_CIPHER_AES256;
- }
- else {
- return false;
- }
- gcry_cipher_hd_t tmp;
- int err = gcry_cipher_open(&tmp, algo, GCRY_CIPHER_MODE_ECB, 0);
- key = tmp;
- err = gcry_cipher_setkey(static_cast<gcry_cipher_hd_t>(key), k, keyLength);
- return true;
-}
-
-
-void AesSrtp::encrypt( const uint8* input, uint8* output ) {
- if (key != NULL) {
- gcry_cipher_encrypt (static_cast<gcry_cipher_hd_t>(key),
- output, SRTP_BLOCK_SIZE, input, SRTP_BLOCK_SIZE);
- }
-}
-
-void AesSrtp::get_ctr_cipher_stream( uint8* output, uint32 length,
- uint8* iv ) {
- uint16 ctr;
- uint16 input;
-
- unsigned char aes_input[SRTP_BLOCK_SIZE];
- unsigned char temp[SRTP_BLOCK_SIZE];
-
- memcpy(aes_input, iv, 14 );
- iv += 14;
-
- for( ctr = 0; ctr < length/SRTP_BLOCK_SIZE; ctr++ ){
- input = ctr;
- //compute the cipher stream
- aes_input[14] = (uint8)((input & 0xFF00) >> 8);
- aes_input[15] = (uint8)((input & 0x00FF));
-
- gcry_cipher_encrypt(static_cast<gcry_cipher_hd_t>(key), &output[ctr*SRTP_BLOCK_SIZE], SRTP_BLOCK_SIZE,
- aes_input, SRTP_BLOCK_SIZE);
- }
- if ((length % SRTP_BLOCK_SIZE) > 0) {
- // Treat the last bytes:
- input = ctr;
- aes_input[14] = (uint8)((input & 0xFF00) >> 8);
- aes_input[15] = (uint8)((input & 0x00FF));
-
- gcry_cipher_encrypt(static_cast<gcry_cipher_hd_t>(key), temp, SRTP_BLOCK_SIZE, aes_input, SRTP_BLOCK_SIZE);
- memcpy(&output[ctr*SRTP_BLOCK_SIZE], temp, length % SRTP_BLOCK_SIZE);
- }
-}
-
-
-void AesSrtp::ctr_encrypt( const uint8* input, uint32 input_length,
- uint8* output, uint8* iv ) {
-
- if (key == NULL)
- return;
-
- uint8* cipher_stream = new uint8[input_length];
-
- get_ctr_cipher_stream( cipher_stream, input_length, iv );
-
- for( unsigned int i = 0; i < input_length; i++ ){
- output[i] = cipher_stream[i] ^ input[i];
- }
- delete []cipher_stream;
-}
-
-void AesSrtp::ctr_encrypt( uint8* data, uint32 data_length, uint8* iv ) {
-
- if (key == NULL)
- return;
-
- //unsigned char cipher_stream[data_length];
- uint8* cipher_stream = new uint8[data_length];
-
- get_ctr_cipher_stream( cipher_stream, data_length, iv );
-
- for( uint32 i = 0; i < data_length; i++ ){
- data[i] ^= cipher_stream[i];
- }
- delete[] cipher_stream;
-}
-
-void AesSrtp::f8_encrypt(const uint8* data, uint32 data_length,
- uint8* iv, uint8* origKey, int32 keyLen,
- uint8* salt, int32 saltLen, AesSrtp* f8Cipher ) {
-
- f8_encrypt(data, data_length, const_cast<uint8*>(data), iv, origKey, keyLen, salt, saltLen, f8Cipher);
-}
-
-#define MAX_KEYLEN 32
-
-void AesSrtp::f8_encrypt(const uint8* in, uint32 in_length, uint8* out,
- uint8* iv, uint8* origKey, int32 keyLen,
- uint8* salt, int32 saltLen, AesSrtp* f8Cipher ) {
-
-
- unsigned char *cp_in, *cp_in1, *cp_out;
- int i;
- int offset = 0;
-
- unsigned char ivAccent[SRTP_BLOCK_SIZE];
- unsigned char maskedKey[MAX_KEYLEN];
- unsigned char saltMask[MAX_KEYLEN];
- unsigned char S[SRTP_BLOCK_SIZE];
-
- F8_CIPHER_CTX f8ctx;
-
- if (key == NULL)
- return;
-
- if (keyLen > MAX_KEYLEN)
- return;
-
- if (saltLen > keyLen)
- return;
-
- /*
- * Get memory for the derived IV (IV')
- */
- f8ctx.ivAccent = ivAccent;
-
- /*
- * First copy the salt into the mask field, then fill with 0x55 to
- * get a full key.
- */
- memcpy(saltMask, salt, saltLen);
- memset(saltMask+saltLen, 0x55, keyLen-saltLen);
-
- /*
- * XOR the original key with the above created mask to
- * get the special key.
- */
- cp_out = maskedKey;
- cp_in = origKey;
- cp_in1 = saltMask;
- for (i = 0; i < keyLen; i++) {
- *cp_out++ = *cp_in++ ^ *cp_in1++;
- }
- /*
- * Prepare the a new AES cipher with the special key to compute IV'
- */
- f8Cipher->setNewKey(maskedKey, keyLen);
-
- /*
- * Use the masked key to encrypt the original IV to produce IV'.
- *
- * After computing the IV' we don't need this cipher context anymore, free it.
- */
- f8Cipher->encrypt(iv, f8ctx.ivAccent);
-
- f8ctx.J = 0; // initialize the counter
- f8ctx.S = S; // get the key stream buffer
-
- memset(f8ctx.S, 0, SRTP_BLOCK_SIZE); // initial value for key stream
-
- while (in_length >= SRTP_BLOCK_SIZE) {
- processBlock(&f8ctx, in+offset, SRTP_BLOCK_SIZE, out+offset);
- in_length -= SRTP_BLOCK_SIZE;
- offset += SRTP_BLOCK_SIZE;
- }
- if (in_length > 0) {
- processBlock(&f8ctx, in+offset, in_length, out+offset);
- }
-}
-
-int AesSrtp::processBlock(F8_CIPHER_CTX *f8ctx, const uint8* in, int32 length, uint8* out) {
-
- int i;
- const uint8 *cp_in;
- uint8* cp_in1, *cp_out;
- uint32_t *ui32p;
-
- /*
- * XOR the previous key stream with IV'
- * ( S(-1) xor IV' )
- */
- cp_in = f8ctx->ivAccent;
- cp_out = f8ctx->S;
- for (i = 0; i < SRTP_BLOCK_SIZE; i++) {
- *cp_out++ ^= *cp_in++;
- }
- /*
- * Now XOR (S(n-1) xor IV') with the current counter, then increment the counter
- */
- ui32p = (uint32_t *)f8ctx->S;
- ui32p[3] ^= htonl(f8ctx->J);
- f8ctx->J++;
- /*
- * Now compute the new key stream using AES encrypt
- */
- gcry_cipher_encrypt(static_cast<gcry_cipher_hd_t>(key), f8ctx->S, SRTP_BLOCK_SIZE, NULL, 0);
- /*
- * as the last step XOR the plain text with the key stream to produce
- * the ciphertext.
- */
- cp_out = out;
- cp_in = in;
- cp_in1 = f8ctx->S;
- for (i = 0; i < length; i++) {
- *cp_out++ = *cp_in++ ^ *cp_in1++;
- }
- return length;
-}
-
-
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-default-style: ellemtel
- * c-basic-offset: 4
- * End:
- */
-
-
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptSrtpSymCrypto.cpp b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptSrtpSymCrypto.cpp
new file mode 100644
index 0000000..766deac
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcryptSrtpSymCrypto.cpp
@@ -0,0 +1,344 @@
+/*
+ Copyright (C) 2005, 2004, 2012 Erik Eliasson, Johan Bilien, Werner Dittmann
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+*/
+
+/**
+ * @author Erik Eliasson <eliasson@it.kth.se>
+ * @author Johan Bilien <jobi@via.ecp.fr>
+ * @author Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+
+extern void initializeGcrypt();
+
+#define MAKE_F8_TEST
+
+#include <gcrypt.h> // the include of gcrypt
+#include <stdlib.h>
+#include <crypto/SrtpSymCrypto.h>
+#include <crypto/twofish.h>
+
+#include <stdio.h>
+
+SrtpSymCrypto::SrtpSymCrypto(int algo) : key(NULL), algorithm(algo) {
+ initializeGcrypt();
+}
+
+SrtpSymCrypto::SrtpSymCrypto( uint8_t* k, int32_t keyLength, int algo) :
+ key(NULL), algorithm(algo) {
+
+ initializeGcrypt();
+ setNewKey(k, keyLength);
+}
+
+SrtpSymCrypto::~SrtpSymCrypto() {
+ if (key) {
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8)
+ gcry_cipher_close(static_cast<gcry_cipher_hd_t>(key));
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
+ memset(key, 0, sizeof(Twofish_key));
+ delete[] (uint8_t*)key;
+ }
+ key = NULL;
+ }
+}
+
+static int twoFishInit = 0;
+
+bool SrtpSymCrypto::setNewKey(const uint8_t* k, int32_t keyLength) {
+
+ // release an existing key before setting a new one
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
+ if (key != NULL) {
+ gcry_cipher_close(static_cast<gcry_cipher_hd_t>(key));
+ key = NULL;
+ }
+
+ int algo = 0;
+ if (keyLength == 16) {
+ algo = GCRY_CIPHER_AES;
+ }
+ else if (keyLength == 32) {
+ algo = GCRY_CIPHER_AES256;
+ }
+ else {
+ return false;
+ }
+ gcry_cipher_hd_t tmp;
+ gcry_cipher_open(&tmp, algo, GCRY_CIPHER_MODE_ECB, 0);
+ key = tmp;
+ gcry_cipher_setkey(static_cast<gcry_cipher_hd_t>(key), k, keyLength);
+ }
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
+ if (!twoFishInit) {
+ Twofish_initialise();
+ twoFishInit = 1;
+ }
+ if (key != NULL)
+ delete[] (uint8_t*)key;
+
+ key = new uint8_t[sizeof(Twofish_key)];
+ memset(key, 0, sizeof(Twofish_key));
+ Twofish_prepare_key((Twofish_Byte*)k, keyLength, (Twofish_key*)key);
+ }
+ else
+ return false;
+
+ return true;
+}
+
+
+void SrtpSymCrypto::encrypt(const uint8_t* input, uint8_t* output) {
+ if (key != NULL) {
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8)
+ gcry_cipher_encrypt (static_cast<gcry_cipher_hd_t>(key),
+ output, SRTP_BLOCK_SIZE, input, SRTP_BLOCK_SIZE);
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8)
+ Twofish_encrypt((Twofish_key*)key, (Twofish_Byte*)input,
+ (Twofish_Byte*)output);
+ }
+}
+
+void SrtpSymCrypto::get_ctr_cipher_stream( uint8_t* output, uint32_t length,
+ uint8_t* iv ) {
+ uint16_t ctr = 0;
+
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ for(ctr = 0; ctr < length/SRTP_BLOCK_SIZE; ctr++ ){
+ //compute the cipher stream
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, &output[ctr*SRTP_BLOCK_SIZE]);
+ }
+ if ((length % SRTP_BLOCK_SIZE) > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ memcpy(&output[ctr*SRTP_BLOCK_SIZE], temp, length % SRTP_BLOCK_SIZE);
+ }
+}
+
+void SrtpSymCrypto::ctr_encrypt( const uint8_t* input, uint32_t input_length,
+ uint8_t* output, uint8_t* iv ) {
+
+ if (key == NULL)
+ return;
+
+ uint16_t ctr = 0;
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ int l = input_length/SRTP_BLOCK_SIZE;
+ for ( ctr = 0; ctr < l; ctr++ ) {
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
+ *output++ = temp[i] ^ *input++;
+ }
+
+ }
+ l = input_length % SRTP_BLOCK_SIZE;
+ if (l > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < l; i++ ) {
+ *output++ = temp[i] ^ *input++;
+ }
+ }
+}
+
+void SrtpSymCrypto::ctr_encrypt( uint8_t* data, uint32_t data_length, uint8_t* iv ) {
+
+ if (key == NULL)
+ return;
+
+ uint16_t ctr = 0;
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ int l = data_length/SRTP_BLOCK_SIZE;
+ for (ctr = 0; ctr < l; ctr++ ) {
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
+ *data++ ^= temp[i];
+ }
+
+ }
+ l = data_length % SRTP_BLOCK_SIZE;
+ if (l > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < l; i++ ) {
+ *data++ ^= temp[i];
+ }
+ }
+
+}
+
+void SrtpSymCrypto::f8_encrypt(const uint8_t* data, uint32_t data_length, uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
+
+ f8_encrypt(data, data_length, const_cast<uint8_t*>(data), iv, f8Cipher);
+}
+
+#define MAX_KEYLEN 32
+
+void SrtpSymCrypto::f8_deriveForIV(SrtpSymCrypto* f8Cipher, uint8_t* key, int32_t keyLen,
+ uint8_t* salt, int32_t saltLen) {
+
+ unsigned char *cp_in, *cp_in1, *cp_out;
+
+ unsigned char maskedKey[MAX_KEYLEN];
+ unsigned char saltMask[MAX_KEYLEN];
+
+ if (keyLen > MAX_KEYLEN)
+ return;
+
+ if (saltLen > keyLen)
+ return;
+ /*
+ * First copy the salt into the mask field, then fill with 0x55 to
+ * get a full key.
+ */
+ memcpy(saltMask, salt, saltLen);
+ memset(saltMask+saltLen, 0x55, keyLen-saltLen);
+
+ /*
+ * XOR the original key with the above created mask to
+ * get the special key.
+ */
+ cp_out = maskedKey;
+ cp_in = key;
+ cp_in1 = saltMask;
+ for (int i = 0; i < keyLen; i++) {
+ *cp_out++ = *cp_in++ ^ *cp_in1++;
+ }
+ /*
+ * Prepare the a new AES cipher with the special key to compute IV'
+ */
+ f8Cipher->setNewKey(maskedKey, keyLen);
+}
+
+void SrtpSymCrypto::f8_encrypt(const uint8_t* in, uint32_t in_length, uint8_t* out,
+ uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
+
+ int offset = 0;
+
+ unsigned char ivAccent[SRTP_BLOCK_SIZE];
+ unsigned char S[SRTP_BLOCK_SIZE];
+
+ F8_CIPHER_CTX f8ctx;
+
+ if (key == NULL)
+ return;
+
+ /*
+ * Get memory for the derived IV (IV')
+ */
+ f8ctx.ivAccent = ivAccent;
+ /*
+ * Use the derived IV encryption setup to encrypt the original IV to produce IV'.
+ */
+ f8Cipher->encrypt(iv, f8ctx.ivAccent);
+
+ f8ctx.J = 0; // initialize the counter
+ f8ctx.S = S; // get the key stream buffer
+
+ memset(f8ctx.S, 0, SRTP_BLOCK_SIZE); // initial value for key stream
+
+ while (in_length >= SRTP_BLOCK_SIZE) {
+ processBlock(&f8ctx, in+offset, SRTP_BLOCK_SIZE, out+offset);
+ in_length -= SRTP_BLOCK_SIZE;
+ offset += SRTP_BLOCK_SIZE;
+ }
+ if (in_length > 0) {
+ processBlock(&f8ctx, in+offset, in_length, out+offset);
+ }
+}
+
+int SrtpSymCrypto::processBlock(F8_CIPHER_CTX *f8ctx, const uint8_t* in, int32_t length, uint8_t* out) {
+
+ int i;
+ const uint8_t *cp_in;
+ uint8_t* cp_in1, *cp_out;
+ uint32_t *ui32p;
+
+ /*
+ * XOR the previous key stream with IV'
+ * ( S(-1) xor IV' )
+ */
+ cp_in = f8ctx->ivAccent;
+ cp_out = f8ctx->S;
+ for (i = 0; i < SRTP_BLOCK_SIZE; i++) {
+ *cp_out++ ^= *cp_in++;
+ }
+ /*
+ * Now XOR (S(n-1) xor IV') with the current counter, then increment the counter
+ */
+ ui32p = (uint32_t *)f8ctx->S;
+ ui32p[3] ^= htonl(f8ctx->J);
+ f8ctx->J++;
+ /*
+ * Now compute the new key stream using encrypt
+ */
+ encrypt(f8ctx->S, f8ctx->S);
+ /*
+ * as the last step XOR the plain text with the key stream to produce
+ * the ciphertext.
+ */
+ cp_out = out;
+ cp_in = in;
+ cp_in1 = f8ctx->S;
+ for (i = 0; i < length; i++) {
+ *cp_out++ = *cp_in++ ^ *cp_in1++;
+ }
+ return length;
+}
+
+/** EMACS **
+ * Local variables:
+ * mode: c++
+ * c-default-style: ellemtel
+ * c-basic-offset: 4
+ * End:
+ */
+
+
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cxx b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cpp
similarity index 77%
rename from jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cxx
rename to jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cpp
index c13f657..208c3ec 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cxx
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/gcrypt/gcrypthmac.cpp
@@ -22,17 +22,16 @@
*/
#include <gcrypt.h>
-#include <ccrtp/crypto/hmac.h>
+#include <crypto/hmac.h>
#include <stdio.h>
-void hmac_sha1(uint8* key, int32 keyLength,
- const uint8* data, int32 dataLength,
- uint8* mac, int32* macLength)
+void hmac_sha1(uint8_t* key, int32_t keyLength,
+ const uint8_t* data, int32_t dataLength,
+ uint8_t* mac, int32_t* macLength)
{
gcry_md_hd_t hd;
- gcry_error_t err = 0;
- err = gcry_md_open(&hd, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
+ gcry_md_open(&hd, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
gcry_md_setkey(hd, key, keyLength);
gcry_md_write (hd, data, dataLength);
@@ -45,19 +44,18 @@
gcry_md_close (hd);
}
-void hmac_sha1( uint8* key, int32 keyLength,
- const uint8* dataChunks[],
- uint32 dataChunkLength[],
- uint8* mac, int32* macLength )
+void hmac_sha1( uint8_t* key, int32_t keyLength,
+ const uint8_t* dataChunks[],
+ uint32_t dataChunkLength[],
+ uint8_t* mac, int32_t* macLength )
{
gcry_md_hd_t hd;
- gcry_error_t err = 0;
- err = gcry_md_open(&hd, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
+ gcry_md_open(&hd, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
gcry_md_setkey(hd, key, keyLength);
while (*dataChunks) {
- gcry_md_write (hd, *dataChunks, (uint32)(*dataChunkLength));
+ gcry_md_write (hd, *dataChunks, (uint32_t)(*dataChunkLength));
dataChunks++;
dataChunkLength++;
}
@@ -72,9 +70,8 @@
void* createSha1HmacContext(uint8_t* key, int32_t key_length)
{
gcry_md_hd_t ctx;
- gcry_error_t err = 0;
-
- err = gcry_md_open(&ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
+
+ gcry_md_open(&ctx, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);
gcry_md_setkey(ctx, key, key_length);
return ctx;
}
@@ -83,11 +80,11 @@
uint8_t* mac, int32_t* mac_length)
{
gcry_md_hd_t pctx = (gcry_md_hd_t)ctx;
-
+
gcry_md_reset(pctx);
gcry_md_write (pctx, data, data_length);
-
+
uint8_t* p = gcry_md_read (pctx, GCRY_MD_SHA1);
memcpy(mac, p, SHA1_DIGEST_LENGTH);
if (mac_length != NULL) {
@@ -99,10 +96,10 @@
uint8_t* mac, int32_t* mac_length )
{
gcry_md_hd_t pctx = (gcry_md_hd_t)ctx;
-
+
gcry_md_reset (pctx);
while (*data) {
- gcry_md_write (pctx, *data, (uint32)(*data_length));
+ gcry_md_write (pctx, *data, (uint32_t)(*data_length));
data++;
data_length++;
}
@@ -117,4 +114,4 @@
{
gcry_md_hd_t pctx = (gcry_md_hd_t)ctx;
gcry_md_close (pctx);
-}
\ No newline at end of file
+}
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/hmac.h b/jni/libccrtp/sources/src/ccrtp/crypto/hmac.h
index 02a5b8c..4abfa8f 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/hmac.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/hmac.h
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+ Copyright (C) 2005, 2004, 2010 Erik Eliasson, Johan Bilien, Werner Dittmann
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -34,12 +34,21 @@
*
* @author Erik Eliasson <eliasson@it.kth.se>
* @author Johan Bilien <jobi@via.ecp.fr>
+ * @author Werner Dittmann
*/
#ifndef HMAC_H
#define HMAC_H
-#include <cc++/config.h>
+/**
+ * @file hmac.h
+ * @brief Functions that provide SHA1 HMAC support
+ *
+ * @ingroup GNU_ZRTP
+ * @{
+ */
+
+#include <stdint.h>
#ifndef SHA1_DIGEST_LENGTH
#define SHA1_DIGEST_LENGTH 20
@@ -65,15 +74,14 @@
* Point to an integer that receives the length of the computed HMAC.
*/
-__EXPORT void hmac_sha1( uint8* key, int32 key_length,
- const uint8* data, uint32 data_length,
- uint8* mac, int32* mac_length );
+void hmac_sha1( uint8_t* key, int32_t key_length,
+ const uint8_t* data, uint32_t data_length,
+ uint8_t* mac, int32_t* mac_length );
/**
* Compute SHA1 HMAC over several data cunks.
*
- * This functions takes several data chunk and computes the SHA1 HAMAC. It
- * uses the openSSL HAMAC SHA1 implementation.
+ * This functions takes several data chunk and computes the SHA1 HAMAC.
*
* @param key
* The MAC key.
@@ -90,15 +98,14 @@
* @param mac_length
* Point to an integer that receives the length of the computed HMAC.
*/
-__EXPORT void hmac_sha1( uint8* key, int32 key_length,
- const uint8* data[], uint32 data_length[],
- uint8* mac, int32* mac_length );
+void hmac_sha1( uint8_t* key, int32_t key_length,
+ const uint8_t* data[], uint32_t data_length[],
+ uint8_t* mac, int32_t* mac_length );
/**
* Create and initialize a SHA1 HMAC context.
*
- * An application uses this context to hash several data into one SHA1
- * digest.
+ * An application uses this context to create several HMAC with the same key.
*
* @param key
* The MAC key.
@@ -106,12 +113,13 @@
* Lenght of the MAC key in bytes
* @return Returns a pointer to the initialized context
*/
-__EXPORT void* createSha1HmacContext(uint8_t* key, int32_t key_length);
+void* createSha1HmacContext(uint8_t* key, int32_t key_length);
/**
* Compute SHA1 HMAC.
*
- * This functions takes one data chunk and computes its SHA1 HMAC.
+ * This functions takes one data chunk and computes its SHA1 HMAC. On return
+ * the SHA1 MAC context is ready to compute a HMAC for another data chunk.
*
* @param ctx
* Pointer to initialized SHA1 HMAC context
@@ -125,14 +133,14 @@
* @param mac_length
* Point to an integer that receives the length of the computed HMAC.
*/
-
-__EXPORT void hmacSha1Ctx(void* ctx, const uint8_t* data, uint32_t data_length,
+void hmacSha1Ctx(void* ctx, const uint8_t* data, uint32_t data_length,
uint8_t* mac, int32_t* mac_length );
/**
* Compute SHA1 HMAC over several data cunks.
*
- * This functions takes several data chunk and computes the SHA1 HAMAC.
+ * This functions takes several data chunks and computes the SHA1 HAMAC. On return
+ * the SHA1 MAC context is ready to compute a HMAC for another data chunk.
*
* @param ctx
* Pointer to initialized SHA1 HMAC context
@@ -147,7 +155,7 @@
* @param mac_length
* Point to an integer that receives the length of the computed HMAC.
*/
-__EXPORT void hmacSha1Ctx(void* ctx, const uint8_t* data[], uint32_t data_length[],
+void hmacSha1Ctx(void* ctx, const uint8_t* data[], uint32_t data_length[],
uint8_t* mac, int32_t* mac_length );
/**
@@ -157,4 +165,8 @@
*/
void freeSha1HmacContext(void* ctx);
+
+/**
+ * @}
+ */
#endif
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.cpp b/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.cpp
index 1f74739..ba4c260 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.cpp
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.cpp
@@ -15,7 +15,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <ccrtp/crypto/macSkein.h>
+#include <crypto/macSkein.h>
#include <stdlib.h>
void macSkein(uint8_t* key, int32_t key_length,
@@ -23,9 +23,9 @@
uint8_t* mac, int32_t mac_length, SkeinSize_t skeinSize)
{
SkeinCtx_t ctx;
-
+
skeinCtxPrepare(&ctx, skeinSize);
-
+
skeinMacInit(&ctx, key, key_length, mac_length);
skeinUpdate(&ctx, data, data_length);
skeinFinal(&ctx, mac);
@@ -36,7 +36,7 @@
uint8_t* mac, int32_t mac_length, SkeinSize_t skeinSize)
{
SkeinCtx_t ctx;
-
+
skeinCtxPrepare(&ctx, skeinSize);
skeinMacInit(&ctx, key, key_length, mac_length);
@@ -62,7 +62,7 @@
uint8_t* mac)
{
SkeinCtx_t* pctx = (SkeinCtx_t*)ctx;
-
+
skeinUpdate(pctx, data, data_length);
skeinFinal(pctx, mac);
skeinReset(pctx);
@@ -72,7 +72,7 @@
uint8_t* mac)
{
SkeinCtx_t* pctx = (SkeinCtx_t*)ctx;
-
+
while (*data) {
skeinUpdate(pctx, *data, *data_length);
data++;
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.h b/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.h
index 013d8fc..71c2ad9 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/macSkein.h
@@ -19,7 +19,7 @@
#ifndef MAC_SKEIN_H
#define MAC_SKEIN_H
-#include <ccrtp/crypto/skeinApi.h>
+#include <crypto/skeinApi.h>
/**
* @file macSkein.h
* @brief Function that provide Skein MAC support
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/AesSrtp.cxx b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/AesSrtp.cxx
deleted file mode 100644
index eb669f8..0000000
--- a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/AesSrtp.cxx
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- * In addition, as a special exception, the copyright holders give
- * permission to link the code of portions of this program with the
- * OpenSSL library under certain conditions as described in each
- * individual source file, and distribute linked combinations
- * including the two.
- * You must obey the GNU General Public License in all respects
- * for all of the code used other than OpenSSL. If you modify
- * file(s) with this exception, you may extend this exception to your
- * version of the file(s), but you are not obligated to do so. If you
- * do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source
- * files in the program, then also delete it here.
- */
-
-/**
- * @author Erik Eliasson <eliasson@it.kth.se>
- * @author Johan Bilien <jobi@via.ecp.fr>
- * @author Werner Dittmann <Werner.Dittmann@t-online.de>
- */
-
-extern void initializeOpenSSL();
-
-#include <stdlib.h>
-#include <openssl/aes.h> // the include of openSSL
-#include <ccrtp/crypto/AesSrtp.h>
-#include <string.h>
-#include <stdio.h>
-
-AesSrtp::AesSrtp(int algo):key(NULL), algorithm(algo) {
- void initializeOpenSSL();
-}
-
-AesSrtp::AesSrtp( uint8* k, int32 keyLength, int algo ):
- key(NULL), algorithm(algo) {
-
- void initializeOpenSSL();
- setNewKey(k, keyLength);
-}
-
-AesSrtp::~AesSrtp() {
- if (key != NULL)
- delete[] (uint8*)key;
-}
-
-bool AesSrtp::setNewKey(const uint8* k, int32 keyLength) {
- // release an existing key before setting a new one
- if (key != NULL)
- delete[] (uint8*)key;
-
- if (!(keyLength == 16 || keyLength == 32)) {
- return false;
- }
- key = new uint8[sizeof( AES_KEY )];
- memset(key, 0, sizeof(AES_KEY) );
- AES_set_encrypt_key(k, keyLength*8, (AES_KEY *)key );
- return true;
-}
-
-
-void AesSrtp::encrypt( const uint8* input, uint8* output ){
- AES_encrypt(input, output, (AES_KEY *)key);
-}
-
-void AesSrtp::get_ctr_cipher_stream( uint8* output, uint32 length,
- uint8* iv ){
- uint16 ctr;
- uint16 input;
-
- unsigned char aes_input[SRTP_BLOCK_SIZE];
- unsigned char temp[SRTP_BLOCK_SIZE];
-
- memcpy(aes_input, iv, 14 );
- iv += 14;
-
- for( ctr = 0; ctr < length/SRTP_BLOCK_SIZE; ctr++ ){
- input = ctr;
- //compute the cipher stream
- aes_input[14] = (uint8)((input & 0xFF00) >> 8);
- aes_input[15] = (uint8)((input & 0x00FF));
-
- AES_encrypt(aes_input, &output[ctr*SRTP_BLOCK_SIZE], (AES_KEY *)key );
- }
- if ((length % SRTP_BLOCK_SIZE) > 0) {
- // Treat the last bytes:
- input = ctr;
- aes_input[14] = (uint8)((input & 0xFF00) >> 8);
- aes_input[15] = (uint8)((input & 0x00FF));
-
- AES_encrypt(aes_input, temp, (AES_KEY *)key );
- memcpy( &output[ctr*SRTP_BLOCK_SIZE], temp, length % SRTP_BLOCK_SIZE );
- }
-}
-
-
-void AesSrtp::ctr_encrypt( const uint8* input, uint32 input_length,
- uint8* output, uint8* iv ) {
-
- if (key == NULL)
- return;
-
- uint8* cipher_stream = new uint8[input_length];
-
- get_ctr_cipher_stream( cipher_stream, input_length, iv );
-
- for( unsigned int i = 0; i < input_length; i++ ){
- output[i] = cipher_stream[i] ^ input[i];
- }
- delete []cipher_stream;
-}
-
-void AesSrtp::ctr_encrypt( uint8* data, uint32 data_length, uint8* iv ) {
-
- if (key == NULL)
- return;
-
- //unsigned char cipher_stream[data_length];
- uint8* cipher_stream = new uint8[data_length];
-
- get_ctr_cipher_stream( cipher_stream, data_length, iv );
-
- for( uint32 i = 0; i < data_length; i++ ){
- data[i] ^= cipher_stream[i];
- }
- delete[] cipher_stream;
-}
-
-void AesSrtp::f8_encrypt(const uint8* data, uint32 data_length,
- uint8* iv, uint8* origKey, int32 keyLen,
- uint8* salt, int32 saltLen, AesSrtp* f8Cipher ) {
-
- f8_encrypt(data, data_length, const_cast<uint8*>(data), iv, origKey, keyLen, salt, saltLen, f8Cipher);
-}
-
-#define MAX_KEYLEN 32
-
-void AesSrtp::f8_encrypt(const uint8* in, uint32 in_length, uint8* out,
- uint8* iv, uint8* origKey, int32 keyLen,
- uint8* salt, int32 saltLen, AesSrtp* f8Cipher ) {
-
-
- unsigned char *cp_in, *cp_in1, *cp_out;
- int i;
- int offset = 0;
-
- unsigned char ivAccent[SRTP_BLOCK_SIZE];
- unsigned char maskedKey[MAX_KEYLEN];
- unsigned char saltMask[MAX_KEYLEN];
- unsigned char S[SRTP_BLOCK_SIZE];
-
- F8_CIPHER_CTX f8ctx;
-
- if (key == NULL)
- return;
-
- if (keyLen > MAX_KEYLEN)
- return;
-
- if (saltLen > keyLen)
- return;
-
- /*
- * Get memory for the derived IV (IV')
- */
- f8ctx.ivAccent = ivAccent;
-
- /*
- * First copy the salt into the mask field, then fill with 0x55 to
- * get a full key.
- */
- memcpy(saltMask, salt, saltLen);
- memset(saltMask+saltLen, 0x55, keyLen-saltLen);
-
- /*
- * XOR the original key with the above created mask to
- * get the special key.
- */
- cp_out = maskedKey;
- cp_in = origKey;
- cp_in1 = saltMask;
- for (i = 0; i < keyLen; i++) {
- *cp_out++ = *cp_in++ ^ *cp_in1++;
- }
- /*
- * Prepare the a new AES cipher with the special key to compute IV'
- */
- f8Cipher->setNewKey(maskedKey, keyLen);
-
- /*
- * Use the masked key to encrypt the original IV to produce IV'.
- *
- * After computing the IV' we don't need this cipher context anymore, free it.
- */
- f8Cipher->encrypt(iv, f8ctx.ivAccent);
-
- f8ctx.J = 0; // initialize the counter
- f8ctx.S = S; // get the key stream buffer
-
- memset(f8ctx.S, 0, SRTP_BLOCK_SIZE); // initial value for key stream
-
- while (in_length >= SRTP_BLOCK_SIZE) {
- processBlock(&f8ctx, in+offset, SRTP_BLOCK_SIZE, out+offset);
- in_length -= SRTP_BLOCK_SIZE;
- offset += SRTP_BLOCK_SIZE;
- }
- if (in_length > 0) {
- processBlock(&f8ctx, in+offset, in_length, out+offset);
- }
-}
-
-int AesSrtp::processBlock(F8_CIPHER_CTX *f8ctx, const uint8* in, int32 length, uint8* out) {
-
- int i;
- const uint8 *cp_in;
- uint8* cp_in1, *cp_out;
- uint32_t *ui32p;
-
- /*
- * XOR the previous key stream with IV'
- * ( S(-1) xor IV' )
- */
- cp_in = f8ctx->ivAccent;
- cp_out = f8ctx->S;
- for (i = 0; i < SRTP_BLOCK_SIZE; i++) {
- *cp_out++ ^= *cp_in++;
- }
- /*
- * Now XOR (S(n-1) xor IV') with the current counter, then increment the counter
- */
- ui32p = (uint32_t *)f8ctx->S;
- ui32p[3] ^= htonl(f8ctx->J);
- f8ctx->J++;
- /*
- * Now compute the new key stream using AES encrypt
- */
- AES_encrypt(f8ctx->S, f8ctx->S, (AES_KEY *)key);
- /*
- * as the last step XOR the plain text with the key stream to produce
- * the ciphertext.
- */
- cp_out = out;
- cp_in = in;
- cp_in1 = f8ctx->S;
- for (i = 0; i < length; i++) {
- *cp_out++ = *cp_in++ ^ *cp_in1++;
- }
- return length;
-}
-
-
-/** EMACS **
- * Local variables:
- * mode: c++
- * c-default-style: ellemtel
- * c-basic-offset: 4
- * End:
- */
-
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/InitializeOpenSSL.cxx b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/InitializeOpenSSL.cxx
deleted file mode 100755
index f0b3258..0000000
--- a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/InitializeOpenSSL.cxx
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- Copyright (C) 2006 Werner Dittmann
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Boston, MA 02111.
-*/
-
-#include <stdio.h>
-#include <openssl/evp.h>
-
-#include <private.h>
-
-#ifdef OPENSSL_SYS_WIN32
-#include <windows.h>
-#endif
-#if defined SOLARIS && !defined HAVE_PTHREAD_H
-#include <synch.h>
-#include <thread.h>
-#endif
-#if defined HAVE_PTHREAD_H && !defined SOLARIS
-#include <pthread.h>
-#endif
-
-static void threadLockSetup(void);
-static void threadLockCleanup(void);
-static void myLockingCallback(int, int, const char *, int);
-
-/**
- * Implement the locking callback functions for openSSL.
- *
- * Unfortunatly we can't use the Commonc++ Mutex here because the
- * Mutex may use (for some cases) the Commonc++ Thread class. OpenSSL
- * does not use this Thread class.
- */
-
-static int initialized = 0;
-
-int initializeOpenSSL ()
-{
-
- if (initialized) {
- return 1;
- }
- initialized = 1;
- threadLockSetup();
- return 1;
-}
-
-int finalizeOpenSSL ()
-{
- if(!initialized)
- return 1;
-
- initialized = 0;
- threadLockCleanup();
- return 1;
-}
-
-#ifdef OPENSSL_SYS_WIN32
-
-static HANDLE *lock_cs;
-
-static void threadLockSetup(void) {
- int i;
-
- lock_cs=OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE));
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- lock_cs[i] = CreateMutex(NULL,FALSE,NULL);
- }
-
- CRYPTO_set_locking_callback((void (*)(int,int,const char *,int))myLockingCallback);
- /* id callback defined */
-}
-
-static void threadLockCleanup(void) {
- int i;
-
- CRYPTO_set_locking_callback(NULL);
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- CloseHandle(lock_cs[i]);
- }
- OPENSSL_free(lock_cs);
-}
-
-static void myLockingCallback(int mode, int type, const char *file, int line) {
- if (mode & CRYPTO_LOCK) {
- WaitForSingleObject(lock_cs[type], INFINITE);
- }
- else {
- ReleaseMutex(lock_cs[type]);
- }
-}
-
-#endif /* OPENSSL_SYS_WIN32 */
-
-
-#if defined SOLARIS && !defined HAVE_PTHREAD_H
-
-static mutex_t *lock_cs;
-static long *lock_count;
-
-static void threadLockSetup(void) {
- int i;
-
- lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(mutex_t));
- lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- lock_count[i] = 0;
- /* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */
- mutex_init(&(lock_cs[i]), USYNC_THREAD, NULL);
- }
- CRYPTO_set_locking_callback((void (*)(int, int ,const char *, int))myLockingCallback);
-}
-
-static void threadLockCleanup(void) {
- int i;
-
- CRYPTO_set_locking_callback(NULL);
-
- fprintf(stderr,"cleanup\n");
-
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- /* rwlock_destroy(&(lock_cs[i])); */
- mutex_destroy(&(lock_cs[i]));
- fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
- }
- OPENSSL_free(lock_cs);
- OPENSSL_free(lock_count);
-}
-
-static void myLockingCallback(int mode, int type, const char *file, int line)
-{
-#ifdef undef
- fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
- CRYPTO_thread_id(),
- (mode&CRYPTO_LOCK)?"l":"u",
- (type&CRYPTO_READ)?"r":"w",file,line);
-#endif
-
- /*
- if (CRYPTO_LOCK_SSL_CERT == type)
- fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
- CRYPTO_thread_id(),
- mode,file,line);
- */
- if (mode & CRYPTO_LOCK) {
- mutex_lock(&(lock_cs[type]));
- lock_count[type]++;
- }
- else {
- mutex_unlock(&(lock_cs[type]));
- }
-}
-
-static unsigned long solaris_thread_id(void) {
- unsigned long ret;
-
- ret=(unsigned long)thr_self();
- return(ret);
-}
-#endif /* SOLARIS */
-
-
-#if defined HAVE_PTHREAD_H && !defined SOLARIS
-
-static pthread_mutex_t* lock_cs;
-static long* lock_count;
-
-static void threadLockSetup(void) {
- int i;
-
- lock_cs = (pthread_mutex_t*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
- lock_count = (long*)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long));
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- lock_count[i] = 0;
- pthread_mutex_init(&(lock_cs[i]),NULL);
- }
-
- // CRYPTO_set_id_callback((unsigned long (*)())pthreads_thread_id);
- CRYPTO_set_locking_callback((void (*)(int, int ,const char *, int))myLockingCallback);
-}
-
-static void threadLockCleanup(void)
-{
- int i;
-
- CRYPTO_set_locking_callback(NULL);
- fprintf(stderr,"cleanup\n");
- for (i = 0; i < CRYPTO_num_locks(); i++) {
- pthread_mutex_destroy(&(lock_cs[i]));
- fprintf(stderr,"%8ld:%s\n",lock_count[i],
- CRYPTO_get_lock_name(i));
- }
- OPENSSL_free(lock_cs);
- OPENSSL_free(lock_count);
-}
-
-static void myLockingCallback(int mode, int type, const char *file,
- int line) {
-#ifdef undef
- fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
- CRYPTO_thread_id(),
- (mode&CRYPTO_LOCK)?"l":"u",
- (type&CRYPTO_READ)?"r":"w",file,line);
-#endif
- if (mode & CRYPTO_LOCK) {
- pthread_mutex_lock(&(lock_cs[type]));
- lock_count[type]++;
- }
- else {
- pthread_mutex_unlock(&(lock_cs[type]));
- }
-}
-
-/*
-static unsigned long pthreads_thread_id(void)
-{
- unsigned long ret;
-
- ret = (unsigned long)pthread_self();
- return(ret);
-}
-*/
-
-#endif /* LIBPTHREAD && !SOLARIS */
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/SrtpSymCrypto.cpp b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/SrtpSymCrypto.cpp
new file mode 100644
index 0000000..569e540
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/SrtpSymCrypto.cpp
@@ -0,0 +1,331 @@
+/*
+ Copyright (C) 2005, 2004, 2012 Erik Eliasson, Johan Bilien, Werner Dittmann
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+/**
+ * @author Erik Eliasson <eliasson@it.kth.se>
+ * @author Johan Bilien <jobi@via.ecp.fr>
+ * @author Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+
+#define MAKE_F8_TEST
+
+#include <stdlib.h>
+#include <openssl/aes.h> // the include of openSSL
+#include <crypto/SrtpSymCrypto.h>
+#include <crypto/twofish.h>
+#include <string.h>
+#include <stdio.h>
+
+#if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
+#include <windows.h>
+#else
+#include <arpa/inet.h>
+#endif
+
+SrtpSymCrypto::SrtpSymCrypto(int algo):key(NULL), algorithm(algo) {
+}
+
+SrtpSymCrypto::SrtpSymCrypto( uint8_t* k, int32_t keyLength, int algo ):
+ key(NULL), algorithm(algo) {
+
+ setNewKey(k, keyLength);
+}
+
+SrtpSymCrypto::~SrtpSymCrypto() {
+ if (key != NULL) {
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
+ memset(key, 0, sizeof(AES_KEY) );
+ }
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
+ memset(key, 0, sizeof(Twofish_key));
+ }
+ delete[] (uint8_t*)key;
+ key = NULL;
+ }
+}
+
+static int twoFishInit = 0;
+
+bool SrtpSymCrypto::setNewKey(const uint8_t* k, int32_t keyLength) {
+ // release an existing key before setting a new one
+ if (key != NULL)
+ delete[] (uint8_t*)key;
+
+ if (!(keyLength == 16 || keyLength == 32)) {
+ return false;
+ }
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
+ key = new uint8_t[sizeof(AES_KEY)];
+ memset(key, 0, sizeof(AES_KEY) );
+ AES_set_encrypt_key(k, keyLength*8, (AES_KEY *)key);
+ }
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
+ if (!twoFishInit) {
+ Twofish_initialise();
+ twoFishInit = 1;
+ }
+ key = new uint8_t[sizeof(Twofish_key)];
+ memset(key, 0, sizeof(Twofish_key));
+ Twofish_prepare_key((Twofish_Byte*)k, keyLength, (Twofish_key*)key);
+ }
+ else
+ return false;
+
+ return true;
+}
+
+
+void SrtpSymCrypto::encrypt(const uint8_t* input, uint8_t* output ) {
+ if (algorithm == SrtpEncryptionAESCM || algorithm == SrtpEncryptionAESF8) {
+ AES_encrypt(input, output, (AES_KEY *)key);
+ }
+ else if (algorithm == SrtpEncryptionTWOCM || algorithm == SrtpEncryptionTWOF8) {
+ Twofish_encrypt((Twofish_key*)key, (Twofish_Byte*)input,
+ (Twofish_Byte*)output);
+ }
+}
+
+void SrtpSymCrypto::get_ctr_cipher_stream(uint8_t* output, uint32_t length,
+ uint8_t* iv ) {
+ uint16_t ctr = 0;
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ for(ctr = 0; ctr < length/SRTP_BLOCK_SIZE; ctr++) {
+ //compute the cipher stream
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, &output[ctr*SRTP_BLOCK_SIZE]);
+ }
+ if ((length % SRTP_BLOCK_SIZE) > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ memcpy(&output[ctr*SRTP_BLOCK_SIZE], temp, length % SRTP_BLOCK_SIZE );
+ }
+}
+
+void SrtpSymCrypto::ctr_encrypt(const uint8_t* input, uint32_t input_length,
+ uint8_t* output, uint8_t* iv ) {
+
+ if (key == NULL)
+ return;
+
+ uint16_t ctr = 0;
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ int l = input_length/SRTP_BLOCK_SIZE;
+ for (ctr = 0; ctr < l; ctr++ ) {
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
+ *output++ = temp[i] ^ *input++;
+ }
+
+ }
+ l = input_length % SRTP_BLOCK_SIZE;
+ if (l > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < l; i++ ) {
+ *output++ = temp[i] ^ *input++;
+ }
+ }
+}
+
+void SrtpSymCrypto::ctr_encrypt( uint8_t* data, uint32_t data_length, uint8_t* iv ) {
+
+ if (key == NULL)
+ return;
+
+ uint16_t ctr = 0;
+ unsigned char temp[SRTP_BLOCK_SIZE];
+
+ int l = data_length/SRTP_BLOCK_SIZE;
+ for (ctr = 0; ctr < l; ctr++ ) {
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < SRTP_BLOCK_SIZE; i++ ) {
+ *data++ ^= temp[i];
+ }
+
+ }
+ l = data_length % SRTP_BLOCK_SIZE;
+ if (l > 0) {
+ // Treat the last bytes:
+ iv[14] = (uint8_t)((ctr & 0xFF00) >> 8);
+ iv[15] = (uint8_t)((ctr & 0x00FF));
+
+ encrypt(iv, temp);
+ for (int i = 0; i < l; i++ ) {
+ *data++ ^= temp[i];
+ }
+ }
+}
+
+void SrtpSymCrypto::f8_encrypt(const uint8_t* data, uint32_t data_length,
+ uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
+
+ f8_encrypt(data, data_length, const_cast<uint8_t*>(data), iv, f8Cipher);
+}
+
+#define MAX_KEYLEN 32
+
+void SrtpSymCrypto::f8_deriveForIV(SrtpSymCrypto* f8Cipher, uint8_t* key, int32_t keyLen,
+ uint8_t* salt, int32_t saltLen) {
+
+ unsigned char *cp_in, *cp_in1, *cp_out;
+
+ unsigned char maskedKey[MAX_KEYLEN];
+ unsigned char saltMask[MAX_KEYLEN];
+
+ if (keyLen > MAX_KEYLEN)
+ return;
+
+ if (saltLen > keyLen)
+ return;
+ /*
+ * First copy the salt into the mask field, then fill with 0x55 to
+ * get a full key.
+ */
+ memcpy(saltMask, salt, saltLen);
+ memset(saltMask+saltLen, 0x55, keyLen-saltLen);
+
+ /*
+ * XOR the original key with the above created mask to
+ * get the special key.
+ */
+ cp_out = maskedKey;
+ cp_in = key;
+ cp_in1 = saltMask;
+ for (int i = 0; i < keyLen; i++) {
+ *cp_out++ = *cp_in++ ^ *cp_in1++;
+ }
+ /*
+ * Prepare the a new AES cipher with the special key to compute IV'
+ */
+ f8Cipher->setNewKey(maskedKey, keyLen);
+}
+
+void SrtpSymCrypto::f8_encrypt(const uint8_t* in, uint32_t in_length, uint8_t* out,
+ uint8_t* iv, SrtpSymCrypto* f8Cipher ) {
+
+
+ int offset = 0;
+
+ unsigned char ivAccent[SRTP_BLOCK_SIZE];
+ unsigned char S[SRTP_BLOCK_SIZE];
+
+ F8_CIPHER_CTX f8ctx;
+
+ if (key == NULL)
+ return;
+ /*
+ * Get memory for the derived IV (IV')
+ */
+ f8ctx.ivAccent = ivAccent;
+ /*
+ * Use the derived IV encryption setup to encrypt the original IV to produce IV'.
+ */
+ f8Cipher->encrypt(iv, f8ctx.ivAccent);
+
+ f8ctx.J = 0; // initialize the counter
+ f8ctx.S = S; // get the key stream buffer
+
+ memset(f8ctx.S, 0, SRTP_BLOCK_SIZE); // initial value for key stream
+
+ while (in_length >= SRTP_BLOCK_SIZE) {
+ processBlock(&f8ctx, in+offset, SRTP_BLOCK_SIZE, out+offset);
+ in_length -= SRTP_BLOCK_SIZE;
+ offset += SRTP_BLOCK_SIZE;
+ }
+ if (in_length > 0) {
+ processBlock(&f8ctx, in+offset, in_length, out+offset);
+ }
+}
+
+int SrtpSymCrypto::processBlock(F8_CIPHER_CTX *f8ctx, const uint8_t* in, int32_t length, uint8_t* out) {
+
+ int i;
+ const uint8_t *cp_in;
+ uint8_t* cp_in1, *cp_out;
+ uint32_t *ui32p;
+
+ /*
+ * XOR the previous key stream with IV'
+ * ( S(-1) xor IV' )
+ */
+ cp_in = f8ctx->ivAccent;
+ cp_out = f8ctx->S;
+ for (i = 0; i < SRTP_BLOCK_SIZE; i++) {
+ *cp_out++ ^= *cp_in++;
+ }
+ /*
+ * Now XOR (S(n-1) xor IV') with the current counter, then increment the counter
+ */
+ ui32p = (uint32_t *)f8ctx->S;
+ ui32p[3] ^= htonl(f8ctx->J);
+ f8ctx->J++;
+ /*
+ * Now compute the new key stream using AES encrypt
+ */
+ encrypt(f8ctx->S, f8ctx->S);
+ /*
+ * as the last step XOR the plain text with the key stream to produce
+ * the ciphertext.
+ */
+ cp_out = out;
+ cp_in = in;
+ cp_in1 = f8ctx->S;
+ for (i = 0; i < length; i++) {
+ *cp_out++ = *cp_in++ ^ *cp_in1++;
+ }
+ return length;
+}
+
+
+/** EMACS **
+ * Local variables:
+ * mode: c++
+ * c-default-style: ellemtel
+ * c-basic-offset: 4
+ * End:
+ */
+
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/hmac.cpp b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/hmac.cpp
index 4edf375..88d33a1 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/openssl/hmac.cpp
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/openssl/hmac.cpp
@@ -37,7 +37,7 @@
#include <stdint.h>
#include <openssl/hmac.h>
-#include <ccrtp/crypto/hmac.h>
+#include <crypto/hmac.h>
void hmac_sha1(uint8_t * key, int32_t key_length,
const uint8_t* data, uint32_t data_length,
@@ -53,15 +53,15 @@
uint32_t data_chunck_length[],
uint8_t* mac, int32_t* mac_length ) {
HMAC_CTX ctx;
- HMAC_CTX_init( &ctx );
- HMAC_Init_ex( &ctx, key, key_length, EVP_sha1(), NULL );
- while ( *data_chunks ) {
- HMAC_Update( &ctx, *data_chunks, *data_chunck_length );
+ HMAC_CTX_init(&ctx);
+ HMAC_Init_ex(&ctx, key, key_length, EVP_sha1(), NULL);
+ while (*data_chunks) {
+ HMAC_Update(&ctx, *data_chunks, *data_chunck_length);
data_chunks ++;
data_chunck_length ++;
}
- HMAC_Final( &ctx, mac, reinterpret_cast<uint32_t*>(mac_length) );
- HMAC_CTX_cleanup( &ctx );
+ HMAC_Final(&ctx, mac, reinterpret_cast<uint32_t*>(mac_length));
+ HMAC_CTX_cleanup(&ctx);
}
void* createSha1HmacContext(uint8_t* key, int32_t key_length)
@@ -77,7 +77,7 @@
uint8_t* mac, int32_t* mac_length)
{
HMAC_CTX* pctx = (HMAC_CTX*)ctx;
-
+
HMAC_Init_ex(pctx, NULL, 0, NULL, NULL );
HMAC_Update(pctx, data, data_length );
HMAC_Final(pctx, mac, reinterpret_cast<uint32_t*>(mac_length) );
@@ -87,7 +87,7 @@
uint8_t* mac, int32_t* mac_length )
{
HMAC_CTX* pctx = (HMAC_CTX*)ctx;
-
+
HMAC_Init_ex(pctx, NULL, 0, NULL, NULL );
while (*data) {
HMAC_Update(pctx, *data, *data_length);
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skein.c b/jni/libccrtp/sources/src/ccrtp/crypto/skein.c
index 60efdcc..5935a2a 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skein.c
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skein.c
@@ -11,8 +11,8 @@
#define SKEIN_PORT_CODE /* instantiate any code in skein_port.h */
#include <string.h> /* get the memcpy/memset functions */
-#include <ccrtp/crypto/skein.h> /* get the Skein API definitions */
-#include <ccrtp/crypto/skein_iv.h> /* get precomputed IVs */
+#include <crypto/skein.h> /* get the Skein API definitions */
+#include <crypto/skein_iv.h> /* get precomputed IVs */
/*****************************************************************/
/* External function to process blkCnt (nonzero) full block(s) of data. */
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skein.h b/jni/libccrtp/sources/src/ccrtp/crypto/skein.h
index 5634cb0..345a112 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skein.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skein.h
@@ -33,7 +33,7 @@
#endif
#include <stddef.h> /* get size_t definition */
-#include <ccrtp/crypto/skein_port.h> /* get platform-specific definitions */
+#include <crypto/skein_port.h> /* get platform-specific definitions */
enum
{
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.c b/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.c
index b669146..84f0120 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.c
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.c
@@ -25,7 +25,7 @@
*/
#define SKEIN_ERR_CHECK 1
-#include <ccrtp/crypto/skeinApi.h>
+#include <crypto/skeinApi.h>
#include <string.h>
#include <stdio.h>
@@ -53,7 +53,7 @@
* The beauty of C :-) .
*/
X = ctx->m.s256.X;
- Xlen = ctx->skeinSize/8;
+ Xlen = (size_t)(ctx->skeinSize/8);
/*
* If size is the same and hash bit length is zero then reuse
* the save chaining variables.
@@ -91,7 +91,7 @@
Skein_Assert(ctx, SKEIN_FAIL);
X = ctx->m.s256.X;
- Xlen = ctx->skeinSize/8;
+ Xlen = (size_t)(ctx->skeinSize/8);
Skein_Assert(hashBitLen, SKEIN_BAD_HASHLEN);
@@ -132,7 +132,7 @@
* The beautiy of C :-) .
*/
X = ctx->m.s256.X;
- Xlen = ctx->skeinSize/8;
+ Xlen = (size_t)(ctx->skeinSize/8);
/*
* If size is the same and hash bit length is zero then reuse
* the save chaining variables.
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.h b/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.h
index cd07632..2f25073 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skeinApi.h
@@ -78,8 +78,20 @@
*
*/
-#include <ccrtp/crypto/skein.h>
+#include <crypto/skein.h>
+
+#ifdef _MSC_VER
+typedef signed __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef signed __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef signed __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef signed __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
#include <stdint.h>
+#endif
#ifdef __cplusplus
extern "C"
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skein_block.c b/jni/libccrtp/sources/src/ccrtp/crypto/skein_block.c
index 759d000..fbf37e7 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skein_block.c
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skein_block.c
@@ -15,7 +15,7 @@
************************************************************************/
#include <string.h>
-#include <ccrtp/crypto/skein.h>
+#include <crypto/skein.h>
#ifndef SKEIN_USE_ASM
#define SKEIN_USE_ASM (0) /* default is all C code (no ASM) */
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skein_iv.h b/jni/libccrtp/sources/src/ccrtp/crypto/skein_iv.h
index 4a02b39..0c62fac 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skein_iv.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skein_iv.h
@@ -1,7 +1,7 @@
#ifndef _SKEIN_IV_H_
#define _SKEIN_IV_H_
-#include <ccrtp/crypto/skein.h> /* get Skein macros and types */
+#include <crypto/skein.h> /* get Skein macros and types */
/*
***************** Pre-computed Skein IVs *******************
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/skein_port.h b/jni/libccrtp/sources/src/ccrtp/crypto/skein_port.h
index e62069e..256e9d5 100644
--- a/jni/libccrtp/sources/src/ccrtp/crypto/skein_port.h
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/skein_port.h
@@ -15,9 +15,12 @@
**
********************************************************************/
-#include <ccrtp/crypto/brg_types.h> /* get integer type definitions */
+#include <crypto/brg_types.h> /* get integer type definitions */
+/*r3gis3r : android already has that defined in types */
+#ifndef ANDROID
typedef unsigned int uint_t; /* native unsigned integer */
+#endif
typedef uint_8t u08b_t; /* 8-bit unsigned integer */
typedef uint_64t u64b_t; /* 64-bit unsigned integer */
@@ -46,7 +49,7 @@
*/
#ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */
-#include <ccrtp/crypto/brg_endian.h> /* get endianness selection */
+#include <crypto/brg_endian.h> /* get endianness selection */
#if PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN
/* here for big-endian CPUs */
#define SKEIN_NEED_SWAP (1)
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/twofish.c b/jni/libccrtp/sources/src/ccrtp/crypto/twofish.c
new file mode 100644
index 0000000..3d390ea
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/twofish.c
@@ -0,0 +1,1733 @@
+/*
+ * Fast, portable, and easy-to-use Twofish implementation,
+ * Version 0.3.
+ * Copyright (c) 2002 by Niels Ferguson.
+ * (See further down for the almost-unrestricted licensing terms.)
+ *
+ * --------------------------------------------------------------------------
+ * There are two files for this implementation:
+ * - twofish.h, the header file.
+ * - twofish.c, the code file.
+ *
+ * To incorporate this code into your program you should:
+ * - Check the licensing terms further down in this comment.
+ * - Fix the two type definitions in twofish.h to suit your platform.
+ * - Fix a few definitions in twofish.c in the section marked
+ * PLATFORM FIXES. There is one important ones that affects
+ * functionality, and then a few definitions that you can optimise
+ * for efficiency but those have no effect on the functionality.
+ * Don't change anything else.
+ * - Put the code in your project and compile it.
+ *
+ * To use this library you should:
+ * - Call Twofish_initialise() in your program before any other function in
+ * this library.
+ * - Use Twofish_prepare_key(...) to convert a key to internal form.
+ * - Use Twofish_encrypt(...) and Twofish_decrypt(...) to encrypt and decrypt
+ * data.
+ * See the comments in the header file for details on these functions.
+ * --------------------------------------------------------------------------
+ *
+ * There are many Twofish implementation available for free on the web.
+ * Most of them are hard to integrate into your own program.
+ * As we like people to use our cipher, I thought I would make it easier.
+ * Here is a free and easy-to-integrate Twofish implementation in C.
+ * The latest version is always available from my personal home page at
+ * http://niels.ferguson.net/
+ *
+ * Integrating library code into a project is difficult because the library
+ * header files interfere with the project's header files and code.
+ * And of course the project's header files interfere with the library code.
+ * I've tried to resolve these problems here.
+ * The header file of this implementation is very light-weight.
+ * It contains two typedefs, a structure, and a few function declarations.
+ * All names it defines start with "Twofish_".
+ * The header file is therefore unlikely to cause problems in your project.
+ * The code file of this implementation doesn't need to include the header
+ * files of the project. There is thus no danger of the project interfering
+ * with all the definitions and macros of the Twofish code.
+ * In most situations, all you need to do is fill in a few platform-specific
+ * definitions in the header file and code file,
+ * and you should be able to run the Twofish code in your project.
+ * I estimate it should take you less than an hour to integrate this code
+ * into your project, most of it spent reading the comments telling you what
+ * to do.
+ *
+ * For people using C++: it is very easy to wrap this library into a
+ * TwofishKey class. One of the big advantages is that you can automate the
+ * wiping of the key material in the destructor. I have not provided a C++
+ * class because the interface depends too much on the abstract base class
+ * you use for block ciphers in your program, which I don't know about.
+ *
+ * This implementation is designed for use on PC-class machines. It uses the
+ * Twofish 'full' keying option which uses large tables. Total table size is
+ * around 5-6 kB for static tables plus 4.5 kB for each pre-processed key.
+ * If you need an implementation that uses less memory,
+ * take a look at Brian Gladman's code on his web site:
+ * http://fp.gladman.plus.com/cryptography_technology/aes/
+ * He has code for all AES candidates.
+ * His Twofish code has lots of options trading off table size vs. speed.
+ * You can also take a look at the optimised code by Doug Whiting on the
+ * Twofish web site
+ * http://www.counterpane.com/twofish.html
+ * which has loads of options.
+ * I believe these existing implementations are harder to re-use because they
+ * are not clean libraries and they impose requirements on the environment.
+ * This implementation is very careful to minimise those,
+ * and should be easier to integrate into any larger program.
+ *
+ * The default mode of this implementation is fully portable as it uses no
+ * behaviour not defined in the C standard. (This is harder than you think.)
+ * If you have any problems porting the default mode, please let me know
+ * so that I can fix the problem. (But only if this code is at fault, I
+ * don't fix compilers.)
+ * Most of the platform fixes are related to non-portable but faster ways
+ * of implementing certain functions.
+ *
+ * In general I've tried to make the code as fast as possible, at the expense
+ * of memory and code size. However, C does impose limits, and this
+ * implementation will be slower than an optimised assembler implementation.
+ * But beware of assembler implementations: a good Pentium implementation
+ * uses completely different code than a good Pentium II implementation.
+ * You basically have to re-write the assembly code for every generation of
+ * processor. Unless you are severely pressed for speed, stick with C.
+ *
+ * The initialisation routine of this implementation contains a self-test.
+ * If initialisation succeeds without calling the fatal routine, then
+ * the implementation works. I don't think you can break the implementation
+ * in such a way that it still passes the tests, unless you are malicious.
+ * In other words: if the initialisation routine returns,
+ * you have successfully ported the implementation.
+ * (Or not implemented the fatal routine properly, but that is your problem.)
+ *
+ * I'm indebted to many people who helped me in one way or another to write
+ * this code. During the design of Twofish and the AES process I had very
+ * extensive discussions of all implementation issues with various people.
+ * Doug Whiting in particular provided a wealth of information. The Twofish
+ * team spent untold hours discussion various cipher features, and their
+ * implementation. Brian Gladman implemented all AES candidates in C,
+ * and we had some fruitful discussions on how to implement Twofish in C.
+ * Jan Nieuwenhuizen tested this code on Linux using GCC.
+ *
+ * Now for the license:
+ * The author hereby grants a perpetual license to everybody to
+ * use this code for any purpose as long as the copyright message is included
+ * in the source code of this or any derived work.
+ *
+ * Yes, this means that you, your company, your club, and anyone else
+ * can use this code anywhere you want. You can change it and distribute it
+ * under the GPL, include it in your commercial product without releasing
+ * the source code, put it on the web, etc.
+ * The only thing you cannot do is remove my copyright message,
+ * or distribute any source code based on this implementation that does not
+ * include my copyright message.
+ *
+ * I appreciate a mention in the documentation or credits,
+ * but I understand if that is difficult to do.
+ * I also appreciate it if you tell me where and why you used my code.
+ *
+ * Please send any questions or comments to niels@ferguson.net
+ *
+ * Have Fun!
+ *
+ * Niels
+ */
+
+/*
+ * DISCLAIMER: As I'm giving away my work for free, I'm of course not going
+ * to accept any liability of any form. This code, or the Twofish cipher,
+ * might very well be flawed; you have been warned.
+ * This software is provided as-is, without any kind of warrenty or
+ * guarantee. And that is really all you can expect when you download
+ * code for free from the Internet.
+ *
+ * I think it is really sad that disclaimers like this seem to be necessary.
+ * If people only had a little bit more common sense, and didn't come
+ * whining like little children every time something happens....
+ */
+
+/*
+ * Version history:
+ * Version 0.0, 2002-08-30
+ * First written.
+ * Version 0.1, 2002-09-03
+ * Added disclaimer. Improved self-tests.
+ * Version 0.2, 2002-09-09
+ * Removed last non-portabilities. Default now works completely within
+ * the C standard. UInt32 can be larger than 32 bits without problems.
+ * Version 0.3, 2002-09-28
+ * Bugfix: use instead of to adhere to ANSI/ISO.
+ * Rename BIG_ENDIAN macro to CPU_IS_BIG_ENDIAN. The gcc library
+ * header already defines BIG_ENDIAN, even though it is not
+ * supposed to.
+ */
+
+
+/*
+ * Minimum set of include files.
+ * You should not need any application-specific include files for this code.
+ * In fact, adding you own header files could break one of the many macros or
+ * functions in this file. Be very careful.
+ * Standard include files will probably be ok.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+/* #include * for memset(), memcpy(), and memcmp() */
+#include "twofish.h"
+
+
+/*
+ * PLATFORM FIXES
+ * ==============
+ *
+ * Fix the type definitions in twofish.h first!
+ *
+ * The following definitions have to be fixed for each particular platform
+ * you work on. If you have a multi-platform program, you no doubt have
+ * portable definitions that you can substitute here without changing the
+ * rest of the code.
+ */
+
+
+/*
+ * Function called if something is fatally wrong with the implementation.
+ * This fatal function is called when a coding error is detected in the
+ * Twofish implementation, or when somebody passes an obviously erroneous
+ * parameter to this implementation. There is not much you can do when
+ * the code contains bugs, so we just stop.
+ *
+ * The argument is a string. Ideally the fatal function prints this string
+ * as an error message. Whatever else this function does, it should never
+ * return. A typical implementation would stop the program completely after
+ * printing the error message.
+ *
+ * This default implementation is not very useful,
+ * but does not assume anything about your environment.
+ * It will at least let you know something is wrong....
+ * I didn't want to include any libraries to print and error or so,
+ * as this makes the code much harder to integrate in a project.
+ *
+ * Note that the Twofish_fatal function may not return to the caller.
+ * Unfortunately this is not something the self-test can test for,
+ * so you have to make sure of this yourself.
+ *
+ * If you want to call an external function, be careful about including
+ * your own header files here. This code uses a lot of macros, and your
+ * header file could easily break it. Maybe the best solution is to use
+ * a separate extern statement for your fatal function.
+ */
+/* #define Twofish_fatal(pmsgx) { fprintf(stderr, pmsgx); exit(1); } */
+#define Twofish_fatal(pmsgx, code) { return(code); }
+
+
+/*
+ * The rest of the settings are not important for the functionality
+ * of this Twofish implementation. That is, their default settings
+ * work on all platforms. You can change them to improve the
+ * speed of the implementation on your platform. Erroneous settings
+ * will result in erroneous implementations, but the self-test should
+ * catch those.
+ */
+
+
+/*
+ * Macros to rotate a Twofish_UInt32 value left or right by the
+ * specified number of bits. This should be a 32-bit rotation,
+ * and not rotation of, say, 64-bit values.
+ *
+ * Every encryption or decryption operation uses 32 of these rotations,
+ * so it is a good idea to make these macros efficient.
+ *
+ * This fully portable definition has one piece of tricky stuff.
+ * The UInt32 might be larger than 32 bits, so we have to mask
+ * any higher bits off. The simplest way to do this is to 'and' the
+ * value first with 0xffffffff and then shift it right. An optimising
+ * compiler that has a 32-bit type can optimise this 'and' away.
+ *
+ * Unfortunately there is no portable way of writing the constant
+ * 0xffffffff. You don't know which suffix to use (U, or UL?)
+ * The UINT32_MASK definition uses a bit of trickery. Shift-left
+ * is only defined if the shift amount is strictly less than the size
+ * of the UInt32, so we can't use (1<<32). The answer it to take the value
+ * 2, cast it to a UInt32, shift it left 31 positions, and subtract one.
+ * Another example of how to make something very simple extremely difficult.
+ * I hate C.
+ *
+ * The rotation macros are straightforward.
+ * They are only applied to UInt32 values, which are _unsigned_
+ * so the >> operator must do a logical shift that brings in zeroes.
+ * On most platforms you will only need to optimise the ROL32 macro; the
+ * ROR32 macro is not inefficient on an optimising compiler as all rotation
+ * amounts in this code are known at compile time.
+ *
+ * On many platforms there is a faster solution.
+ * For example, MS compilers have the __rotl and __rotr functions
+ * that generate x86 rotation instructions.
+ */
+#define UINT32_MASK ( (((Twofish_UInt32)2)<<31) - 1 )
+
+#ifndef _MSC_VER
+#define ROL32(x,n) ( (x)<<(n) | ((x) & UINT32_MASK) >> (32-(n)) )
+#define ROR32(x,n) ( (x)>>(n) | ((x) & UINT32_MASK) << (32-(n)) )
+#else
+#define ROL32(x,n) (_lrotl((x), (n)))
+#define ROR32(x,n) (_lrotr((x), (n)))
+#endif
+
+/*
+ * Select data type for q-table entries.
+ *
+ * Larger entry types cost more memory (1.5 kB), and might be faster
+ * or slower depending on the CPU and compiler details.
+ *
+ * This choice only affects the static data size and the key setup speed.
+ * Functionality, expanded key size, or encryption speed are not affected.
+ * Define to 1 to get large q-table entries.
+ */
+#define LARGE_Q_TABLE 0 /* default = 0 */
+
+
+/*
+ * Method to select a single byte from a UInt32.
+ * WARNING: non-portable code if set; might not work on all platforms.
+ *
+ * Inside the inner loop of Twofish it is necessary to access the 4
+ * individual bytes of a UInt32. This can be done using either shifts
+ * and masks, or memory accesses.
+ *
+ * Set to 0 to use shift and mask operations for the byte selection.
+ * This is more ALU intensive. It is also fully portable.
+ *
+ * Set to 1 to use memory accesses. The UInt32 is stored in memory and
+ * the individual bytes are read from memory one at a time.
+ * This solution is more memory-intensive, and not fully portable.
+ * It might be faster on your platform, or not. If you use this option,
+ * make sure you set the CPU_IS_BIG_ENDIAN flag appropriately.
+ *
+ * This macro does not affect the conversion of the inputs and outputs
+ * of the cipher. See the CONVERT_USING_CASTS macro for that.
+ */
+#define SELECT_BYTE_FROM_UINT32_IN_MEMORY 0 /* default = 0 */
+
+
+/*
+ * Method used to read the input and write the output.
+ * WARNING: non-portable code if set; might not work on all platforms.
+ *
+ * Twofish operates on 32-bit words. The input to the cipher is
+ * a byte array, as is the output. The portable method of doing the
+ * conversion is a bunch of rotate and mask operations, but on many
+ * platforms it can be done faster using a cast.
+ * This only works if your CPU allows UInt32 accesses to arbitrary Byte
+ * addresses.
+ *
+ * Set to 0 to use the shift and mask operations. This is fully
+ * portable. .
+ *
+ * Set to 1 to use a cast. The Byte * is cast to a UInt32 *, and a
+ * UInt32 is read. If necessary (as indicated by the CPU_IS_BIG_ENDIAN
+ * macro) the byte order in the UInt32 is swapped. The reverse is done
+ * to write the output of the encryption/decryption. Make sure you set
+ * the CPU_IS_BIG_ENDIAN flag appropriately.
+ * This option does not work unless a UInt32 is exactly 32 bits.
+ *
+ * This macro only changes the reading/writing of the plaintext/ciphertext.
+ * See the SELECT_BYTE_FROM_UINT32_IN_MEMORY to affect the way in which
+ * a UInt32 is split into 4 bytes for the S-box selection.
+ */
+#define CONVERT_USING_CASTS 0 /* default = 0 */
+
+
+/*
+ * Endianness switch.
+ * Only relevant if SELECT_BYTE_FROM_UINT32_IN_MEMORY or
+ * CONVERT_USING_CASTS is set.
+ *
+ * Set to 1 on a big-endian machine, and to 0 on a little-endian machine.
+ * Twofish uses the little-endian convention (least significant byte first)
+ * and big-endian machines (using most significant byte first)
+ * have to do a few conversions.
+ *
+ * CAUTION: This code has never been tested on a big-endian machine,
+ * because I don't have access to one. Feedback appreciated.
+ */
+#define CPU_IS_BIG_ENDIAN 0
+
+
+/*
+ * Macro to reverse the order of the bytes in a UInt32.
+ * Used to convert to little-endian on big-endian machines.
+ * This macro is always tested, but only used in the encryption and
+ * decryption if CONVERT_USING_CASTS, and CPU_IS_BIG_ENDIAN
+ * are both set. In other words: this macro is only speed-critical if
+ * both these flags have been set.
+ *
+ * This default definition of SWAP works, but on many platforms there is a
+ * more efficient implementation.
+ */
+#define BSWAP(x) ((ROL32((x),8)&0x00ff00ff) | (ROR32((x),8) & 0xff00ff00))
+
+
+/*
+ * END OF PLATFORM FIXES
+ * =====================
+ *
+ * You should not have to touch the rest of this file.
+ */
+
+
+/*
+ * Convert the external type names to some that are easier to use inside
+ * this file. I didn't want to use the names Byte and UInt32 in the
+ * header file, because many programs already define them and using two
+ * conventions at once can be very difficult.
+ * Don't change these definitions! Change the originals
+ * in twofish.h instead.
+ */
+/* A Byte must be an unsigned integer, 8 bits long. */
+/* typedef Twofish_Byte Byte; */
+/* A UInt32 must be an unsigned integer at least 32 bits long. */
+/* typedef Twofish_UInt32 UInt32; */
+
+
+/*
+ * Define a macro ENDIAN_CONVERT.
+ *
+ * We define a macro ENDIAN_CONVERT that performs a BSWAP on big-endian
+ * machines, and is the identity function on little-endian machines.
+ * The code then uses this macro without considering the endianness.
+ */
+
+#if CPU_IS_BIG_ENDIAN
+#define ENDIAN_CONVERT(x) BSWAP(x)
+#else
+#define ENDIAN_CONVERT(x) (x)
+#endif
+
+
+/*
+ * Compute byte offset within a UInt32 stored in memory.
+ *
+ * This is only used when SELECT_BYTE_FROM_UINT32_IN_MEMORY is set.
+ *
+ * The input is the byte number 0..3, 0 for least significant.
+ * Note the use of sizeof() to support UInt32 types that are larger
+ * than 4 bytes.
+ */
+#if CPU_IS_BIG_ENDIAN
+#define BYTE_OFFSET( n ) (sizeof(Twofish_UInt32) - 1 - (n) )
+#else
+#define BYTE_OFFSET( n ) (n)
+#endif
+
+
+/*
+ * Macro to get Byte no. b from UInt32 value X.
+ * We use two different definition, depending on the settings.
+ */
+#if SELECT_BYTE_FROM_UINT32_IN_MEMORY
+ /* Pick the byte from the memory in which X is stored. */
+#define SELECT_BYTE( X, b ) (((Twofish_Byte *)(&(X)))[BYTE_OFFSET(b)])
+#else
+ /* Portable solution: Pick the byte directly from the X value. */
+#define SELECT_BYTE( X, b ) (((X) >> (8*(b))) & 0xff)
+#endif
+
+
+/* Some shorthands because we use byte selection in large formulae. */
+#define b0(X) SELECT_BYTE((X),0)
+#define b1(X) SELECT_BYTE((X),1)
+#define b2(X) SELECT_BYTE((X),2)
+#define b3(X) SELECT_BYTE((X),3)
+
+
+/*
+ * We need macros to load and store UInt32 from/to byte arrays
+ * using the least-significant-byte-first convention.
+ *
+ * GET32( p ) gets a UInt32 in lsb-first form from four bytes pointed to
+ * by p.
+ * PUT32( v, p ) writes the UInt32 value v at address p in lsb-first form.
+ */
+#if CONVERT_USING_CASTS
+
+ /* Get UInt32 from four bytes pointed to by p. */
+#define GET32( p ) ENDIAN_CONVERT( *((Twofish_UInt32 *)(p)) )
+ /* Put UInt32 into four bytes pointed to by p */
+#define PUT32( v, p ) *((Twofish_UInt32 *)(p)) = ENDIAN_CONVERT(v)
+
+#else
+
+ /* Get UInt32 from four bytes pointed to by p. */
+#define GET32( p ) \
+ ( \
+ (Twofish_UInt32)((p)[0]) \
+ | (Twofish_UInt32)((p)[1])<< 8 \
+ | (Twofish_UInt32)((p)[2])<<16 \
+ | (Twofish_UInt32)((p)[3])<<24 \
+ )
+ /* Put UInt32 into four bytes pointed to by p */
+#define PUT32( v, p ) \
+ (p)[0] = (Twofish_Byte)(((v) ) & 0xff); \
+ (p)[1] = (Twofish_Byte)(((v) >> 8) & 0xff); \
+ (p)[2] = (Twofish_Byte)(((v) >> 16) & 0xff); \
+ (p)[3] = (Twofish_Byte)(((v) >> 24) & 0xff)
+
+#endif
+
+
+/*
+ * Test the platform-specific macros.
+ * This function tests the macros defined so far to make sure the
+ * definitions are appropriate for this platform.
+ * If you make any mistake in the platform configuration, this should detect
+ * that and inform you what went wrong.
+ * Somewhere, someday, this is going to save somebody a lot of time,
+ * because misbehaving macros are hard to debug.
+ */
+static int test_platform()
+ {
+ /* Buffer with test values. */
+ Twofish_Byte buf[] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0};
+ Twofish_UInt32 C;
+ Twofish_UInt32 x,y;
+ int i;
+
+ /*
+ * Some sanity checks on the types that can't be done in compile time.
+ * A smart compiler will just optimise these tests away.
+ * The pre-processor doesn't understand different types, so we cannot
+ * do these checks in compile-time.
+ *
+ * I hate C.
+ *
+ * The first check in each case is to make sure the size is correct.
+ * The second check is to ensure that it is an unsigned type.
+ */
+ if( ((Twofish_UInt32)((Twofish_UInt32)1 << 31) == 0) || ((Twofish_UInt32)-1 < 0 ))
+ {
+ Twofish_fatal( "Twofish code: Twofish_UInt32 type not suitable", ERR_UINT32 );
+ }
+ if( (sizeof( Twofish_Byte ) != 1) || (((Twofish_Byte)-1) < 0) )
+ {
+ Twofish_fatal( "Twofish code: Twofish_Byte type not suitable", ERR_BYTE );
+ }
+
+ /*
+ * Sanity-check the endianness conversions.
+ * This is just an aid to find problems. If you do the endianness
+ * conversion macros wrong you will fail the full cipher test,
+ * but that does not help you find the error.
+ * Always make it easy to find the bugs!
+ *
+ * Detail: There is no fully portable way of writing UInt32 constants,
+ * as you don't know whether to use the U or UL suffix. Using only U you
+ * might only be allowed 16-bit constants. Using UL you might get 64-bit
+ * constants which cannot be stored in a UInt32 without warnings, and
+ * which generally behave subtly different from a true UInt32.
+ * As long as we're just comparing with the constant,
+ * we can always use the UL suffix and at worst lose some efficiency.
+ * I use a separate '32-bit constant' macro in most of my other code.
+ *
+ * I hate C.
+ *
+ * Start with testing GET32. We test it on all positions modulo 4
+ * to make sure we can handly any position of inputs. (Some CPUs
+ * do not allow non-aligned accesses which we would do if you used
+ * the CONVERT_USING_CASTS option.
+ */
+ if( (GET32( buf ) != 0x78563412UL) || (GET32(buf+1) != 0x9a785634UL)
+ || (GET32( buf+2 ) != 0xbc9a7856UL) || (GET32(buf+3) != 0xdebc9a78UL) )
+ {
+ Twofish_fatal( "Twofish code: GET32 not implemented properly", ERR_GET32 );
+ }
+
+ /*
+ * We can now use GET32 to test PUT32.
+ * We don't test the shifted versions. If GET32 can do that then
+ * so should PUT32.
+ */
+ C = GET32( buf );
+ PUT32( 3*C, buf );
+ if( GET32( buf ) != 0x69029c36UL )
+ {
+ Twofish_fatal( "Twofish code: PUT32 not implemented properly", ERR_PUT32 );
+ }
+
+
+ /* Test ROL and ROR */
+ for( i=1; i<32; i++ )
+ {
+ /* Just a simple test. */
+ x = ROR32( C, i );
+ y = ROL32( C, i );
+ x ^= (C>>i) ^ (C<<(32-i));
+ /*y ^= (C<>(32-i)); */
+ y ^= (C<<i) ^ (C>>(32-i));
+ x |= y;
+ /*
+ * Now all we check is that x is zero in the least significant
+ * 32 bits. Using the UL suffix is safe here, as it doesn't matter
+ * if we get a larger type.
+ */
+ if( (x & 0xffffffffUL) != 0 )
+ {
+ Twofish_fatal( "Twofish ROL or ROR not properly defined.", ERR_ROLR );
+ }
+ }
+
+ /* Test the BSWAP macro */
+ if( BSWAP(C) != 0x12345678UL )
+ {
+ /*
+ * The BSWAP macro should always work, even if you are not using it.
+ * A smart optimising compiler will just remove this entire test.
+ */
+ Twofish_fatal( "BSWAP not properly defined.", ERR_BSWAP );
+ }
+
+ /* And we can test the b macros which use SELECT_BYTE. */
+ if( (b0(C)!=0x12) || (b1(C) != 0x34) || (b2(C) != 0x56) || (b3(C) != 0x78) )
+ {
+ /*
+ * There are many reasons why this could fail.
+ * Most likely is that CPU_IS_BIG_ENDIAN has the wrong value.
+ */
+ Twofish_fatal( "Twofish code: SELECT_BYTE not implemented properly", ERR_SELECTB );
+ }
+ return SUCCESS;
+ }
+
+
+/*
+ * Finally, we can start on the Twofish-related code.
+ * You really need the Twofish specifications to understand this code. The
+ * best source is the Twofish book:
+ * "The Twofish Encryption Algorithm", by Bruce Schneier, John Kelsey,
+ * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson.
+ * you can also use the AES submission document of Twofish, which is
+ * available from my list of publications on my personal web site at
+ * http://niels.ferguson.net/.
+ *
+ * The first thing we do is write the testing routines. This is what the
+ * implementation has to satisfy in the end. We only test the external
+ * behaviour of the implementation of course.
+ */
+
+
+/*
+ * Perform a single self test on a (plaintext,ciphertext,key) triple.
+ * Arguments:
+ * key array of key bytes
+ * key_len length of key in bytes
+ * p plaintext
+ * c ciphertext
+ */
+static int test_vector( Twofish_Byte key[], int key_len, Twofish_Byte p[16], Twofish_Byte c[16] )
+ {
+ Twofish_Byte tmp[16]; /* scratch pad. */
+ Twofish_key xkey; /* The expanded key */
+ int i;
+
+
+ /* Prepare the key */
+ if ((i = Twofish_prepare_key( key, key_len, &xkey)) < 0)
+ return i;
+
+ /*
+ * We run the test twice to ensure that the xkey structure
+ * is not damaged by the first encryption.
+ * Those are hideous bugs to find if you get them in an application.
+ */
+ for( i=0; i<2; i++ )
+ {
+ /* Encrypt and test */
+ Twofish_encrypt( &xkey, p, tmp );
+ if( memcmp( c, tmp, 16 ) != 0 )
+ {
+ Twofish_fatal( "Twofish encryption failure", ERR_TEST_ENC );
+ }
+
+ /* Decrypt and test */
+ Twofish_decrypt( &xkey, c, tmp );
+ if( memcmp( p, tmp, 16 ) != 0 )
+ {
+ Twofish_fatal( "Twofish decryption failure", ERR_TEST_DEC );
+ }
+ }
+
+ /* The test keys are not secret, so we don't need to wipe xkey. */
+ return SUCCESS;
+ }
+
+
+/*
+ * Check implementation using three (key,plaintext,ciphertext)
+ * test vectors, one for each major key length.
+ *
+ * This is an absolutely minimal self-test.
+ * This routine does not test odd-sized keys.
+ */
+static int test_vectors()
+ {
+ /*
+ * We run three tests, one for each major key length.
+ * These test vectors come from the Twofish specification.
+ * One encryption and one decryption using randomish data and key
+ * will detect almost any error, especially since we generate the
+ * tables ourselves, so we don't have the problem of a single
+ * damaged table entry in the source.
+ */
+
+ /* 128-bit test is the I=3 case of section B.2 of the Twofish book. */
+ static Twofish_Byte k128[] = {
+ 0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
+ 0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A,
+ };
+ static Twofish_Byte p128[] = {
+ 0xD4, 0x91, 0xDB, 0x16, 0xE7, 0xB1, 0xC3, 0x9E,
+ 0x86, 0xCB, 0x08, 0x6B, 0x78, 0x9F, 0x54, 0x19
+ };
+ static Twofish_Byte c128[] = {
+ 0x01, 0x9F, 0x98, 0x09, 0xDE, 0x17, 0x11, 0x85,
+ 0x8F, 0xAA, 0xC3, 0xA3, 0xBA, 0x20, 0xFB, 0xC3
+ };
+
+ /* 192-bit test is the I=4 case of section B.2 of the Twofish book. */
+ static Twofish_Byte k192[] = {
+ 0x88, 0xB2, 0xB2, 0x70, 0x6B, 0x10, 0x5E, 0x36,
+ 0xB4, 0x46, 0xBB, 0x6D, 0x73, 0x1A, 0x1E, 0x88,
+ 0xEF, 0xA7, 0x1F, 0x78, 0x89, 0x65, 0xBD, 0x44
+ };
+ static Twofish_Byte p192[] = {
+ 0x39, 0xDA, 0x69, 0xD6, 0xBA, 0x49, 0x97, 0xD5,
+ 0x85, 0xB6, 0xDC, 0x07, 0x3C, 0xA3, 0x41, 0xB2
+ };
+ static Twofish_Byte c192[] = {
+ 0x18, 0x2B, 0x02, 0xD8, 0x14, 0x97, 0xEA, 0x45,
+ 0xF9, 0xDA, 0xAC, 0xDC, 0x29, 0x19, 0x3A, 0x65
+ };
+
+ /* 256-bit test is the I=4 case of section B.2 of the Twofish book. */
+ static Twofish_Byte k256[] = {
+ 0xD4, 0x3B, 0xB7, 0x55, 0x6E, 0xA3, 0x2E, 0x46,
+ 0xF2, 0xA2, 0x82, 0xB7, 0xD4, 0x5B, 0x4E, 0x0D,
+ 0x57, 0xFF, 0x73, 0x9D, 0x4D, 0xC9, 0x2C, 0x1B,
+ 0xD7, 0xFC, 0x01, 0x70, 0x0C, 0xC8, 0x21, 0x6F
+ };
+ static Twofish_Byte p256[] = {
+ 0x90, 0xAF, 0xE9, 0x1B, 0xB2, 0x88, 0x54, 0x4F,
+ 0x2C, 0x32, 0xDC, 0x23, 0x9B, 0x26, 0x35, 0xE6
+ };
+ static Twofish_Byte c256[] = {
+ 0x6C, 0xB4, 0x56, 0x1C, 0x40, 0xBF, 0x0A, 0x97,
+ 0x05, 0x93, 0x1C, 0xB6, 0xD4, 0x08, 0xE7, 0xFA
+ };
+
+ int ret;
+
+ /* Run the actual tests. */
+ if ((ret = test_vector( k128, 16, p128, c128 )) < 0)
+ return ret;
+ if ((ret = test_vector( k192, 24, p192, c192 )) < 0)
+ return ret;
+ if ((ret = test_vector( k256, 32, p256, c256 )) < 0)
+ return ret;
+ return SUCCESS;
+ }
+
+
+/*
+ * Perform extensive test for a single key size.
+ *
+ * Test a single key size against the test vectors from section
+ * B.2 in the Twofish book. This is a sequence of 49 encryptions
+ * and decryptions. Each plaintext is equal to the ciphertext of
+ * the previous encryption. The key is made up from the ciphertext
+ * two and three encryptions ago. Both plaintext and key start
+ * at the zero value.
+ * We should have designed a cleaner recurrence relation for
+ * these tests, but it is too late for that now. At least we learned
+ * how to do it better next time.
+ * For details see appendix B of the book.
+ *
+ * Arguments:
+ * key_len Number of bytes of key
+ * final_value Final plaintext value after 49 iterations
+ */
+static int test_sequence( int key_len, Twofish_Byte final_value[] )
+ {
+ Twofish_Byte buf[ (50+3)*16 ]; /* Buffer to hold our computation values. */
+ Twofish_Byte tmp[16]; /* Temp for testing the decryption. */
+ Twofish_key xkey; /* The expanded key */
+ int i, ret;
+ Twofish_Byte * p;
+
+ /* Wipe the buffer */
+ memset( buf, 0, sizeof( buf ) );
+
+ /*
+ * Because the recurrence relation is done in an inconvenient manner
+ * we end up looping backwards over the buffer.
+ */
+
+ /* Pointer in buffer points to current plaintext. */
+ p = &buf[50*16];
+ for( i=1; i<50; i++ )
+ {
+ /*
+ * Prepare a key.
+ * This automatically checks that key_len is valid.
+ */
+ if ((ret = Twofish_prepare_key( p+16, key_len, &xkey)) < 0)
+ return ret;
+
+ /* Compute the next 16 bytes in the buffer */
+ Twofish_encrypt( &xkey, p, p-16 );
+
+ /* Check that the decryption is correct. */
+ Twofish_decrypt( &xkey, p-16, tmp );
+ if( memcmp( tmp, p, 16 ) != 0 )
+ {
+ Twofish_fatal( "Twofish decryption failure in sequence", ERR_SEQ_DEC );
+ }
+ /* Move on to next 16 bytes in the buffer. */
+ p -= 16;
+ }
+
+ /* And check the final value. */
+ if( memcmp( p, final_value, 16 ) != 0 )
+ {
+ Twofish_fatal( "Twofish encryption failure in sequence", ERR_SEQ_ENC );
+ }
+
+ /* None of the data was secret, so there is no need to wipe anything. */
+ return SUCCESS;
+ }
+
+
+/*
+ * Run all three sequence tests from the Twofish test vectors.
+ *
+ * This checks the most extensive test vectors currently available
+ * for Twofish. The data is from the Twofish book, appendix B.2.
+ */
+static int test_sequences()
+ {
+ static Twofish_Byte r128[] = {
+ 0x5D, 0x9D, 0x4E, 0xEF, 0xFA, 0x91, 0x51, 0x57,
+ 0x55, 0x24, 0xF1, 0x15, 0x81, 0x5A, 0x12, 0xE0
+ };
+ static Twofish_Byte r192[] = {
+ 0xE7, 0x54, 0x49, 0x21, 0x2B, 0xEE, 0xF9, 0xF4,
+ 0xA3, 0x90, 0xBD, 0x86, 0x0A, 0x64, 0x09, 0x41
+ };
+ static Twofish_Byte r256[] = {
+ 0x37, 0xFE, 0x26, 0xFF, 0x1C, 0xF6, 0x61, 0x75,
+ 0xF5, 0xDD, 0xF4, 0xC3, 0x3B, 0x97, 0xA2, 0x05
+ };
+
+ /* Run the three sequence test vectors */
+ int ret;
+ if ((ret = test_sequence( 16, r128)) < 0)
+ return ret;
+ if ((ret = test_sequence( 24, r192)) < 0)
+ return ret;
+ if ((ret = test_sequence( 32, r256)) < 0)
+ return ret;
+ return SUCCESS;
+ }
+
+
+/*
+ * Test the odd-sized keys.
+ *
+ * Every odd-sized key is equivalent to a one of 128, 192, or 256 bits.
+ * The equivalent key is found by padding at the end with zero bytes
+ * until a regular key size is reached.
+ *
+ * We just test that the key expansion routine behaves properly.
+ * If the expanded keys are identical, then the encryptions and decryptions
+ * will behave the same.
+ */
+static int test_odd_sized_keys()
+ {
+ Twofish_Byte buf[32];
+ Twofish_key xkey;
+ Twofish_key xkey_two;
+ int i, ret;
+
+ /*
+ * We first create an all-zero key to use as PRNG key.
+ * Normally we would not have to fill the buffer with zeroes, as we could
+ * just pass a zero key length to the Twofish_prepare_key function.
+ * However, this relies on using odd-sized keys, and those are just the
+ * ones we are testing here. We can't use an untested function to test
+ * itself.
+ */
+ memset( buf, 0, sizeof( buf ) );
+ if ((ret = Twofish_prepare_key( buf, 16, &xkey)) < 0)
+ return ret;
+
+ /* Fill buffer with pseudo-random data derived from two encryptions */
+ Twofish_encrypt( &xkey, buf, buf );
+ Twofish_encrypt( &xkey, buf, buf+16 );
+
+ /* Create all possible shorter keys that are prefixes of the buffer. */
+ for( i=31; i>=0; i-- )
+ {
+ /* Set a byte to zero. This is the new padding byte */
+ buf[i] = 0;
+
+ /* Expand the key with only i bytes of length */
+ if ((ret = Twofish_prepare_key( buf, i, &xkey)) < 0)
+ return ret;
+
+ /* Expand the corresponding padded key of regular length */
+ if ((ret = Twofish_prepare_key( buf, i<=16 ? 16 : (i<= 24 ? 24 : 32), &xkey_two )) < 0)
+ return ret;
+
+ /* Compare the two */
+ if( memcmp( &xkey, &xkey_two, sizeof( xkey ) ) != 0 )
+ {
+ Twofish_fatal( "Odd sized keys do not expand properly", ERR_ODD_KEY );
+ }
+ }
+
+ /* None of the key values are secret, so we don't need to wipe them. */
+ return SUCCESS;
+ }
+
+
+/*
+ * Test the Twofish implementation.
+ *
+ * This routine runs all the self tests, in order of importance.
+ * It is called by the Twofish_initialise routine.
+ *
+ * In almost all applications the cost of running the self tests during
+ * initialisation is insignificant, especially
+ * compared to the time it takes to load the application from disk.
+ * If you are very pressed for initialisation performance,
+ * you could remove some of the tests. Make sure you did run them
+ * once in the software and hardware configuration you are using.
+ */
+static int self_test()
+ {
+ int ret;
+ /* The three test vectors form an absolute minimal test set. */
+ if ((ret = test_vectors()) < 0)
+ return ret;
+
+ /*
+ * If at all possible you should run these tests too. They take
+ * more time, but provide a more thorough coverage.
+ */
+ if ((ret = test_sequences()) < 0)
+ return ret;
+
+ /* Test the odd-sized keys. */
+ if ((ret = test_odd_sized_keys()) < 0)
+ return ret;
+ return SUCCESS;
+ }
+
+
+/*
+ * And now, the actual Twofish implementation.
+ *
+ * This implementation generates all the tables during initialisation.
+ * I don't like large tables in the code, especially since they are easily
+ * damaged in the source without anyone noticing it. You need code to
+ * generate them anyway, and this way all the code is close together.
+ * Generating them in the application leads to a smaller executable
+ * (the code is smaller than the tables it generates) and a
+ * larger static memory footprint.
+ *
+ * Twofish can be implemented in many ways. I have chosen to
+ * use large tables with a relatively long key setup time.
+ * If you encrypt more than a few blocks of data it pays to pre-compute
+ * as much as possible. This implementation is relatively inefficient for
+ * applications that need to re-key every block or so.
+ */
+
+/*
+ * We start with the t-tables, directly from the Twofish definition.
+ * These are nibble-tables, but merging them and putting them two nibbles
+ * in one byte is more work than it is worth.
+ */
+static Twofish_Byte t_table[2][4][16] = {
+ {
+ {0x8,0x1,0x7,0xD,0x6,0xF,0x3,0x2,0x0,0xB,0x5,0x9,0xE,0xC,0xA,0x4},
+ {0xE,0xC,0xB,0x8,0x1,0x2,0x3,0x5,0xF,0x4,0xA,0x6,0x7,0x0,0x9,0xD},
+ {0xB,0xA,0x5,0xE,0x6,0xD,0x9,0x0,0xC,0x8,0xF,0x3,0x2,0x4,0x7,0x1},
+ {0xD,0x7,0xF,0x4,0x1,0x2,0x6,0xE,0x9,0xB,0x3,0x0,0x8,0x5,0xC,0xA}
+ },
+ {
+ {0x2,0x8,0xB,0xD,0xF,0x7,0x6,0xE,0x3,0x1,0x9,0x4,0x0,0xA,0xC,0x5},
+ {0x1,0xE,0x2,0xB,0x4,0xC,0x3,0x7,0x6,0xD,0xA,0x5,0xF,0x9,0x0,0x8},
+ {0x4,0xC,0x7,0x5,0x1,0x6,0x9,0xA,0x0,0xE,0xD,0x8,0x2,0xB,0x3,0xF},
+ {0xB,0x9,0x5,0x1,0xC,0x3,0xD,0xE,0x6,0x4,0x7,0xF,0x2,0x0,0x8,0xA}
+ }
+};
+
+
+/* A 1-bit rotation of 4-bit values. Input must be in range 0..15 */
+#define ROR4BY1( x ) (((x)>>1) | (((x)<<3) & 0x8) )
+
+/*
+ * The q-boxes are only used during the key schedule computations.
+ * These are 8->8 bit lookup tables. Some CPUs prefer to have 8->32 bit
+ * lookup tables as it is faster to load a 32-bit value than to load an
+ * 8-bit value and zero the rest of the register.
+ * The LARGE_Q_TABLE switch allows you to choose 32-bit entries in
+ * the q-tables. Here we just define the Qtype which is used to store
+ * the entries of the q-tables.
+ */
+#if LARGE_Q_TABLE
+typedef Twofish_UInt32 Qtype;
+#else
+typedef Twofish_Byte Qtype;
+#endif
+
+/*
+ * The actual q-box tables.
+ * There are two q-boxes, each having 256 entries.
+ */
+static Qtype q_table[2][256];
+
+
+/*
+ * Now the function that converts a single t-table into a q-table.
+ *
+ * Arguments:
+ * t[4][16] : four 4->4bit lookup tables that define the q-box
+ * q[256] : output parameter: the resulting q-box as a lookup table.
+ */
+static void make_q_table( Twofish_Byte t[4][16], Qtype q[256] )
+ {
+ int ae,be,ao,bo; /* Some temporaries. */
+ int i;
+ /* Loop over all input values and compute the q-box result. */
+ for( i=0; i<256; i++ ) {
+ /*
+ * This is straight from the Twofish specifications.
+ *
+ * The ae variable is used for the a_i values from the specs
+ * with even i, and ao for the odd i's. Similarly for the b's.
+ */
+ ae = i>>4; be = i&0xf;
+ ao = ae ^ be; bo = ae ^ ROR4BY1(be) ^ ((ae<<3)&8);
+ ae = t[0][ao]; be = t[1][bo];
+ ao = ae ^ be; bo = ae ^ ROR4BY1(be) ^ ((ae<<3)&8);
+ ae = t[2][ao]; be = t[3][bo];
+
+ /* Store the result in the q-box table, the cast avoids a warning. */
+ q[i] = (Qtype) ((be<<4) | ae);
+ }
+ }
+
+
+/*
+ * Initialise both q-box tables.
+ */
+static void initialise_q_boxes() {
+ /* Initialise each of the q-boxes using the t-tables */
+ make_q_table( t_table[0], q_table[0] );
+ make_q_table( t_table[1], q_table[1] );
+ }
+
+
+/*
+ * Next up is the MDS matrix multiplication.
+ * The MDS matrix multiplication operates in the field
+ * GF(2)[x]/p(x) with p(x)=x^8+x^6+x^5+x^3+1.
+ * If you don't understand this, read a book on finite fields. You cannot
+ * follow the finite-field computations without some background.
+ *
+ * In this field, multiplication by x is easy: shift left one bit
+ * and if bit 8 is set then xor the result with 0x169.
+ *
+ * The MDS coefficients use a multiplication by 1/x,
+ * or rather a division by x. This is easy too: first make the
+ * value 'even' (i.e. bit 0 is zero) by xorring with 0x169 if necessary,
+ * and then shift right one position.
+ * Even easier: shift right and xor with 0xb4 if the lsbit was set.
+ *
+ * The MDS coefficients are 1, EF, and 5B, and we use the fact that
+ * EF = 1 + 1/x + 1/x^2
+ * 5B = 1 + 1/x^2
+ * in this field. This makes multiplication by EF and 5B relatively easy.
+ *
+ * This property is no accident, the MDS matrix was designed to allow
+ * this implementation technique to be used.
+ *
+ * We have four MDS tables, each mapping 8 bits to 32 bits.
+ * Each table performs one column of the matrix multiplication.
+ * As the MDS is always preceded by q-boxes, each of these tables
+ * also implements the q-box just previous to that column.
+ */
+
+/* The actual MDS tables. */
+static Twofish_UInt32 MDS_table[4][256];
+
+/* A small table to get easy conditional access to the 0xb4 constant. */
+static Twofish_UInt32 mds_poly_divx_const[] = {0,0xb4};
+
+/* Function to initialise the MDS tables. */
+static void initialise_mds_tables()
+ {
+ int i;
+ Twofish_UInt32 q,qef,q5b; /* Temporary variables. */
+
+ /* Loop over all 8-bit input values */
+ for( i=0; i<256; i++ )
+ {
+ /*
+ * To save some work during the key expansion we include the last
+ * of the q-box layers from the h() function in these MDS tables.
+ */
+
+ /* We first do the inputs that are mapped through the q0 table. */
+ q = q_table[0][i];
+ /*
+ * Here we divide by x, note the table to get 0xb4 only if the
+ * lsbit is set.
+ * This sets qef = (1/x)*q in the finite field
+ */
+ qef = (q >> 1) ^ mds_poly_divx_const[ q & 1 ];
+ /*
+ * Divide by x again, and add q to get (1+1/x^2)*q.
+ * Note that (1+1/x^2) = 5B in the field, and addition in the field
+ * is exclusive or on the bits.
+ */
+ q5b = (qef >> 1) ^ mds_poly_divx_const[ qef & 1 ] ^ q;
+ /*
+ * Add q5b to qef to set qef = (1+1/x+1/x^2)*q.
+ * Again, (1+1/x+1/x^2) = EF in the field.
+ */
+ qef ^= q5b;
+
+ /*
+ * Now that we have q5b = 5B * q and qef = EF * q
+ * we can fill two of the entries in the MDS matrix table.
+ * See the Twofish specifications for the order of the constants.
+ */
+ MDS_table[1][i] = (q <<24) | (q5b<<16) | (qef<<8) | qef;
+ MDS_table[3][i] = (q5b<<24) | (qef<<16) | (q <<8) | q5b;
+
+ /* Now we do it all again for the two columns that have a q1 box. */
+ q = q_table[1][i];
+ qef = (q >> 1) ^ mds_poly_divx_const[ q & 1 ];
+ q5b = (qef >> 1) ^ mds_poly_divx_const[ qef & 1 ] ^ q;
+ qef ^= q5b;
+
+ /* The other two columns use the coefficient in a different order. */
+ MDS_table[0][i] = (qef<<24) | (qef<<16) | (q5b<<8) | q ;
+ MDS_table[2][i] = (qef<<24) | (q <<16) | (qef<<8) | q5b;
+ }
+ }
+
+
+/*
+ * The h() function is the heart of the Twofish cipher.
+ * It is a complicated sequence of q-box lookups, key material xors,
+ * and finally the MDS matrix.
+ * We use lots of macros to make this reasonably fast.
+ */
+
+/* First a shorthand for the two q-tables */
+#define q0 q_table[0]
+#define q1 q_table[1]
+
+/*
+ * Each macro computes one column of the h for either 2, 3, or 4 stages.
+ * As there are 4 columns, we have 12 macros in all.
+ *
+ * The key bytes are stored in the Byte array L at offset
+ * 0,1,2,3, 8,9,10,11, [16,17,18,19, [24,25,26,27]] as this is the
+ * order we get the bytes from the user. If you look at the Twofish
+ * specs, you'll see that h() is applied to the even key words or the
+ * odd key words. The bytes of the even words appear in this spacing,
+ * and those of the odd key words too.
+ *
+ * These macros are the only place where the q-boxes and the MDS table
+ * are used.
+ */
+#define H02( y, L ) MDS_table[0][q0[q0[y]^L[ 8]]^L[0]]
+#define H12( y, L ) MDS_table[1][q0[q1[y]^L[ 9]]^L[1]]
+#define H22( y, L ) MDS_table[2][q1[q0[y]^L[10]]^L[2]]
+#define H32( y, L ) MDS_table[3][q1[q1[y]^L[11]]^L[3]]
+#define H03( y, L ) H02( q1[y]^L[16], L )
+#define H13( y, L ) H12( q1[y]^L[17], L )
+#define H23( y, L ) H22( q0[y]^L[18], L )
+#define H33( y, L ) H32( q0[y]^L[19], L )
+#define H04( y, L ) H03( q1[y]^L[24], L )
+#define H14( y, L ) H13( q0[y]^L[25], L )
+#define H24( y, L ) H23( q0[y]^L[26], L )
+#define H34( y, L ) H33( q1[y]^L[27], L )
+
+/*
+ * Now we can define the h() function given an array of key bytes.
+ * This function is only used in the key schedule, and not to pre-compute
+ * the keyed S-boxes.
+ *
+ * In the key schedule, the input is always of the form k*(1+2^8+2^16+2^24)
+ * so we only provide k as an argument.
+ *
+ * Arguments:
+ * k input to the h() function.
+ * L pointer to array of key bytes at
+ * offsets 0,1,2,3, ... 8,9,10,11, [16,17,18,19, [24,25,26,27]]
+ * kCycles # key cycles, 2, 3, or 4.
+ */
+static Twofish_UInt32 h( int k, Twofish_Byte L[], int kCycles )
+ {
+ switch( kCycles ) {
+ /* We code all 3 cases separately for speed reasons. */
+ case 2:
+ return H02(k,L) ^ H12(k,L) ^ H22(k,L) ^ H32(k,L);
+ case 3:
+ return H03(k,L) ^ H13(k,L) ^ H23(k,L) ^ H33(k,L);
+ case 4:
+ return H04(k,L) ^ H14(k,L) ^ H24(k,L) ^ H34(k,L);
+ default:
+ /* This is always a coding error, which is fatal. */
+ Twofish_fatal( "Twofish h(): Illegal argument", ERR_ILL_ARG );
+ return ERR_ILL_ARG;
+ }
+ }
+
+
+/*
+ * Pre-compute the keyed S-boxes.
+ * Fill the pre-computed S-box array in the expanded key structure.
+ * Each pre-computed S-box maps 8 bits to 32 bits.
+ *
+ * The S argument contains half the number of bytes of the full key, but is
+ * derived from the full key. (See Twofish specifications for details.)
+ * S has the weird byte input order used by the Hxx macros.
+ *
+ * This function takes most of the time of a key expansion.
+ *
+ * Arguments:
+ * S pointer to array of 8*kCycles Bytes containing the S vector.
+ * kCycles number of key words, must be in the set {2,3,4}
+ * xkey pointer to Twofish_key structure that will contain the S-boxes.
+ */
+static int fill_keyed_sboxes( Twofish_Byte S[], int kCycles, Twofish_key * xkey )
+ {
+ int i;
+ switch( kCycles ) {
+ /* We code all 3 cases separately for speed reasons. */
+ case 2:
+ for( i=0; i<256; i++ )
+ {
+ xkey->s[0][i]= H02( i, S );
+ xkey->s[1][i]= H12( i, S );
+ xkey->s[2][i]= H22( i, S );
+ xkey->s[3][i]= H32( i, S );
+ }
+ break;
+ case 3:
+ for( i=0; i<256; i++ )
+ {
+ xkey->s[0][i]= H03( i, S );
+ xkey->s[1][i]= H13( i, S );
+ xkey->s[2][i]= H23( i, S );
+ xkey->s[3][i]= H33( i, S );
+ }
+ break;
+ case 4:
+ for( i=0; i<256; i++ )
+ {
+ xkey->s[0][i]= H04( i, S );
+ xkey->s[1][i]= H14( i, S );
+ xkey->s[2][i]= H24( i, S );
+ xkey->s[3][i]= H34( i, S );
+ }
+ break;
+ default:
+ /* This is always a coding error, which is fatal. */
+ Twofish_fatal( "Twofish fill_keyed_sboxes(): Illegal argument", ERR_ILL_ARG );
+ }
+ return SUCCESS;
+ }
+
+
+/* A flag to keep track of whether we have been initialised or not. */
+static int Twofish_initialised = 0;
+
+/*
+ * Initialise the Twofish implementation.
+ * This function must be called before any other function in the
+ * Twofish implementation is called.
+ * This routine also does some sanity checks, to make sure that
+ * all the macros behave, and it tests the whole cipher.
+ */
+int Twofish_initialise()
+ {
+ int ret;
+ /* First test the various platform-specific definitions. */
+ if ((ret = test_platform()) < 0)
+ return ret;
+
+ /* We can now generate our tables, in the right order of course. */
+ initialise_q_boxes();
+ initialise_mds_tables();
+
+ /* We're finished with the initialisation itself. */
+ Twofish_initialised = 1;
+
+ /*
+ * And run some tests on the whole cipher.
+ * Yes, you need to do this every time you start your program.
+ * It is called assurance; you have to be certain that your program
+ * still works properly.
+ */
+ return self_test();
+ }
+
+
+/*
+ * The Twofish key schedule uses an Reed-Solomon code matrix multiply.
+ * Just like the MDS matrix, the RS-matrix is designed to be easy
+ * to implement. Details are below in the code.
+ *
+ * These constants make it easy to compute in the finite field used
+ * for the RS code.
+ *
+ * We use Bytes for the RS computation, but these are automatically
+ * widened to unsigned integers in the expressions. Having unsigned
+ * ints in these tables therefore provides the fastest access.
+ */
+static unsigned int rs_poly_const[] = {0, 0x14d};
+static unsigned int rs_poly_div_const[] = {0, 0xa6 };
+
+
+/*
+ * Prepare a key for use in encryption and decryption.
+ * Like most block ciphers, Twofish allows the key schedule
+ * to be pre-computed given only the key.
+ * Twofish has a fairly 'heavy' key schedule that takes a lot of time
+ * to compute. The main work is pre-computing the S-boxes used in the
+ * encryption and decryption. We feel that this makes the cipher much
+ * harder to attack. The attacker doesn't even know what the S-boxes
+ * contain without including the entire key schedule in the analysis.
+ *
+ * Unlike most Twofish implementations, this one allows any key size from
+ * 0 to 32 bytes. Odd key sizes are defined for Twofish (see the
+ * specifications); the key is simply padded with zeroes to the next real
+ * key size of 16, 24, or 32 bytes.
+ * Each odd-sized key is thus equivalent to a single normal-sized key.
+ *
+ * Arguments:
+ * key array of key bytes
+ * key_len number of bytes in the key, must be in the range 0,...,32.
+ * xkey Pointer to an Twofish_key structure that will be filled
+ * with the internal form of the cipher key.
+ */
+int Twofish_prepare_key( Twofish_Byte key[], int key_len, Twofish_key * xkey )
+ {
+ /* We use a single array to store all key material in,
+ * to simplify the wiping of the key material at the end.
+ * The first 32 bytes contain the actual (padded) cipher key.
+ * The next 32 bytes contain the S-vector in its weird format,
+ * and we have 4 bytes of overrun necessary for the RS-reduction.
+ */
+ Twofish_Byte K[32+32+4];
+
+ int kCycles; /* # key cycles, 2,3, or 4. */
+
+ int i;
+ Twofish_UInt32 A, B; /* Used to compute the round keys. */
+
+ Twofish_Byte * kptr; /* Three pointers for the RS computation. */
+ Twofish_Byte * sptr;
+ Twofish_Byte * t;
+
+ Twofish_Byte b,bx,bxx; /* Some more temporaries for the RS computation. */
+
+ /* Check that the Twofish implementation was initialised. */
+ if( Twofish_initialised == 0 )
+ {
+ /*
+ * You didn't call Twofish_initialise before calling this routine.
+ * This is a programming error, and therefore we call the fatal
+ * routine.
+ *
+ * I could of course call the initialisation routine here,
+ * but there are a few reasons why I don't. First of all, the
+ * self-tests have to be done at startup. It is no good to inform
+ * the user that the cipher implementation fails when he wants to
+ * write his data to disk in encrypted form. You have to warn him
+ * before he spends time typing his data. Second, the initialisation
+ * and self test are much slower than a single key expansion.
+ * Calling the initialisation here makes the performance of the
+ * cipher unpredictable. This can lead to really weird problems
+ * if you use the cipher for a real-time task. Suddenly it fails
+ * once in a while the first time you try to use it. Things like
+ * that are almost impossible to debug.
+ */
+ /* Twofish_fatal( "Twofish implementation was not initialised.", ERR_INIT ); */
+
+ /*
+ * There is always a danger that the Twofish_fatal routine returns,
+ * in spite of the specifications that it should not.
+ * (A good programming rule: don't trust the rest of the code.)
+ * This would be disasterous. If the q-tables and MDS-tables have
+ * not been initialised, they are probably still filled with zeroes.
+ * Suppose the MDS-tables are all zero. The key expansion would then
+ * generate all-zero round keys, and all-zero s-boxes. The danger
+ * is that nobody would notice as the encry
+ * mangles the input, and the decryption still 'decrypts' it,
+ * but now in a completely key-independent manner.
+ * To stop such security disasters, we use blunt force.
+ * If your program hangs here: fix the fatal routine!
+ */
+ for(;;); /* Infinite loop, which beats being insecure. */
+ }
+
+ /* Check for valid key length. */
+ if( key_len < 0 || key_len > 32 )
+ {
+ /*
+ * This can only happen if a programmer didn't read the limitations
+ * on the key size.
+ */
+ Twofish_fatal( "Twofish_prepare_key: illegal key length", ERR_KEY_LEN );
+ /*
+ * A return statement just in case the fatal macro returns.
+ * The rest of the code assumes that key_len is in range, and would
+ * buffer-overflow if it wasn't.
+ *
+ * Why do we still use a programming language that has problems like
+ * buffer overflows, when these problems were solved in 1960 with
+ * the development of Algol? Have we not leared anything?
+ */
+ return ERR_KEY_LEN;
+ }
+
+ /* Pad the key with zeroes to the next suitable key length. */
+ memcpy( K, key, key_len );
+ memset( K+key_len, 0, sizeof(K)-key_len );
+
+ /*
+ * Compute kCycles: the number of key cycles used in the cipher.
+ * 2 for 128-bit keys, 3 for 192-bit keys, and 4 for 256-bit keys.
+ */
+ kCycles = (key_len + 7) >> 3;
+ /* Handle the special case of very short keys: minimum 2 cycles. */
+ if( kCycles < 2 )
+ {
+ kCycles = 2;
+ }
+
+ /*
+ * From now on we just pretend to have 8*kCycles bytes of
+ * key material in K. This handles all the key size cases.
+ */
+
+ /*
+ * We first compute the 40 expanded key words,
+ * formulas straight from the Twofish specifications.
+ */
+ for( i=0; i<40; i+=2 )
+ {
+ /*
+ * Due to the byte spacing expected by the h() function
+ * we can pick the bytes directly from the key K.
+ * As we use bytes, we never have the little/big endian
+ * problem.
+ *
+ * Note that we apply the rotation function only to simple
+ * variables, as the rotation macro might evaluate its argument
+ * more than once.
+ */
+ A = h( i , K , kCycles );
+ B = h( i+1, K+4, kCycles );
+ B = ROL32( B, 8 );
+
+ /* Compute and store the round keys. */
+ A += B;
+ B += A;
+ xkey->K[i] = A;
+ xkey->K[i+1] = ROL32( B, 9 );
+ }
+
+ /* Wipe variables that contained key material. */
+ A=B=0;
+
+ /*
+ * And now the dreaded RS multiplication that few seem to understand.
+ * The RS matrix is not random, and is specially designed to compute the
+ * RS matrix multiplication in a simple way.
+ *
+ * We work in the field GF(2)[x]/x^8+x^6+x^3+x^2+1. Note that this is a
+ * different field than used for the MDS matrix.
+ * (At least, it is a different representation because all GF(2^8)
+ * representations are equivalent in some form.)
+ *
+ * We take 8 consecutive bytes of the key and interpret them as
+ * a polynomial k_0 + k_1 y + k_2 y^2 + ... + k_7 y^7 where
+ * the k_i bytes are the key bytes and are elements of the finite field.
+ * We multiply this polynomial by y^4 and reduce it modulo
+ * y^4 + (x + 1/x)y^3 + (x)y^2 + (x + 1/x)y + 1.
+ * using straightforward polynomial modulo reduction.
+ * The coefficients of the result are the result of the RS
+ * matrix multiplication. When we wrote the Twofish specification,
+ * the original RS definition used the polynomials,
+ * but that requires much more mathematical knowledge.
+ * We were already using matrix multiplication in a finite field for
+ * the MDS matrix, so I re-wrote the RS operation as a matrix
+ * multiplication to reduce the difficulty of understanding it.
+ * Some implementors have not picked up on this simpler method of
+ * computing the RS operation, even though it is mentioned in the
+ * specifications.
+ *
+ * It is possible to perform these computations faster by using 32-bit
+ * word operations, but that is not portable and this is not a speed-
+ * critical area.
+ *
+ * We explained the 1/x computation when we did the MDS matrix.
+ *
+ * The S vector is stored in K[32..64].
+ * The S vector has to be reversed, so we loop cross-wise.
+ *
+ * Note the weird byte spacing of the S-vector, to match the even
+ * or odd key words arrays. See the discussion at the Hxx macros for
+ * details.
+ */
+ kptr = K + 8*kCycles; /* Start at end of key */
+ sptr = K + 32; /* Start at start of S */
+
+ /* Loop over all key material */
+ while( kptr > K )
+ {
+ kptr -= 8;
+ /*
+ * Initialise the polynimial in sptr[0..12]
+ * The first four coefficients are 0 as we have to multiply by y^4.
+ * The next 8 coefficients are from the key material.
+ */
+ memset( sptr, 0, 4 );
+ memcpy( sptr+4, kptr, 8 );
+
+ /*
+ * The 12 bytes starting at sptr are now the coefficients of
+ * the polynomial we need to reduce.
+ */
+
+ /* Loop over the polynomial coefficients from high to low */
+ t = sptr+11;
+ /* Keep looping until polynomial is degree 3; */
+ while( t > sptr+3 )
+ {
+ /* Pick up the highest coefficient of the poly. */
+ b = *t;
+
+ /*
+ * Compute x and (x+1/x) times this coefficient.
+ * See the MDS matrix implementation for a discussion of
+ * multiplication by x and 1/x. We just use different
+ * constants here as we are in a
+ * different finite field representation.
+ *
+ * These two statements set
+ * bx = (x) * b
+ * bxx= (x + 1/x) * b
+ */
+ bx = (Twofish_Byte)((b<<1) ^ rs_poly_const[ b>>7 ]);
+ bxx= (Twofish_Byte)((b>>1) ^ rs_poly_div_const[ b&1 ] ^ bx);
+
+ /*
+ * Subtract suitable multiple of
+ * y^4 + (x + 1/x)y^3 + (x)y^2 + (x + 1/x)y + 1
+ * from the polynomial, except that we don't bother
+ * updating t[0] as it will become zero anyway.
+ */
+ t[-1] ^= bxx;
+ t[-2] ^= bx;
+ t[-3] ^= bxx;
+ t[-4] ^= b;
+
+ /* Go to the next coefficient. */
+ t--;
+ }
+
+ /* Go to next S-vector word, obeying the weird spacing rules. */
+ sptr += 8;
+ }
+
+ /* Wipe variables that contained key material. */
+ b = bx = bxx = 0;
+
+ /* And finally, we can compute the key-dependent S-boxes. */
+ fill_keyed_sboxes( &K[32], kCycles, xkey );
+
+ /* Wipe array that contained key material. */
+ memset( K, 0, sizeof( K ) );
+ return SUCCESS;
+ }
+
+
+/*
+ * We can now start on the actual encryption and decryption code.
+ * As these are often speed-critical we will use a lot of macros.
+ */
+
+/*
+ * The g() function is the heart of the round function.
+ * We have two versions of the g() function, one without an input
+ * rotation and one with.
+ * The pre-computed S-boxes make this pretty simple.
+ */
+#define g0(X,xkey) \
+ (xkey->s[0][b0(X)]^xkey->s[1][b1(X)]^xkey->s[2][b2(X)]^xkey->s[3][b3(X)])
+
+#define g1(X,xkey) \
+ (xkey->s[0][b3(X)]^xkey->s[1][b0(X)]^xkey->s[2][b1(X)]^xkey->s[3][b2(X)])
+
+/*
+ * A single round of Twofish. The A,B,C,D are the four state variables,
+ * T0 and T1 are temporaries, xkey is the expanded key, and r the
+ * round number.
+ *
+ * Note that this macro does not implement the swap at the end of the round.
+ */
+#define ENCRYPT_RND( A,B,C,D, T0, T1, xkey, r ) \
+ T0 = g0(A,xkey); T1 = g1(B,xkey);\
+ C ^= T0+T1+xkey->K[8+2*(r)]; C = ROR32(C,1);\
+ D = ROL32(D,1); D ^= T0+2*T1+xkey->K[8+2*(r)+1]
+
+/*
+ * Encrypt a single cycle, consisting of two rounds.
+ * This avoids the swapping of the two halves.
+ * Parameter r is now the cycle number.
+ */
+#define ENCRYPT_CYCLE( A, B, C, D, T0, T1, xkey, r ) \
+ ENCRYPT_RND( A,B,C,D,T0,T1,xkey,2*(r) );\
+ ENCRYPT_RND( C,D,A,B,T0,T1,xkey,2*(r)+1 )
+
+/* Full 16-round encryption */
+#define ENCRYPT( A,B,C,D,T0,T1,xkey ) \
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 0 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 1 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 2 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 3 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 4 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 5 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 6 );\
+ ENCRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 7 )
+
+/*
+ * A single round of Twofish for decryption. It differs from
+ * ENCRYTP_RND only because of the 1-bit rotations.
+ */
+#define DECRYPT_RND( A,B,C,D, T0, T1, xkey, r ) \
+ T0 = g0(A,xkey); T1 = g1(B,xkey);\
+ C = ROL32(C,1); C ^= T0+T1+xkey->K[8+2*(r)];\
+ D ^= T0+2*T1+xkey->K[8+2*(r)+1]; D = ROR32(D,1)
+
+/*
+ * Decrypt a single cycle, consisting of two rounds.
+ * This avoids the swapping of the two halves.
+ * Parameter r is now the cycle number.
+ */
+#define DECRYPT_CYCLE( A, B, C, D, T0, T1, xkey, r ) \
+ DECRYPT_RND( A,B,C,D,T0,T1,xkey,2*(r)+1 );\
+ DECRYPT_RND( C,D,A,B,T0,T1,xkey,2*(r) )
+
+/* Full 16-round decryption. */
+#define DECRYPT( A,B,C,D,T0,T1, xkey ) \
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 7 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 6 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 5 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 4 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 3 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 2 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 1 );\
+ DECRYPT_CYCLE( A,B,C,D,T0,T1,xkey, 0 )
+
+/*
+ * A macro to read the state from the plaintext and do the initial key xors.
+ * The koff argument allows us to use the same macro
+ * for the decryption which uses different key words at the start.
+ */
+#define GET_INPUT( src, A,B,C,D, xkey, koff ) \
+ A = GET32(src )^xkey->K[ koff]; B = GET32(src+ 4)^xkey->K[1+koff]; \
+ C = GET32(src+ 8)^xkey->K[2+koff]; D = GET32(src+12)^xkey->K[3+koff]
+
+/*
+ * Similar macro to put the ciphertext in the output buffer.
+ * We xor the keys into the state variables before we use the PUT32
+ * macro as the macro might use its argument multiple times.
+ */
+#define PUT_OUTPUT( A,B,C,D, dst, xkey, koff ) \
+ A ^= xkey->K[ koff]; B ^= xkey->K[1+koff]; \
+ C ^= xkey->K[2+koff]; D ^= xkey->K[3+koff]; \
+ PUT32( A, dst ); PUT32( B, dst+ 4 ); \
+ PUT32( C, dst+8 ); PUT32( D, dst+12 )
+
+
+/*
+ * Twofish block encryption
+ *
+ * Arguments:
+ * xkey expanded key array
+ * p 16 bytes of plaintext
+ * c 16 bytes in which to store the ciphertext
+ */
+void Twofish_encrypt( Twofish_key * xkey, Twofish_Byte p[16], Twofish_Byte c[16])
+ {
+ Twofish_UInt32 A,B,C,D,T0,T1; /* Working variables */
+
+ /* Get the four plaintext words xorred with the key */
+ GET_INPUT( p, A,B,C,D, xkey, 0 );
+
+ /* Do 8 cycles (= 16 rounds) */
+ ENCRYPT( A,B,C,D,T0,T1,xkey );
+
+ /* Store them with the final swap and the output whitening. */
+ PUT_OUTPUT( C,D,A,B, c, xkey, 4 );
+ }
+
+
+/*
+ * Twofish block decryption.
+ *
+ * Arguments:
+ * xkey expanded key array
+ * p 16 bytes of plaintext
+ * c 16 bytes in which to store the ciphertext
+ */
+void Twofish_decrypt( Twofish_key * xkey, Twofish_Byte c[16], Twofish_Byte p[16])
+ {
+ Twofish_UInt32 A,B,C,D,T0,T1; /* Working variables */
+
+ /* Get the four plaintext words xorred with the key */
+ GET_INPUT( c, A,B,C,D, xkey, 4 );
+
+ /* Do 8 cycles (= 16 rounds) */
+ DECRYPT( A,B,C,D,T0,T1,xkey );
+
+ /* Store them with the final swap and the output whitening. */
+ PUT_OUTPUT( C,D,A,B, p, xkey, 0 );
+ }
+
+/*
+ * Using the macros it is easy to make special routines for
+ * CBC mode, CTR mode etc. The only thing you might want to
+ * add is a XOR_PUT_OUTPUT which xors the outputs into the
+ * destinationa instead of overwriting the data. This requires
+ * a XOR_PUT32 macro as well, but that should all be trivial.
+ *
+ * I thought about including routines for the separate cipher
+ * modes here, but it is unclear which modes should be included,
+ * and each encryption or decryption routine takes up a lot of code space.
+ * Also, I don't have any test vectors for any cipher modes
+ * with Twofish.
+ */
+
+
diff --git a/jni/libccrtp/sources/src/ccrtp/crypto/twofish.h b/jni/libccrtp/sources/src/ccrtp/crypto/twofish.h
new file mode 100644
index 0000000..cf444fa
--- /dev/null
+++ b/jni/libccrtp/sources/src/ccrtp/crypto/twofish.h
@@ -0,0 +1,214 @@
+/*
+ * Fast, portable, and easy-to-use Twofish implementation,
+ * Version 0.3.
+ * Copyright (c) 2002 by Niels Ferguson.
+ *
+ * See the twofish.c file for the details of the how and why of this code.
+ *
+ * The author hereby grants a perpetual license to everybody to
+ * use this code for any purpose as long as the copyright message is included
+ * in the source code of this or any derived work.
+ */
+
+
+/*
+ * PLATFORM FIXES
+ * ==============
+ *
+ * The following definitions have to be fixed for each particular platform
+ * you work on. If you have a multi-platform program, you no doubt have
+ * portable definitions that you can substitute here without changing
+ * the rest of the code.
+ *
+ * The defaults provided here should work on most PC compilers.
+ */
+#ifndef _TWOFISH_H
+#define _TWOFISH_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+/**
+ * A Twofish_Byte must be an unsigned 8-bit integer.
+ *
+ * It must also be the elementary data size of your C platform,
+ * i.e. sizeof( Twofish_Byte ) == 1.
+ */
+typedef unsigned char Twofish_Byte;
+
+/**
+ * A Twofish_UInt32 must be an unsigned integer of at least 32 bits.
+ *
+ * This type is used only internally in the implementation, so ideally it
+ * would not appear in the header file, but it is used inside the
+ * Twofish_key structure which means it has to be included here.
+ */
+typedef unsigned int Twofish_UInt32;
+
+
+/*
+ * END OF PLATFORM FIXES
+ * =====================
+ *
+ * You should not have to touch the rest of this file, but the code
+ * in twofish.c has a few things you need to fix too.
+ */
+
+/**
+ * Return codes
+ */
+
+#define SUCCESS 1
+#define ERR_UINT32 -2
+#define ERR_BYTE -3
+#define ERR_GET32 -4
+#define ERR_PUT32 -5
+#define ERR_ROLR -6
+#define ERR_BSWAP -7
+#define ERR_SELECTB -8
+#define ERR_TEST_ENC -9
+#define ERR_TEST_DEC -10
+#define ERR_SEQ_ENC -11
+#define ERR_SEQ_DEC -12
+#define ERR_ODD_KEY -13
+#define ERR_INIT -14
+#define ERR_KEY_LEN -15
+#define ERR_ILL_ARG -16
+
+
+/**
+ * Structure that contains a prepared Twofish key.
+ *
+ * A cipher key is used in two stages. In the first stage it is converted
+ * form the original form to an internal representation.
+ * This internal form is then used to encrypt and decrypt data.
+ * This structure contains the internal form. It is rather large: 4256 bytes
+ * on a platform with 32-bit unsigned values.
+ *
+ * Treat this as an opague structure, and don't try to manipulate the
+ * elements in it. I wish I could hide the inside of the structure,
+ * but C doesn't allow that.
+ */
+typedef
+ struct
+ {
+ Twofish_UInt32 s[4][256]; /* pre-computed S-boxes */
+ Twofish_UInt32 K[40]; /* Round key words */
+ }
+ Twofish_key;
+
+
+/**
+ * Initialise and test the Twofish implementation.
+ *
+ * This function MUST be called before any other function in the
+ * Twofish implementation is called.
+ * It only needs to be called once.
+ *
+ * Apart from initialising the implementation it performs a self test.
+ * If the Twofish_fatal function is not called, the code passed the test.
+ * (See the twofish.c file for details on the Twofish_fatal function.)
+ *
+ * @returns a negative number if an error happend, +1 otherwise
+ */
+extern int Twofish_initialise();
+
+
+/**
+ * Convert a cipher key to the internal form used for
+ * encryption and decryption.
+ *
+ * The cipher key is an array of bytes; the Twofish_Byte type is
+ * defined above to a type suitable on your platform.
+ *
+ * Any key must be converted to an internal form in the Twofisk_key structure
+ * before it can be used.
+ * The encryption and decryption functions only work with the internal form.
+ * The conversion to internal form need only be done once for each key value.
+ *
+ * Be sure to wipe all key storage, including the Twofish_key structure,
+ * once you are done with the key data.
+ * A simple memset( TwofishKey, 0, sizeof( TwofishKey ) ) will do just fine.
+ *
+ * Unlike most implementations, this one allows any key size from 0 bytes
+ * to 32 bytes. According to the Twofish specifications,
+ * irregular key sizes are handled by padding the key with zeroes at the end
+ * until the key size is 16, 24, or 32 bytes, whichever
+ * comes first. Note that each key of irregular size is equivalent to exactly
+ * one key of 16, 24, or 32 bytes.
+ *
+ * WARNING: Short keys have low entropy, and result in low security.
+ * Anything less than 8 bytes is utterly insecure. For good security
+ * use at least 16 bytes. I prefer to use 32-byte keys to prevent
+ * any collision attacks on the key.
+ *
+ * The key length argument key_len must be in the proper range.
+ * If key_len is not in the range 0,...,32 this routine attempts to generate
+ * a fatal error (depending on the code environment),
+ * and at best (or worst) returns without having done anything.
+ *
+ * @param key Array of key bytes
+ * @param key_len Number of key bytes, must be in the range 0,1,...,32.
+ * @para xkey Pointer to an Twofish_key structure that will be filled
+ * with the internal form of the cipher key.
+ * @returns a negative number if an error happend, +1 otherwise
+ */
+extern int Twofish_prepare_key(
+ Twofish_Byte key[],
+ int key_len,
+ Twofish_key * xkey
+ );
+
+
+/**
+ * Encrypt a single block of data.
+ *
+ * This function encrypts a single block of 16 bytes of data.
+ * If you want to encrypt a larger or variable-length message,
+ * you will have to use a cipher mode, such as CBC or CTR.
+ * These are outside the scope of this implementation.
+ *
+ * The xkey structure is not modified by this routine, and can be
+ * used for further encryption and decryption operations.
+ *
+ * @param xkey pointer to Twofish_key, internal form of the key
+ * produces by Twofish_prepare_key()
+ * @param p Plaintext to be encrypted
+ * @param c Place to store the ciphertext
+ */
+extern void Twofish_encrypt(
+ Twofish_key * xkey,
+ Twofish_Byte p[16],
+ Twofish_Byte c[16]
+ );
+
+
+/**
+ * Decrypt a single block of data.
+ *
+ * This function decrypts a single block of 16 bytes of data.
+ * If you want to decrypt a larger or variable-length message,
+ * you will have to use a cipher mode, such as CBC or CTR.
+ * These are outside the scope of this implementation.
+ *
+ * The xkey structure is not modified by this routine, and can be
+ * used for further encryption and decryption operations.
+ *
+ * @param xkey pointer to Twofish_key, internal form of the key
+ * produces by Twofish_prepare_key()
+ * @param c Ciphertext to be decrypted
+ * @param p Place to store the plaintext
+ */
+extern void Twofish_decrypt(
+ Twofish_key * xkey,
+ Twofish_Byte c[16],
+ Twofish_Byte p[16]
+ );
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/jni/libccrtp/sources/src/ccrtp/ext.h b/jni/libccrtp/sources/src/ccrtp/ext.h
index e398609..615562d 100644
--- a/jni/libccrtp/sources/src/ccrtp/ext.h
+++ b/jni/libccrtp/sources/src/ccrtp/ext.h
@@ -1,27 +1,27 @@
// Copyright (C) 1999-2003 Open Source Telecom Corporation.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,24 +35,23 @@
// If you do not wish that, delete this exception notice.
//
-/**
- * @file ext.h
+/**
+ * @file ext.h
* @short ccRTP Stack extensions.
**/
#ifndef CCXX_RTP_EXT_H
#define CCXX_RTP_EXT_H
-#ifndef CCXX_SOCKET_H_
-#include <cc++/socket.h>
+#ifndef COMMONCPP_SOCKET_H_
+#include <commoncpp/socket.h>
+#include <commoncpp/udp.h>
#endif
#include <ccrtp/ioqueue.h>
#include <ccrtp/channel.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup rtpext ccRTP Extension classes
@@ -69,101 +68,99 @@
* @author David Sugar
* @short RTP peer host over UDP.
*/
-class __EXPORT RTPDuplex : public RTPDataQueue,
- protected UDPReceive, public UDPTransmit
+class __EXPORT RTPDuplex : public RTPDataQueue,
+ protected UDPReceive, public UDPTransmit
{
public:
- /**
- * @param bind network address this socket is to be bound
- * @param local transport port this socket is to be bound
- * @param remote peer transpor port
- */
- RTPDuplex(const InetAddress &bind, tpport_t local, tpport_t remote);
+ /**
+ * @param bind network address this socket is to be bound
+ * @param local transport port this socket is to be bound
+ * @param remote peer transpor port
+ */
+ RTPDuplex(const InetAddress &bind, tpport_t local, tpport_t remote);
- /**
- *
- */
- virtual
- ~RTPDuplex();
+ /**
+ *
+ */
+ virtual
+ ~RTPDuplex();
- /**
- * @param host peer address
- * @param port peer port. If not specified, the same as the
- * local is used
- * @return socket status
- */
- UDPTransmit::Error
- connect(const InetHostAddress &host, tpport_t port = 0);
+ /**
+ * @param host peer address
+ * @param port peer port. If not specified, the same as the
+ * local is used
+ * @return socket status
+ */
+ UDPTransmit::Error
+ connect(const InetHostAddress &host, tpport_t port = 0);
protected:
- /**
- * @param timeout how much time to wait for new data
- * @return if there is some new data
- */
- bool
- isPendingData(microtimeout_t timeout)
- { return isPendingReceive(timeout); }
+ /**
+ * @param timeout how much time to wait for new data
+ * @return if there is some new data
+ */
+ bool
+ isPendingData(microtimeout_t timeout)
+ { return isPendingReceive(timeout); }
- /**
- * @param buffer pointer to data to be written
- * @param len how many octets to write
- * @return number of octets written
- */
- size_t
- sendData(const unsigned char *const buffer, size_t len)
- { return UDPTransmit::transmit((const char *)buffer, len); }
+ /**
+ * @param buffer pointer to data to be written
+ * @param len how many octets to write
+ * @return number of octets written
+ */
+ size_t
+ sendData(const unsigned char *const buffer, size_t len)
+ { return UDPTransmit::transmit((const char *)buffer, len); }
- /**
- * @param buffer where to store the retrieved data
- * @param len how many octets to read
- * @param na Source network address.
- * @param tp Source transport port.
- * @return number of octets read
- */
- size_t
- recvData(unsigned char *buffer, size_t len,
- InetHostAddress& na, tpport_t& tp)
- { /* na = UDPReceive::getPeer(&tp); FIX name ambiguity */
- return UDPReceive::receive(buffer, len); }
-
- /**
- * @param - peer host network address.
- * @param - peer host RTP data transport port.
- **/
+ /**
+ * @param buffer where to store the retrieved data
+ * @param len how many octets to read
+ * @param na Source network address.
+ * @param tp Source transport port.
+ * @return number of octets read
+ */
+ size_t
+ recvData(unsigned char *buffer, size_t len,
+ InetHostAddress& na, tpport_t& tp)
+ { /* na = UDPReceive::getPeer(&tp); FIX name ambiguity */
+ return UDPReceive::receive(buffer, len); }
+
+ /**
+ * @param - peer host network address.
+ * @param - peer host RTP data transport port.
+ **/
inline void
setDataPeer(const InetAddress&, tpport_t)
- { }
+ { }
- /**
- * @param - peer host network address.
- * @param - peer host RTCP transport port.
- **/
+ /**
+ * @param - peer host network address.
+ * @param - peer host RTCP transport port.
+ **/
inline void
setControlPeer(const InetAddress&, tpport_t)
- { }
+ { }
- inline size_t
- getNextDataPacketSize() const
- {
- // the const cast is a trick only needed for cc++2 <= 1.0.10
- size_t len; ccioctl(const_cast<RTPDuplex*>(this)->UDPReceive::getReceiver(),FIONREAD,len); return len;
- }
+ inline size_t
+ getNextDataPacketSize() const
+ {
+ // the const cast is a trick only needed for cc++2 <= 1.0.10
+ size_t len; ccioctl(const_cast<RTPDuplex*>(this)->UDPReceive::getReceiver(),FIONREAD,len); return len;
+ }
- /**
- * @return the associated peer information
- */
- SyncSource &getPeer();
+ /**
+ * @return the associated peer information
+ */
+ SyncSource &getPeer();
private:
- tpport_t dataBasePort;
+ tpport_t dataBasePort;
};
/*@}*/ // rtpext
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_EXT_H
diff --git a/jni/libccrtp/sources/src/ccrtp/formats.h b/jni/libccrtp/sources/src/ccrtp/formats.h
index d5896f1..7efc7ac 100644
--- a/jni/libccrtp/sources/src/ccrtp/formats.h
+++ b/jni/libccrtp/sources/src/ccrtp/formats.h
@@ -1,27 +1,27 @@
// Copyright (C) 2002 Federico Montesino Pouzols <fedemp@altern.org>.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,15 +35,13 @@
// If you do not wish that, delete this exception notice.
//
-#ifndef CCXX_RTP_FORMATS_H_
+#ifndef CCXX_RTP_FORMATS_H_
#define CCXX_RTP_FORMATS_H_
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
-/**
- * @file formats.h
+/**
+ * @file formats.h
*
* @short Payload types and formats.
**/
@@ -74,47 +72,47 @@
* AVP profile.
**/
typedef enum {
- // Types for audio formats:
- sptPCMU = 0, ///< ITU-T G.711. mu-law audio 8 Khz (RFC 1890)
- firstStaticPayloadType = sptPCMU,
- // 1016 static payload type is now deprecated. Type 1 is reserved.
- // spt1016, ///< CELP audio (FED-STD 1016) (RFC 1890)
- sptG726_32 = 2, ///< ITU-T G.726. ADPCM audio (RFC 1890)
- sptGSM, ///< GSM audio (RFC 1890)
- sptG723, ///< ITU-T G.723. MP-MLQ ACELP audio (RFC 1890)
- sptDVI4_8000, ///< Modified IMA ADPCM audio 8Khz (RFC 1890)
- sptDVI4_16000, ///< Modified IMA ADPCM audio 16Khz (RFC 1890)
- sptLPC, ///< LPC audio (RFC 1890)
- sptPCMA, ///< ITU-T G.711 A-law audio 8 Khz (RFC 1890)
- sptG722, ///< Audio (RFCs 1890, 3047)
- sptL16_DUAL, ///< Linear uncompressed dual audio (RFC 1890)
- sptL16_MONO, ///< Linear uncompressed mono audio (RFC 1890)
- sptQCELP, ///< Audio at 8000 hz.
- // Type 13 is reserved.
- sptMPA = 14, ///< MPEG Audio elem. stream (RFCs 1890, 2250)
- sptG728, ///< ITU-T G.728. LD-CELP audio
- sptDVI4_11025, ///< DVI audio at 11025 hz (by Joseph Di Pol)
- sptDVI4_22050, ///< DVI audio at 22050 hz (by Joseph Di Pol)
- sptG729, ///< ITU-T G.729. CS-ACELP audio
- // Type 19 is reserved. Types 20 - 23 are unassigned.
- lastStaticAudioPayloadType = sptG729,
+ // Types for audio formats:
+ sptPCMU = 0, ///< ITU-T G.711. mu-law audio 8 Khz (RFC 1890)
+ firstStaticPayloadType = sptPCMU,
+ // 1016 static payload type is now deprecated. Type 1 is reserved.
+ // spt1016, ///< CELP audio (FED-STD 1016) (RFC 1890)
+ sptG726_32 = 2, ///< ITU-T G.726. ADPCM audio (RFC 1890)
+ sptGSM, ///< GSM audio (RFC 1890)
+ sptG723, ///< ITU-T G.723. MP-MLQ ACELP audio (RFC 1890)
+ sptDVI4_8000, ///< Modified IMA ADPCM audio 8Khz (RFC 1890)
+ sptDVI4_16000, ///< Modified IMA ADPCM audio 16Khz (RFC 1890)
+ sptLPC, ///< LPC audio (RFC 1890)
+ sptPCMA, ///< ITU-T G.711 A-law audio 8 Khz (RFC 1890)
+ sptG722, ///< Audio (RFCs 1890, 3047)
+ sptL16_DUAL, ///< Linear uncompressed dual audio (RFC 1890)
+ sptL16_MONO, ///< Linear uncompressed mono audio (RFC 1890)
+ sptQCELP, ///< Audio at 8000 hz.
+ // Type 13 is reserved.
+ sptMPA = 14, ///< MPEG Audio elem. stream (RFCs 1890, 2250)
+ sptG728, ///< ITU-T G.728. LD-CELP audio
+ sptDVI4_11025, ///< DVI audio at 11025 hz (by Joseph Di Pol)
+ sptDVI4_22050, ///< DVI audio at 22050 hz (by Joseph Di Pol)
+ sptG729, ///< ITU-T G.729. CS-ACELP audio
+ // Type 19 is reserved. Types 20 - 23 are unassigned.
+ lastStaticAudioPayloadType = sptG729,
- // Types for video formats:
- // Type 24 is unassigned.
- sptCELB = 25, ///< Sun's propietary video (RFCs 1890, 2029)
- sptJPEG, ///< JPEG (ISO 10918) video (RFCs 1890, 2435)
- // Type 27 is unassigned.
- sptNV = 28, ///< Ron Frederick's nv audio (RFC 1890)
- // Types 29 and 30 are unassigned.
- sptH261 = 31, ///< ITU-T H.261 video (RFCs 1890, 2032)
- sptMPV, ///< MPEG Video elem. stream (RFCs 1890, 2250)
- sptMP2T, ///< MPEG 2 Transport stream (RFCs 1890, 2250)
- sptH263, ///< ITU-T H.263 video (RFCs 2190, 2429)
- // Types 35 - 71 are unassigned.
- // Types 72 - 76 are reserved.
- // Types 96 - 127 are dynamic.
- lastStaticPayloadType = sptH263
-} StaticPayloadType;
+ // Types for video formats:
+ // Type 24 is unassigned.
+ sptCELB = 25, ///< Sun's propietary video (RFCs 1890, 2029)
+ sptJPEG, ///< JPEG (ISO 10918) video (RFCs 1890, 2435)
+ // Type 27 is unassigned.
+ sptNV = 28, ///< Ron Frederick's nv audio (RFC 1890)
+ // Types 29 and 30 are unassigned.
+ sptH261 = 31, ///< ITU-T H.261 video (RFCs 1890, 2032)
+ sptMPV, ///< MPEG Video elem. stream (RFCs 1890, 2250)
+ sptMP2T, ///< MPEG 2 Transport stream (RFCs 1890, 2250)
+ sptH263, ///< ITU-T H.263 video (RFCs 2190, 2429)
+ // Types 35 - 71 are unassigned.
+ // Types 72 - 76 are reserved.
+ // Types 96 - 127 are dynamic.
+ lastStaticPayloadType = sptH263
+} StaticPayloadType;
/**
* @class PayloadFormat
@@ -127,65 +125,65 @@
* This is a base class for both StaticPayloadFormat and
* DynamicPayloadFormat.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT PayloadFormat
{
public:
- /**
- * Get payload type numeric identifier carried in RTP packets.
- *
- * @return payload type numeric identifier.
- **/
- inline PayloadType getPayloadType() const
- { return payloadType; }
+ /**
+ * Get payload type numeric identifier carried in RTP packets.
+ *
+ * @return payload type numeric identifier.
+ **/
+ inline PayloadType getPayloadType() const
+ { return payloadType; }
- /**
- * Get RTP clock rate for this payload format. Note this
- * method provides the RTP clock rate (for the timestamp in
- * RTP data packets headers), which is not necessarily the
- * same as the codec clock rate.
- *
- * @return RTP clock rate in Hz.
- **/
- inline uint32 getRTPClockRate() const
- { return RTPClockRate; }
-
+ /**
+ * Get RTP clock rate for this payload format. Note this
+ * method provides the RTP clock rate (for the timestamp in
+ * RTP data packets headers), which is not necessarily the
+ * same as the codec clock rate.
+ *
+ * @return RTP clock rate in Hz.
+ **/
+ inline uint32 getRTPClockRate() const
+ { return RTPClockRate; }
+
protected:
- /**
- * PayloadFormat must not be used but as base class.
- **/
- PayloadFormat()
- { }
-
- /**
- * PayloadFormat must not be used but as base class.
- **/
- inline virtual ~PayloadFormat()
- { }
+ /**
+ * PayloadFormat must not be used but as base class.
+ **/
+ PayloadFormat()
+ { }
- /**
- * Set payload type numeric identifier carried in RTP packets.
- *
- * @param pt payload type number.
- **/
- inline void setPayloadType(PayloadType pt)
- { payloadType = pt; }
+ /**
+ * PayloadFormat must not be used but as base class.
+ **/
+ inline virtual ~PayloadFormat()
+ { }
- /**
- * Set RTP clock rate.
- *
- * @param rate RTP clock rate in Hz.
- **/
- inline void setRTPClockRate(uint32 rate)
- { RTPClockRate = rate; }
+ /**
+ * Set payload type numeric identifier carried in RTP packets.
+ *
+ * @param pt payload type number.
+ **/
+ inline void setPayloadType(PayloadType pt)
+ { payloadType = pt; }
- // default clock rate
- static const uint32 defaultRTPClockRate;
+ /**
+ * Set RTP clock rate.
+ *
+ * @param rate RTP clock rate in Hz.
+ **/
+ inline void setRTPClockRate(uint32 rate)
+ { RTPClockRate = rate; }
+
+ // default clock rate
+ static const uint32 defaultRTPClockRate;
private:
- PayloadType payloadType; ///< Numeric identifier.
- uint32 RTPClockRate; ///< Rate in Hz.
+ PayloadType payloadType; ///< Numeric identifier.
+ uint32 RTPClockRate; ///< Rate in Hz.
};
/**
@@ -198,29 +196,29 @@
* StaticPayloadFormat(sptPCMU) will set the proper clock rate and any
* other parameters for that static payload type.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
- **/
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
+ **/
class __EXPORT StaticPayloadFormat : public PayloadFormat
{
public:
- /**
- * Constructor. Builds a payload format from a static payload
- * binding identifier, assigning the numeric identifier and
- * RTP clock rate statically bounded.
- *
- * @param type Numeric identifier in the range 0-96.
- * @note some identifiers are reserved.
- **/
- StaticPayloadFormat(StaticPayloadType type);
-
+ /**
+ * Constructor. Builds a payload format from a static payload
+ * binding identifier, assigning the numeric identifier and
+ * RTP clock rate statically bounded.
+ *
+ * @param type Numeric identifier in the range 0-96.
+ * @note some identifiers are reserved.
+ **/
+ StaticPayloadFormat(StaticPayloadType type);
+
private:
- /**
- * RTP clock rate for static payload types. There is no need
- * for a table like this for video types, since they all have
- * 90000 Khz rate.
- **/
- static uint32 staticAudioTypesRates[lastStaticAudioPayloadType -
- firstStaticPayloadType + 1];
+ /**
+ * RTP clock rate for static payload types. There is no need
+ * for a table like this for video types, since they all have
+ * 90000 Khz rate.
+ **/
+ static uint32 staticAudioTypesRates[lastStaticAudioPayloadType -
+ firstStaticPayloadType + 1];
};
/**
@@ -232,26 +230,24 @@
* assigned, it must be specified to the constructor. This class will
* be used by applications that support dynamic payload negotiation.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
- **/
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
+ **/
class __EXPORT DynamicPayloadFormat : public PayloadFormat
{
public:
- /**
- * Constructor. Builds a dynamic payload format from payload
- * numeric identifier and the corresponding RTP clock rate.
- *
- * @param type payload type numeric identifier.
- * @param rate RTP clock rate.
- **/
- DynamicPayloadFormat(PayloadType type, uint32 rate);
+ /**
+ * Constructor. Builds a dynamic payload format from payload
+ * numeric identifier and the corresponding RTP clock rate.
+ *
+ * @param type payload type numeric identifier.
+ * @param rate RTP clock rate.
+ **/
+ DynamicPayloadFormat(PayloadType type, uint32 rate);
};
-/** @}*/ // payload
+/** @}*/ // payload
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif // ndef CCXX_RTP_FORMATS_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/ioqueue.h b/jni/libccrtp/sources/src/ccrtp/ioqueue.h
index d8aa239..c33c3c3 100644
--- a/jni/libccrtp/sources/src/ccrtp/ioqueue.h
+++ b/jni/libccrtp/sources/src/ccrtp/ioqueue.h
@@ -41,15 +41,13 @@
* @short Generic RTP input/output queues.
**/
-#ifndef CCXX_RTP_IOQUEUE_H_
+#ifndef CCXX_RTP_IOQUEUE_H_
#define CCXX_RTP_IOQUEUE_H_
#include <ccrtp/iqueue.h>
#include <ccrtp/oqueue.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup ioqueue Generic RTP input/output queues.
@@ -75,56 +73,56 @@
* @short RTP data queue handler.
*/
class __EXPORT RTPDataQueue :
- public IncomingDataQueue,
- public OutgoingDataQueue
+ public IncomingDataQueue,
+ public OutgoingDataQueue
{
public:
- /**
- * @enum Tos rtp.h cc++/rtp.h
- * @short Type of network service the application uses.
- *
- * If the application uses enhanced network service, for
- * instance Integrated Services or Differentiated Services, it
- * <em>has not</em> to ensure fair competition with TCP,
- * provided that the requested service is actually being
- * delivered. Whenever the application uses best-effort
- * service or the requested enhanced service is not actually
- * being delivered, it <em>has</em> to ensure fair competition
- * with TCP. By default, best-effot is assumed.
- *
- * @note Although not required, RTP packets are always sent on
- * top of UDP segments. No other underlying transport protocol
- * is supported at present.
- *
- * @todo implement fair competition with tcp
- **/
- typedef enum {
- tosBestEffort, ///< Best-effort network service
- tosEnhanced ///< Enhanced network service
- } Tos;
+ /**
+ * @enum Tos rtp.h cc++/rtp.h
+ * @short Type of network service the application uses.
+ *
+ * If the application uses enhanced network service, for
+ * instance Integrated Services or Differentiated Services, it
+ * <em>has not</em> to ensure fair competition with TCP,
+ * provided that the requested service is actually being
+ * delivered. Whenever the application uses best-effort
+ * service or the requested enhanced service is not actually
+ * being delivered, it <em>has</em> to ensure fair competition
+ * with TCP. By default, best-effot is assumed.
+ *
+ * @note Although not required, RTP packets are always sent on
+ * top of UDP segments. No other underlying transport protocol
+ * is supported at present.
+ *
+ * @todo implement fair competition with tcp
+ **/
+ typedef enum {
+ tosBestEffort, ///< Best-effort network service
+ tosEnhanced ///< Enhanced network service
+ } Tos;
- /**
- * Specify the kind of service the application expects to use.
- *
- * @param tos type of service the application expects to use
- *
- * @note If enhanced service is specified but packet loss is
- * high (the requested service does not appear to actually be
- * delivered) ccRTP defaults to best-effort suitable
- * behaviour: guarantee fair competition with TCP.
- *
- * @todo Implement fair competition with tcp
- **/
- inline void
- setTypeOfService(Tos tos)
- { typeOfService = tos; }
+ /**
+ * Specify the kind of service the application expects to use.
+ *
+ * @param tos type of service the application expects to use
+ *
+ * @note If enhanced service is specified but packet loss is
+ * high (the requested service does not appear to actually be
+ * delivered) ccRTP defaults to best-effort suitable
+ * behaviour: guarantee fair competition with TCP.
+ *
+ * @todo Implement fair competition with tcp
+ **/
+ inline void
+ setTypeOfService(Tos tos)
+ { typeOfService = tos; }
- /**
- * Enable packet queue processing in the stack. This method
- * will not any thread of execution.
- **/
- inline void enableStack()
- { dataServiceActive = true; }
+ /**
+ * Enable packet queue processing in the stack. This method
+ * will not any thread of execution.
+ **/
+ inline void enableStack()
+ { dataServiceActive = true; }
/**
* Disable packet queue processing in the stack.
@@ -132,206 +130,204 @@
inline void disableStack()
{ dataServiceActive = false; }
- /**
- * Get active connection state flag.
- *
- * @return true if connection "active".
- */
- inline bool
- isActive() const
- { return dataServiceActive; }
+ /**
+ * Get active connection state flag.
+ *
+ * @return true if connection "active".
+ */
+ inline bool
+ isActive() const
+ { return dataServiceActive; }
- /**
- * Get the timestamp that should be given for a packet whose
- * payload sampling instant corresponds to the current system
- * time.
- *
- * The timestamp applications should provide for each packet
- * represents the sampling instant of its payload and should
- * not be a reading of the system clock. Nevertheless, the
- * internal operation of the RTP stack relies on the accuracy
- * of the provided timestamp, since several computations
- * assume that there is a certain degree of correspondence
- * between the timestamp and the system clock.
- *
- * It is recommended that applications use this method in
- * order to <em>periodically adjust the RTP timestamp</em>.
- *
- * In particular, it is advisable getting the timestamp
- * corresponding to the first sampling instant or any instant
- * after a period of inactivity through a call to this method.
- *
- * Applications should use the nominal sampling or
- * any other value provided by the coder in order to compute
- * the next timestamps with minimum computational requirement.
- *
- * For instance, an application using an RTP profile that
- * specifies a fixed sampling rate of 8 Khz with eight bits
- * per sample, continuously transmitting audio blocks 80
- * octets long, would transmit 100 packets every
- * second. Every packet would carry a timestamp 80 units
- * greater than the previous one. So, the first timestamp
- * would be obtained from this method, whereas the following
- * ones would be computed adding 80 every time. Also the
- * timestamp should be increased for every block whether
- * it is put in the queue or dropped.
- *
- * The aforementioned increment can be obtained from the
- * RTPDataQueue::getTimestampIncrement() method rather than
- * computing it by hand in the application.
- *
- * @note Frame based applications must follow a specific
- * timestamping method, probably specified in a profile.
- *
- * @note You should take into account that by default ccRTP
- * assumes that the application begins sampling at the queue
- * creation time. Moreover, the first sampling instant is
- * assigned a "user visible" timestamp of 0, although the RTP
- * stack will then add internally a ramdom offset unknown to
- * the application. That is to say, the application may count
- * samples from 0 in order to get the timestamp for the next
- * packet, provided that the first sampling instant is the
- * same as the queue creation time. Nevertheless, this
- * simpler way of starting will not be as accurate as it would
- * be if the application got at least the first timestamp
- * through getCurrentTimestamp. <em>We provide this option
- * since ccRTP interface is evolving, but we admit that it is
- * ugly, we could remove this option or even replace uint32
- * timestamps with a restrictively regulated object;
- * suggestions are gladly welcomed</em>
- **/
- uint32
- getCurrentTimestamp() const;
+ /**
+ * Get the timestamp that should be given for a packet whose
+ * payload sampling instant corresponds to the current system
+ * time.
+ *
+ * The timestamp applications should provide for each packet
+ * represents the sampling instant of its payload and should
+ * not be a reading of the system clock. Nevertheless, the
+ * internal operation of the RTP stack relies on the accuracy
+ * of the provided timestamp, since several computations
+ * assume that there is a certain degree of correspondence
+ * between the timestamp and the system clock.
+ *
+ * It is recommended that applications use this method in
+ * order to <em>periodically adjust the RTP timestamp</em>.
+ *
+ * In particular, it is advisable getting the timestamp
+ * corresponding to the first sampling instant or any instant
+ * after a period of inactivity through a call to this method.
+ *
+ * Applications should use the nominal sampling or
+ * any other value provided by the coder in order to compute
+ * the next timestamps with minimum computational requirement.
+ *
+ * For instance, an application using an RTP profile that
+ * specifies a fixed sampling rate of 8 Khz with eight bits
+ * per sample, continuously transmitting audio blocks 80
+ * octets long, would transmit 100 packets every
+ * second. Every packet would carry a timestamp 80 units
+ * greater than the previous one. So, the first timestamp
+ * would be obtained from this method, whereas the following
+ * ones would be computed adding 80 every time. Also the
+ * timestamp should be increased for every block whether
+ * it is put in the queue or dropped.
+ *
+ * The aforementioned increment can be obtained from the
+ * RTPDataQueue::getTimestampIncrement() method rather than
+ * computing it by hand in the application.
+ *
+ * @note Frame based applications must follow a specific
+ * timestamping method, probably specified in a profile.
+ *
+ * @note You should take into account that by default ccRTP
+ * assumes that the application begins sampling at the queue
+ * creation time. Moreover, the first sampling instant is
+ * assigned a "user visible" timestamp of 0, although the RTP
+ * stack will then add internally a ramdom offset unknown to
+ * the application. That is to say, the application may count
+ * samples from 0 in order to get the timestamp for the next
+ * packet, provided that the first sampling instant is the
+ * same as the queue creation time. Nevertheless, this
+ * simpler way of starting will not be as accurate as it would
+ * be if the application got at least the first timestamp
+ * through getCurrentTimestamp. <em>We provide this option
+ * since ccRTP interface is evolving, but we admit that it is
+ * ugly, we could remove this option or even replace uint32
+ * timestamps with a restrictively regulated object;
+ * suggestions are gladly welcomed</em>
+ **/
+ uint32
+ getCurrentTimestamp() const;
- /**
- * Specify the bandwidth of the current session.
- *
- * @param bw bandwidth of the current session, in bits/s.
- *
- * @see AVPQueue::setControlBandwidth()
- */
- void
- setSessionBandwidth(uint32 bw)
- { sessionBw = bw; }
+ /**
+ * Specify the bandwidth of the current session.
+ *
+ * @param bw bandwidth of the current session, in bits/s.
+ *
+ * @see AVPQueue::setControlBandwidth()
+ */
+ void
+ setSessionBandwidth(uint32 bw)
+ { sessionBw = bw; }
- uint32
- getDefaultSessionBandwidth() const
- { return defaultSessionBw; }
+ uint32
+ getDefaultSessionBandwidth() const
+ { return defaultSessionBw; }
- uint32
- getSessionBandwidth() const
- { return sessionBw; }
+ uint32
+ getSessionBandwidth() const
+ { return sessionBw; }
- /**
- * Set the packet timeclock for synchronizing timestamps.
- **/
- inline void
- setTimeclock()
- { timeclock.setTimer(); }
+ /**
+ * Set the packet timeclock for synchronizing timestamps.
+ **/
+ inline void
+ setTimeclock()
+ { timeclock.setTimer(); }
- /**
- * Get the packet timeclock for synchronizing timestamps.
- *
- * @return runtime in milliseconds since last set.
- */
- inline timeout_t
- getTimeclock() const
- { return timeclock.getElapsed(); }
+ /**
+ * Get the packet timeclock for synchronizing timestamps.
+ *
+ * @return runtime in milliseconds since last set.
+ */
+ inline timeout_t
+ getTimeclock() const
+ { return timeclock.getElapsed(); }
protected:
- /**
- * Constructor. This will generate a random application SSRC
- * identifier.
- *
- * @param size an estimation of the number of participants in
- * the session
- **/
- RTPDataQueue(uint32 size = defaultMembersHashSize);
+ /**
+ * Constructor. This will generate a random application SSRC
+ * identifier.
+ *
+ * @param size an estimation of the number of participants in
+ * the session
+ **/
+ RTPDataQueue(uint32 size = defaultMembersHashSize);
- /**
- * Using this constructor you can start a session with the
- * given ssrc, instead of the usual randomly generated
- * one. This is necessary when you need to initiate several
- * sessions having the same SSRC identifier, for instance, to
- * implement layered encoding, in which case each layer is
- * managed through a different session but all sessions share
- * the same SSRC identifier.
- *
- * @warning This doesn't seem to be a good solution
- *
- * @param ssrc Synchronization SouRCe identifier for this session
- * @param size an estimation of the number of participants in the
- * session
- */
- RTPDataQueue(uint32* ssrc, uint32 size = defaultMembersHashSize);
+ /**
+ * Using this constructor you can start a session with the
+ * given ssrc, instead of the usual randomly generated
+ * one. This is necessary when you need to initiate several
+ * sessions having the same SSRC identifier, for instance, to
+ * implement layered encoding, in which case each layer is
+ * managed through a different session but all sessions share
+ * the same SSRC identifier.
+ *
+ * @warning This doesn't seem to be a good solution
+ *
+ * @param ssrc Synchronization SouRCe identifier for this session
+ * @param size an estimation of the number of participants in the
+ * session
+ */
+ RTPDataQueue(uint32* ssrc, uint32 size = defaultMembersHashSize);
- /**
- * The queue destructor flushes the queue and stops all
- * services.
- */
- inline virtual
- ~RTPDataQueue()
- { endQueue(); }
+ /**
+ * The queue destructor flushes the queue and stops all
+ * services.
+ */
+ inline virtual
+ ~RTPDataQueue()
+ { endQueue(); }
/**
* A plugin point for timer tick driven events.
*/
inline virtual void
- timerTick()
- { return; }
+ timerTick()
+ { return; }
- void renewLocalSSRC()
- {IncomingDataQueue::renewLocalSSRC();}
+ void renewLocalSSRC()
+ {IncomingDataQueue::renewLocalSSRC();}
private:
- RTPDataQueue(const RTPDataQueue &o);
+ RTPDataQueue(const RTPDataQueue &o);
- RTPDataQueue&
- operator=(const RTPDataQueue &o);
+ RTPDataQueue&
+ operator=(const RTPDataQueue &o);
- /**
- * Global queue initialization.
- *
- * @param localSSRC local 32-bit SSRC identifier
- **/
- void
- initQueue();
+ /**
+ * Global queue initialization.
+ *
+ * @param localSSRC local 32-bit SSRC identifier
+ **/
+ void
+ initQueue();
protected:
- /**
- * This method ends the queue.
- */
- void
- endQueue();
+ /**
+ * This method ends the queue.
+ */
+ void
+ endQueue();
- /**
- * This function is used to check for and schedule against
- * arriving packets based on the derived connection type.
- *
- * @return true if packet waiting for processing.
- * @param number of microseconds to wait.
- */
- virtual bool
- isPendingData(microtimeout_t timeout) = 0;
+ /**
+ * This function is used to check for and schedule against
+ * arriving packets based on the derived connection type.
+ *
+ * @return true if packet waiting for processing.
+ * @param number of microseconds to wait.
+ */
+ virtual bool
+ isPendingData(microtimeout_t timeout) = 0;
private:
- // true if connection "active"
- volatile bool dataServiceActive;
- Tos typeOfService;
- TimerPort timeclock;
- /* RTP session bandwidth control */
- static const uint32 defaultSessionBw;
- uint32 sessionBw;
+ // true if connection "active"
+ volatile bool dataServiceActive;
+ Tos typeOfService;
+ TimerPort timeclock;
+ /* RTP session bandwidth control */
+ static const uint32 defaultSessionBw;
+ uint32 sessionBw;
};
/** @}*/ // ioqueue
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_IOQUEUE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/iqueue.h b/jni/libccrtp/sources/src/ccrtp/iqueue.h
index 0fbd14d..36350d4 100644
--- a/jni/libccrtp/sources/src/ccrtp/iqueue.h
+++ b/jni/libccrtp/sources/src/ccrtp/iqueue.h
@@ -41,7 +41,7 @@
* @short Generic RTP input queues.
**/
-#ifndef CCXX_RTP_IQUEUE_H_
+#ifndef CCXX_RTP_IQUEUE_H_
#define CCXX_RTP_IQUEUE_H_
#include <ccrtp/queuebase.h>
@@ -49,9 +49,7 @@
#include <list>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup iqueue Generic RTP input queues.
@@ -70,52 +68,52 @@
class __EXPORT Members
{
public:
- inline void
- setMembersCount(uint32 n)
- { members = n; }
+ inline void
+ setMembersCount(uint32 n)
+ { members = n; }
- inline void
- increaseMembersCount()
- { members++; }
+ inline void
+ increaseMembersCount()
+ { members++; }
- inline void
- decreaseMembersCount()
- { members--; }
+ inline void
+ decreaseMembersCount()
+ { members--; }
- inline uint32
- getMembersCount() const
- { return members; }
+ inline uint32
+ getMembersCount() const
+ { return members; }
- inline void
- setSendersCount(uint32 n)
- { activeSenders = n; }
+ inline void
+ setSendersCount(uint32 n)
+ { activeSenders = n; }
- inline void
- increaseSendersCount()
- { activeSenders++; }
+ inline void
+ increaseSendersCount()
+ { activeSenders++; }
- inline void
- decreaseSendersCount()
- { activeSenders--; }
+ inline void
+ decreaseSendersCount()
+ { activeSenders--; }
- inline uint32
- getSendersCount() const
- { return activeSenders; }
+ inline uint32
+ getSendersCount() const
+ { return activeSenders; }
protected:
- Members() :
- members(0),
- activeSenders(0)
- { }
+ Members() :
+ members(0),
+ activeSenders(0)
+ { }
- inline virtual ~Members()
- { }
+ inline virtual ~Members()
+ { }
private:
- /// number of identified members
- uint32 members;
- /// number of identified members that currently are active senders
- uint32 activeSenders;
+ /// number of identified members
+ uint32 members;
+ /// number of identified members that currently are active senders
+ uint32 activeSenders;
};
/**
@@ -127,50 +125,50 @@
class __EXPORT SyncSourceHandler
{
public:
- /**
- * This requires SyncSource - SyncSourceHandler friendship.
- *
- * Get the SyncSourceLink corresponding to a SyncSource
- * object.
- **/
- inline void*
- getLink(const SyncSource& source) const
- { return source.getLink(); }
+ /**
+ * This requires SyncSource - SyncSourceHandler friendship.
+ *
+ * Get the SyncSourceLink corresponding to a SyncSource
+ * object.
+ **/
+ inline void*
+ getLink(const SyncSource& source) const
+ { return source.getLink(); }
- inline void
- setLink(SyncSource& source, void* link)
- { source.setLink(link); }
+ inline void
+ setLink(SyncSource& source, void* link)
+ { source.setLink(link); }
- inline void
- setParticipant(SyncSource& source, Participant& p)
- { source.setParticipant(p); }
+ inline void
+ setParticipant(SyncSource& source, Participant& p)
+ { source.setParticipant(p); }
- inline void
- setState(SyncSource& source, SyncSource::State ns)
- { source.setState(ns); }
+ inline void
+ setState(SyncSource& source, SyncSource::State ns)
+ { source.setState(ns); }
- inline void
- setSender(SyncSource& source, bool active)
- { source.setSender(active); }
+ inline void
+ setSender(SyncSource& source, bool active)
+ { source.setSender(active); }
- inline void
- setDataTransportPort(SyncSource& source, tpport_t p)
- { source.setDataTransportPort(p); }
+ inline void
+ setDataTransportPort(SyncSource& source, tpport_t p)
+ { source.setDataTransportPort(p); }
- inline void
- setControlTransportPort(SyncSource& source, tpport_t p)
- { source.setControlTransportPort(p); }
+ inline void
+ setControlTransportPort(SyncSource& source, tpport_t p)
+ { source.setControlTransportPort(p); }
- inline void
- setNetworkAddress(SyncSource& source, InetAddress addr)
- { source.setNetworkAddress(addr); }
+ inline void
+ setNetworkAddress(SyncSource& source, InetAddress addr)
+ { source.setNetworkAddress(addr); }
protected:
- SyncSourceHandler()
- { }
+ SyncSourceHandler()
+ { }
- inline virtual ~SyncSourceHandler()
- { }
+ inline virtual ~SyncSourceHandler()
+ { }
};
/**
@@ -182,21 +180,21 @@
class __EXPORT ParticipantHandler
{
public:
- inline void
- setSDESItem(Participant* part, SDESItemType item,
- const std::string& val)
- { part->setSDESItem(item,val); }
+ inline void
+ setSDESItem(Participant* part, SDESItemType item,
+ const std::string& val)
+ { part->setSDESItem(item,val); }
- inline void
- setPRIVPrefix(Participant* part, const std::string val)
- { part->setPRIVPrefix(val); }
+ inline void
+ setPRIVPrefix(Participant* part, const std::string val)
+ { part->setPRIVPrefix(val); }
protected:
- ParticipantHandler()
- { }
+ ParticipantHandler()
+ { }
- inline virtual ~ParticipantHandler()
- { }
+ inline virtual ~ParticipantHandler()
+ { }
};
/**
@@ -208,21 +206,21 @@
class __EXPORT ApplicationHandler
{
public:
- inline void
- addParticipant(RTPApplication& app, Participant& part)
- { app.addParticipant(part); }
+ inline void
+ addParticipant(RTPApplication& app, Participant& part)
+ { app.addParticipant(part); }
- inline void
- removeParticipant(RTPApplication& app,
- RTPApplication::ParticipantLink* pl)
- { app.removeParticipant(pl); }
+ inline void
+ removeParticipant(RTPApplication& app,
+ RTPApplication::ParticipantLink* pl)
+ { app.removeParticipant(pl); }
protected:
- ApplicationHandler()
- { }
+ ApplicationHandler()
+ { }
- inline virtual ~ApplicationHandler()
- { }
+ inline virtual ~ApplicationHandler()
+ { }
};
/**
@@ -235,57 +233,57 @@
class __EXPORT ConflictHandler
{
public:
- struct ConflictingTransportAddress
- {
- ConflictingTransportAddress(InetAddress na,
- tpport_t dtp, tpport_t ctp);
+ struct ConflictingTransportAddress
+ {
+ ConflictingTransportAddress(InetAddress na,
+ tpport_t dtp, tpport_t ctp);
- void setNext(ConflictingTransportAddress* nc)
- { next = nc; }
+ void setNext(ConflictingTransportAddress* nc)
+ { next = nc; }
- inline const InetAddress& getNetworkAddress( ) const
- { return networkAddress; }
+ inline const InetAddress& getNetworkAddress( ) const
+ { return networkAddress; }
- inline tpport_t getDataTransportPort() const
- { return dataTransportPort; }
+ inline tpport_t getDataTransportPort() const
+ { return dataTransportPort; }
- inline tpport_t getControlTransportPort() const
- { return controlTransportPort; }
+ inline tpport_t getControlTransportPort() const
+ { return controlTransportPort; }
- InetAddress networkAddress;
- tpport_t dataTransportPort;
- tpport_t controlTransportPort;
- ConflictingTransportAddress* next;
- // arrival time of last data or control packet.
- timeval lastPacketTime;
- };
+ InetAddress networkAddress;
+ tpport_t dataTransportPort;
+ tpport_t controlTransportPort;
+ ConflictingTransportAddress* next;
+ // arrival time of last data or control packet.
+ timeval lastPacketTime;
+ };
- /**
- * @param na Inet network address.
- * @param dtp Data transport port.
- **/
- ConflictingTransportAddress* searchDataConflict(InetAddress na,
- tpport_t dtp);
- /**
- * @param na Inet network address.
- * @param ctp Data transport port.
- **/
- ConflictingTransportAddress* searchControlConflict(InetAddress na,
- tpport_t ctp);
+ /**
+ * @param na Inet network address.
+ * @param dtp Data transport port.
+ **/
+ ConflictingTransportAddress* searchDataConflict(InetAddress na,
+ tpport_t dtp);
+ /**
+ * @param na Inet network address.
+ * @param ctp Data transport port.
+ **/
+ ConflictingTransportAddress* searchControlConflict(InetAddress na,
+ tpport_t ctp);
- void updateConflict(ConflictingTransportAddress& ca)
- { gettimeofday(&(ca.lastPacketTime),NULL); }
+ void updateConflict(ConflictingTransportAddress& ca)
+ { SysTime::gettimeofday(&(ca.lastPacketTime),NULL); }
- void addConflict(const InetAddress& na, tpport_t dtp, tpport_t ctp);
+ void addConflict(const InetAddress& na, tpport_t dtp, tpport_t ctp);
protected:
- ConflictHandler()
- { firstConflict = lastConflict = NULL; }
+ ConflictHandler()
+ { firstConflict = lastConflict = NULL; }
- inline virtual ~ConflictHandler()
- { }
+ inline virtual ~ConflictHandler()
+ { }
- ConflictingTransportAddress* firstConflict, * lastConflict;
+ ConflictingTransportAddress* firstConflict, * lastConflict;
};
/**
@@ -299,579 +297,579 @@
* @author Federico Montesino Pouzols <fedemp@altern.org>
*/
class __EXPORT MembershipBookkeeping :
- public SyncSourceHandler,
- public ParticipantHandler,
- public ApplicationHandler,
- public ConflictHandler,
- private Members
+ public SyncSourceHandler,
+ public ParticipantHandler,
+ public ApplicationHandler,
+ public ConflictHandler,
+ private Members
{
public:
- inline size_t getDefaultMembersHashSize()
- { return defaultMembersHashSize; }
+ inline size_t getDefaultMembersHashSize()
+ { return defaultMembersHashSize; }
protected:
- /**
- * @short The initial size is a hint to allocate the resources
- * needed in order to keep the members' identifiers and
- * associated information.
- *
- * Although ccRTP will reallocate resources when it becomes
- * necessary, a good hint may save a lot of unpredictable time
- * penalties.
- *
- * @param initialSize an estimation of how many participants
- * the session will consist of.
- *
- */
- MembershipBookkeeping(uint32 initialSize = defaultMembersHashSize);
+ /**
+ * @short The initial size is a hint to allocate the resources
+ * needed in order to keep the members' identifiers and
+ * associated information.
+ *
+ * Although ccRTP will reallocate resources when it becomes
+ * necessary, a good hint may save a lot of unpredictable time
+ * penalties.
+ *
+ * @param initialSize an estimation of how many participants
+ * the session will consist of.
+ *
+ */
+ MembershipBookkeeping(uint32 initialSize = defaultMembersHashSize);
- /**
- * Purges all RTPSource structures created during the session,
- * as well as the hash table and the list of sources.
- **/
- inline virtual
- ~MembershipBookkeeping()
- { endMembers(); }
+ /**
+ * Purges all RTPSource structures created during the session,
+ * as well as the hash table and the list of sources.
+ **/
+ inline virtual
+ ~MembershipBookkeeping()
+ { endMembers(); }
- struct SyncSourceLink;
+ struct SyncSourceLink;
- inline SyncSourceLink* getLink(const SyncSource& source) const
- { return static_cast<SyncSourceLink*>(SyncSourceHandler::getLink(source)); }
- /**
- * Get whether a synchronization source is recorded in this
- * membership controller.
- **/
- inline bool isMine(const SyncSource& source) const
- { return getLink(source)->getMembership() == this; }
+ inline SyncSourceLink* getLink(const SyncSource& source) const
+ { return static_cast<SyncSourceLink*>(SyncSourceHandler::getLink(source)); }
+ /**
+ * Get whether a synchronization source is recorded in this
+ * membership controller.
+ **/
+ inline bool isMine(const SyncSource& source) const
+ { return getLink(source)->getMembership() == this; }
- /**
- * @struct IncomingRTPPktLink
- *
- * @short Incoming RTP data packets control structure within
- * the incoming packet queue class.
- **/
- struct IncomingRTPPktLink
- {
- IncomingRTPPktLink(IncomingRTPPkt* pkt, SyncSourceLink* sLink,
- struct timeval& recv_ts,
- uint32 shifted_ts,
- IncomingRTPPktLink* sp,
- IncomingRTPPktLink* sn,
- IncomingRTPPktLink* p,
- IncomingRTPPktLink* n) :
- packet(pkt),
- sourceLink(sLink),
- prev(p), next(n),
- srcPrev(sp), srcNext(sn),
- receptionTime(recv_ts),
- shiftedTimestamp(shifted_ts)
- { }
+ /**
+ * @struct IncomingRTPPktLink
+ *
+ * @short Incoming RTP data packets control structure within
+ * the incoming packet queue class.
+ **/
+ struct IncomingRTPPktLink
+ {
+ IncomingRTPPktLink(IncomingRTPPkt* pkt, SyncSourceLink* sLink,
+ struct timeval& recv_ts,
+ uint32 shifted_ts,
+ IncomingRTPPktLink* sp,
+ IncomingRTPPktLink* sn,
+ IncomingRTPPktLink* p,
+ IncomingRTPPktLink* n) :
+ packet(pkt),
+ sourceLink(sLink),
+ prev(p), next(n),
+ srcPrev(sp), srcNext(sn),
+ receptionTime(recv_ts),
+ shiftedTimestamp(shifted_ts)
+ { }
- ~IncomingRTPPktLink()
- { }
+ ~IncomingRTPPktLink()
+ { }
- inline SyncSourceLink* getSourceLink() const
- { return sourceLink; }
+ inline SyncSourceLink* getSourceLink() const
+ { return sourceLink; }
- inline void setSourceLink(SyncSourceLink* src)
- { sourceLink = src; }
+ inline void setSourceLink(SyncSourceLink* src)
+ { sourceLink = src; }
- inline IncomingRTPPktLink* getNext() const
- { return next; }
+ inline IncomingRTPPktLink* getNext() const
+ { return next; }
- inline void setNext(IncomingRTPPktLink* nl)
- { next = nl; }
+ inline void setNext(IncomingRTPPktLink* nl)
+ { next = nl; }
- inline IncomingRTPPktLink* getPrev() const
- { return prev; }
+ inline IncomingRTPPktLink* getPrev() const
+ { return prev; }
- inline void setPrev(IncomingRTPPktLink* pl)
- { prev = pl; }
+ inline void setPrev(IncomingRTPPktLink* pl)
+ { prev = pl; }
- inline IncomingRTPPktLink* getSrcNext() const
- { return srcNext; }
+ inline IncomingRTPPktLink* getSrcNext() const
+ { return srcNext; }
- inline void setSrcNext(IncomingRTPPktLink* sn)
- { srcNext = sn; }
+ inline void setSrcNext(IncomingRTPPktLink* sn)
+ { srcNext = sn; }
- inline IncomingRTPPktLink* getSrcPrev() const
- { return srcPrev; }
+ inline IncomingRTPPktLink* getSrcPrev() const
+ { return srcPrev; }
- inline void setSrcPrev(IncomingRTPPktLink* sp)
- { srcPrev = sp; }
+ inline void setSrcPrev(IncomingRTPPktLink* sp)
+ { srcPrev = sp; }
- inline IncomingRTPPkt* getPacket() const
- { return packet; }
+ inline IncomingRTPPkt* getPacket() const
+ { return packet; }
- inline void setPacket(IncomingRTPPkt* pkt)
- { packet = pkt; }
+ inline void setPacket(IncomingRTPPkt* pkt)
+ { packet = pkt; }
- /**
- * Set the time this packet was received at.
- *
- * @param t time of reception.
- * @note this has almost nothing to do with the 32-bit
- * timestamp contained in the packet header.
- **/
- inline void setRecvTime(const timeval &t)
- { receptionTime = t; }
+ /**
+ * Set the time this packet was received at.
+ *
+ * @param t time of reception.
+ * @note this has almost nothing to do with the 32-bit
+ * timestamp contained in the packet header.
+ **/
+ inline void setRecvTime(const timeval &t)
+ { receptionTime = t; }
- /**
- * Get the time this packet was received at.
- **/
- inline timeval getRecvTime() const
- { return receptionTime; }
+ /**
+ * Get the time this packet was received at.
+ **/
+ inline timeval getRecvTime() const
+ { return receptionTime; }
- /**
- * Get timestamp of this packet. The timestamp of
- * incoming packets is filtered so that the timestamp
- * this method provides for the first packet received
- * from every source starts from 0.
- *
- * @return 32 bit timestamp starting from 0 for each source.
- */
- inline uint32 getTimestamp() const
- { return shiftedTimestamp; }
+ /**
+ * Get timestamp of this packet. The timestamp of
+ * incoming packets is filtered so that the timestamp
+ * this method provides for the first packet received
+ * from every source starts from 0.
+ *
+ * @return 32 bit timestamp starting from 0 for each source.
+ */
+ inline uint32 getTimestamp() const
+ { return shiftedTimestamp; }
- inline void setTimestamp(uint32 ts)
- { shiftedTimestamp = ts;}
+ inline void setTimestamp(uint32 ts)
+ { shiftedTimestamp = ts;}
- // the packet this link refers to.
- IncomingRTPPkt* packet;
- // the synchronization source this packet comes from.
- SyncSourceLink* sourceLink;
- // global incoming packet queue links.
- IncomingRTPPktLink* prev, * next;
- // source specific incoming packet queue links.
- IncomingRTPPktLink* srcPrev, * srcNext;
- // time this packet was received at
- struct timeval receptionTime;
- // timestamp of the packet in host order and after
- // substracting the initial timestamp for its source
- // (it is an increment from the initial timestamp).
- uint32 shiftedTimestamp;
- };
+ // the packet this link refers to.
+ IncomingRTPPkt* packet;
+ // the synchronization source this packet comes from.
+ SyncSourceLink* sourceLink;
+ // global incoming packet queue links.
+ IncomingRTPPktLink* prev, * next;
+ // source specific incoming packet queue links.
+ IncomingRTPPktLink* srcPrev, * srcNext;
+ // time this packet was received at
+ struct timeval receptionTime;
+ // timestamp of the packet in host order and after
+ // substracting the initial timestamp for its source
+ // (it is an increment from the initial timestamp).
+ uint32 shiftedTimestamp;
+ };
- /**
- * @struct SyncSourceLink
- *
- * @short Synchronization Source internal handler within the
- * incoming packets queue.
- *
- * Incoming packets queue objects hold a hash table and a
- * linked list of synchronization sources. For each of these
- * sources, there is also a linked list of incoming rtp
- * packets, which are linked in an "all incoming packets" list
- * as well. SyncSourceLink objects hold the necessary data to
- * maintain these data estructures, as well as source specific
- * information and statistics for RTCP,
- *
- * @author Federico Montesino Pouzols <fedemp@altern.org>
- **/
- struct SyncSourceLink
- {
- // 2^16
- static const uint32 SEQNUMMOD;
+ /**
+ * @struct SyncSourceLink
+ *
+ * @short Synchronization Source internal handler within the
+ * incoming packets queue.
+ *
+ * Incoming packets queue objects hold a hash table and a
+ * linked list of synchronization sources. For each of these
+ * sources, there is also a linked list of incoming rtp
+ * packets, which are linked in an "all incoming packets" list
+ * as well. SyncSourceLink objects hold the necessary data to
+ * maintain these data estructures, as well as source specific
+ * information and statistics for RTCP,
+ *
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
+ **/
+ struct SyncSourceLink
+ {
+ // 2^16
+ static const uint32 SEQNUMMOD;
- SyncSourceLink(MembershipBookkeeping* m,
- SyncSource* s,
- IncomingRTPPktLink* fp = NULL,
- IncomingRTPPktLink* lp = NULL,
- SyncSourceLink* ps = NULL,
- SyncSourceLink* ns = NULL,
- SyncSourceLink* ncollis = NULL) :
- membership(m), source(s), first(fp), last(lp),
- prev(ps), next(ns), nextCollis(ncollis),
- prevConflict(NULL)
- { m->setLink(*s,this); // record that the source is associated
- initStats(); // to this link.
- }
+ SyncSourceLink(MembershipBookkeeping* m,
+ SyncSource* s,
+ IncomingRTPPktLink* fp = NULL,
+ IncomingRTPPktLink* lp = NULL,
+ SyncSourceLink* ps = NULL,
+ SyncSourceLink* ns = NULL,
+ SyncSourceLink* ncollis = NULL) :
+ membership(m), source(s), first(fp), last(lp),
+ prev(ps), next(ns), nextCollis(ncollis),
+ prevConflict(NULL)
+ { m->setLink(*s,this); // record that the source is associated
+ initStats(); // to this link.
+ }
- /**
- * Note it deletes the source.
- **/
- ~SyncSourceLink();
+ /**
+ * Note it deletes the source.
+ **/
+ ~SyncSourceLink();
- inline MembershipBookkeeping* getMembership()
- { return membership; }
+ inline MembershipBookkeeping* getMembership()
+ { return membership; }
- /**
- * Get the synchronization source object this link
- * objet holds information for.
- **/
- inline SyncSource* getSource() { return source; }
+ /**
+ * Get the synchronization source object this link
+ * objet holds information for.
+ **/
+ inline SyncSource* getSource() { return source; }
- /**
- * Get first RTP (data) packet in the queue of packets
- * received from this socket.
- **/
- inline IncomingRTPPktLink* getFirst()
- { return first; }
+ /**
+ * Get first RTP (data) packet in the queue of packets
+ * received from this socket.
+ **/
+ inline IncomingRTPPktLink* getFirst()
+ { return first; }
- inline void setFirst(IncomingRTPPktLink* fp)
- { first = fp; }
+ inline void setFirst(IncomingRTPPktLink* fp)
+ { first = fp; }
- /**
- * Get last RTP (data) packet in the queue of packets
- * received from this socket.
- **/
- inline IncomingRTPPktLink* getLast()
- { return last; }
+ /**
+ * Get last RTP (data) packet in the queue of packets
+ * received from this socket.
+ **/
+ inline IncomingRTPPktLink* getLast()
+ { return last; }
- inline void setLast(IncomingRTPPktLink* lp)
- { last = lp; }
+ inline void setLast(IncomingRTPPktLink* lp)
+ { last = lp; }
- /**
- * Get the link object for the previous RTP source.
- **/
- inline SyncSourceLink* getPrev()
- { return prev; }
+ /**
+ * Get the link object for the previous RTP source.
+ **/
+ inline SyncSourceLink* getPrev()
+ { return prev; }
- inline void setPrev(SyncSourceLink* ps)
- { prev = ps; }
+ inline void setPrev(SyncSourceLink* ps)
+ { prev = ps; }
- /**
- * Get the link object for the next RTP source.
- **/
- inline SyncSourceLink* getNext()
- { return next; }
+ /**
+ * Get the link object for the next RTP source.
+ **/
+ inline SyncSourceLink* getNext()
+ { return next; }
- inline void setNext(SyncSourceLink *ns)
- { next = ns; }
+ inline void setNext(SyncSourceLink *ns)
+ { next = ns; }
- /**
- * Get the link object for the next RTP source in the
- * hash table entry collision list. Note that
- * collision does not refer to SSRC collision, but
- * hash table collision.
- **/
- inline SyncSourceLink* getNextCollis()
- { return nextCollis; }
+ /**
+ * Get the link object for the next RTP source in the
+ * hash table entry collision list. Note that
+ * collision does not refer to SSRC collision, but
+ * hash table collision.
+ **/
+ inline SyncSourceLink* getNextCollis()
+ { return nextCollis; }
- inline void setNextCollis(SyncSourceLink* ns)
- { nextCollis = ns; }
+ inline void setNextCollis(SyncSourceLink* ns)
+ { nextCollis = ns; }
- inline ConflictingTransportAddress* getPrevConflict() const
- { return prevConflict; }
+ inline ConflictingTransportAddress* getPrevConflict() const
+ { return prevConflict; }
- /**
- * Get conflicting address.
- **/
- void setPrevConflict(InetAddress& addr, tpport_t dataPort,
- tpport_t controlPort);
+ /**
+ * Get conflicting address.
+ **/
+ void setPrevConflict(InetAddress& addr, tpport_t dataPort,
+ tpport_t controlPort);
- unsigned char* getSenderInfo()
- { return senderInfo; }
+ unsigned char* getSenderInfo()
+ { return senderInfo; }
- void setSenderInfo(unsigned char* si);
+ void setSenderInfo(unsigned char* si);
- unsigned char* getReceiverInfo()
- { return receiverInfo; }
+ unsigned char* getReceiverInfo()
+ { return receiverInfo; }
- void setReceiverInfo(unsigned char* ri);
+ void setReceiverInfo(unsigned char* ri);
- inline timeval getLastPacketTime() const
- { return lastPacketTime; }
+ inline timeval getLastPacketTime() const
+ { return lastPacketTime; }
- inline timeval getLastRTCPPacketTime() const
- { return lastRTCPPacketTime; }
+ inline timeval getLastRTCPPacketTime() const
+ { return lastRTCPPacketTime; }
- inline timeval getLastRTCPSRTime() const
- { return lastRTCPSRTime; }
+ inline timeval getLastRTCPSRTime() const
+ { return lastRTCPSRTime; }
- /**
- * Get the total number of RTP packets received from this
- * source.
- */
- inline uint32 getObservedPacketCount() const
- { return obsPacketCount; }
+ /**
+ * Get the total number of RTP packets received from this
+ * source.
+ */
+ inline uint32 getObservedPacketCount() const
+ { return obsPacketCount; }
- inline void incObservedPacketCount()
- { obsPacketCount++; }
+ inline void incObservedPacketCount()
+ { obsPacketCount++; }
- /**
- * Get the total number of payload octets received from this
- * source.
- **/
- inline uint32 getObservedOctetCount() const
- { return obsOctetCount; }
+ /**
+ * Get the total number of payload octets received from this
+ * source.
+ **/
+ inline uint32 getObservedOctetCount() const
+ { return obsOctetCount; }
- inline void incObservedOctetCount(uint32 n)
- { obsOctetCount += n; }
+ inline void incObservedOctetCount(uint32 n)
+ { obsOctetCount += n; }
- /**
- * Get the highest valid sequence number received.
- **/
- uint16
- getMaxSeqNum() const
- { return maxSeqNum; }
+ /**
+ * Get the highest valid sequence number received.
+ **/
+ uint16
+ getMaxSeqNum() const
+ { return maxSeqNum; }
- /**
- * Set the highest valid sequence number recived.
- * @param max Sequence number.
- **/
- void
- setMaxSeqNum(uint16 max)
- { maxSeqNum = max; }
+ /**
+ * Set the highest valid sequence number recived.
+ * @param max Sequence number.
+ **/
+ void
+ setMaxSeqNum(uint16 max)
+ { maxSeqNum = max; }
- inline uint32
- getExtendedMaxSeqNum() const
- { return extendedMaxSeqNum; }
+ inline uint32
+ getExtendedMaxSeqNum() const
+ { return extendedMaxSeqNum; }
- inline void
- setExtendedMaxSeqNum(uint32 seq)
- { extendedMaxSeqNum = seq; }
+ inline void
+ setExtendedMaxSeqNum(uint32 seq)
+ { extendedMaxSeqNum = seq; }
- inline uint32 getCumulativePacketLost() const
- { return cumulativePacketLost; }
+ inline uint32 getCumulativePacketLost() const
+ { return cumulativePacketLost; }
- inline void setCumulativePacketLost(uint32 pl)
- { cumulativePacketLost = pl; }
+ inline void setCumulativePacketLost(uint32 pl)
+ { cumulativePacketLost = pl; }
- inline uint8 getFractionLost() const
- { return fractionLost; }
+ inline uint8 getFractionLost() const
+ { return fractionLost; }
- inline void setFractionLost(uint8 fl)
- { fractionLost = fl; }
+ inline void setFractionLost(uint8 fl)
+ { fractionLost = fl; }
- inline uint32 getLastPacketTransitTime()
- { return lastPacketTransitTime; }
+ inline uint32 getLastPacketTransitTime()
+ { return lastPacketTransitTime; }
- inline void setLastPacketTransitTime(uint32 time)
- { lastPacketTransitTime = time; }
+ inline void setLastPacketTransitTime(uint32 time)
+ { lastPacketTransitTime = time; }
- inline float getJitter() const
- { return jitter; }
+ inline float getJitter() const
+ { return jitter; }
- inline void setJitter(float j)
- { jitter = j; }
+ inline void setJitter(float j)
+ { jitter = j; }
- inline uint32 getInitialDataTimestamp() const
- { return initialDataTimestamp; }
+ inline uint32 getInitialDataTimestamp() const
+ { return initialDataTimestamp; }
- inline void setInitialDataTimestamp(uint32 ts)
- { initialDataTimestamp = ts; }
+ inline void setInitialDataTimestamp(uint32 ts)
+ { initialDataTimestamp = ts; }
- inline timeval getInitialDataTime() const
- { return initialDataTime; }
+ inline timeval getInitialDataTime() const
+ { return initialDataTime; }
- inline void setInitialDataTime(timeval it)
- { initialDataTime = it; }
+ inline void setInitialDataTime(timeval it)
+ { initialDataTime = it; }
- /**
- * Mark this source as having sent a BYE control packet.
- *
- * @return whether some packet from this source had
- * been received before (getHello() has been called at
- * least once)
- **/
- bool getGoodbye()
- {
- if(!flag)
- return false;
- flag = false;
- return true;
- }
+ /**
+ * Mark this source as having sent a BYE control packet.
+ *
+ * @return whether some packet from this source had
+ * been received before (getHello() has been called at
+ * least once)
+ **/
+ bool getGoodbye()
+ {
+ if(!flag)
+ return false;
+ flag = false;
+ return true;
+ }
- /**
- * Mark this source as having sent some packet.
- *
- * @return whether no packet from this source had been
- * received before
- **/
- bool getHello() {
- if(flag)
- return false;
- flag = true;
- return true;
- }
+ /**
+ * Mark this source as having sent some packet.
+ *
+ * @return whether no packet from this source had been
+ * received before
+ **/
+ bool getHello() {
+ if(flag)
+ return false;
+ flag = true;
+ return true;
+ }
- inline uint32 getBadSeqNum() const
- { return badSeqNum; }
+ inline uint32 getBadSeqNum() const
+ { return badSeqNum; }
- inline void setBadSeqNum(uint32 seq)
- { badSeqNum = seq; }
+ inline void setBadSeqNum(uint32 seq)
+ { badSeqNum = seq; }
- uint8 getProbation() const
- { return probation; }
+ uint8 getProbation() const
+ { return probation; }
- inline void setProbation(uint8 p)
- { probation = p; }
+ inline void setProbation(uint8 p)
+ { probation = p; }
- inline void decProbation()
- { --probation; }
+ inline void decProbation()
+ { --probation; }
- bool isValid() const
- { return 0 == probation; }
+ bool isValid() const
+ { return 0 == probation; }
- inline uint16 getBaseSeqNum() const
- { return baseSeqNum; }
+ inline uint16 getBaseSeqNum() const
+ { return baseSeqNum; }
- inline uint32 getSeqNumAccum() const
- { return seqNumAccum; }
+ inline uint32 getSeqNumAccum() const
+ { return seqNumAccum; }
- inline void incSeqNumAccum()
- { seqNumAccum += SEQNUMMOD; }
+ inline void incSeqNumAccum()
+ { seqNumAccum += SEQNUMMOD; }
- /**
- * Start a new sequence of received packets.
- **/
- inline void initSequence(uint16 seqnum)
- { maxSeqNum = seqNumAccum = seqnum; }
+ /**
+ * Start a new sequence of received packets.
+ **/
+ inline void initSequence(uint16 seqnum)
+ { maxSeqNum = seqNumAccum = seqnum; }
- /**
- * Record the insertion of an RTP packet from this
- * source into the scheduled reception queue. All
- * received packets should be registered with
- * recordReception(), but only those actually inserted
- * into the queue should be registered via this
- * method.
- *
- * @param pl Link structure for packet inserted into the queue.
- **/
- void recordInsertion(const IncomingRTPPktLink& pl);
+ /**
+ * Record the insertion of an RTP packet from this
+ * source into the scheduled reception queue. All
+ * received packets should be registered with
+ * recordReception(), but only those actually inserted
+ * into the queue should be registered via this
+ * method.
+ *
+ * @param pl Link structure for packet inserted into the queue.
+ **/
+ void recordInsertion(const IncomingRTPPktLink& pl);
- void initStats();
+ void initStats();
- /**
- * Compute cumulative packet lost and fraction of
- * packets lost during the last reporting interval.
- **/
- void computeStats();
+ /**
+ * Compute cumulative packet lost and fraction of
+ * packets lost during the last reporting interval.
+ **/
+ void computeStats();
- MembershipBookkeeping* membership;
- // The source this link object refers to.
- SyncSource* source;
- // first/last packets from this source in the queue.
- IncomingRTPPktLink* first, * last;
- // Links for synchronization sources located before
- // and after this one in the list of sources.
- SyncSourceLink* prev, * next;
- // Prev and next inside the hash table collision list.
- SyncSourceLink* nextCollis;
- ConflictingTransportAddress* prevConflict;
- unsigned char* senderInfo;
- unsigned char* receiverInfo;
- // time the last RTP packet from this source was
- // received at.
- timeval lastPacketTime;
- // time the last RTCP packet was received.
- timeval lastRTCPPacketTime;
- // time the lasrt RTCP SR was received. Required for
- // DLSR computation.
- timeval lastRTCPSRTime;
+ MembershipBookkeeping* membership;
+ // The source this link object refers to.
+ SyncSource* source;
+ // first/last packets from this source in the queue.
+ IncomingRTPPktLink* first, * last;
+ // Links for synchronization sources located before
+ // and after this one in the list of sources.
+ SyncSourceLink* prev, * next;
+ // Prev and next inside the hash table collision list.
+ SyncSourceLink* nextCollis;
+ ConflictingTransportAddress* prevConflict;
+ unsigned char* senderInfo;
+ unsigned char* receiverInfo;
+ // time the last RTP packet from this source was
+ // received at.
+ timeval lastPacketTime;
+ // time the last RTCP packet was received.
+ timeval lastRTCPPacketTime;
+ // time the lasrt RTCP SR was received. Required for
+ // DLSR computation.
+ timeval lastRTCPSRTime;
- // for outgoing RR reports.
- // number of packets received from this source.
- uint32 obsPacketCount;
- // number of octets received from this source.
- uint32 obsOctetCount;
- // the higher sequence number seen from this source
- uint16 maxSeqNum;
- uint32 extendedMaxSeqNum;
- uint32 cumulativePacketLost;
- uint8 fractionLost;
- // for interarrivel jitter computation
- uint32 lastPacketTransitTime;
- // interarrival jitter of packets from this source.
- float jitter;
- uint32 initialDataTimestamp;
- timeval initialDataTime;
+ // for outgoing RR reports.
+ // number of packets received from this source.
+ uint32 obsPacketCount;
+ // number of octets received from this source.
+ uint32 obsOctetCount;
+ // the higher sequence number seen from this source
+ uint16 maxSeqNum;
+ uint32 extendedMaxSeqNum;
+ uint32 cumulativePacketLost;
+ uint8 fractionLost;
+ // for interarrivel jitter computation
+ uint32 lastPacketTransitTime;
+ // interarrival jitter of packets from this source.
+ float jitter;
+ uint32 initialDataTimestamp;
+ timeval initialDataTime;
- // this flag assures we only call one gotHello and one
- // gotGoodbye for this src.
- bool flag;
+ // this flag assures we only call one gotHello and one
+ // gotGoodbye for this src.
+ bool flag;
- // for source validation:
- uint32 badSeqNum;
- uint8 probation; // packets in sequence before valid.
- uint16 baseSeqNum;
- uint32 expectedPrior;
- uint32 receivedPrior;
- uint32 seqNumAccum;
- };
+ // for source validation:
+ uint32 badSeqNum;
+ uint8 probation; // packets in sequence before valid.
+ uint16 baseSeqNum;
+ uint32 expectedPrior;
+ uint32 receivedPrior;
+ uint32 seqNumAccum;
+ };
- /**
- * Returns whether there is already a synchronizacion source
- * with "ssrc" SSRC identifier.
- **/
- bool
- isRegistered(uint32 ssrc);
+ /**
+ * Returns whether there is already a synchronizacion source
+ * with "ssrc" SSRC identifier.
+ **/
+ bool
+ isRegistered(uint32 ssrc);
- /**
- * Get the description of a source by its <code>ssrc</code> identifier.
- *
- * @param ssrc SSRC identifier, in host order.
- * @param created whether a new source has been created.
- * @return Pointer to the SyncSource object identified by
- * <code>ssrc</code>.
- */
- SyncSourceLink*
- getSourceBySSRC(uint32 ssrc, bool& created);
+ /**
+ * Get the description of a source by its <code>ssrc</code> identifier.
+ *
+ * @param ssrc SSRC identifier, in host order.
+ * @param created whether a new source has been created.
+ * @return Pointer to the SyncSource object identified by
+ * <code>ssrc</code>.
+ */
+ SyncSourceLink*
+ getSourceBySSRC(uint32 ssrc, bool& created);
- /**
- * Mark the source identified by <code>ssrc</code> as having
- * sent a BYE packet. It is not deleted until a timeout
- * expires, so that in case some packets from this source
- * arrive a bit later the source is not inserted again in the
- * table of known sources.
- *
- * @return true if the source had been previously identified.
- * false if it was not in the table of known sources.
- **/
- bool
- BYESource(uint32 ssrc);
+ /**
+ * Mark the source identified by <code>ssrc</code> as having
+ * sent a BYE packet. It is not deleted until a timeout
+ * expires, so that in case some packets from this source
+ * arrive a bit later the source is not inserted again in the
+ * table of known sources.
+ *
+ * @return true if the source had been previously identified.
+ * false if it was not in the table of known sources.
+ **/
+ bool
+ BYESource(uint32 ssrc);
- /**
- * Remove the description of the source identified by
- * <code>ssrc</code>
- *
- * @return whether the source has been actually removed or it
- * did not exist.
- */
- bool
- removeSource(uint32 ssrc);
+ /**
+ * Remove the description of the source identified by
+ * <code>ssrc</code>
+ *
+ * @return whether the source has been actually removed or it
+ * did not exist.
+ */
+ bool
+ removeSource(uint32 ssrc);
- inline SyncSourceLink* getFirst()
- { return first; }
+ inline SyncSourceLink* getFirst()
+ { return first; }
- inline SyncSourceLink* getLast()
- { return last; }
+ inline SyncSourceLink* getLast()
+ { return last; }
- inline uint32
- getMembersCount()
- { return Members::getMembersCount(); }
+ inline uint32
+ getMembersCount()
+ { return Members::getMembersCount(); }
- inline void
- setMembersCount(uint32 n)
- { Members::setMembersCount(n); }
+ inline void
+ setMembersCount(uint32 n)
+ { Members::setMembersCount(n); }
- inline uint32
- getSendersCount()
- { return Members::getSendersCount(); }
+ inline uint32
+ getSendersCount()
+ { return Members::getSendersCount(); }
- static const size_t defaultMembersHashSize;
- static const uint32 SEQNUMMOD;
+ static const size_t defaultMembersHashSize;
+ static const uint32 SEQNUMMOD;
private:
- MembershipBookkeeping(const MembershipBookkeeping &o);
+ MembershipBookkeeping(const MembershipBookkeeping &o);
- MembershipBookkeeping&
- operator=(const MembershipBookkeeping &o);
+ MembershipBookkeeping&
+ operator=(const MembershipBookkeeping &o);
- /**
- * Purge all RTPSource structures, the hash table and the list
- * of sources.
- **/
- void
- endMembers();
+ /**
+ * Purge all RTPSource structures, the hash table and the list
+ * of sources.
+ **/
+ void
+ endMembers();
- // Hash table with sources of RTP and RTCP packets
- uint32 sourceBucketsNum;
- SyncSourceLink** sourceLinks;
- // List of sources, ordered from older to newer
- SyncSourceLink* first, * last;
+ // Hash table with sources of RTP and RTCP packets
+ uint32 sourceBucketsNum;
+ SyncSourceLink** sourceLinks;
+ // List of sources, ordered from older to newer
+ SyncSourceLink* first, * last;
};
/**
@@ -881,166 +879,166 @@
* @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT IncomingDataQueue: public IncomingDataQueueBase,
- protected MembershipBookkeeping
+ protected MembershipBookkeeping
{
public:
- /**
- * @class SyncSourcesIterator
- * @short iterator through the list of synchronizations
- * sources in this session
- **/
- class SyncSourcesIterator
- {
- public:
- typedef std::forward_iterator_tag iterator_category;
- typedef SyncSource value_type;
- typedef ptrdiff_t difference_type;
- typedef const SyncSource* pointer;
- typedef const SyncSource& reference;
+ /**
+ * @class SyncSourcesIterator
+ * @short iterator through the list of synchronizations
+ * sources in this session
+ **/
+ class SyncSourcesIterator
+ {
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef SyncSource value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef const SyncSource* pointer;
+ typedef const SyncSource& reference;
- SyncSourcesIterator(SyncSourceLink* l = NULL) :
- link(l)
- { }
+ SyncSourcesIterator(SyncSourceLink* l = NULL) :
+ link(l)
+ { }
- SyncSourcesIterator(const SyncSourcesIterator& si) :
- link(si.link)
- { }
+ SyncSourcesIterator(const SyncSourcesIterator& si) :
+ link(si.link)
+ { }
- reference operator*() const
- { return *(link->getSource()); }
+ reference operator*() const
+ { return *(link->getSource()); }
- pointer operator->() const
- { return link->getSource(); }
+ pointer operator->() const
+ { return link->getSource(); }
- SyncSourcesIterator& operator++() {
- link = link->getNext();
- return *this;
- }
+ SyncSourcesIterator& operator++() {
+ link = link->getNext();
+ return *this;
+ }
- SyncSourcesIterator operator++(int) {
- SyncSourcesIterator result(*this);
- ++(*this);
- return result;
- }
+ SyncSourcesIterator operator++(int) {
+ SyncSourcesIterator result(*this);
+ ++(*this);
+ return result;
+ }
- friend bool operator==(const SyncSourcesIterator& l,
- const SyncSourcesIterator& r)
- { return l.link == r.link; }
+ friend bool operator==(const SyncSourcesIterator& l,
+ const SyncSourcesIterator& r)
+ { return l.link == r.link; }
- friend bool operator!=(const SyncSourcesIterator& l,
- const SyncSourcesIterator& r)
- { return l.link != r.link; }
+ friend bool operator!=(const SyncSourcesIterator& l,
+ const SyncSourcesIterator& r)
+ { return l.link != r.link; }
- private:
- SyncSourceLink *link;
- };
+ private:
+ SyncSourceLink *link;
+ };
- SyncSourcesIterator begin()
- { return SyncSourcesIterator(MembershipBookkeeping::getFirst()); }
+ SyncSourcesIterator begin()
+ { return SyncSourcesIterator(MembershipBookkeeping::getFirst()); }
- SyncSourcesIterator end()
- { return SyncSourcesIterator(NULL); }
+ SyncSourcesIterator end()
+ { return SyncSourcesIterator(NULL); }
- /**
- * Retreive data from a specific timestamped packet if such a
- * packet is currently available in the receive buffer.
- *
- * @param stamp Data unit timestamp.
- * @param src Optional synchronization source selector.
- * @return data retrieved from the reception buffer.
- * @retval null pointer if no packet with such timestamp is available.
- **/
- const AppDataUnit*
- getData(uint32 stamp, const SyncSource* src = NULL);
+ /**
+ * Retreive data from a specific timestamped packet if such a
+ * packet is currently available in the receive buffer.
+ *
+ * @param stamp Data unit timestamp.
+ * @param src Optional synchronization source selector.
+ * @return data retrieved from the reception buffer.
+ * @retval null pointer if no packet with such timestamp is available.
+ **/
+ const AppDataUnit*
+ getData(uint32 stamp, const SyncSource* src = NULL);
- /**
- * Determine if packets are waiting in the reception queue.
- *
- * @param src Optional synchronization source selector.
- * @return True if packets are waiting.
- */
- bool
- isWaiting(const SyncSource* src = NULL) const;
+ /**
+ * Determine if packets are waiting in the reception queue.
+ *
+ * @param src Optional synchronization source selector.
+ * @return True if packets are waiting.
+ */
+ bool
+ isWaiting(const SyncSource* src = NULL) const;
- /**
- * Get timestamp of first packet waiting in the queue.
- *
- * @param src optional source selector.
- * @return timestamp of first arrival packet.
- **/
- uint32
- getFirstTimestamp(const SyncSource* src = NULL) const;
+ /**
+ * Get timestamp of first packet waiting in the queue.
+ *
+ * @param src optional source selector.
+ * @return timestamp of first arrival packet.
+ **/
+ uint32
+ getFirstTimestamp(const SyncSource* src = NULL) const;
- /**
- * When receiving packets from a new source, it may be
- * convenient to reject a first few packets before we are
- * really sure the source is valid. This method sets how many
- * data packets must be received in sequence before the source
- * is considered valid and the stack starts to accept its
- * packets.
- *
- * @note the default (see defaultMinValidPacketSequence())
- * value for this parameter is 0, so that no packets are
- * rejected (data packets are accepted from the first one).
- *
- * @note this validation is performed after the generic header
- * validation and the additional validation done in
- * onRTPPacketRecv().
- *
- * @note if any valid RTCP packet is received from this
- * source, it will be immediatly considered valid regardless
- * of the number of sequential data packets received.
- *
- * @param packets number of sequential packet required
- **/
- void
- setMinValidPacketSequence(uint8 packets)
- { minValidPacketSequence = packets; }
+ /**
+ * When receiving packets from a new source, it may be
+ * convenient to reject a first few packets before we are
+ * really sure the source is valid. This method sets how many
+ * data packets must be received in sequence before the source
+ * is considered valid and the stack starts to accept its
+ * packets.
+ *
+ * @note the default (see defaultMinValidPacketSequence())
+ * value for this parameter is 0, so that no packets are
+ * rejected (data packets are accepted from the first one).
+ *
+ * @note this validation is performed after the generic header
+ * validation and the additional validation done in
+ * onRTPPacketRecv().
+ *
+ * @note if any valid RTCP packet is received from this
+ * source, it will be immediatly considered valid regardless
+ * of the number of sequential data packets received.
+ *
+ * @param packets number of sequential packet required
+ **/
+ void
+ setMinValidPacketSequence(uint8 packets)
+ { minValidPacketSequence = packets; }
- uint8
- getDefaultMinValidPacketSequence() const
- { return defaultMinValidPacketSequence; }
+ uint8
+ getDefaultMinValidPacketSequence() const
+ { return defaultMinValidPacketSequence; }
- /**
- * Get the minimun number of consecutive packets that must be
- * received from a source before accepting its data packets.
- **/
- uint8
- getMinValidPacketSequence() const
- { return minValidPacketSequence; }
+ /**
+ * Get the minimun number of consecutive packets that must be
+ * received from a source before accepting its data packets.
+ **/
+ uint8
+ getMinValidPacketSequence() const
+ { return minValidPacketSequence; }
- void
- setMaxPacketMisorder(uint16 packets)
- { maxPacketMisorder = packets; }
+ void
+ setMaxPacketMisorder(uint16 packets)
+ { maxPacketMisorder = packets; }
- uint16
- getDefaultMaxPacketMisorder() const
- { return defaultMaxPacketMisorder; }
+ uint16
+ getDefaultMaxPacketMisorder() const
+ { return defaultMaxPacketMisorder; }
- uint16
- getMaxPacketMisorder() const
- { return maxPacketMisorder; }
+ uint16
+ getMaxPacketMisorder() const
+ { return maxPacketMisorder; }
- /**
- *
- * It also prevents packets sent after a restart of the source
- * being immediately accepted.
- **/
- void
- setMaxPacketDropout(uint16 packets) // default: 3000.
- { maxPacketDropout = packets; }
+ /**
+ *
+ * It also prevents packets sent after a restart of the source
+ * being immediately accepted.
+ **/
+ void
+ setMaxPacketDropout(uint16 packets) // default: 3000.
+ { maxPacketDropout = packets; }
- uint16
- getDefaultMaxPacketDropout() const
- { return defaultMaxPacketDropout; }
+ uint16
+ getDefaultMaxPacketDropout() const
+ { return defaultMaxPacketDropout; }
- uint16
- getMaxPacketDropout() const
- { return maxPacketDropout; }
+ uint16
+ getMaxPacketDropout() const
+ { return maxPacketDropout; }
- // default value for constructors that allow to specify
- // members table s\ize
+ // default value for constructors that allow to specify
+ // members table s\ize
inline static size_t
getDefaultMembersSize()
{ return defaultMembersSize; }
@@ -1080,142 +1078,142 @@
getInQueueCryptoContext(uint32 ssrc);
protected:
- /**
- * @param size initial size of the membership table.
- **/
- IncomingDataQueue(uint32 size);
+ /**
+ * @param size initial size of the membership table.
+ **/
+ IncomingDataQueue(uint32 size);
- virtual ~IncomingDataQueue()
- { }
+ virtual ~IncomingDataQueue()
+ { }
- /**
- * Apply collision and loop detection and correction algorithm
- * when receiving RTP data packets. Follows section 8.2 in
- * draft-ietf-avt-rtp-new.
- *
- * @param sourceLink link to the source object.
- * @param is_new whether the source has been just recorded.
- * @param na data packet network address.
- * @param tp data packet source transport port.
- *
- * @return whether the packet must not be discarded.
- **/
- bool checkSSRCInIncomingRTPPkt(SyncSourceLink& sourceLink,
- bool is_new, InetAddress& na,
- tpport_t tp);
+ /**
+ * Apply collision and loop detection and correction algorithm
+ * when receiving RTP data packets. Follows section 8.2 in
+ * draft-ietf-avt-rtp-new.
+ *
+ * @param sourceLink link to the source object.
+ * @param is_new whether the source has been just recorded.
+ * @param na data packet network address.
+ * @param tp data packet source transport port.
+ *
+ * @return whether the packet must not be discarded.
+ **/
+ bool checkSSRCInIncomingRTPPkt(SyncSourceLink& sourceLink,
+ bool is_new, InetAddress& na,
+ tpport_t tp);
- /**
- * Set the number of RTCP intervals that the stack will wait
- * to change the state of a source from stateActive to
- * stateInactive, or to delete the source after being in
- * stateInactive.
- *
- * Note that this value should be uniform accross all
- * participants and SHOULD be fixed for a particular profile.
- *
- * @param intervals number of RTCP report intervals
- *
- * @note If RTCP is not being used, the RTCP interval is
- * assumed to be the default: 5 seconds.
- * @note The default for this value is, as RECOMMENDED, 5.
- **/
- void setSourceExpirationPeriod(uint8 intervals)
- { sourceExpirationPeriod = intervals; }
+ /**
+ * Set the number of RTCP intervals that the stack will wait
+ * to change the state of a source from stateActive to
+ * stateInactive, or to delete the source after being in
+ * stateInactive.
+ *
+ * Note that this value should be uniform accross all
+ * participants and SHOULD be fixed for a particular profile.
+ *
+ * @param intervals number of RTCP report intervals
+ *
+ * @note If RTCP is not being used, the RTCP interval is
+ * assumed to be the default: 5 seconds.
+ * @note The default for this value is, as RECOMMENDED, 5.
+ **/
+ void setSourceExpirationPeriod(uint8 intervals)
+ { sourceExpirationPeriod = intervals; }
- /**
- * This function is used by the service thread to process
- * the next incoming packet and place it in the receive list.
- *
- * @return number of payload bytes received. <0 if error.
- */
- virtual size_t
- takeInDataPacket();
+ /**
+ * This function is used by the service thread to process
+ * the next incoming packet and place it in the receive list.
+ *
+ * @return number of payload bytes received. <0 if error.
+ */
+ virtual size_t
+ takeInDataPacket();
- void renewLocalSSRC();
+ void renewLocalSSRC();
- /**
- * This is used to fetch a packet in the receive queue and to
- * expire packets older than the current timestamp.
- *
- * @return packet buffer object for current timestamp if found.
- * @param timestamp timestamp requested.
- * @param src optional source selector
- * @note if found, the packet is removed from the reception queue
- **/
- IncomingDataQueue::IncomingRTPPktLink*
- getWaiting(uint32 timestamp, const SyncSource *src = NULL);
+ /**
+ * This is used to fetch a packet in the receive queue and to
+ * expire packets older than the current timestamp.
+ *
+ * @return packet buffer object for current timestamp if found.
+ * @param timestamp timestamp requested.
+ * @param src optional source selector
+ * @note if found, the packet is removed from the reception queue
+ **/
+ IncomingDataQueue::IncomingRTPPktLink*
+ getWaiting(uint32 timestamp, const SyncSource *src = NULL);
- /**
- * Log reception of a new RTP packet from this source. Usually
- * updates data such as the packet counter, the expected
- * sequence number for the next packet and the time the last
- * packet was received at.
- *
- * @param srcLink Link structure for the synchronization
- * source of this packet.
- * @param pkt Packet just created and to be logged.
- * @param recvtime Reception time.
- *
- * @return whether, according to the source state and
- * statistics, the packet is considered valid and must be
- * inserted in the incoming packets queue.
- **/
- bool
- recordReception(SyncSourceLink& srcLink, const IncomingRTPPkt& pkt,
- const timeval recvtime);
+ /**
+ * Log reception of a new RTP packet from this source. Usually
+ * updates data such as the packet counter, the expected
+ * sequence number for the next packet and the time the last
+ * packet was received at.
+ *
+ * @param srcLink Link structure for the synchronization
+ * source of this packet.
+ * @param pkt Packet just created and to be logged.
+ * @param recvtime Reception time.
+ *
+ * @return whether, according to the source state and
+ * statistics, the packet is considered valid and must be
+ * inserted in the incoming packets queue.
+ **/
+ bool
+ recordReception(SyncSourceLink& srcLink, const IncomingRTPPkt& pkt,
+ const timeval recvtime);
- /**
- * Log extraction of a packet from this source from the
- * scheduled reception queue.
- *
- * @param pkt Packet extracted from the queue.
- **/
- void
- recordExtraction(const IncomingRTPPkt& pkt);
+ /**
+ * Log extraction of a packet from this source from the
+ * scheduled reception queue.
+ *
+ * @param pkt Packet extracted from the queue.
+ **/
+ void
+ recordExtraction(const IncomingRTPPkt& pkt);
- void purgeIncomingQueue();
+ void purgeIncomingQueue();
- /**
- * Virtual called when a new synchronization source has joined
- * the session.
- *
- * @param - new synchronization source
- **/
- inline virtual void
- onNewSyncSource(const SyncSource&)
- { }
+ /**
+ * Virtual called when a new synchronization source has joined
+ * the session.
+ *
+ * @param - new synchronization source
+ **/
+ inline virtual void
+ onNewSyncSource(const SyncSource&)
+ { }
protected:
- /**
- * A virtual function to support parsing of arriving packets
- * to determine if they should be kept in the queue and to
- * dispatch events.
- *
- * A generic header validity check (as specified in RFC 1889)
- * is performed on every incoming packet. If the generic check
- * completes succesfully, this method is called before the
- * packet is actually inserted into the reception queue.
- *
- * May be used to perform additional validity checks or to do
- * some application specific processing.
- *
- * @param - packet just received.
- * @return true if packet is kept in the incoming packets queue.
- **/
- inline virtual bool
- onRTPPacketRecv(IncomingRTPPkt&)
- { return true; }
+ /**
+ * A virtual function to support parsing of arriving packets
+ * to determine if they should be kept in the queue and to
+ * dispatch events.
+ *
+ * A generic header validity check (as specified in RFC 1889)
+ * is performed on every incoming packet. If the generic check
+ * completes succesfully, this method is called before the
+ * packet is actually inserted into the reception queue.
+ *
+ * May be used to perform additional validity checks or to do
+ * some application specific processing.
+ *
+ * @param - packet just received.
+ * @return true if packet is kept in the incoming packets queue.
+ **/
+ inline virtual bool
+ onRTPPacketRecv(IncomingRTPPkt&)
+ { return true; }
- /**
- * A hook to filter packets in the receive queue that are being
- * expired. This hook may be used to do some application
- * specific processing on expired packets before they are
- * deleted.
- *
- * @param - packet expired from the recv queue.
- **/
- inline virtual void onExpireRecv(IncomingRTPPkt&)
- { return; }
+ /**
+ * A hook to filter packets in the receive queue that are being
+ * expired. This hook may be used to do some application
+ * specific processing on expired packets before they are
+ * deleted.
+ *
+ * @param - packet expired from the recv queue.
+ **/
+ inline virtual void onExpireRecv(IncomingRTPPkt&)
+ { return; }
/**
* A hook that gets called if the decoding of an incoming SRTP was erroneous
@@ -1235,66 +1233,64 @@
{ return false; }
inline virtual bool
- end2EndDelayed(IncomingRTPPktLink&)
- { return false; }
+ end2EndDelayed(IncomingRTPPktLink&)
+ { return false; }
- /**
- * Insert a just received packet in the queue (both general
- * and source specific queues). If the packet was already in
- * the queue (same SSRC and sequence number), it is not
- * inserted but deleted.
- *
- * @param packetLink link to a packet just received and
- * generally validated and processed by onRTPPacketRecv.
- *
- * @return whether the packet was successfully inserted.
- * @retval false when the packet is duplicated (there is
- * already a packet from the same source with the same
- * timestamp).
- * @retval true when the packet is not duplicated.
- **/
- bool
- insertRecvPacket(IncomingRTPPktLink* packetLink);
+ /**
+ * Insert a just received packet in the queue (both general
+ * and source specific queues). If the packet was already in
+ * the queue (same SSRC and sequence number), it is not
+ * inserted but deleted.
+ *
+ * @param packetLink link to a packet just received and
+ * generally validated and processed by onRTPPacketRecv.
+ *
+ * @return whether the packet was successfully inserted.
+ * @retval false when the packet is duplicated (there is
+ * already a packet from the same source with the same
+ * timestamp).
+ * @retval true when the packet is not duplicated.
+ **/
+ bool
+ insertRecvPacket(IncomingRTPPktLink* packetLink);
- /**
- * This function performs the physical I/O for reading a
- * packet from the source. It is a virtual that is
- * overriden in the derived class.
- *
- * @return number of bytes read.
- * @param buffer of read packet.
- * @param length of data to read.
- * @param host address of source.
- * @param port number of source.
- **/
- virtual size_t
- recvData(unsigned char* buffer, size_t length,
- InetHostAddress& host, tpport_t& port) = 0;
+ /**
+ * This function performs the physical I/O for reading a
+ * packet from the source. It is a virtual that is
+ * overriden in the derived class.
+ *
+ * @return number of bytes read.
+ * @param buffer of read packet.
+ * @param length of data to read.
+ * @param host address of source.
+ * @param port number of source.
+ **/
+ virtual size_t
+ recvData(unsigned char* buffer, size_t length,
+ InetHostAddress& host, tpport_t& port) = 0;
- virtual size_t
- getNextDataPacketSize() const = 0;
+ virtual size_t
+ getNextDataPacketSize() const = 0;
- mutable ThreadLock recvLock;
- // reception queue
- IncomingRTPPktLink* recvFirst, * recvLast;
- // values for packet validation.
- static const uint8 defaultMinValidPacketSequence;
- static const uint16 defaultMaxPacketMisorder;
- static const uint16 defaultMaxPacketDropout;
- uint8 minValidPacketSequence;
- uint16 maxPacketMisorder;
- uint16 maxPacketDropout;
- static const size_t defaultMembersSize;
- uint8 sourceExpirationPeriod;
- mutable Mutex cryptoMutex;
+ mutable ThreadLock recvLock;
+ // reception queue
+ IncomingRTPPktLink* recvFirst, * recvLast;
+ // values for packet validation.
+ static const uint8 defaultMinValidPacketSequence;
+ static const uint16 defaultMaxPacketMisorder;
+ static const uint16 defaultMaxPacketDropout;
+ uint8 minValidPacketSequence;
+ uint16 maxPacketMisorder;
+ uint16 maxPacketDropout;
+ static const size_t defaultMembersSize;
+ uint8 sourceExpirationPeriod;
+ mutable Mutex cryptoMutex;
std::list<CryptoContext *> cryptoContexts;
};
/** @}*/ // iqueue
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_IQUEUE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/oqueue.h b/jni/libccrtp/sources/src/ccrtp/oqueue.h
index 3d9bbbc..8048dba 100644
--- a/jni/libccrtp/sources/src/ccrtp/oqueue.h
+++ b/jni/libccrtp/sources/src/ccrtp/oqueue.h
@@ -41,16 +41,14 @@
* @short Generic RTP output queues.
**/
-#ifndef CCXX_RTP_OQUEUE_H_
+#ifndef CCXX_RTP_OQUEUE_H_
#define CCXX_RTP_OQUEUE_H_
#include <ccrtp/queuebase.h>
#include <ccrtp/CryptoContext.h>
#include <list>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup oqueue Generic RTP output queues.
@@ -68,72 +66,72 @@
class __EXPORT DestinationListHandler
{
protected:
- struct TransportAddress;
- std::list<TransportAddress*> destList;
+ struct TransportAddress;
+ std::list<TransportAddress*> destList;
public:
- DestinationListHandler();
+ DestinationListHandler();
- ~DestinationListHandler();
+ ~DestinationListHandler();
- /**
- * Get whether there is only a destination in the list.
- **/
- inline bool isSingleDestination() const
- { return (1 == destList.size()); }
+ /**
+ * Get whether there is only a destination in the list.
+ **/
+ inline bool isSingleDestination() const
+ { return (1 == destList.size()); }
- inline TransportAddress* getFirstDestination() const
- { return destList.front(); }
+ inline TransportAddress* getFirstDestination() const
+ { return destList.front(); }
- inline void lockDestinationList() const
- { destinationLock.readLock(); }
+ inline void lockDestinationList() const
+ { destinationLock.readLock(); }
- inline void unlockDestinationList() const
- { destinationLock.unlock(); }
+ inline void unlockDestinationList() const
+ { destinationLock.unlock(); }
protected:
- inline void writeLockDestinationList() const
- { destinationLock.writeLock(); }
+ inline void writeLockDestinationList() const
+ { destinationLock.writeLock(); }
- /**
- * Locks the object before modifying it.
- **/
- bool
- addDestinationToList(const InetAddress& ia, tpport_t data,
- tpport_t control);
+ /**
+ * Locks the object before modifying it.
+ **/
+ bool
+ addDestinationToList(const InetAddress& ia, tpport_t data,
+ tpport_t control);
- /**
- * Locks the object before modifying it.
- **/
- bool removeDestinationFromList(const InetAddress& ia,
- tpport_t dataPort,
- tpport_t controlPort);
+ /**
+ * Locks the object before modifying it.
+ **/
+ bool removeDestinationFromList(const InetAddress& ia,
+ tpport_t dataPort,
+ tpport_t controlPort);
- struct TransportAddress
- {
- TransportAddress(InetAddress na, tpport_t dtp, tpport_t ctp) :
- networkAddress(na), dataTransportPort(dtp),
- controlTransportPort(ctp)
- { }
+ struct TransportAddress
+ {
+ TransportAddress(InetAddress na, tpport_t dtp, tpport_t ctp) :
+ networkAddress(na), dataTransportPort(dtp),
+ controlTransportPort(ctp)
+ { }
- inline const InetAddress& getNetworkAddress() const
- { return networkAddress; }
+ inline const InetAddress& getNetworkAddress() const
+ { return networkAddress; }
- inline tpport_t getDataTransportPort() const
- { return dataTransportPort; }
+ inline tpport_t getDataTransportPort() const
+ { return dataTransportPort; }
- inline tpport_t getControlTransportPort() const
- { return controlTransportPort; }
+ inline tpport_t getControlTransportPort() const
+ { return controlTransportPort; }
- InetAddress networkAddress;
- tpport_t dataTransportPort, controlTransportPort;
- };
+ InetAddress networkAddress;
+ tpport_t dataTransportPort, controlTransportPort;
+ };
private:
- mutable ThreadLock destinationLock;
+ mutable ThreadLock destinationLock;
};
-#ifdef CCXX_IPV6
+#ifdef CCXX_IPV6
/**
* @class DestinationListHandler
*
@@ -145,69 +143,69 @@
class __EXPORT DestinationListHandlerIPV6
{
protected:
- struct TransportAddressIPV6;
- std::list<TransportAddressIPV6*> destListIPV6;
+ struct TransportAddressIPV6;
+ std::list<TransportAddressIPV6*> destListIPV6;
public:
- DestinationListHandlerIPV6();
+ DestinationListHandlerIPV6();
- ~DestinationListHandlerIPV6();
+ ~DestinationListHandlerIPV6();
- /**
- * Get whether there is only a destination in the list.
- **/
- inline bool isSingleDestinationIPV6() const
- { return (1 == destListIPV6.size()); }
+ /**
+ * Get whether there is only a destination in the list.
+ **/
+ inline bool isSingleDestinationIPV6() const
+ { return (1 == destListIPV6.size()); }
- inline TransportAddressIPV6* getFirstDestinationIPV6() const
- { return destListIPV6.front(); }
+ inline TransportAddressIPV6* getFirstDestinationIPV6() const
+ { return destListIPV6.front(); }
- inline void lockDestinationListIPV6() const
- { destinationLock.readLock(); }
+ inline void lockDestinationListIPV6() const
+ { destinationLock.readLock(); }
- inline void unlockDestinationListIPV6() const
- { destinationLock.unlock(); }
+ inline void unlockDestinationListIPV6() const
+ { destinationLock.unlock(); }
protected:
- inline void writeLockDestinationListIPV6() const
- { destinationLock.writeLock(); }
+ inline void writeLockDestinationListIPV6() const
+ { destinationLock.writeLock(); }
- /**
- * Locks the object before modifying it.
- **/
- bool
- addDestinationToListIPV6(const IPV6Address& ia, tpport_t data,
- tpport_t control);
+ /**
+ * Locks the object before modifying it.
+ **/
+ bool
+ addDestinationToListIPV6(const IPV6Address& ia, tpport_t data,
+ tpport_t control);
- /**
- * Locks the object before modifying it.
- **/
- bool removeDestinationFromListIPV6(const IPV6Address& ia,
- tpport_t dataPort,
- tpport_t controlPort);
+ /**
+ * Locks the object before modifying it.
+ **/
+ bool removeDestinationFromListIPV6(const IPV6Address& ia,
+ tpport_t dataPort,
+ tpport_t controlPort);
- struct TransportAddressIPV6
- {
- TransportAddressIPV6(IPV6Address na, tpport_t dtp, tpport_t ctp) :
- networkAddress(na), dataTransportPort(dtp),
- controlTransportPort(ctp)
- { }
+ struct TransportAddressIPV6
+ {
+ TransportAddressIPV6(IPV6Address na, tpport_t dtp, tpport_t ctp) :
+ networkAddress(na), dataTransportPort(dtp),
+ controlTransportPort(ctp)
+ { }
- inline const IPV6Address& getNetworkAddress() const
- { return networkAddress; }
+ inline const IPV6Address& getNetworkAddress() const
+ { return networkAddress; }
- inline tpport_t getDataTransportPort() const
- { return dataTransportPort; }
+ inline tpport_t getDataTransportPort() const
+ { return dataTransportPort; }
- inline tpport_t getControlTransportPort() const
- { return controlTransportPort; }
+ inline tpport_t getControlTransportPort() const
+ { return controlTransportPort; }
- IPV6Address networkAddress;
- tpport_t dataTransportPort, controlTransportPort;
- };
+ IPV6Address networkAddress;
+ tpport_t dataTransportPort, controlTransportPort;
+ };
private:
- mutable ThreadLock destinationLock;
+ mutable ThreadLock destinationLock;
};
#endif
@@ -220,83 +218,83 @@
* @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT OutgoingDataQueue:
- public OutgoingDataQueueBase,
-#ifdef CCXX_IPV6
- protected DestinationListHandlerIPV6,
+ public OutgoingDataQueueBase,
+#ifdef CCXX_IPV6
+ protected DestinationListHandlerIPV6,
#endif
- protected DestinationListHandler
+ protected DestinationListHandler
{
public:
-#ifdef CCXX_IPV6
- bool
- addDestination(const IPV6Address& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+#ifdef CCXX_IPV6
+ bool
+ addDestination(const IPV6Address& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
- bool
- forgetDestination(const IPV6Address& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+ bool
+ forgetDestination(const IPV6Address& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
#endif
- bool
- addDestination(const InetHostAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+ bool
+ addDestination(const InetHostAddress& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
- bool
- addDestination(const InetMcastAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+ bool
+ addDestination(const InetMcastAddress& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
- bool
- forgetDestination(const InetHostAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+ bool
+ forgetDestination(const InetHostAddress& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
- bool
- forgetDestination(const InetMcastAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0);
+ bool
+ forgetDestination(const InetMcastAddress& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0);
- /**
- * Add csrc as the CSRC identifier of a new contributor. This
- * method adds the CSRC identifier to a list of contributors
- * that will be inserted in every packet enqueued from now on.
- **/
- void
- addContributor(uint32 csrc);
+ /**
+ * Add csrc as the CSRC identifier of a new contributor. This
+ * method adds the CSRC identifier to a list of contributors
+ * that will be inserted in every packet enqueued from now on.
+ **/
+ void
+ addContributor(uint32 csrc);
- /**
- * Remove CSRC from the list of contributors.
- **/
- bool
- removeContributor(uint32 csrc);
+ /**
+ * Remove CSRC from the list of contributors.
+ **/
+ bool
+ removeContributor(uint32 csrc);
- /**
- * Determine if outgoing packets are waiting to send.
- *
- * @return true if there are packets waiting to be send.
- */
- bool
- isSending() const;
+ /**
+ * Determine if outgoing packets are waiting to send.
+ *
+ * @return true if there are packets waiting to be send.
+ */
+ bool
+ isSending() const;
- /**
- * This is used to create a data packet in the send queue.
- * Sometimes a "NULL" or empty packet will be used instead, and
- * these are known as "silent" packets. "Silent" packets are
- * used simply to "push" the scheduler along more accurately
- * by giving the appearence that a next packet is waiting to
- * be sent and to provide a valid timestamp for that packet.
- *
- * @param stamp Timestamp for expected send time of packet.
- * @param data Value or NULL if special "silent" packet.
- * @param len May be 0 to indicate a default by payload type.
- **/
- void
- putData(uint32 stamp, const unsigned char* data = NULL, size_t len = 0);
+ /**
+ * This is used to create a data packet in the send queue.
+ * Sometimes a "NULL" or empty packet will be used instead, and
+ * these are known as "silent" packets. "Silent" packets are
+ * used simply to "push" the scheduler along more accurately
+ * by giving the appearence that a next packet is waiting to
+ * be sent and to provide a valid timestamp for that packet.
+ *
+ * @param stamp Timestamp for expected send time of packet.
+ * @param data Value or NULL if special "silent" packet.
+ * @param len May be 0 to indicate a default by payload type.
+ **/
+ void
+ putData(uint32 stamp, const unsigned char* data = NULL, size_t len = 0);
/**
* This is used to create a data packet and send it immediately.
@@ -314,94 +312,94 @@
sendImmediate(uint32 stamp, const unsigned char* data = NULL, size_t len = 0);
- /**
- * Set padding. All outgoing packets will be transparently
- * padded to a multiple of paddinglen.
- *
- * @param paddinglen pad packets to a length multiple of paddinglen.
- **/
- void setPadding(uint8 paddinglen)
- { sendInfo.paddinglen = paddinglen; }
+ /**
+ * Set padding. All outgoing packets will be transparently
+ * padded to a multiple of paddinglen.
+ *
+ * @param paddinglen pad packets to a length multiple of paddinglen.
+ **/
+ void setPadding(uint8 paddinglen)
+ { sendInfo.paddinglen = paddinglen; }
- /**
- * Set marker bit for the packet in which the next data
- * provided will be send. When transmitting audio, should be
- * set for the first packet of a talk spurt. When transmitting
- * video, should be set for the last packet for a video frame.
- *
- * @param mark Marker bit value for next packet.
- **/
- void setMark(bool mark)
- { sendInfo.marked = mark; }
+ /**
+ * Set marker bit for the packet in which the next data
+ * provided will be send. When transmitting audio, should be
+ * set for the first packet of a talk spurt. When transmitting
+ * video, should be set for the last packet for a video frame.
+ *
+ * @param mark Marker bit value for next packet.
+ **/
+ void setMark(bool mark)
+ { sendInfo.marked = mark; }
- /**
- * Get wheter the mark bit will be set in the next packet.
- **/
- inline bool getMark() const
- { return sendInfo.marked; }
+ /**
+ * Get wheter the mark bit will be set in the next packet.
+ **/
+ inline bool getMark() const
+ { return sendInfo.marked; }
- /**
- * Set partial data for an already queued packet. This is often
- * used for multichannel data.
- *
- * @param timestamp Timestamp of packet.
- * @param data Buffer to copy from.
- * @param offset Offset to copy from.
- * @param max Maximum data size.
- * @return Number of packet data bytes set.
- **/
- size_t
- setPartial(uint32 timestamp, unsigned char* data, size_t offset, size_t max);
+ /**
+ * Set partial data for an already queued packet. This is often
+ * used for multichannel data.
+ *
+ * @param timestamp Timestamp of packet.
+ * @param data Buffer to copy from.
+ * @param offset Offset to copy from.
+ * @param max Maximum data size.
+ * @return Number of packet data bytes set.
+ **/
+ size_t
+ setPartial(uint32 timestamp, unsigned char* data, size_t offset, size_t max);
- inline microtimeout_t
- getDefaultSchedulingTimeout() const
- { return defaultSchedulingTimeout; }
+ inline microtimeout_t
+ getDefaultSchedulingTimeout() const
+ { return defaultSchedulingTimeout; }
- /**
- * Set the default scheduling timeout to use when no data
- * packets are waiting to be sent.
- *
- * @param to timeout in milliseconds.
- **/
- inline void
- setSchedulingTimeout(microtimeout_t to)
- { schedulingTimeout = to; }
+ /**
+ * Set the default scheduling timeout to use when no data
+ * packets are waiting to be sent.
+ *
+ * @param to timeout in milliseconds.
+ **/
+ inline void
+ setSchedulingTimeout(microtimeout_t to)
+ { schedulingTimeout = to; }
- inline microtimeout_t
- getDefaultExpireTimeout() const
- { return defaultExpireTimeout; }
+ inline microtimeout_t
+ getDefaultExpireTimeout() const
+ { return defaultExpireTimeout; }
- /**
- * Set the "expired" timer for expiring packets pending in
- * the send queue which have gone unsent and are already
- * "too late" to be sent now.
- *
- * @param to timeout to expire unsent packets in milliseconds.
- **/
- inline void
- setExpireTimeout(microtimeout_t to)
- { expireTimeout = to; }
+ /**
+ * Set the "expired" timer for expiring packets pending in
+ * the send queue which have gone unsent and are already
+ * "too late" to be sent now.
+ *
+ * @param to timeout to expire unsent packets in milliseconds.
+ **/
+ inline void
+ setExpireTimeout(microtimeout_t to)
+ { expireTimeout = to; }
- inline microtimeout_t getExpireTimeout() const
- { return expireTimeout; }
+ inline microtimeout_t getExpireTimeout() const
+ { return expireTimeout; }
- /**
- * Get the total number of packets sent so far
- *
- * @return total number of packets sent
- */
- inline uint32
- getSendPacketCount() const
- { return sendInfo.packetCount; }
+ /**
+ * Get the total number of packets sent so far
+ *
+ * @return total number of packets sent
+ */
+ inline uint32
+ getSendPacketCount() const
+ { return sendInfo.packetCount; }
- /**
- * Get the total number of octets (payload only) sent so far.
- *
- * @return total number of payload octets sent in RTP packets.
- **/
- inline uint32
- getSendOctetCount() const
- { return sendInfo.octetCount; }
+ /**
+ * Get the total number of octets (payload only) sent so far.
+ *
+ * @return total number of payload octets sent in RTP packets.
+ **/
+ inline uint32
+ getSendOctetCount() const
+ { return sendInfo.octetCount; }
/**
* Get the sequence number of the next outgoing packet.
@@ -446,189 +444,187 @@
protected:
- OutgoingDataQueue();
+ OutgoingDataQueue();
- virtual ~OutgoingDataQueue()
- { }
+ virtual ~OutgoingDataQueue()
+ { }
- struct OutgoingRTPPktLink
- {
- OutgoingRTPPktLink(OutgoingRTPPkt* pkt,
- OutgoingRTPPktLink* p,
- OutgoingRTPPktLink* n) :
- packet(pkt), prev(p), next(n) { }
+ struct OutgoingRTPPktLink
+ {
+ OutgoingRTPPktLink(OutgoingRTPPkt* pkt,
+ OutgoingRTPPktLink* p,
+ OutgoingRTPPktLink* n) :
+ packet(pkt), prev(p), next(n) { }
- ~OutgoingRTPPktLink() { delete packet; }
+ ~OutgoingRTPPktLink() { delete packet; }
- inline OutgoingRTPPkt* getPacket() { return packet; }
+ inline OutgoingRTPPkt* getPacket() { return packet; }
- inline void setPacket(OutgoingRTPPkt* pkt) { packet = pkt; }
+ inline void setPacket(OutgoingRTPPkt* pkt) { packet = pkt; }
- inline OutgoingRTPPktLink* getPrev() { return prev; }
+ inline OutgoingRTPPktLink* getPrev() { return prev; }
- inline void setPrev(OutgoingRTPPktLink* p) { prev = p; }
+ inline void setPrev(OutgoingRTPPktLink* p) { prev = p; }
- inline OutgoingRTPPktLink* getNext() { return next; }
+ inline OutgoingRTPPktLink* getNext() { return next; }
- inline void setNext(OutgoingRTPPktLink* n) { next = n; }
+ inline void setNext(OutgoingRTPPktLink* n) { next = n; }
- // the packet this link refers to.
- OutgoingRTPPkt* packet;
- // global outgoing packets queue.
- OutgoingRTPPktLink * prev, * next;
- };
+ // the packet this link refers to.
+ OutgoingRTPPkt* packet;
+ // global outgoing packets queue.
+ OutgoingRTPPktLink * prev, * next;
+ };
- /**
- * This is used to write the RTP data packet to one or more
- * destinations. It is used by both sendImmediate and by
- * dispatchDataPacket.
- *
- * @param RTP packet to send.
- */
- void
- dispatchImmediate(OutgoingRTPPkt *packet);
+ /**
+ * This is used to write the RTP data packet to one or more
+ * destinations. It is used by both sendImmediate and by
+ * dispatchDataPacket.
+ *
+ * @param RTP packet to send.
+ */
+ void
+ dispatchImmediate(OutgoingRTPPkt *packet);
- /**
- * This computes the timeout period for scheduling transmission
- * of the next packet at the "head" of the send buffer. If no
- * packets are waiting, a default timeout is used. This actually
- * forms the "isPending()" timeout of the rtp receiver in the
- * service thread.
- *
- * @return timeout until next packet is scheduled to send.
- **/
- microtimeout_t
- getSchedulingTimeout();
+ /**
+ * This computes the timeout period for scheduling transmission
+ * of the next packet at the "head" of the send buffer. If no
+ * packets are waiting, a default timeout is used. This actually
+ * forms the "isPending()" timeout of the rtp receiver in the
+ * service thread.
+ *
+ * @return timeout until next packet is scheduled to send.
+ **/
+ microtimeout_t
+ getSchedulingTimeout();
- /**
- * This function is used by the service thread to process
- * the next outgoing packet pending in the sending queue.
- *
- * @return number of bytes sent. 0 if silent, <0 if error.
- **/
- size_t
- dispatchDataPacket();
+ /**
+ * This function is used by the service thread to process
+ * the next outgoing packet pending in the sending queue.
+ *
+ * @return number of bytes sent. 0 if silent, <0 if error.
+ **/
+ size_t
+ dispatchDataPacket();
- /**
- * For thoses cases in which the application requires a method
- * to set the sequence number for the outgoing stream (such as
- * for implementing the RTSP PLAY command).
- *
- * @param seqNum next sequence number to be used for outgoing packets.
- *
- **/
- inline void
- setNextSeqNum(uint32 seqNum)
- { sendInfo.sendSeq = seqNum; }
+ /**
+ * For thoses cases in which the application requires a method
+ * to set the sequence number for the outgoing stream (such as
+ * for implementing the RTSP PLAY command).
+ *
+ * @param seqNum next sequence number to be used for outgoing packets.
+ *
+ **/
+ inline void
+ setNextSeqNum(uint32 seqNum)
+ { sendInfo.sendSeq = seqNum; }
- inline uint32
- getCurrentSeqNum(void)
- { return sendInfo.sendSeq; }
+ inline uint32
+ getCurrentSeqNum(void)
+ { return sendInfo.sendSeq; }
- /**
- */
- inline void
- setInitialTimestamp(uint32 ts)
- { initialTimestamp = ts; }
+ /**
+ */
+ inline void
+ setInitialTimestamp(uint32 ts)
+ { initialTimestamp = ts; }
- /**
- */
- inline uint32
- getInitialTimestamp()
- { return initialTimestamp; }
+ /**
+ */
+ inline uint32
+ getInitialTimestamp()
+ { return initialTimestamp; }
- void purgeOutgoingQueue();
+ void purgeOutgoingQueue();
virtual void
setControlPeer(const InetAddress &host, tpport_t port) {}
-#ifdef CCXX_IPV6
- virtual void
- setControlPeerIPV6(const IPV6Address &host, tpport_t port) {}
+#ifdef CCXX_IPV6
+ virtual void
+ setControlPeerIPV6(const IPV6Address &host, tpport_t port) {}
#endif
// The crypto contexts for outgoing SRTP sessions.
- mutable Mutex cryptoMutex;
+ mutable Mutex cryptoMutex;
std::list<CryptoContext *> cryptoContexts;
private:
/**
- * A hook to filter packets being sent that have been expired.
- *
- * @param - expired packet from the send queue.
- **/
- inline virtual void onExpireSend(OutgoingRTPPkt&)
- { }
+ * A hook to filter packets being sent that have been expired.
+ *
+ * @param - expired packet from the send queue.
+ **/
+ inline virtual void onExpireSend(OutgoingRTPPkt&)
+ { }
- virtual void
+ virtual void
setDataPeer(const InetAddress &host, tpport_t port) {}
-#ifdef CCXX_IPV6
- virtual void
- setDataPeerIPV6(const IPV6Address &host, tpport_t port) {}
+#ifdef CCXX_IPV6
+ virtual void
+ setDataPeerIPV6(const IPV6Address &host, tpport_t port) {}
#endif
- /**
- * This function performs the physical I/O for writing a
- * packet to the destination. It is a virtual that is
- * overriden in the derived class.
- *
- * @param buffer Pointer to data to write.
- * @param len Length of data to write.
- * @return number of bytes sent.
- **/
- virtual size_t
- sendData(const unsigned char* const buffer, size_t len) {return 0;}
+ /**
+ * This function performs the physical I/O for writing a
+ * packet to the destination. It is a virtual that is
+ * overriden in the derived class.
+ *
+ * @param buffer Pointer to data to write.
+ * @param len Length of data to write.
+ * @return number of bytes sent.
+ **/
+ virtual size_t
+ sendData(const unsigned char* const buffer, size_t len) {return 0;}
-#ifdef CCXX_IPV6
- virtual size_t
- sendDataIPV6(const unsigned char* const buffer, size_t len) {return 0;}
+#ifdef CCXX_IPV6
+ virtual size_t
+ sendDataIPV6(const unsigned char* const buffer, size_t len) {return 0;}
#endif
- static const microtimeout_t defaultSchedulingTimeout;
- static const microtimeout_t defaultExpireTimeout;
- mutable ThreadLock sendLock;
- // outgoing data packets queue
- OutgoingRTPPktLink* sendFirst, * sendLast;
- uint32 initialTimestamp;
- // transmission scheduling timeout for the service thread
- microtimeout_t schedulingTimeout;
- // how old a packet can reach in the sending queue before deletetion
- microtimeout_t expireTimeout;
+ static const microtimeout_t defaultSchedulingTimeout;
+ static const microtimeout_t defaultExpireTimeout;
+ mutable ThreadLock sendLock;
+ // outgoing data packets queue
+ OutgoingRTPPktLink* sendFirst, * sendLast;
+ uint32 initialTimestamp;
+ // transmission scheduling timeout for the service thread
+ microtimeout_t schedulingTimeout;
+ // how old a packet can reach in the sending queue before deletetion
+ microtimeout_t expireTimeout;
- struct {
- // number of packets sent from the beginning
- uint32 packetCount;
- // number of payload octets sent from the beginning
- uint32 octetCount;
- // the sequence number of the next packet to sent
- uint16 sendSeq;
- // contributing sources
- uint32 sendSources[16];
- // how many CSRCs to send.
- uint16 sendCC;
- // pad packets to a paddinglen multiple
- uint8 paddinglen;
- // This flags tells whether to set the bit M in the
- // RTP fixed header of the packet in which the next
- // provided data will be sent.
- bool marked;
- // whether there was not loss.
- bool complete;
- // ramdonly generated offset for the timestamp of sent packets
- uint32 initialTimestamp;
- // elapsed time accumulated through successive overflows of
- // the local timestamp field
- timeval overflowTime;
- } sendInfo;
+ struct {
+ // number of packets sent from the beginning
+ uint32 packetCount;
+ // number of payload octets sent from the beginning
+ uint32 octetCount;
+ // the sequence number of the next packet to sent
+ uint16 sendSeq;
+ // contributing sources
+ uint32 sendSources[16];
+ // how many CSRCs to send.
+ uint16 sendCC;
+ // pad packets to a paddinglen multiple
+ uint8 paddinglen;
+ // This flags tells whether to set the bit M in the
+ // RTP fixed header of the packet in which the next
+ // provided data will be sent.
+ bool marked;
+ // whether there was not loss.
+ bool complete;
+ // ramdonly generated offset for the timestamp of sent packets
+ uint32 initialTimestamp;
+ // elapsed time accumulated through successive overflows of
+ // the local timestamp field
+ timeval overflowTime;
+ } sendInfo;
};
/** @}*/ // oqueue
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_OQUEUE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/pool.h b/jni/libccrtp/sources/src/ccrtp/pool.h
index 54b6bc3..9f241ad 100644
--- a/jni/libccrtp/sources/src/ccrtp/pool.h
+++ b/jni/libccrtp/sources/src/ccrtp/pool.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001,2002,2006 Federico Montesino Pouzols <fedemp@altern.org>
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -46,43 +46,41 @@
#include <list>
#include <ccrtp/rtp.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
+NAMESPACE_COMMONCPP
using std::list;
-#endif
typedef TRTPSessionBase<> RTPSessionBase;
class RTPSessionBaseHandler
{
public:
- inline microtimeout_t getSchedulingTimeout(RTPSessionBase& s)
- { return s.getSchedulingTimeout(); }
+ inline microtimeout_t getSchedulingTimeout(RTPSessionBase& s)
+ { return s.getSchedulingTimeout(); }
- inline timeval getRTCPCheckInterval(RTPSessionBase& s)
- { return s.getRTCPCheckInterval(); }
+ inline timeval getRTCPCheckInterval(RTPSessionBase& s)
+ { return s.getRTCPCheckInterval(); }
- size_t
- takeInDataPacket(RTPSessionBase& s)
- { return s.takeInDataPacket(); }
-
- size_t
- dispatchDataPacket(RTPSessionBase& s)
- { return s.dispatchDataPacket(); }
-
- void
- controlReceptionService(RTPSessionBase& s)
- { s.controlReceptionService(); }
-
- void
- controlTransmissionService(RTPSessionBase& s)
- { s.controlTransmissionService(); }
-
- inline SOCKET getDataRecvSocket(RTPSessionBase& s) const
- { return s.getDataRecvSocket(); }
-
- inline SOCKET getControlRecvSocket(RTPSessionBase& s) const
- { return s.getControlRecvSocket(); }
+ size_t
+ takeInDataPacket(RTPSessionBase& s)
+ { return s.takeInDataPacket(); }
+
+ size_t
+ dispatchDataPacket(RTPSessionBase& s)
+ { return s.dispatchDataPacket(); }
+
+ void
+ controlReceptionService(RTPSessionBase& s)
+ { s.controlReceptionService(); }
+
+ void
+ controlTransmissionService(RTPSessionBase& s)
+ { s.controlTransmissionService(); }
+
+ inline SOCKET getDataRecvSocket(RTPSessionBase& s) const
+ { return s.getDataRecvSocket(); }
+
+ inline SOCKET getControlRecvSocket(RTPSessionBase& s) const
+ { return s.getControlRecvSocket(); }
};
/**
@@ -94,33 +92,33 @@
class SessionListElement {
private:
- RTPSessionBase* elem;
- bool cleared;
+ RTPSessionBase* elem;
+ bool cleared;
public:
- SessionListElement(RTPSessionBase* e);
- void clear();
- bool isCleared();
- RTPSessionBase* get();
+ SessionListElement(RTPSessionBase* e);
+ void clear();
+ bool isCleared();
+ RTPSessionBase* get();
};
-inline SessionListElement::SessionListElement(RTPSessionBase* e)
- : elem(e), cleared(false) {
+inline SessionListElement::SessionListElement(RTPSessionBase* e)
+ : elem(e), cleared(false) {
}
inline void SessionListElement::clear() {
- cleared = true;
- delete elem;
- elem = 0;
+ cleared = true;
+ delete elem;
+ elem = 0;
}
inline bool SessionListElement::isCleared() {
- return cleared;
+ return cleared;
}
inline RTPSessionBase* SessionListElement::get() {
- return elem;
+ return elem;
}
/**
@@ -137,7 +135,7 @@
bool operator() (SessionListElement* e)
{
- return e->get() == elem;
+ return e->get() == elem;
}
};
@@ -157,84 +155,82 @@
class __EXPORT RTPSessionPool: public RTPSessionBaseHandler
{
public:
- RTPSessionPool();
+ RTPSessionPool();
- inline virtual ~RTPSessionPool()
- { }
+ inline virtual ~RTPSessionPool()
+ { }
- bool
- addSession(RTPSessionBase& session);
+ bool
+ addSession(RTPSessionBase& session);
- bool
- removeSession(RTPSessionBase& session);
+ bool
+ removeSession(RTPSessionBase& session);
- size_t
- getPoolLength() const;
+ size_t
+ getPoolLength() const;
- virtual void startRunning() = 0;
+ virtual void startRunning() = 0;
- inline bool isActive()
- { return poolActive; }
+ inline bool isActive()
+ { return poolActive; }
protected:
- inline void setActive()
- { poolActive = true; }
-
- inline timeval getPoolTimeout()
- { return poolTimeout; }
+ inline void setActive()
+ { poolActive = true; }
- inline void setPoolTimeout(int sec, int usec)
- { poolTimeout.tv_sec = sec; poolTimeout.tv_usec = usec; }
+ inline timeval getPoolTimeout()
+ { return poolTimeout; }
- inline void setPoolTimeout(struct timeval to)
- { poolTimeout = to; }
+ inline void setPoolTimeout(int sec, int usec)
+ { poolTimeout.tv_sec = sec; poolTimeout.tv_usec = usec; }
- std::list<SessionListElement*> sessionList;
- typedef std::list<SessionListElement*>::iterator PoolIterator;
+ inline void setPoolTimeout(struct timeval to)
+ { poolTimeout = to; }
- mutable ThreadLock poolLock;
+ std::list<SessionListElement*> sessionList;
+ typedef std::list<SessionListElement*>::iterator PoolIterator;
-#ifndef WIN32
- fd_set recvSocketSet;
- SOCKET highestSocket; // highest socket number + 1
+ mutable ThreadLock poolLock;
+
+#ifndef _MSWINDOWS_
+ fd_set recvSocketSet;
+ SOCKET highestSocket; // highest socket number + 1
#endif
private:
- timeval poolTimeout;
- mutable bool poolActive;
+ timeval poolTimeout;
+ mutable bool poolActive;
};
-class __EXPORT SingleRTPSessionPool :
- public RTPSessionPool,
- public Thread
+class __EXPORT SingleRTPSessionPool :
+ public RTPSessionPool,
+ public Thread
{
public:
- /**
- * @param pri optional thread priority value.
- **/
- SingleRTPSessionPool(int pri = 0) :
- RTPSessionPool(),
- Thread(pri)
- { }
-
- ~SingleRTPSessionPool()
- { }
+ /**
+ * @param pri optional thread priority value.
+ **/
+ SingleRTPSessionPool(int pri = 0) :
+ RTPSessionPool(),
+ Thread(pri)
+ { }
- void startRunning()
- { setActive(); Thread::start(); }
+ ~SingleRTPSessionPool()
+ { }
+
+ void startRunning()
+ { setActive(); Thread::start(); }
protected:
- /**
- * Runnable method for the thread. This thread serves all the
- * RTP sessions.added to this pool.
- */
- void run();
+ /**
+ * Runnable method for the thread. This thread serves all the
+ * RTP sessions.added to this pool.
+ */
+ void run();
};
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_POOL_H
diff --git a/jni/libccrtp/sources/src/ccrtp/queuebase.h b/jni/libccrtp/sources/src/ccrtp/queuebase.h
index 9c2611b..a80482b 100644
--- a/jni/libccrtp/sources/src/ccrtp/queuebase.h
+++ b/jni/libccrtp/sources/src/ccrtp/queuebase.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001,2002,2004 Federico Montesino Pouzols <fedemp@altern.org>.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,128 +35,126 @@
// If you do not wish that, delete this exception notice.
//
-/**
- * @file queuebase.h
+/**
+ * @file queuebase.h
*
* @short Base classes for RTP queues.
**/
-#ifndef CCXX_RTP_QUEUEBASE_H_
+#ifndef CCXX_RTP_QUEUEBASE_H_
#define CCXX_RTP_QUEUEBASE_H_
-#include <cc++/pointer.h>
+#include <commoncpp/pointer.h>
#include <ccrtp/rtppkt.h>
#include <ccrtp/sources.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup queuebase Base classes for RTP queues.
* @{
**/
-/**
+/**
* @class AppDataUnit
- * @short Interface (envelope) to data received over RTP packets.
+ * @short Interface (envelope) to data received over RTP packets.
*
* A class of objects representing data transmitted over RTP packets.
* Tipically, this object will apply to received data. Data blocks
* received via RTP connections as well as its related objects
* (source, etc), are accessed through the methods of this class.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT AppDataUnit
-{
+{
public:
- AppDataUnit(const IncomingRTPPkt& packet, const SyncSource& src);
-
- inline ~AppDataUnit()
- { }
-
- /**
- * @param src the AppDataUnit object being copied
- */
- AppDataUnit(const AppDataUnit& src);
-
- /**
- * Assignment operator
- *
- * @param source the AppDataUnit object being assigned @return
- * the result of the assignment
- */
- AppDataUnit&
- operator=(const AppDataUnit& source);
-
- /**
- * @return type of this data
- */
- inline PayloadType
- getType() const
- { return datablock->getPayloadType(); }
+ AppDataUnit(const IncomingRTPPkt& packet, const SyncSource& src);
- /**
- * Get data as it is received in RTP packets (i.e. for
- * multi-octet encodings, octets are in network
- * order.
- *
- * @return Raw pointer to data block.
- **/
- inline const uint8* const
- getData() const
- { return datablock->getPayload(); }
-
- /**
- * @return length of data in octets
- **/
- size_t
- getSize() const
- { return datablock->getPayloadSize(); }
+ inline ~AppDataUnit()
+ { }
- /**
- * @return Source that sent this data
- */
- inline const SyncSource&
- getSource() const
- { return *source; }
+ /**
+ * @param src the AppDataUnit object being copied
+ */
+ AppDataUnit(const AppDataUnit& src);
- /**
- * Is this data unit marked?.
- *
- * @return true if marked.
- **/
- inline bool
- isMarked() const
- { return datablock->isMarked(); }
+ /**
+ * Assignment operator
+ *
+ * @param source the AppDataUnit object being assigned @return
+ * the result of the assignment
+ */
+ AppDataUnit&
+ operator=(const AppDataUnit& source);
- /**
- * Get data unit sequence number.
- **/
- inline uint16
- getSeqNum() const
- { return datablock->getSeqNum(); }
+ /**
+ * @return type of this data
+ */
+ inline PayloadType
+ getType() const
+ { return datablock->getPayloadType(); }
- /**
- * Get the number of contributing sources in the CSRC list.
- **/
- inline uint8
- getContributorsCount() const
- { return (uint8)datablock->getCSRCsCount(); }
+ /**
+ * Get data as it is received in RTP packets (i.e. for
+ * multi-octet encodings, octets are in network
+ * order.
+ *
+ * @return Raw pointer to data block.
+ **/
+ inline const uint8* const
+ getData() const
+ { return datablock->getPayload(); }
- /**
- * Get the array of 32-bit CSRC identifiers.
- *
- * @return NULL if (getContributorsCount() == 0)
- **/
- inline const uint32*
- getContributorsID() const
- { return datablock->getCSRCs(); }
+ /**
+ * @return length of data in octets
+ **/
+ size_t
+ getSize() const
+ { return datablock->getPayloadSize(); }
+
+ /**
+ * @return Source that sent this data
+ */
+ inline const SyncSource&
+ getSource() const
+ { return *source; }
+
+ /**
+ * Is this data unit marked?.
+ *
+ * @return true if marked.
+ **/
+ inline bool
+ isMarked() const
+ { return datablock->isMarked(); }
+
+ /**
+ * Get data unit sequence number.
+ **/
+ inline uint16
+ getSeqNum() const
+ { return datablock->getSeqNum(); }
+
+ /**
+ * Get the number of contributing sources in the CSRC list.
+ **/
+ inline uint8
+ getContributorsCount() const
+ { return (uint8)datablock->getCSRCsCount(); }
+
+ /**
+ * Get the array of 32-bit CSRC identifiers.
+ *
+ * @return NULL if (getContributorsCount() == 0)
+ **/
+ inline const uint32*
+ getContributorsID() const
+ { return datablock->getCSRCs(); }
private:
- Pointer<const IncomingRTPPkt> datablock;
- const SyncSource* source;
+ Pointer<const IncomingRTPPkt> datablock;
+ const SyncSource* source;
};
/**
@@ -164,180 +162,178 @@
*
* A virtual base class for RTP queue hierarchies.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT RTPQueueBase
{
public:
- /**
- * Set the payload format in use, for timing and payload type
- * identification purposes.
- *
- * @param pf payload format to use from now on.
- * @return whether the payload format has been successfully set.
- **/
- inline bool
- setPayloadFormat(const PayloadFormat& pf)
- {
- currentPayloadType = pf.getPayloadType();
- currentRTPClockRate = pf.getRTPClockRate();
- return true;
- }
+ /**
+ * Set the payload format in use, for timing and payload type
+ * identification purposes.
+ *
+ * @param pf payload format to use from now on.
+ * @return whether the payload format has been successfully set.
+ **/
+ inline bool
+ setPayloadFormat(const PayloadFormat& pf)
+ {
+ currentPayloadType = pf.getPayloadType();
+ currentRTPClockRate = pf.getRTPClockRate();
+ return true;
+ }
- inline uint32 getLocalSSRC() const
- { return localSSRC; }
+ inline uint32 getLocalSSRC() const
+ { return localSSRC; }
- /**
- * Get the clock rate in RTP clock units (for instance, 8000
- * units per second for PCMU, or 90000 units per second for
- * MP2T). This value depends on what payload format has been
- * selected using setPayloadFormat().
- *
- * @return clock rate in RTP clock units.
- **/
- inline uint32 getCurrentRTPClockRate() const
- { return currentRTPClockRate; }
+ /**
+ * Get the clock rate in RTP clock units (for instance, 8000
+ * units per second for PCMU, or 90000 units per second for
+ * MP2T). This value depends on what payload format has been
+ * selected using setPayloadFormat().
+ *
+ * @return clock rate in RTP clock units.
+ **/
+ inline uint32 getCurrentRTPClockRate() const
+ { return currentRTPClockRate; }
- inline PayloadType getCurrentPayloadType() const
- { return currentPayloadType; }
+ inline PayloadType getCurrentPayloadType() const
+ { return currentPayloadType; }
- inline timeval getInitialTime() const
- { return initialTime; }
+ inline timeval getInitialTime() const
+ { return initialTime; }
protected:
- /**
- * @param ssrc If not null, the local SSRC identifier for this
- * session.
- **/
- RTPQueueBase(uint32 *ssrc = NULL);
+ /**
+ * @param ssrc If not null, the local SSRC identifier for this
+ * session.
+ **/
+ RTPQueueBase(uint32 *ssrc = NULL);
- inline void setLocalSSRC(uint32 ssrc)
- { localSSRC = ssrc; localSSRCNetwork = htonl(ssrc); }
+ inline void setLocalSSRC(uint32 ssrc)
+ { localSSRC = ssrc; localSSRCNetwork = htonl(ssrc); }
- inline uint32 getLocalSSRCNetwork() const
- { return localSSRCNetwork; }
+ inline uint32 getLocalSSRCNetwork() const
+ { return localSSRCNetwork; }
- virtual
- ~RTPQueueBase()
- { }
+ virtual
+ ~RTPQueueBase()
+ { }
- /**
- * A plugin point for posting of BYE messages.
- *
- * @param - reason to leave the RTP session.
- * @return number of octets sent.
- **/
- inline virtual size_t
- dispatchBYE(const std::string&)
- { return 0; }
+ /**
+ * A plugin point for posting of BYE messages.
+ *
+ * @param - reason to leave the RTP session.
+ * @return number of octets sent.
+ **/
+ inline virtual size_t
+ dispatchBYE(const std::string&)
+ { return 0; }
- inline virtual void
- renewLocalSSRC()
- { }
+ inline virtual void
+ renewLocalSSRC()
+ { }
private:
- // local SSRC 32-bit identifier
- uint32 localSSRC;
- // SSRC in network byte order
- uint32 localSSRCNetwork;
- // RTP clock rate for the current payload type.
- uint32 currentRTPClockRate;
- // Current payload type set for outgoing packets and expected
- // from incoming packets.
- PayloadType currentPayloadType;
- // when the queue is created
- timeval initialTime;
+ // local SSRC 32-bit identifier
+ uint32 localSSRC;
+ // SSRC in network byte order
+ uint32 localSSRCNetwork;
+ // RTP clock rate for the current payload type.
+ uint32 currentRTPClockRate;
+ // Current payload type set for outgoing packets and expected
+ // from incoming packets.
+ PayloadType currentPayloadType;
+ // when the queue is created
+ timeval initialTime;
};
/**
* @class OutgoingDataQueueBase
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT OutgoingDataQueueBase:
- public virtual RTPQueueBase
+ public virtual RTPQueueBase
{
public:
- inline size_t
- getDefaultMaxSendSegmentSize()
- { return defaultMaxSendSegmentSize;}
+ inline size_t
+ getDefaultMaxSendSegmentSize()
+ { return defaultMaxSendSegmentSize;}
- /**
- * Set maximum payload segment size before fragmenting sends.
- *
- * @param size Maximum payload size.
- * @return Whether segment size was successfully set.
- **/
- inline void
- setMaxSendSegmentSize(size_t size)
- { maxSendSegmentSize = size; }
+ /**
+ * Set maximum payload segment size before fragmenting sends.
+ *
+ * @param size Maximum payload size.
+ * @return Whether segment size was successfully set.
+ **/
+ inline void
+ setMaxSendSegmentSize(size_t size)
+ { maxSendSegmentSize = size; }
- inline size_t
- getMaxSendSegmentSize()
- { return maxSendSegmentSize; }
+ inline size_t
+ getMaxSendSegmentSize()
+ { return maxSendSegmentSize; }
protected:
- OutgoingDataQueueBase();
+ OutgoingDataQueueBase();
- inline virtual
- ~OutgoingDataQueueBase()
- { }
+ inline virtual
+ ~OutgoingDataQueueBase()
+ { }
private:
- static const size_t defaultMaxSendSegmentSize;
- // maximum packet size before fragmenting sends.
- size_t maxSendSegmentSize;
+ static const size_t defaultMaxSendSegmentSize;
+ // maximum packet size before fragmenting sends.
+ size_t maxSendSegmentSize;
};
/**
* @class IncomingDataQueueBase
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT IncomingDataQueueBase:
- public virtual RTPQueueBase
+ public virtual RTPQueueBase
{
public:
- inline size_t getDefaultMaxRecvPacketSize() const
- { return defaultMaxRecvPacketSize; }
+ inline size_t getDefaultMaxRecvPacketSize() const
+ { return defaultMaxRecvPacketSize; }
- inline size_t
- getMaxRecvPacketSize() const
- { return maxRecvPacketSize; }
+ inline size_t
+ getMaxRecvPacketSize() const
+ { return maxRecvPacketSize; }
- /**
- * @param maxsize maximum length of received RTP data packets,
- * in octets. Defaults to the value returned by
- * getDefaultMaxRecvPacketSize().
- *
- * @note This method sets a filter for incoming
- * packets. Setting higher values does not necessarily imply
- * higher memory usage (this method does not set any buffer
- * size).
- **/
- inline void
- setMaxRecvPacketSize(size_t maxsize)
- { maxRecvPacketSize = maxsize; }
+ /**
+ * @param maxsize maximum length of received RTP data packets,
+ * in octets. Defaults to the value returned by
+ * getDefaultMaxRecvPacketSize().
+ *
+ * @note This method sets a filter for incoming
+ * packets. Setting higher values does not necessarily imply
+ * higher memory usage (this method does not set any buffer
+ * size).
+ **/
+ inline void
+ setMaxRecvPacketSize(size_t maxsize)
+ { maxRecvPacketSize = maxsize; }
protected:
- IncomingDataQueueBase()
- { setMaxRecvPacketSize(getDefaultMaxRecvPacketSize()); }
+ IncomingDataQueueBase()
+ { setMaxRecvPacketSize(getDefaultMaxRecvPacketSize()); }
- inline virtual
- ~IncomingDataQueueBase()
- { }
+ inline virtual
+ ~IncomingDataQueueBase()
+ { }
private:
- static const size_t defaultMaxRecvPacketSize;
- // filter value for received packets length.
- size_t maxRecvPacketSize;
+ static const size_t defaultMaxRecvPacketSize;
+ // filter value for received packets length.
+ size_t maxRecvPacketSize;
};
/** @}*/ // queuebase
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_QUEUEBASE_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/rtcppkt.h b/jni/libccrtp/sources/src/ccrtp/rtcppkt.h
index 7213ab6..20e4b96 100644
--- a/jni/libccrtp/sources/src/ccrtp/rtcppkt.h
+++ b/jni/libccrtp/sources/src/ccrtp/rtcppkt.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001,2002,2004,2007 Federico Montesino Pouzols <fedemp@altern.org>.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,17 +35,15 @@
// If you do not wish that, delete this exception notice.
//
-#ifndef CCXX_RTP_RTCPPKT_H_
+#ifndef CCXX_RTP_RTCPPKT_H_
#define CCXX_RTP_RTCPPKT_H_
#include <ccrtp/base.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
-/**
- * @file rtcppkt.h
+/**
+ * @file rtcppkt.h
*
* @short RTCP packets handling.
**/
@@ -55,7 +53,7 @@
* @{
**/
-/**
+/**
* @enum SDESItemType
* @short SDES items that may be carried in a Source DEScription RTCP packet.
*
@@ -66,17 +64,17 @@
**/
typedef enum
{
- SDESItemTypeEND = 0, ///< END of SDES item list.
- SDESItemTypeCNAME, ///< Canonical end-point identifier.
- SDESItemTypeNAME, ///< Personal NAME of the user.
- SDESItemTypeEMAIL, ///< EMAIL address of the user.
- SDESItemTypePHONE, ///< Phone number of the user.
- SDESItemTypeLOC, ///< Location where the user is.
- SDESItemTypeTOOL, ///< Application or tool.
- SDESItemTypeNOTE, ///< Comment usually reporting state.
- SDESItemTypePRIV, ///< Private extension.
- SDESItemTypeH323CADDR, ///< H323 callable address.
- SDESItemTypeLast = SDESItemTypeH323CADDR ///< Last defined code.
+ SDESItemTypeEND = 0, ///< END of SDES item list.
+ SDESItemTypeCNAME, ///< Canonical end-point identifier.
+ SDESItemTypeNAME, ///< Personal NAME of the user.
+ SDESItemTypeEMAIL, ///< EMAIL address of the user.
+ SDESItemTypePHONE, ///< Phone number of the user.
+ SDESItemTypeLOC, ///< Location where the user is.
+ SDESItemTypeTOOL, ///< Application or tool.
+ SDESItemTypeNOTE, ///< Comment usually reporting state.
+ SDESItemTypePRIV, ///< Private extension.
+ SDESItemTypeH323CADDR, ///< H323 callable address.
+ SDESItemTypeLast = SDESItemTypeH323CADDR ///< Last defined code.
} SDESItemType;
/**
@@ -87,420 +85,420 @@
* Intended to be used, through inheritance, in RTCP management
* classes, such as QueueRTCPManager.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
-class __EXPORT RTCPCompoundHandler
+class __EXPORT RTCPCompoundHandler
{
public:
- inline void setPathMTU(uint16 mtu)
- { pathMTU = mtu; }
+ inline void setPathMTU(uint16 mtu)
+ { pathMTU = mtu; }
- inline uint16 getPathMTU()
- { return pathMTU; }
+ inline uint16 getPathMTU()
+ { return pathMTU; }
-#ifdef CCXX_PACKED
-#pragma pack(1)
+#ifdef CCXX_PACKED
+#pragma pack(1)
#endif
- /**
- * @struct ReceiverInfo
- *
- * Struct for the data contained in a receiver info
- * block. Receiver info blocks can be found in SR (sender
- * report) or RR (receiver report) RTCP packets.
- **/
- struct ReceiverInfo
- {
- uint8 fractionLost; ///< packet fraction lost.
- uint8 lostMSB; ///< cumulative lost MSB of 3 octets.
- uint16 lostLSW; ///< cumulative lost two LSB.
- uint32 highestSeqNum; ///< highest sequence number.
- uint32 jitter; ///< arrival jitter.
- uint32 lsr; ///< last sender report timestamp.
- uint32 dlsr; ///< delay since last sender report.
- };
-
- /**
- * @struct RRBlock
- *
- * Struct for a receiver info block in a SR (sender report) or an RR
- * (receiver report) RTCP packet.
- **/
- struct RRBlock
- {
- uint32 ssrc; ///< source identifier.
- ReceiverInfo rinfo; ///< info about the source.
- };
-
- /**
- * @struct RecvReport
- *
- * @short raw structure of the source and every receiver report in an
- * SR or RR RTCP packet.
- **/
- struct RecvReport
- {
- uint32 ssrc; ///< source identifier.
- RRBlock blocks[1]; ///< receiver report blocks.
- };
-
- /**
- * @struct SenderInfo
- *
- * Struct for the sender info block in a SR (sender report)
- * RTCP packet.
- **/
- struct SenderInfo
- {
- uint32 NTPMSW; ///< NTP timestamp higher octets.
- uint32 NTPLSW; ///< NTP timestamp lower octets.
- uint32 RTPTimestamp; ///< RTP timestamp.
- uint32 packetCount; ///< cumulative packet counter.
- uint32 octetCount; ///< cumulative octet counter.
- };
-
- /**
- * @struct SendReport
- *
- * Struct for SR (sender report) RTCP packets.
- **/
- struct SendReport
- {
- uint32 ssrc; ///< source identifier.
- SenderInfo sinfo; ///< actual sender info.
- RRBlock blocks[1]; ///< possibly several receiver info blocks.
- };
-
- /**
- * @struct SDESItem
- *
- * Struct for an item description of a SDES packet.
- **/
- struct SDESItem
- {
- uint8 type; ///< item identifier.
- uint8 len; ///< item len in octets.
- char data[1]; ///< item content.
- };
+ /**
+ * @struct ReceiverInfo
+ *
+ * Struct for the data contained in a receiver info
+ * block. Receiver info blocks can be found in SR (sender
+ * report) or RR (receiver report) RTCP packets.
+ **/
+ struct ReceiverInfo
+ {
+ uint8 fractionLost; ///< packet fraction lost.
+ uint8 lostMSB; ///< cumulative lost MSB of 3 octets.
+ uint16 lostLSW; ///< cumulative lost two LSB.
+ uint32 highestSeqNum; ///< highest sequence number.
+ uint32 jitter; ///< arrival jitter.
+ uint32 lsr; ///< last sender report timestamp.
+ uint32 dlsr; ///< delay since last sender report.
+ };
- /**
- * @struct SDESChunk
- *
- * Struct for a chunk of items in a SDES RTCP packet.
- **/
- struct SDESChunk
- {
- uint32 getSSRC() const
- { return (ntohl(ssrc)); }
+ /**
+ * @struct RRBlock
+ *
+ * Struct for a receiver info block in a SR (sender report) or an RR
+ * (receiver report) RTCP packet.
+ **/
+ struct RRBlock
+ {
+ uint32 ssrc; ///< source identifier.
+ ReceiverInfo rinfo; ///< info about the source.
+ };
- uint32 ssrc; ///< SSRC identifer from sender.
- SDESItem item; ///< SDES item from sender.
- };
+ /**
+ * @struct RecvReport
+ *
+ * @short raw structure of the source and every receiver report in an
+ * SR or RR RTCP packet.
+ **/
+ struct RecvReport
+ {
+ uint32 ssrc; ///< source identifier.
+ RRBlock blocks[1]; ///< receiver report blocks.
+ };
- /**
- * @struct BYEPacket
- *
- * @short Struct for BYE (leaving session) RTCP packets.
- **/
- struct BYEPacket
- {
- uint32 ssrc; ///< ssrc identifier of source leaving.
- uint8 length; ///< [optional] length of reason.
- };
-
- /**
- * @struct APPPacket
- *
- * @short Struct for APP (application specific) RTCP packets.
- **/
- struct APPPacket
- {
- uint32 ssrc; ///< ssrc identifier of source.
- char name [4]; ///< Name of the APP packet,
- ///interpreted as a sequence of
- ///four characters.
- unsigned char data[1]; ///< application dependent data.
- };
+ /**
+ * @struct SenderInfo
+ *
+ * Struct for the sender info block in a SR (sender report)
+ * RTCP packet.
+ **/
+ struct SenderInfo
+ {
+ uint32 NTPMSW; ///< NTP timestamp higher octets.
+ uint32 NTPLSW; ///< NTP timestamp lower octets.
+ uint32 RTPTimestamp; ///< RTP timestamp.
+ uint32 packetCount; ///< cumulative packet counter.
+ uint32 octetCount; ///< cumulative octet counter.
+ };
- /**
- * @struct FIRPacket
- *
- * @short Struct for Full Intra-frame Request (FIR) RTCP
- * packet. Specific for H.261 sessions (see RFC 2032).
- **/
- struct FIRPacket
- {
- uint32 ssrc; ///< ssrc identifier of source.
- };
+ /**
+ * @struct SendReport
+ *
+ * Struct for SR (sender report) RTCP packets.
+ **/
+ struct SendReport
+ {
+ uint32 ssrc; ///< source identifier.
+ SenderInfo sinfo; ///< actual sender info.
+ RRBlock blocks[1]; ///< possibly several receiver info blocks.
+ };
- /**
- * @struct NACKPacket
- *
- * @short Struct for Negative ACKnowledgements (NACK) RTCP
- * packet. Specific for H.261 sessions (see RFC 2032).
- **/
- struct NACKPacket
- {
- uint32 ssrc; ///< ssrc identifier of source.
- uint16 fsn; ///< First Sequence Number lost.
- uint16 blp; ///< Bitmask of following Lost Packets.
- };
+ /**
+ * @struct SDESItem
+ *
+ * Struct for an item description of a SDES packet.
+ **/
+ struct SDESItem
+ {
+ uint8 type; ///< item identifier.
+ uint8 len; ///< item len in octets.
+ char data[1]; ///< item content.
+ };
- /**
- * @struct RTCPFixedHeader
- * Fixed RTCP packet header. First 32-bit word in any RTCP
- * packet.
- */
- struct RTCPFixedHeader
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- ///< For big endian boxes
- unsigned char version:2; ///< Version, currently 2.
- unsigned char padding:1; ///< Padding bit.
- unsigned char block_count:5; ///< Number of RR, SR, or SDES chunks.
+ /**
+ * @struct SDESChunk
+ *
+ * Struct for a chunk of items in a SDES RTCP packet.
+ **/
+ struct SDESChunk
+ {
+ uint32 getSSRC() const
+ { return (ntohl(ssrc)); }
+
+ uint32 ssrc; ///< SSRC identifer from sender.
+ SDESItem item; ///< SDES item from sender.
+ };
+
+ /**
+ * @struct BYEPacket
+ *
+ * @short Struct for BYE (leaving session) RTCP packets.
+ **/
+ struct BYEPacket
+ {
+ uint32 ssrc; ///< ssrc identifier of source leaving.
+ uint8 length; ///< [optional] length of reason.
+ };
+
+ /**
+ * @struct APPPacket
+ *
+ * @short Struct for APP (application specific) RTCP packets.
+ **/
+ struct APPPacket
+ {
+ uint32 ssrc; ///< ssrc identifier of source.
+ char name [4]; ///< Name of the APP packet,
+ ///interpreted as a sequence of
+ ///four characters.
+ unsigned char data[1]; ///< application dependent data.
+ };
+
+ /**
+ * @struct FIRPacket
+ *
+ * @short Struct for Full Intra-frame Request (FIR) RTCP
+ * packet. Specific for H.261 sessions (see RFC 2032).
+ **/
+ struct FIRPacket
+ {
+ uint32 ssrc; ///< ssrc identifier of source.
+ };
+
+ /**
+ * @struct NACKPacket
+ *
+ * @short Struct for Negative ACKnowledgements (NACK) RTCP
+ * packet. Specific for H.261 sessions (see RFC 2032).
+ **/
+ struct NACKPacket
+ {
+ uint32 ssrc; ///< ssrc identifier of source.
+ uint16 fsn; ///< First Sequence Number lost.
+ uint16 blp; ///< Bitmask of following Lost Packets.
+ };
+
+ /**
+ * @struct RTCPFixedHeader
+ * Fixed RTCP packet header. First 32-bit word in any RTCP
+ * packet.
+ */
+ struct RTCPFixedHeader
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ ///< For big endian boxes
+ unsigned char version:2; ///< Version, currently 2.
+ unsigned char padding:1; ///< Padding bit.
+ unsigned char block_count:5; ///< Number of RR, SR, or SDES chunks.
#else
- ///< For little endian boxes
- unsigned char block_count:5; ///< Number of RR, SR, or SDES chunks.
- unsigned char padding:1; ///< Padding bit.
- unsigned char version:2; ///< Version, currently 2.
+ ///< For little endian boxes
+ unsigned char block_count:5; ///< Number of RR, SR, or SDES chunks.
+ unsigned char padding:1; ///< Padding bit.
+ unsigned char version:2; ///< Version, currently 2.
#endif
- uint8 type; ///< type of RTCP packet.
- uint16 length; ///< number of 32-bit words in the packet (*minus one*).
- };
+ uint8 type; ///< type of RTCP packet.
+ uint16 length; ///< number of 32-bit words in the packet (*minus one*).
+ };
- /**
- * @struct RTCPPacket
- *
- * @short Struct representing general RTCP packet headers as they are
- * sent through the network.
- *
- * This struct consists of a fixed header, always at the
- * beginning of any RTCP packet, and a union for all the RTCP
- * packet types supported.
- **/
- struct RTCPPacket
- {
- /**
- * @enum Type rtp.h cc++/rtp.h
- *
- * RTCP packet types. They are registered with IANA.
- */
- typedef enum {
- tSR = 200, ///< Sender Report.
- tRR, ///< Receiver Report.
- tSDES, ///< Source DEScription.
- tBYE, ///< End of participation.
- tAPP, ///< APPlication specific.
- tFIR = 192, ///< Full Intra-frame request.
- tNACK = 193, ///< Negative ACK.
- tXR ///< Extended Report.
- } Type;
-
- /**
- * Get the packet length specified in its header, in
- * octets and in host order.
- **/
- uint32 getLength() const
- { return ((ntohs(fh.length) + 1) << 2); }
+ /**
+ * @struct RTCPPacket
+ *
+ * @short Struct representing general RTCP packet headers as they are
+ * sent through the network.
+ *
+ * This struct consists of a fixed header, always at the
+ * beginning of any RTCP packet, and a union for all the RTCP
+ * packet types supported.
+ **/
+ struct RTCPPacket
+ {
+ /**
+ * @enum Type rtp.h cc++/rtp.h
+ *
+ * RTCP packet types. They are registered with IANA.
+ */
+ typedef enum {
+ tSR = 200, ///< Sender Report.
+ tRR, ///< Receiver Report.
+ tSDES, ///< Source DEScription.
+ tBYE, ///< End of participation.
+ tAPP, ///< APPlication specific.
+ tFIR = 192, ///< Full Intra-frame request.
+ tNACK = 193, ///< Negative ACK.
+ tXR ///< Extended Report.
+ } Type;
- /**
- * Get the SSRC identifier specified in the packet
- * header, in host order.
- **/
- uint32 getSSRC() const
- { return (ntohl(info.RR.ssrc)); } // SSRC is always the first
- // word after fh.
+ /**
+ * Get the packet length specified in its header, in
+ * octets and in host order.
+ **/
+ uint32 getLength() const
+ { return ((ntohs(fh.length) + 1) << 2); }
- RTCPFixedHeader fh; ///< Fixed RTCP header.
+ /**
+ * Get the SSRC identifier specified in the packet
+ * header, in host order.
+ **/
+ uint32 getSSRC() const
+ { return (ntohl(info.RR.ssrc)); } // SSRC is always the first
+ // word after fh.
- // An RTCP packet may be of any of the types defined
- // above, including APP specific ones.
- union
- {
- SendReport SR;
- RecvReport RR;
- SDESChunk SDES;
- BYEPacket BYE;
- APPPacket APP;
- NACKPacket NACK;
- FIRPacket FIR;
- } info; ///< Union for SR, RR, SDES, BYE and APP
- };
-#ifdef CCXX_PACKED
+ RTCPFixedHeader fh; ///< Fixed RTCP header.
+
+ // An RTCP packet may be of any of the types defined
+ // above, including APP specific ones.
+ union
+ {
+ SendReport SR;
+ RecvReport RR;
+ SDESChunk SDES;
+ BYEPacket BYE;
+ APPPacket APP;
+ NACKPacket NACK;
+ FIRPacket FIR;
+ } info; ///< Union for SR, RR, SDES, BYE and APP
+ };
+#ifdef CCXX_PACKED
#pragma pack()
#endif
protected:
- enum { defaultPathMTU = 1500 };
+ enum { defaultPathMTU = 1500 };
- RTCPCompoundHandler(uint16 mtu = defaultPathMTU);
+ RTCPCompoundHandler(uint16 mtu = defaultPathMTU);
- ~RTCPCompoundHandler();
+ ~RTCPCompoundHandler();
- /**
- * Perform RTCP compound packet header validity check as
- * specified in draft-ietv-avt-rtp-new. This method follows
- * appendix A.2. Correct version, payload type, padding bit
- * and length of every RTCP packet in the compound are
- * verified.
- *
- * @param len length of the RTCP compound packet in
- * the reception buffer
- * @return whether the header is valid.
- */
- bool
- checkCompoundRTCPHeader(size_t len);
+ /**
+ * Perform RTCP compound packet header validity check as
+ * specified in draft-ietv-avt-rtp-new. This method follows
+ * appendix A.2. Correct version, payload type, padding bit
+ * and length of every RTCP packet in the compound are
+ * verified.
+ *
+ * @param len length of the RTCP compound packet in
+ * the reception buffer
+ * @return whether the header is valid.
+ */
+ bool
+ checkCompoundRTCPHeader(size_t len);
- // buffer to hold RTCP compound packets being sent. Allocated
- // in construction time
- unsigned char* rtcpSendBuffer;
- // buffer to hold RTCP compound packets being
- // received. Allocated at construction time
- unsigned char* rtcpRecvBuffer;
+ // buffer to hold RTCP compound packets being sent. Allocated
+ // in construction time
+ unsigned char* rtcpSendBuffer;
+ // buffer to hold RTCP compound packets being
+ // received. Allocated at construction time
+ unsigned char* rtcpRecvBuffer;
- friend class RTCPSenderInfo;
- friend class RTCPReceiverInfo;
+ friend class RTCPSenderInfo;
+ friend class RTCPReceiverInfo;
private:
- // path MTU. RTCP packets should not be greater than this
- uint16 pathMTU;
- // masks for RTCP header validation;
- static const uint16 RTCP_VALID_MASK;
- static const uint16 RTCP_VALID_VALUE;
+ // path MTU. RTCP packets should not be greater than this
+ uint16 pathMTU;
+ // masks for RTCP header validation;
+ static const uint16 RTCP_VALID_MASK;
+ static const uint16 RTCP_VALID_VALUE;
};
/**
* @class RTCPReceiverInfo
* @short Report block information of SR/RR RTCP reports.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT RTCPReceiverInfo
{
public:
- RTCPReceiverInfo(void* ri)
- { memcpy(&receiverInfo,&ri,
- sizeof(RTCPCompoundHandler::ReceiverInfo));}
+ RTCPReceiverInfo(void* ri)
+ { memcpy(&receiverInfo,&ri,
+ sizeof(RTCPCompoundHandler::ReceiverInfo));}
RTCPReceiverInfo(RTCPCompoundHandler::ReceiverInfo& si)
- : receiverInfo( si )
+ : receiverInfo( si )
{
}
- ~RTCPReceiverInfo()
- { }
+ ~RTCPReceiverInfo()
+ { }
- /**
- * Get fraction of lost packets, as a number between 0 and
- * 255.
- **/
- inline uint8
- getFractionLost() const
- { return receiverInfo.fractionLost; }
+ /**
+ * Get fraction of lost packets, as a number between 0 and
+ * 255.
+ **/
+ inline uint8
+ getFractionLost() const
+ { return receiverInfo.fractionLost; }
- inline uint32
- getCumulativePacketLost() const
- { return ( ((uint32)ntohs(receiverInfo.lostLSW)) +
- (((uint32)receiverInfo.lostMSB) << 16) ); }
-
- inline uint32
- getExtendedSeqNum() const
- { return ntohl(receiverInfo.highestSeqNum); }
+ inline uint32
+ getCumulativePacketLost() const
+ { return ( ((uint32)ntohs(receiverInfo.lostLSW)) +
+ (((uint32)receiverInfo.lostMSB) << 16) ); }
- /**
- * Get the statistical variance of the RTP data packets
- * interarrival time.
- *
- * @return Interarrival jitter, in timestamp units.
- **/
- uint32
- getJitter() const
- { return ntohl(receiverInfo.jitter); }
+ inline uint32
+ getExtendedSeqNum() const
+ { return ntohl(receiverInfo.highestSeqNum); }
- /**
- * Get the integer part of the NTP timestamp of the last SR
- * RTCP packet received from the source this receiver report
- * refers to.
- **/
- uint16
- getLastSRNTPTimestampInt() const
- { return (uint16)((ntohl(receiverInfo.lsr) & 0xFFFF0000) >> 16); }
+ /**
+ * Get the statistical variance of the RTP data packets
+ * interarrival time.
+ *
+ * @return Interarrival jitter, in timestamp units.
+ **/
+ uint32
+ getJitter() const
+ { return ntohl(receiverInfo.jitter); }
- /**
- * Get the fractional part of the NTP timestamp of the last SR
- * RTCP packet received from the source this receiver report
- * refers to.
- **/
- uint16
- getLastSRNTPTimestampFrac() const
- { return (uint16)(ntohl(receiverInfo.lsr) & 0xFFFF); }
+ /**
+ * Get the integer part of the NTP timestamp of the last SR
+ * RTCP packet received from the source this receiver report
+ * refers to.
+ **/
+ uint16
+ getLastSRNTPTimestampInt() const
+ { return (uint16)((ntohl(receiverInfo.lsr) & 0xFFFF0000) >> 16); }
- /**
- * Get the delay between the last SR packet received and the
- * transmission of this report.
- *
- * @return Delay, in units of 1/65536 seconds
- **/
- uint32
- getDelayLastSR() const
- { return ntohl(receiverInfo.dlsr); }
+ /**
+ * Get the fractional part of the NTP timestamp of the last SR
+ * RTCP packet received from the source this receiver report
+ * refers to.
+ **/
+ uint16
+ getLastSRNTPTimestampFrac() const
+ { return (uint16)(ntohl(receiverInfo.lsr) & 0xFFFF); }
+
+ /**
+ * Get the delay between the last SR packet received and the
+ * transmission of this report.
+ *
+ * @return Delay, in units of 1/65536 seconds
+ **/
+ uint32
+ getDelayLastSR() const
+ { return ntohl(receiverInfo.dlsr); }
private:
- RTCPCompoundHandler::ReceiverInfo receiverInfo;
+ RTCPCompoundHandler::ReceiverInfo receiverInfo;
};
/**
* @class RTCPSenderInfo
* @short Sender block information of SR RTCP reports.
*
- * @author Federico Montesino Pouzols <fedemp@altern.org>
+ * @author Federico Montesino Pouzols <fedemp@altern.org>
**/
class __EXPORT RTCPSenderInfo
{
public:
- RTCPSenderInfo(void* si)
- { memcpy(&senderInfo,&si,
- sizeof(RTCPCompoundHandler::SenderInfo));}
+ RTCPSenderInfo(void* si)
+ { memcpy(&senderInfo,&si,
+ sizeof(RTCPCompoundHandler::SenderInfo));}
RTCPSenderInfo(RTCPCompoundHandler::SenderInfo& si)
- : senderInfo( si )
+ : senderInfo( si )
{
}
- ~RTCPSenderInfo()
- { }
+ ~RTCPSenderInfo()
+ { }
- /**
- * Get integer part of the NTP timestamp of this packet.
- * @see NTP2Timeval
- **/
- uint32
- getNTPTimestampInt() const
- { return ntohl(senderInfo.NTPMSW); }
+ /**
+ * Get integer part of the NTP timestamp of this packet.
+ * @see NTP2Timeval
+ **/
+ uint32
+ getNTPTimestampInt() const
+ { return ntohl(senderInfo.NTPMSW); }
- /**
- * Get fractional part of the NTP timestamp of this packet.
- * @see NTP2Timeval
- **/
- uint32
- getNTPTimestampFrac() const
- { return ntohl(senderInfo.NTPLSW); }
+ /**
+ * Get fractional part of the NTP timestamp of this packet.
+ * @see NTP2Timeval
+ **/
+ uint32
+ getNTPTimestampFrac() const
+ { return ntohl(senderInfo.NTPLSW); }
- inline uint32
- getRTPTimestamp() const
- { return ntohl(senderInfo.RTPTimestamp); }
+ inline uint32
+ getRTPTimestamp() const
+ { return ntohl(senderInfo.RTPTimestamp); }
- /**
- * Get count of sent data packets.
- **/
- inline uint32
- getPacketCount() const
- { return ntohl(senderInfo.packetCount); }
-
- inline uint32
- getOctetCount() const
- { return ntohl(senderInfo.octetCount); }
+ /**
+ * Get count of sent data packets.
+ **/
+ inline uint32
+ getPacketCount() const
+ { return ntohl(senderInfo.packetCount); }
+
+ inline uint32
+ getOctetCount() const
+ { return ntohl(senderInfo.octetCount); }
private:
- RTCPCompoundHandler::SenderInfo senderInfo;
+ RTCPCompoundHandler::SenderInfo senderInfo;
};
/**
@@ -526,9 +524,7 @@
/** @}*/ // rtcppacket
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif // ndef CCXX_RTP_RTCPPKT_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/rtp.h b/jni/libccrtp/sources/src/ccrtp/rtp.h
old mode 100755
new mode 100644
index a3e2861..b08e762
--- a/jni/libccrtp/sources/src/ccrtp/rtp.h
+++ b/jni/libccrtp/sources/src/ccrtp/rtp.h
@@ -46,15 +46,13 @@
* profile specific functionality (following RFC 3551).
**/
-#ifndef CCXX_RTP_RTP_H_
+#ifndef CCXX_RTP_RTP_H_
#define CCXX_RTP_RTP_H_
#include <ccrtp/cqueue.h>
#include <ccrtp/channel.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup sessions RTP sessions.
@@ -82,325 +80,325 @@
* @author David Sugar <dyfet@ostel.com>
* @short RTP protocol stack based on Common C++.
**/
- template <class RTPDataChannel = DualRTPUDPIPv4Channel,
- class RTCPChannel = DualRTPUDPIPv4Channel,
- class ServiceQueue = AVPQueue>
- class __EXPORT TRTPSessionBase : public ServiceQueue
- {
- public:
- /**
- * Builds a session waiting for packets in a host address.
- *
- * @param ia Network address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- * */
- TRTPSessionBase(const InetHostAddress& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app) :
- ServiceQueue(membersSize,app)
- { build(ia,dataPort,controlPort); }
+ template <class RTPDataChannel = DualRTPUDPIPv4Channel,
+ class RTCPChannel = DualRTPUDPIPv4Channel,
+ class ServiceQueue = AVPQueue>
+ class __EXPORT TRTPSessionBase : public ServiceQueue
+ {
+ public:
+ /**
+ * Builds a session waiting for packets in a host address.
+ *
+ * @param ia Network address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ * */
+ TRTPSessionBase(const InetHostAddress& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app) :
+ ServiceQueue(membersSize,app)
+ { build(ia,dataPort,controlPort); }
- /**
- * Builds a session with the specified ssrc identifier for the
- * local source.
- *
- * @param ssrc SSRC identifier for the local source.
- * @param ia Network address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- **/
- TRTPSessionBase(uint32 ssrc,
- const InetHostAddress& ia,
- tpport_t dataPort, tpport_t controlPort,
- uint32 membersSize, RTPApplication& app):
- ServiceQueue(ssrc,membersSize,app)
- { build(ia,dataPort,controlPort); }
+ /**
+ * Builds a session with the specified ssrc identifier for the
+ * local source.
+ *
+ * @param ssrc SSRC identifier for the local source.
+ * @param ia Network address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ **/
+ TRTPSessionBase(uint32 ssrc,
+ const InetHostAddress& ia,
+ tpport_t dataPort, tpport_t controlPort,
+ uint32 membersSize, RTPApplication& app):
+ ServiceQueue(ssrc,membersSize,app)
+ { build(ia,dataPort,controlPort); }
- /**
- * Builds a session waiting for packets in a multicast address.
- * TODO: ssrc constructor for multicast!
- *
- * @param ia Multicast address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- * @param iface Index (from 0 to n) of network interface to join to
- * multicast group.
- **/
- TRTPSessionBase(const InetMcastAddress& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app, uint32 iface) :
- ServiceQueue(membersSize,app)
- { build(ia,dataPort,controlPort,iface); }
+ /**
+ * Builds a session waiting for packets in a multicast address.
+ * TODO: ssrc constructor for multicast!
+ *
+ * @param ia Multicast address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ * @param iface Index (from 0 to n) of network interface to join to
+ * multicast group.
+ **/
+ TRTPSessionBase(const InetMcastAddress& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app, uint32 iface) :
+ ServiceQueue(membersSize,app)
+ { build(ia,dataPort,controlPort,iface); }
- /**
- * Builds a session waiting for packets in a multicast
- * address, with the specified ssrc identifier for the local
- * source.
- *
- * @param ssrc SSRC identifier for the local source.
- * @param ia Multicast address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- * @param iface Index (from 0 to n) of network interface to join to
- * multicast group.
- **/
- TRTPSessionBase(uint32 ssrc,
- const InetMcastAddress& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app, uint32 iface) :
- ServiceQueue(ssrc,membersSize,app)
- { build(ia,dataPort,controlPort,iface); }
+ /**
+ * Builds a session waiting for packets in a multicast
+ * address, with the specified ssrc identifier for the local
+ * source.
+ *
+ * @param ssrc SSRC identifier for the local source.
+ * @param ia Multicast address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ * @param iface Index (from 0 to n) of network interface to join to
+ * multicast group.
+ **/
+ TRTPSessionBase(uint32 ssrc,
+ const InetMcastAddress& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app, uint32 iface) :
+ ServiceQueue(ssrc,membersSize,app)
+ { build(ia,dataPort,controlPort,iface); }
- virtual size_t dispatchBYE(const std::string &str)
- {
- return QueueRTCPManager::dispatchBYE(str);
- }
+ virtual size_t dispatchBYE(const std::string &str)
+ {
+ return QueueRTCPManager::dispatchBYE(str);
+ }
- /**
- * Set the value of the TTL field in the sent packets.
- *
- * @param ttl Time To Live
- * @return error code from the socket operation
- */
- inline Socket::Error
- setMcastTTL(uint8 ttl)
- {
- Socket::Error error = dso->setMulticast(true);
- if ( error ) return error;
- error = dso->setTimeToLive(ttl);
- if ( error ) return error;
- error = cso->setMulticast(true);
- if ( error ) return error;
- return cso->setTimeToLive(ttl);
- }
+ /**
+ * Set the value of the TTL field in the sent packets.
+ *
+ * @param ttl Time To Live
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ setMcastTTL(uint8 ttl)
+ {
+ Socket::Error error = dso->setMulticast(true);
+ if ( error ) return error;
+ error = dso->setTimeToLive(ttl);
+ if ( error ) return error;
+ error = cso->setMulticast(true);
+ if ( error ) return error;
+ return cso->setTimeToLive(ttl);
+ }
- inline virtual
- ~TRTPSessionBase()
- {
- endSocket();
- }
+ inline virtual
+ ~TRTPSessionBase()
+ {
+ endSocket();
+ }
- inline RTPDataChannel *getDSO(void)
- {return dso;}
+ inline RTPDataChannel *getDSO(void)
+ {return dso;}
- protected:
- /**
- * @param timeout maximum timeout to wait, in microseconds
- */
- inline bool
- isPendingData(microtimeout_t timeout)
- { return dso->isPendingRecv(timeout); }
+ protected:
+ /**
+ * @param timeout maximum timeout to wait, in microseconds
+ */
+ inline bool
+ isPendingData(microtimeout_t timeout)
+ { return dso->isPendingRecv(timeout); }
- InetHostAddress
- getDataSender(tpport_t *port = NULL) const
- { return dso->getSender(port); }
+ InetHostAddress
+ getDataSender(tpport_t *port = NULL) const
+ { return dso->getSender(port); }
- inline size_t
- getNextDataPacketSize() const
- { return dso->getNextPacketSize(); }
+ inline size_t
+ getNextDataPacketSize() const
+ { return dso->getNextPacketSize(); }
- /**
- * Receive data from the data channel/socket.
- *
- * @param buffer Memory region to read to.
- * @param len Maximum number of octets to get.
- * @param na Source network address.
- * @param tp Source transport port.
- * @return Number of octets actually read.
- */
- inline size_t
- recvData(unsigned char* buffer, size_t len,
- InetHostAddress& na, tpport_t& tp)
- { na = dso->getSender(tp); return dso->recv(buffer, len); }
+ /**
+ * Receive data from the data channel/socket.
+ *
+ * @param buffer Memory region to read to.
+ * @param len Maximum number of octets to get.
+ * @param na Source network address.
+ * @param tp Source transport port.
+ * @return Number of octets actually read.
+ */
+ inline size_t
+ recvData(unsigned char* buffer, size_t len,
+ InetHostAddress& na, tpport_t& tp)
+ { na = dso->getSender(tp); return dso->recv(buffer, len); }
- inline void
- setDataPeer(const InetAddress &host, tpport_t port)
- { dso->setPeer(host,port); }
+ inline void
+ setDataPeer(const InetAddress &host, tpport_t port)
+ { dso->setPeer(host,port); }
- /**
- * @param buffer memory region to write from
- * @param len number of octets to write
- */
- inline size_t
- sendData(const unsigned char* const buffer, size_t len)
- { return dso->send(buffer, len); }
+ /**
+ * @param buffer memory region to write from
+ * @param len number of octets to write
+ */
+ inline size_t
+ sendData(const unsigned char* const buffer, size_t len)
+ { return dso->send(buffer, len); }
- inline SOCKET getDataRecvSocket() const
- { return dso->getRecvSocket(); }
+ inline SOCKET getDataRecvSocket() const
+ { return dso->getRecvSocket(); }
- /**
- * @param timeout maximum timeout to wait, in microseconds
- * @return whether there are packets waiting to be picked
- */
- inline bool
- isPendingControl(microtimeout_t timeout)
- { return cso->isPendingRecv(timeout); }
+ /**
+ * @param timeout maximum timeout to wait, in microseconds
+ * @return whether there are packets waiting to be picked
+ */
+ inline bool
+ isPendingControl(microtimeout_t timeout)
+ { return cso->isPendingRecv(timeout); }
- InetHostAddress
- getControlSender(tpport_t *port = NULL) const
- { return cso->getSender(port); }
+ InetHostAddress
+ getControlSender(tpport_t *port = NULL) const
+ { return cso->getSender(port); }
- /**
- * Receive data from the control channel/socket.
- *
- * @param buffer Buffer where to get data.
- * @param len Maximum number of octets to get.
- * @param na Source network address.
- * @param tp Source transport port.
- * @return Number of octets actually read.
- **/
- inline size_t
- recvControl(unsigned char *buffer, size_t len,
- InetHostAddress& na, tpport_t& tp)
- { na = cso->getSender(tp); return cso->recv(buffer,len); }
+ /**
+ * Receive data from the control channel/socket.
+ *
+ * @param buffer Buffer where to get data.
+ * @param len Maximum number of octets to get.
+ * @param na Source network address.
+ * @param tp Source transport port.
+ * @return Number of octets actually read.
+ **/
+ inline size_t
+ recvControl(unsigned char *buffer, size_t len,
+ InetHostAddress& na, tpport_t& tp)
+ { na = cso->getSender(tp); return cso->recv(buffer,len); }
- inline void
- setControlPeer(const InetAddress &host, tpport_t port)
- { cso->setPeer(host,port); }
+ inline void
+ setControlPeer(const InetAddress &host, tpport_t port)
+ { cso->setPeer(host,port); }
- /**
- * @return number of octets actually written
- * @param buffer
- * @param len
- */
- inline size_t
- sendControl(const unsigned char* const buffer, size_t len)
- { return cso->send(buffer,len); }
+ /**
+ * @return number of octets actually written
+ * @param buffer
+ * @param len
+ */
+ inline size_t
+ sendControl(const unsigned char* const buffer, size_t len)
+ { return cso->send(buffer,len); }
- inline SOCKET getControlRecvSocket() const
- { return cso->getRecvSocket(); }
+ inline SOCKET getControlRecvSocket() const
+ { return cso->getRecvSocket(); }
- /**
- * Join a multicast group.
- *
- * @param ia address of the multicast group
- * @return error code from the socket operation
- */
- inline Socket::Error
- joinGroup(const InetMcastAddress& ia, uint32 iface)
- {
- Socket::Error error = dso->setMulticast(true);
- if ( error ) return error;
- error = dso->join(ia,iface);
- if ( error ) return error;
- error = cso->setMulticast(true);
- if ( error ) {
- dso->drop(ia);
- return error;
- }
- error = cso->join(ia,iface);
- if ( error ) {
- dso->drop(ia);
- return error;
- }
- return Socket::errSuccess;
- }
+ /**
+ * Join a multicast group.
+ *
+ * @param ia address of the multicast group
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ joinGroup(const InetMcastAddress& ia, uint32 iface)
+ {
+ Socket::Error error = dso->setMulticast(true);
+ if ( error ) return error;
+ error = dso->join(ia,iface);
+ if ( error ) return error;
+ error = cso->setMulticast(true);
+ if ( error ) {
+ dso->drop(ia);
+ return error;
+ }
+ error = cso->join(ia,iface);
+ if ( error ) {
+ dso->drop(ia);
+ return error;
+ }
+ return Socket::errSuccess;
+ }
- /**
- * Leave a multicast group.
- *
- * @param ia address of the multicast group
- * @return error code from the socket operation
- */
- inline Socket::Error
- leaveGroup(const InetMcastAddress& ia)
- {
- Socket::Error error = dso->setMulticast(false);
- if ( error ) return error;
- error = dso->leaveGroup(ia);
- if ( error ) return error;
- error = cso->setMulticast(false);
- if ( error ) return error;
- return cso->leaveGroup(ia);
- }
+ /**
+ * Leave a multicast group.
+ *
+ * @param ia address of the multicast group
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ leaveGroup(const InetMcastAddress& ia)
+ {
+ Socket::Error error = dso->setMulticast(false);
+ if ( error ) return error;
+ error = dso->leaveGroup(ia);
+ if ( error ) return error;
+ error = cso->setMulticast(false);
+ if ( error ) return error;
+ return cso->leaveGroup(ia);
+ }
- inline void
- endSocket()
- {
- if (dso) {
- dso->endSocket();
- delete dso;
- }
- dso = NULL;
- if (cso) {
- cso->endSocket();
- delete cso;
- }
- cso = NULL;
- }
+ inline void
+ endSocket()
+ {
+ if (dso) {
+ dso->endSocket();
+ delete dso;
+ }
+ dso = NULL;
+ if (cso) {
+ cso->endSocket();
+ delete cso;
+ }
+ cso = NULL;
+ }
- private:
- void
- build(const InetHostAddress& ia, tpport_t dataPort,
- tpport_t controlPort)
- {
- if ( 0 == controlPort ) {
- dataBasePort = even_port(dataPort);
- controlBasePort = dataBasePort + 1;
- } else {
- dataBasePort = dataPort;
- controlBasePort = controlPort;
- }
- dso = new RTPDataChannel(ia,dataBasePort);
- cso = new RTCPChannel(ia,controlBasePort);
- }
+ private:
+ void
+ build(const InetHostAddress& ia, tpport_t dataPort,
+ tpport_t controlPort)
+ {
+ if ( 0 == controlPort ) {
+ dataBasePort = even_port(dataPort);
+ controlBasePort = dataBasePort + 1;
+ } else {
+ dataBasePort = dataPort;
+ controlBasePort = controlPort;
+ }
+ dso = new RTPDataChannel(ia,dataBasePort);
+ cso = new RTCPChannel(ia,controlBasePort);
+ }
- void
- build(const InetMcastAddress& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 iface)
- {
- if ( 0 == controlPort ) {
- dataBasePort = even_port(dataPort);
- controlBasePort = dataBasePort + 1;
- } else {
- dataBasePort = dataPort;
- controlBasePort = controlPort;
- }
- dso = new RTPDataChannel(InetHostAddress("0.0.0.0"),dataBasePort);
- cso = new RTCPChannel(InetHostAddress("0.0.0.0"),controlBasePort);
- joinGroup(ia,iface);
- }
+ void
+ build(const InetMcastAddress& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 iface)
+ {
+ if ( 0 == controlPort ) {
+ dataBasePort = even_port(dataPort);
+ controlBasePort = dataBasePort + 1;
+ } else {
+ dataBasePort = dataPort;
+ controlBasePort = controlPort;
+ }
+ dso = new RTPDataChannel(InetHostAddress("0.0.0.0"),dataBasePort);
+ cso = new RTCPChannel(InetHostAddress("0.0.0.0"),controlBasePort);
+ joinGroup(ia,iface);
+ }
- /**
- * Ensure a port number is odd. If it is an even number, return
- * the next lower (odd) port number.
- *
- * @param port number to filter
- * @return filtered (odd) port number
- */
- inline tpport_t
- odd_port(tpport_t port)
- { return (port & 0x01)? (port) : (port - 1); }
+ /**
+ * Ensure a port number is odd. If it is an even number, return
+ * the next lower (odd) port number.
+ *
+ * @param port number to filter
+ * @return filtered (odd) port number
+ */
+ inline tpport_t
+ odd_port(tpport_t port)
+ { return (port & 0x01)? (port) : (port - 1); }
- /**
- * Ensure a port number is even. If it is an odd number, return
- * the next lower (even) port number.
- *
- * @param port number to filter
- * @return filtered (even) port number
- */
- inline tpport_t
- even_port(tpport_t port)
- { return (port & 0x01)? (port - 1) : (port); }
+ /**
+ * Ensure a port number is even. If it is an odd number, return
+ * the next lower (even) port number.
+ *
+ * @param port number to filter
+ * @return filtered (even) port number
+ */
+ inline tpport_t
+ even_port(tpport_t port)
+ { return (port & 0x01)? (port - 1) : (port); }
- tpport_t dataBasePort;
- tpport_t controlBasePort;
+ tpport_t dataBasePort;
+ tpport_t controlBasePort;
- protected:
- RTPDataChannel* dso;
- RTCPChannel* cso;
- friend class RTPSessionBaseHandler;
- };
+ protected:
+ RTPDataChannel* dso;
+ RTCPChannel* cso;
+ friend class RTPSessionBaseHandler;
+ };
/**
* @class SingleThreadRTPSession
@@ -412,30 +410,30 @@
*
* @author Federico Montesino Pouzols <fedemp@altern.org>
**/
- template
- <class RTPDataChannel = DualRTPUDPIPv4Channel,
- class RTCPChannel = DualRTPUDPIPv4Channel,
- class ServiceQueue = AVPQueue>
- class __EXPORT SingleThreadRTPSession :
- protected Thread,
- public TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
- {
- public:
- SingleThreadRTPSession(const InetHostAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0,
- int pri = 0,
- uint32 memberssize =
- MembershipBookkeeping::defaultMembersHashSize,
- RTPApplication& app = defaultApplication()
+ template
+ <class RTPDataChannel = DualRTPUDPIPv4Channel,
+ class RTCPChannel = DualRTPUDPIPv4Channel,
+ class ServiceQueue = AVPQueue>
+ class __EXPORT SingleThreadRTPSession :
+ protected Thread,
+ public TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
+ {
+ public:
+ SingleThreadRTPSession(const InetHostAddress& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0,
+ int pri = 0,
+ uint32 memberssize =
+ MembershipBookkeeping::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
- );
+ );
#else
- ):
- Thread(pri),
- TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
- (ia,dataPort,controlPort,memberssize,app)
- { }
+ ):
+ Thread(pri),
+ TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
+ (ia,dataPort,controlPort,memberssize,app)
+ { }
#endif
SingleThreadRTPSession(uint32 ssrc, const InetHostAddress& ia,
@@ -446,25 +444,25 @@
MembershipBookkeeping::defaultMembersHashSize,
RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
- );
+ );
#else
- ):
- Thread(pri),
- TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
- (ssrc, ia,dataPort,controlPort,memberssize,app)
+ ):
+ Thread(pri),
+ TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>
+ (ssrc, ia,dataPort,controlPort,memberssize,app)
{ }
#endif
SingleThreadRTPSession(const InetMcastAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0,
- int pri = 0,
- uint32 memberssize =
- MembershipBookkeeping::defaultMembersHashSize,
- RTPApplication& app = defaultApplication(),
- uint32 iface = 0
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0,
+ int pri = 0,
+ uint32 memberssize =
+ MembershipBookkeeping::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication(),
+ uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
- );
+ );
#else
):
Thread(pri),
@@ -474,13 +472,13 @@
#endif
SingleThreadRTPSession(uint32 ssrc, const InetMcastAddress& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0,
- int pri = 0,
- uint32 memberssize =
- MembershipBookkeeping::defaultMembersHashSize,
- RTPApplication& app = defaultApplication(),
- uint32 iface = 0
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0,
+ int pri = 0,
+ uint32 memberssize =
+ MembershipBookkeeping::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication(),
+ uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
);
#else
@@ -553,38 +551,32 @@
**/
virtual void run(void)
{
- microtimeout_t timeout = 0;
- while ( ServiceQueue::isActive() ) {
- if ( timeout < 1000 ){ // !(timeout/1000)
- timeout = getSchedulingTimeout();
- }
- setCancel(cancelDeferred);
- controlReceptionService();
- controlTransmissionService();
- setCancel(cancelImmediate);
- microtimeout_t maxWait =
- timeval2microtimeout(getRTCPCheckInterval());
- // make sure the scheduling timeout is
- // <= the check interval for RTCP
- // packets
- timeout = (timeout > maxWait)? maxWait : timeout;
- if ( timeout < 1000 ) { // !(timeout/1000)
- setCancel(cancelDeferred);
- dispatchDataPacket();
- setCancel(cancelImmediate);
- timerTick();
- } else {
- if ( isPendingData(timeout/1000) ) {
- setCancel(cancelDeferred);
+ microtimeout_t timeout = 0;
+ while ( ServiceQueue::isActive() ) {
+ if ( timeout < 1000 ){ // !(timeout/1000)
+ timeout = getSchedulingTimeout();
+ }
+ controlReceptionService();
+ controlTransmissionService();
+ microtimeout_t maxWait =
+ timeval2microtimeout(getRTCPCheckInterval());
+ // make sure the scheduling timeout is
+ // <= the check interval for RTCP
+ // packets
+ timeout = (timeout > maxWait)? maxWait : timeout;
+ if ( timeout < 1000 ) { // !(timeout/1000)
+ dispatchDataPacket();
+ timerTick();
+ } else {
+ if ( isPendingData(timeout/1000) ) {
if (ServiceQueue::isActive()) { // take in only if active
takeInDataPacket();
}
- setCancel(cancelImmediate);
- }
- timeout = 0;
- }
- }
- dispatchBYE("GNU ccRTP stack finishing.");
+ }
+ timeout = 0;
+ }
+ }
+ dispatchBYE("GNU ccRTP stack finishing.");
// Thread::exit();
}
@@ -623,9 +615,9 @@
* @short Symmetric UDP/IPv4 RTP session scheduled by one thread of execution.
**/
typedef SingleThreadRTPSession<SymmetricRTPChannel,
- SymmetricRTPChannel> SymmetricRTPSession;
+ SymmetricRTPChannel> SymmetricRTPSession;
-#ifdef CCXX_IPV6
+#ifdef CCXX_IPV6
/**
* @class RTPSessionBaseIPV6
@@ -649,8 +641,8 @@
* @short RTP protocol stack based on Common C++.
**/
template <class RTPDataChannel = DualRTPUDPIPv6Channel,
- class RTCPChannel = DualRTPUDPIPv6Channel,
- class ServiceQueue = AVPQueue>
+ class RTCPChannel = DualRTPUDPIPv6Channel,
+ class ServiceQueue = AVPQueue>
class __EXPORT TRTPSessionBaseIPV6 : public ServiceQueue
{
public:
@@ -664,303 +656,303 @@
* @param app Application this session is associated to.
* */
TRTPSessionBaseIPV6(const IPV6Host& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app) :
- ServiceQueue(membersSize,app)
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app) :
+ ServiceQueue(membersSize,app)
{ build(ia,dataPort,controlPort); }
- /**
- * Builds a session with the specified ssrc identifier for the
- * local source.
- *
- * @param ssrc SSRC identifier for the local source.
- * @param ia Network address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- **/
- TRTPSessionBaseIPV6(uint32 ssrc,
- const IPV6Host& ia,
- tpport_t dataPort, tpport_t controlPort,
- uint32 membersSize, RTPApplication& app):
- ServiceQueue(ssrc,membersSize,app)
- { build(ia,dataPort,controlPort); }
+ /**
+ * Builds a session with the specified ssrc identifier for the
+ * local source.
+ *
+ * @param ssrc SSRC identifier for the local source.
+ * @param ia Network address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ **/
+ TRTPSessionBaseIPV6(uint32 ssrc,
+ const IPV6Host& ia,
+ tpport_t dataPort, tpport_t controlPort,
+ uint32 membersSize, RTPApplication& app):
+ ServiceQueue(ssrc,membersSize,app)
+ { build(ia,dataPort,controlPort); }
- /**
- * Builds a session waiting for packets in a multicast address.
- * TODO: ssrc constructor for multicast!
- *
- * @param ia Multicast address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- * @param iface Index (from 0 to n) of network interface to join to
- * multicast group.
- **/
- TRTPSessionBaseIPV6(const IPV6Multicast& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app, uint32 iface) :
- ServiceQueue(membersSize,app)
- { build(ia,dataPort,controlPort,iface); }
+ /**
+ * Builds a session waiting for packets in a multicast address.
+ * TODO: ssrc constructor for multicast!
+ *
+ * @param ia Multicast address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ * @param iface Index (from 0 to n) of network interface to join to
+ * multicast group.
+ **/
+ TRTPSessionBaseIPV6(const IPV6Multicast& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app, uint32 iface) :
+ ServiceQueue(membersSize,app)
+ { build(ia,dataPort,controlPort,iface); }
- /**
- * Builds a session waiting for packets in a multicast
- * address, with the specified ssrc identifier for the local
- * source.
- *
- * @param ssrc SSRC identifier for the local source.
- * @param ia Multicast address this socket is to be bound.
- * @param dataPort Transport port the data socket is to be bound.
- * @param controlPort Transport port the control socket is to be bound.
- * @param membersSize Initial size of the membership table.
- * @param app Application this session is associated to.
- * @param iface Index (from 0 to n) of network interface to join to
- * multicast group.
- **/
- TRTPSessionBaseIPV6(uint32 ssrc,
- const IPV6Multicast& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 membersSize,
- RTPApplication& app, uint32 iface) :
- ServiceQueue(ssrc,membersSize,app)
- { build(ia,dataPort,controlPort,iface); }
+ /**
+ * Builds a session waiting for packets in a multicast
+ * address, with the specified ssrc identifier for the local
+ * source.
+ *
+ * @param ssrc SSRC identifier for the local source.
+ * @param ia Multicast address this socket is to be bound.
+ * @param dataPort Transport port the data socket is to be bound.
+ * @param controlPort Transport port the control socket is to be bound.
+ * @param membersSize Initial size of the membership table.
+ * @param app Application this session is associated to.
+ * @param iface Index (from 0 to n) of network interface to join to
+ * multicast group.
+ **/
+ TRTPSessionBaseIPV6(uint32 ssrc,
+ const IPV6Multicast& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 membersSize,
+ RTPApplication& app, uint32 iface) :
+ ServiceQueue(ssrc,membersSize,app)
+ { build(ia,dataPort,controlPort,iface); }
- virtual size_t dispatchBYE(const std::string &str)
- {
- return QueueRTCPManager::dispatchBYE(str);
- }
+ virtual size_t dispatchBYE(const std::string &str)
+ {
+ return QueueRTCPManager::dispatchBYE(str);
+ }
- inline virtual
- ~TRTPSessionBaseIPV6()
- {
- endSocket();
- }
+ inline virtual
+ ~TRTPSessionBaseIPV6()
+ {
+ endSocket();
+ }
- inline RTPDataChannel *getDSO(void)
- {return dso;}
+ inline RTPDataChannel *getDSO(void)
+ {return dso;}
protected:
- /**
- * @param timeout maximum timeout to wait, in microseconds
- */
- inline bool
- isPendingData(microtimeout_t timeout)
- { return dso->isPendingRecv(timeout); }
+ /**
+ * @param timeout maximum timeout to wait, in microseconds
+ */
+ inline bool
+ isPendingData(microtimeout_t timeout)
+ { return dso->isPendingRecv(timeout); }
- inline IPV6Host
- getDataSender(tpport_t *port = NULL) const
- { return dso->getSender(port); }
+ inline IPV6Host
+ getDataSender(tpport_t *port = NULL) const
+ { return dso->getSender(port); }
- inline size_t
- getNextDataPacketSize() const
- { return dso->getNextPacketSize(); }
+ inline size_t
+ getNextDataPacketSize() const
+ { return dso->getNextPacketSize(); }
- /**
- * Receive data from the data channel/socket.
- *
- * @param buffer Memory region to read to.
- * @param len Maximum number of octets to get.
- * @param na Source network address.
- * @param tp Source transport port.
- * @return Number of octets actually read.
- */
- inline size_t
- recvData(unsigned char* buffer, size_t len,
- IPV6Host& na, tpport_t& tp)
- { na = dso->getSender(tp); return dso->recv(buffer, len); }
+ /**
+ * Receive data from the data channel/socket.
+ *
+ * @param buffer Memory region to read to.
+ * @param len Maximum number of octets to get.
+ * @param na Source network address.
+ * @param tp Source transport port.
+ * @return Number of octets actually read.
+ */
+ inline size_t
+ recvData(unsigned char* buffer, size_t len,
+ IPV6Host& na, tpport_t& tp)
+ { na = dso->getSender(tp); return dso->recv(buffer, len); }
inline void
setDataPeerIPV6(const IPV6Host &host, tpport_t port)
- { dso->setPeer(host,port); }
+ { dso->setPeer(host,port); }
- /**
- * @param buffer memory region to write from
- * @param len number of octets to write
- */
- inline size_t
- sendDataIPV6(const unsigned char* const buffer, size_t len)
- { return dso->send(buffer, len); }
+ /**
+ * @param buffer memory region to write from
+ * @param len number of octets to write
+ */
+ inline size_t
+ sendDataIPV6(const unsigned char* const buffer, size_t len)
+ { return dso->send(buffer, len); }
- inline SOCKET getDataRecvSocket() const
- { return dso->getRecvSocket(); }
+ inline SOCKET getDataRecvSocket() const
+ { return dso->getRecvSocket(); }
- /**
- * @param timeout maximum timeout to wait, in microseconds
- * @return whether there are packets waiting to be picked
- */
+ /**
+ * @param timeout maximum timeout to wait, in microseconds
+ * @return whether there are packets waiting to be picked
+ */
inline bool
- isPendingControl(microtimeout_t timeout)
- { return cso->isPendingRecv(timeout); }
+ isPendingControl(microtimeout_t timeout)
+ { return cso->isPendingRecv(timeout); }
- inline IPV6Host
- getControlSender(tpport_t *port = NULL) const
- { return cso->getSender(port); }
+ inline IPV6Host
+ getControlSender(tpport_t *port = NULL) const
+ { return cso->getSender(port); }
- /**
- * Receive data from the control channel/socket.
- *
- * @param buffer Buffer where to get data.
- * @param len Maximum number of octets to get.
- * @param na Source network address.
- * @param tp Source transport port.
- * @return Number of octets actually read.
- **/
+ /**
+ * Receive data from the control channel/socket.
+ *
+ * @param buffer Buffer where to get data.
+ * @param len Maximum number of octets to get.
+ * @param na Source network address.
+ * @param tp Source transport port.
+ * @return Number of octets actually read.
+ **/
inline size_t
- recvControl(unsigned char *buffer, size_t len,
- IPV6Host& na, tpport_t& tp)
- { na = cso->getSender(tp); return cso->recv(buffer,len); }
+ recvControl(unsigned char *buffer, size_t len,
+ IPV6Host& na, tpport_t& tp)
+ { na = cso->getSender(tp); return cso->recv(buffer,len); }
inline void
setControlPeerIPV6(const IPV6Host &host, tpport_t port)
- { cso->setPeer(host,port); }
+ { cso->setPeer(host,port); }
- /**
- * @return number of octets actually written
- * @param buffer
- * @param len
- */
+ /**
+ * @return number of octets actually written
+ * @param buffer
+ * @param len
+ */
inline size_t
- sendControl(const unsigned char* const buffer, size_t len)
- { return cso->send(buffer,len); }
+ sendControl(const unsigned char* const buffer, size_t len)
+ { return cso->send(buffer,len); }
- inline SOCKET getControlRecvSocket() const
- { return cso->getRecvSocket(); }
+ inline SOCKET getControlRecvSocket() const
+ { return cso->getRecvSocket(); }
- inline void
- endSocket()
- {
- dso->endSocket();
- cso->endSocket();
- if (dso) delete dso;
- dso = NULL;
- if (cso) delete cso;
- cso = NULL;
- }
+ inline void
+ endSocket()
+ {
+ dso->endSocket();
+ cso->endSocket();
+ if (dso) delete dso;
+ dso = NULL;
+ if (cso) delete cso;
+ cso = NULL;
+ }
private:
- void
- build(const IPV6Host& ia, tpport_t dataPort,
- tpport_t controlPort)
- {
- if ( 0 == controlPort ) {
- dataBasePort = even_port(dataPort);
- controlBasePort = dataBasePort + 1;
- } else {
- dataBasePort = dataPort;
- controlBasePort = controlPort;
- }
- dso = new RTPDataChannel(ia,dataBasePort);
- cso = new RTCPChannel(ia,controlBasePort);
- }
+ void
+ build(const IPV6Host& ia, tpport_t dataPort,
+ tpport_t controlPort)
+ {
+ if ( 0 == controlPort ) {
+ dataBasePort = even_port(dataPort);
+ controlBasePort = dataBasePort + 1;
+ } else {
+ dataBasePort = dataPort;
+ controlBasePort = controlPort;
+ }
+ dso = new RTPDataChannel(ia,dataBasePort);
+ cso = new RTCPChannel(ia,controlBasePort);
+ }
- void
- build(const IPV6Multicast& ia, tpport_t dataPort,
- tpport_t controlPort, uint32 iface)
- {
- if ( 0 == controlPort ) {
- dataBasePort = even_port(dataPort);
- controlBasePort = dataBasePort + 1;
- } else {
- dataBasePort = dataPort;
- controlBasePort = controlPort;
- }
- dso = new RTPDataChannel(IPV6Host("0.0.0.0"),dataBasePort);
- cso = new RTCPChannel(IPV6Host("0.0.0.0"),controlBasePort);
- joinGroup(ia,iface);
- }
+ void
+ build(const IPV6Multicast& ia, tpport_t dataPort,
+ tpport_t controlPort, uint32 iface)
+ {
+ if ( 0 == controlPort ) {
+ dataBasePort = even_port(dataPort);
+ controlBasePort = dataBasePort + 1;
+ } else {
+ dataBasePort = dataPort;
+ controlBasePort = controlPort;
+ }
+ dso = new RTPDataChannel(IPV6Host("0.0.0.0"),dataBasePort);
+ cso = new RTCPChannel(IPV6Host("0.0.0.0"),controlBasePort);
+ joinGroup(ia,iface);
+ }
- /**
- * Join a multicast group.
- *
- * @param ia address of the multicast group
- * @return error code from the socket operation
- */
- inline Socket::Error
- joinGroup(const IPV6Multicast& ia, uint32 iface)
- {
- Socket::Error error = dso->setMulticast(true);
- if ( error ) return error;
- error = dso->join(ia,iface);
- if ( error ) return error;
- error = cso->setMulticast(true);
- if ( error ) {
- dso->drop(ia);
- return error;
- }
- error = cso->join(ia,iface);
- if ( error ) {
- dso->drop(ia);
- return error;
- }
- return Socket::errSuccess;
- }
+ /**
+ * Join a multicast group.
+ *
+ * @param ia address of the multicast group
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ joinGroup(const IPV6Multicast& ia, uint32 iface)
+ {
+ Socket::Error error = dso->setMulticast(true);
+ if ( error ) return error;
+ error = dso->join(ia,iface);
+ if ( error ) return error;
+ error = cso->setMulticast(true);
+ if ( error ) {
+ dso->drop(ia);
+ return error;
+ }
+ error = cso->join(ia,iface);
+ if ( error ) {
+ dso->drop(ia);
+ return error;
+ }
+ return Socket::errSuccess;
+ }
- /**
- * Leave a multicast group.
- *
- * @param ia address of the multicast group
- * @return error code from the socket operation
- */
- inline Socket::Error
- leaveGroup(const IPV6Multicast& ia)
- {
- Socket::Error error = dso->setMulticast(false);
- if ( error ) return error;
- error = dso->leaveGroup(ia);
- if ( error ) return error;
- error = cso->setMulticast(false);
- if ( error ) return error;
- return cso->leaveGroup(ia);
- }
+ /**
+ * Leave a multicast group.
+ *
+ * @param ia address of the multicast group
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ leaveGroup(const IPV6Multicast& ia)
+ {
+ Socket::Error error = dso->setMulticast(false);
+ if ( error ) return error;
+ error = dso->leaveGroup(ia);
+ if ( error ) return error;
+ error = cso->setMulticast(false);
+ if ( error ) return error;
+ return cso->leaveGroup(ia);
+ }
- /**
- * Set the value of the TTL field in the sent packets.
- *
- * @param ttl Time To Live
- * @return error code from the socket operation
- */
- inline Socket::Error
- setMcastTTL(uint8 ttl)
- {
- Socket::Error error = dso->setMulticast(true);
- if ( error ) return error;
- error = dso->setTimeToLive(ttl);
- if ( error ) return error;
- error = cso->setMulticast(true);
- if ( error ) return error;
- return cso->setTimeToLive(ttl);
- }
+ /**
+ * Set the value of the TTL field in the sent packets.
+ *
+ * @param ttl Time To Live
+ * @return error code from the socket operation
+ */
+ inline Socket::Error
+ setMcastTTL(uint8 ttl)
+ {
+ Socket::Error error = dso->setMulticast(true);
+ if ( error ) return error;
+ error = dso->setTimeToLive(ttl);
+ if ( error ) return error;
+ error = cso->setMulticast(true);
+ if ( error ) return error;
+ return cso->setTimeToLive(ttl);
+ }
- /**
- * Ensure a port number is odd. If it is an even number, return
- * the next lower (odd) port number.
- *
- * @param port number to filter
- * @return filtered (odd) port number
- */
- inline tpport_t
- odd_port(tpport_t port)
- { return (port & 0x01)? (port) : (port - 1); }
+ /**
+ * Ensure a port number is odd. If it is an even number, return
+ * the next lower (odd) port number.
+ *
+ * @param port number to filter
+ * @return filtered (odd) port number
+ */
+ inline tpport_t
+ odd_port(tpport_t port)
+ { return (port & 0x01)? (port) : (port - 1); }
- /**
- * Ensure a port number is even. If it is an odd number, return
- * the next lower (even) port number.
- *
- * @param port number to filter
- * @return filtered (even) port number
- */
- inline tpport_t
- even_port(tpport_t port)
- { return (port & 0x01)? (port - 1) : (port); }
+ /**
+ * Ensure a port number is even. If it is an odd number, return
+ * the next lower (even) port number.
+ *
+ * @param port number to filter
+ * @return filtered (even) port number
+ */
+ inline tpport_t
+ even_port(tpport_t port)
+ { return (port & 0x01)? (port - 1) : (port); }
- tpport_t dataBasePort;
- tpport_t controlBasePort;
+ tpport_t dataBasePort;
+ tpport_t controlBasePort;
protected:
- RTPDataChannel* dso;
- RTCPChannel* cso;
- friend class RTPSessionBaseHandler;
+ RTPDataChannel* dso;
+ RTCPChannel* cso;
+ friend class RTPSessionBaseHandler;
};
/**
@@ -978,37 +970,37 @@
class RTCPChannel = DualRTPUDPIPv6Channel,
class ServiceQueue = AVPQueue>
class __EXPORT SingleThreadRTPSessionIPV6 :
- protected Thread,
- public TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
+ protected Thread,
+ public TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
{
public:
- SingleThreadRTPSessionIPV6(const IPV6Host& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0,
- int pri = 0,
- uint32 memberssize =
- MembershipBookkeeping::defaultMembersHashSize,
- RTPApplication& app = defaultApplication()
+ SingleThreadRTPSessionIPV6(const IPV6Host& ia,
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0,
+ int pri = 0,
+ uint32 memberssize =
+ MembershipBookkeeping::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication()
#if defined(_MSC_VER) && _MSC_VER >= 1300
- );
+ );
#else
- ):
- Thread(pri),
- TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
- (ia,dataPort,controlPort,memberssize,app)
+ ):
+ Thread(pri),
+ TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>
+ (ia,dataPort,controlPort,memberssize,app)
{ }
#endif
SingleThreadRTPSessionIPV6(const IPV6Multicast& ia,
- tpport_t dataPort = DefaultRTPDataPort,
- tpport_t controlPort = 0,
- int pri = 0,
- uint32 memberssize =
- MembershipBookkeeping::defaultMembersHashSize,
- RTPApplication& app = defaultApplication(),
- uint32 iface = 0
+ tpport_t dataPort = DefaultRTPDataPort,
+ tpport_t controlPort = 0,
+ int pri = 0,
+ uint32 memberssize =
+ MembershipBookkeeping::defaultMembersHashSize,
+ RTPApplication& app = defaultApplication(),
+ uint32 iface = 0
#if defined(_MSC_VER) && _MSC_VER >= 1300
- );
+ );
#else
):
Thread(pri),
@@ -1038,25 +1030,25 @@
protected:
inline void enableStack(void)
-{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::enableStack();}
+{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::enableStack();}
inline void disableStack(void)
-{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::disableStack();}
+{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::disableStack();}
inline microtimeout_t getSchedulingTimeout(void)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::getSchedulingTimeout();}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::getSchedulingTimeout();}
inline void controlReceptionService(void)
-{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::controlReceptionService();}
+{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::controlReceptionService();}
inline void controlTransmissionService(void)
-{TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::controlTransmissionService();}
+{TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::controlTransmissionService();}
inline timeval getRTCPCheckInterval(void)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::getRTCPCheckInterval();}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::getRTCPCheckInterval();}
inline size_t dispatchDataPacket(void)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchDataPacket();}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchDataPacket();}
#if defined(_MSC_VER) && _MSC_VER >= 1300
virtual void run(void);
@@ -1070,7 +1062,7 @@
{return;}
virtual bool isPendingData(microtimeout_t timeout)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::isPendingData(timeout);}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::isPendingData(timeout);}
/**
* Single runnable method for this RTP stacks, schedules
@@ -1078,46 +1070,40 @@
**/
virtual void run(void)
{
- microtimeout_t timeout = 0;
- while ( ServiceQueue::isActive() ) {
- if ( timeout < 1000 ){ // !(timeout/1000)
- timeout = getSchedulingTimeout();
- }
- setCancel(cancelDeferred);
- controlReceptionService();
- controlTransmissionService();
- setCancel(cancelImmediate);
- microtimeout_t maxWait =
- timeval2microtimeout(getRTCPCheckInterval());
- // make sure the scheduling timeout is
- // <= the check interval for RTCP
- // packets
- timeout = (timeout > maxWait)? maxWait : timeout;
- if ( timeout < 1000 ) { // !(timeout/1000)
- setCancel(cancelDeferred);
- dispatchDataPacket();
- setCancel(cancelImmediate);
- timerTick();
- } else {
- if ( isPendingData(timeout/1000) ) {
- setCancel(cancelDeferred);
- takeInDataPacket();
- setCancel(cancelImmediate);
- }
- timeout = 0;
- }
- }
- dispatchBYE("GNU ccRTP stack finishing.");
+ microtimeout_t timeout = 0;
+ while ( ServiceQueue::isActive() ) {
+ if ( timeout < 1000 ){ // !(timeout/1000)
+ timeout = getSchedulingTimeout();
+ }
+ controlReceptionService();
+ controlTransmissionService();
+ microtimeout_t maxWait =
+ timeval2microtimeout(getRTCPCheckInterval());
+ // make sure the scheduling timeout is
+ // <= the check interval for RTCP
+ // packets
+ timeout = (timeout > maxWait)? maxWait : timeout;
+ if ( timeout < 1000 ) { // !(timeout/1000)
+ dispatchDataPacket();
+ timerTick();
+ } else {
+ if ( isPendingData(timeout/1000) ) {
+ takeInDataPacket();
+ }
+ timeout = 0;
+ }
+ }
+ dispatchBYE("GNU ccRTP stack finishing.");
Thread::exit();
}
#endif
inline size_t takeInDataPacket(void)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::takeInDataPacket();}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::takeInDataPacket();}
inline size_t dispatchBYE(const std::string &str)
-{return TRTPSessionBase<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchBYE(str);}
+{return TRTPSessionBaseIPV6<RTPDataChannel,RTCPChannel,ServiceQueue>::dispatchBYE(str);}
};
/**
@@ -1146,16 +1132,14 @@
* @short Symmetric UDP/IPv6 RTP session scheduled by one thread of execution.
**/
typedef SingleThreadRTPSessionIPV6<SymmetricRTPChannelIPV6,
- SymmetricRTPChannelIPV6> SymmetricRTPSessionIPV6;
+ SymmetricRTPChannelIPV6> SymmetricRTPSessionIPV6;
#endif
/** @}*/ // sessions
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_RTP_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/rtppkt.h b/jni/libccrtp/sources/src/ccrtp/rtppkt.h
index 8a6ae6e..20809f0 100644
--- a/jni/libccrtp/sources/src/ccrtp/rtppkt.h
+++ b/jni/libccrtp/sources/src/ccrtp/rtppkt.h
@@ -35,16 +35,14 @@
// If you do not wish that, delete this exception notice.
//
-#ifndef CCXX_RTP_RTPPKT_H_
+#ifndef CCXX_RTP_RTPPKT_H_
#define CCXX_RTP_RTPPKT_H_
#include <ccrtp/base.h>
#include <ccrtp/formats.h>
#include <ccrtp/CryptoContext.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @file rtppkt.h
@@ -75,221 +73,221 @@
class __EXPORT RTPPacket
{
private:
- struct RTPFixedHeader;
- struct RTPHeaderExt;
+ struct RTPFixedHeader;
+ struct RTPHeaderExt;
public:
- /**
- * Constructor, construct a packet object given the memory
- * zone its content (header and payload) is stored. Commonly
- * used to build RTPPacket objects from incoming data.
- *
- * @param block whole packet
- * @param len total length (header + payload + padding) of the
- * packet
- * @param duplicate whether to memcopy the packet. At present,
- * this feature is not used.
- * @note used in IncomingRTPPkt.
- **/
- RTPPacket(const unsigned char* const block, size_t len,
- bool duplicate = false);
+ /**
+ * Constructor, construct a packet object given the memory
+ * zone its content (header and payload) is stored. Commonly
+ * used to build RTPPacket objects from incoming data.
+ *
+ * @param block whole packet
+ * @param len total length (header + payload + padding) of the
+ * packet
+ * @param duplicate whether to memcopy the packet. At present,
+ * this feature is not used.
+ * @note used in IncomingRTPPkt.
+ **/
+ RTPPacket(const unsigned char* const block, size_t len,
+ bool duplicate = false);
- /**
- * Construct a packet object without specifying its real
- * content yet. Commonly used for outgoing packets. Header
- * fields and payload must be filled in by another methods or
- * by a derived constructor.
- *
- * @param hdrlen length of the header (including CSRC and extension).
- * @param plen payload length.
- * @param paddinglen pad packet to a multiple of paddinglen
- * @note used in OutgoingRTPPkt.
- */
+ /**
+ * Construct a packet object without specifying its real
+ * content yet. Commonly used for outgoing packets. Header
+ * fields and payload must be filled in by another methods or
+ * by a derived constructor.
+ *
+ * @param hdrlen length of the header (including CSRC and extension).
+ * @param plen payload length.
+ * @param paddinglen pad packet to a multiple of paddinglen
+ * @note used in OutgoingRTPPkt.
+ */
RTPPacket(size_t hdrlen, size_t plen, uint8 paddinglen, CryptoContext* pcc= NULL);
- /**
- * Get the length of the header, including contributing
- * sources identifiers and header extension, if present.
- *
- * @return number of octets.
- **/
- inline uint32
- getHeaderSize() const
- { return hdrSize; }
+ /**
+ * Get the length of the header, including contributing
+ * sources identifiers and header extension, if present.
+ *
+ * @return number of octets.
+ **/
+ inline uint32
+ getHeaderSize() const
+ { return hdrSize; }
- /**
- * @return pointer to the payload section of the packet.
- **/
- inline const uint8* const
- getPayload() const
- { return (uint8*)(buffer + getHeaderSize()); }
+ /**
+ * @return pointer to the payload section of the packet.
+ **/
+ inline const uint8* const
+ getPayload() const
+ { return (uint8*)(buffer + getHeaderSize()); }
- /**
- * @return length of the payload section, in octets.
- **/
- inline uint32
- getPayloadSize() const
- { return payloadSize; }
+ /**
+ * @return length of the payload section, in octets.
+ **/
+ inline uint32
+ getPayloadSize() const
+ { return payloadSize; }
- /**
- * @return value of the PT header field.
- **/
- inline PayloadType
- getPayloadType() const
- { return static_cast<PayloadType>(getHeader()->payload); }
+ /**
+ * @return value of the PT header field.
+ **/
+ inline PayloadType
+ getPayloadType() const
+ { return static_cast<PayloadType>(getHeader()->payload); }
- /**
- * @return value of the sequence number header field, in host order.
- **/
- inline uint16
- getSeqNum() const
- { return cachedSeqNum; }
+ /**
+ * @return value of the sequence number header field, in host order.
+ **/
+ inline uint16
+ getSeqNum() const
+ { return cachedSeqNum; }
- /**
- * @return packet timestamp in host order.
- **/
- inline uint32
- getTimestamp() const
- { return cachedTimestamp; }
+ /**
+ * @return packet timestamp in host order.
+ **/
+ inline uint32
+ getTimestamp() const
+ { return cachedTimestamp; }
- /**
- * @return RTP protocol version of packet.
- **/
- inline uint8
- getProtocolVersion() const
- { return getHeader()->version; }
+ /**
+ * @return RTP protocol version of packet.
+ **/
+ inline uint8
+ getProtocolVersion() const
+ { return getHeader()->version; }
- /**
- * Ask whether the packet contains padding bytes at the end
- * @return true if the header padding bit is 1.
- **/
- inline bool
- isPadded() const
- { return getHeader()->padding; }
+ /**
+ * Ask whether the packet contains padding bytes at the end
+ * @return true if the header padding bit is 1.
+ **/
+ inline bool
+ isPadded() const
+ { return getHeader()->padding; }
- /**
- * Get the number of octets padding the end of the payload
- * section.
- *
- * @return Padding length in octets.
- **/
- inline uint8
- getPaddingSize() const
- { return buffer[total - 1]; }
+ /**
+ * Get the number of octets padding the end of the payload
+ * section.
+ *
+ * @return Padding length in octets.
+ **/
+ inline uint8
+ getPaddingSize() const
+ { return buffer[total - 1]; }
- /**
- * Ask whether the packet is marked (for isntance, is a new
- * talk spurt in some audio profiles).
- *
- * @return true is the header marker bit is 1.
- **/
- inline bool
- isMarked() const
- { return getHeader()->marker; }
+ /**
+ * Ask whether the packet is marked (for isntance, is a new
+ * talk spurt in some audio profiles).
+ *
+ * @return true is the header marker bit is 1.
+ **/
+ inline bool
+ isMarked() const
+ { return getHeader()->marker; }
- /**
- * Ask whether the packet contains header extensions.
- *
- * @return true if the header extension bit is 1.
- **/
- inline bool
- isExtended() const
- { return getHeader()->extension; }
+ /**
+ * Ask whether the packet contains header extensions.
+ *
+ * @return true if the header extension bit is 1.
+ **/
+ inline bool
+ isExtended() const
+ { return getHeader()->extension; }
- /**
- * Get the number of contributing sources specified in the
- * packet header.
- **/
- inline uint16
- getCSRCsCount() const
- { return getHeader()->cc; }
+ /**
+ * Get the number of contributing sources specified in the
+ * packet header.
+ **/
+ inline uint16
+ getCSRCsCount() const
+ { return getHeader()->cc; }
- /**
- * Get the 32-bit identifiers of the contributing sources for
- * the packet as an array, of length getCSRCsCount().
- *
- * @return An array of CSRC identifiers as they are in the
- * packet (in network order).
- **/
- inline const uint32*
- getCSRCs() const
- { return static_cast<const uint32*>(&(getHeader()->sources[1])); }
+ /**
+ * Get the 32-bit identifiers of the contributing sources for
+ * the packet as an array, of length getCSRCsCount().
+ *
+ * @return An array of CSRC identifiers as they are in the
+ * packet (in network order).
+ **/
+ inline const uint32*
+ getCSRCs() const
+ { return static_cast<const uint32*>(&(getHeader()->sources[1])); }
- /**
- * Get the first 16 bits (in network order) of the header of
- * the RTP header extension. Its meaning is undefined at this
- * level.
- *
- * @return 0 if the packet has no header extension, otherwise
- * the first 16 bits of the header extension, in
- * network order.
- *
- * @note 0 could be a valid value for the first 16 bits, in
- * that case RTPPacket::isExtended() should be use.
- **/
- inline uint16
- getHdrExtUndefined() const
- { return (isExtended()? getHeaderExt()->undefined : 0); }
+ /**
+ * Get the first 16 bits (in network order) of the header of
+ * the RTP header extension. Its meaning is undefined at this
+ * level.
+ *
+ * @return 0 if the packet has no header extension, otherwise
+ * the first 16 bits of the header extension, in
+ * network order.
+ *
+ * @note 0 could be a valid value for the first 16 bits, in
+ * that case RTPPacket::isExtended() should be use.
+ **/
+ inline uint16
+ getHdrExtUndefined() const
+ { return (isExtended()? getHeaderExt()->undefined : 0); }
- /**
- * Get the length (in octets) of the data contained in the
- * header extension. Note that this length does not include
- * the four octets at the beginning of the header extension.
- *
- * @return 0 if the packet has no header extension, otherwise
- * the length.
- *
- * @note 0 is a valid value for this field, so
- * RTPPacket::isExtended() should be used.
- **/
- inline uint32
- getHdrExtSize() const
- { return (isExtended()?
- (static_cast<uint32>(ntohs(getHeaderExt()->length)) << 2) :
- 0); }
+ /**
+ * Get the length (in octets) of the data contained in the
+ * header extension. Note that this length does not include
+ * the four octets at the beginning of the header extension.
+ *
+ * @return 0 if the packet has no header extension, otherwise
+ * the length.
+ *
+ * @note 0 is a valid value for this field, so
+ * RTPPacket::isExtended() should be used.
+ **/
+ inline uint32
+ getHdrExtSize() const
+ { return (isExtended()?
+ (static_cast<uint32>(ntohs(getHeaderExt()->length)) << 2) :
+ 0); }
- /**
- * Get the content of the header extension.
- *
- * @return NULL if the packet has no header extension, otherwise
- * a pointer to the packet header extension content.
- **/
- inline const unsigned char*
- getHdrExtContent() const
- { return (isExtended() ?
- (reinterpret_cast<const unsigned char*>(getHeaderExt()) +
- sizeof(RTPHeaderExt)) :
- NULL); }
+ /**
+ * Get the content of the header extension.
+ *
+ * @return NULL if the packet has no header extension, otherwise
+ * a pointer to the packet header extension content.
+ **/
+ inline const unsigned char*
+ getHdrExtContent() const
+ { return (isExtended() ?
+ (reinterpret_cast<const unsigned char*>(getHeaderExt()) +
+ sizeof(RTPHeaderExt)) :
+ NULL); }
- /**
- * Get the raw packet as it will be sent through the network.
- *
- * @return memory zone where the raw packet structure is
- * stored in.
- **/
- inline const unsigned char* const
- getRawPacket() const
- { return buffer; }
+ /**
+ * Get the raw packet as it will be sent through the network.
+ *
+ * @return memory zone where the raw packet structure is
+ * stored in.
+ **/
+ inline const unsigned char* const
+ getRawPacket() const
+ { return buffer; }
- /**
- * Get the raw packet length, including header, extension,
- * payload and padding.
- *
- * @return size of the raw packet structure.
- **/
- inline uint32
- getRawPacketSize() const
- { return total; }
+ /**
+ * Get the raw packet length, including header, extension,
+ * payload and padding.
+ *
+ * @return size of the raw packet structure.
+ **/
+ inline uint32
+ getRawPacketSize() const
+ { return total; }
inline uint32
getRawPacketSizeSrtp() const
{ return total + srtpLength; }
inline size_t
- getSizeOfFixedHeader() const
- { return sizeof(RTPFixedHeader); }
-
- /**
+ getSizeOfFixedHeader() const
+ { return sizeof(RTPFixedHeader); }
+
+ /**
* Re-compute payload length.
*
* This recomputation may be necessary in case of SRTP. We need to decrypt
@@ -297,68 +295,68 @@
* @c incqueue.cpp
*
* @param padding
- * If true then set padding flag in RTP header and re-compute
+ * If true then set padding flag in RTP header and re-compute
* payloadSize.
*/
void reComputePayLength(bool padding);
-
+
protected:
- /**
- * Destructor, free the buffer provided in the constructor.
- **/
- inline virtual ~RTPPacket()
- { endPacket(); }
+ /**
+ * Destructor, free the buffer provided in the constructor.
+ **/
+ inline virtual ~RTPPacket()
+ { endPacket(); }
- /**
- * Free memory allocated for the packet.
- **/
- void
- endPacket();
+ /**
+ * Free memory allocated for the packet.
+ **/
+ void
+ endPacket();
- /**
- * Return low level structure for the header of the packet.
- *
- * @return RTPFixedHeader pointer to the header of the packet.
- **/
- inline RTPFixedHeader*
- getHeader() const
- { return reinterpret_cast<RTPFixedHeader*>(buffer); }
+ /**
+ * Return low level structure for the header of the packet.
+ *
+ * @return RTPFixedHeader pointer to the header of the packet.
+ **/
+ inline RTPFixedHeader*
+ getHeader() const
+ { return reinterpret_cast<RTPFixedHeader*>(buffer); }
- inline void
- setExtension(bool e)
- { getHeader()->extension = e; }
+ inline void
+ setExtension(bool e)
+ { getHeader()->extension = e; }
- /**
- * Get a pointer to RTPHeaderExt pointing after the RTP header
- * (fixed part plus contributing sources). No check for
- * for the X bit is done.
- *
- * @return header extension if present, garbage if not.
- **/
- inline const RTPHeaderExt*
- getHeaderExt() const
- {
+ /**
+ * Get a pointer to RTPHeaderExt pointing after the RTP header
+ * (fixed part plus contributing sources). No check for
+ * for the X bit is done.
+ *
+ * @return header extension if present, garbage if not.
+ **/
+ inline const RTPHeaderExt*
+ getHeaderExt() const
+ {
uint32 fixsize = sizeof(RTPFixedHeader) + (getHeader()->cc << 2);
- return (reinterpret_cast<RTPHeaderExt*>(buffer + fixsize));
- }
+ return (reinterpret_cast<RTPHeaderExt*>(buffer + fixsize));
+ }
- /**
- * Obtain the absolute timestamp carried in the packet header.
- *
- * @return 32-bit timestamp in host order.
- **/
- inline uint32
- getRawTimestamp() const
- { return ntohl(getHeader()->timestamp); }
+ /**
+ * Obtain the absolute timestamp carried in the packet header.
+ *
+ * @return 32-bit timestamp in host order.
+ **/
+ inline uint32
+ getRawTimestamp() const
+ { return ntohl(getHeader()->timestamp); }
- inline void
- setbuffer(const void* src, size_t len, size_t pos)
- { memcpy(buffer + pos,src,len); }
+ inline void
+ setbuffer(const void* src, size_t len, size_t pos)
+ { memcpy(buffer + pos,src,len); }
- /// Packet sequence number in host order.
- uint16 cachedSeqNum;
- /// Packet timestamp in host order (includes initial shift).
- uint32 cachedTimestamp;
+ /// Packet sequence number in host order.
+ uint16 cachedSeqNum;
+ /// Packet timestamp in host order (includes initial shift).
+ uint32 cachedTimestamp;
/**
* Offset into packet memory pointing to area for SRTP data.
@@ -382,119 +380,119 @@
uint32 payloadSize;
private:
- /// packet in memory
- unsigned char* buffer;
- /// size of the header, including contributing sources and extensions
- uint32 hdrSize;
- /// whether the object was contructed with duplicated = true
- bool duplicated;
+ /// packet in memory
+ unsigned char* buffer;
+ /// size of the header, including contributing sources and extensions
+ uint32 hdrSize;
+ /// whether the object was contructed with duplicated = true
+ bool duplicated;
-#ifdef CCXX_PACKED
+#ifdef CCXX_PACKED
#pragma pack(1)
#endif
- /**
- * @struct RTPFixedHeader
- * @short RTP fixed header as it is send through the network.
- *
- * A low-level representation for generic RTP packet header as
- * defined in RFC 1889. A packet consists of the fixed RTP
- * header, a possibly empty list of contributing sources and
- * the payload. Header contents are kept in network (big
- * endian) order.
- **/
- struct RTPFixedHeader
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- /// For big endian boxes
- unsigned char version:2; ///< Version, currently 2
- unsigned char padding:1; ///< Padding bit
- unsigned char extension:1; ///< Extension bit
- unsigned char cc:4; ///< CSRC count
- unsigned char marker:1; ///< Marker bit
- unsigned char payload:7; ///< Payload type
+ /**
+ * @struct RTPFixedHeader
+ * @short RTP fixed header as it is send through the network.
+ *
+ * A low-level representation for generic RTP packet header as
+ * defined in RFC 1889. A packet consists of the fixed RTP
+ * header, a possibly empty list of contributing sources and
+ * the payload. Header contents are kept in network (big
+ * endian) order.
+ **/
+ struct RTPFixedHeader
+ {
+#if __BYTE_ORDER == __BIG_ENDIAN
+ /// For big endian boxes
+ unsigned char version:2; ///< Version, currently 2
+ unsigned char padding:1; ///< Padding bit
+ unsigned char extension:1; ///< Extension bit
+ unsigned char cc:4; ///< CSRC count
+ unsigned char marker:1; ///< Marker bit
+ unsigned char payload:7; ///< Payload type
#else
- /// For little endian boxes
- unsigned char cc:4; ///< CSRC count
- unsigned char extension:1; ///< Extension bit
- unsigned char padding:1; ///< Padding bit
- unsigned char version:2; ///< Version, currently 2
- unsigned char payload:7; ///< Payload type
- unsigned char marker:1; ///< Marker bit
+ /// For little endian boxes
+ unsigned char cc:4; ///< CSRC count
+ unsigned char extension:1; ///< Extension bit
+ unsigned char padding:1; ///< Padding bit
+ unsigned char version:2; ///< Version, currently 2
+ unsigned char payload:7; ///< Payload type
+ unsigned char marker:1; ///< Marker bit
#endif
- uint16 sequence; ///< sequence number
- uint32 timestamp; ///< timestamp
- uint32 sources[1]; ///< contributing sources
- };
+ uint16 sequence; ///< sequence number
+ uint32 timestamp; ///< timestamp
+ uint32 sources[1]; ///< contributing sources
+ };
- /**
- * @struct RFC2833Payload
- * @short a structure defining RFC2833 Telephony events.
- *
- * structure to define RFC2833 telephony events in RTP. You can
- * use this by recasing the pointer returned by getPayload().
- */
+ /**
+ * @struct RFC2833Payload
+ * @short a structure defining RFC2833 Telephony events.
+ *
+ * structure to define RFC2833 telephony events in RTP. You can
+ * use this by recasing the pointer returned by getPayload().
+ */
public:
- struct RFC2833Payload
- {
+ struct RFC2833Payload
+ {
#if __BYTE_ORDER == __BIG_ENDIAN
- uint8 event : 8;
- bool ebit : 1;
- bool rbit : 1;
- uint8 vol : 6;
- uint16 duration : 16;
+ uint8 event : 8;
+ bool ebit : 1;
+ bool rbit : 1;
+ uint8 vol : 6;
+ uint16 duration : 16;
#else
- uint8 event : 8;
- uint8 vol : 6;
- bool rbit : 1;
- bool ebit : 1;
- uint16 duration : 16;
+ uint8 event : 8;
+ uint8 vol : 6;
+ bool rbit : 1;
+ bool ebit : 1;
+ uint16 duration : 16;
#endif
- };
+ };
private:
- /**
- * @struct RTPHeaderExt
- *
- * Fixed component of the variable-length header extension,
- * appended to the fixed header, after the CSRC list, when X
- * == 1.
- **/
- struct RTPHeaderExt
- {
- uint16 undefined; ///< to be defined
- uint16 length; ///< number of 32-bit words in the extension
- };
-#ifdef CCXX_PACKED
+ /**
+ * @struct RTPHeaderExt
+ *
+ * Fixed component of the variable-length header extension,
+ * appended to the fixed header, after the CSRC list, when X
+ * == 1.
+ **/
+ struct RTPHeaderExt
+ {
+ uint16 undefined; ///< to be defined
+ uint16 length; ///< number of 32-bit words in the extension
+ };
+#ifdef CCXX_PACKED
#pragma pack()
#endif
- /* definitions for access to most common 2833 fields... */
+ /* definitions for access to most common 2833 fields... */
public:
- /**
- * Fetch a raw 2833 packet.
- *
- * @return low level 2833 data structure.
- */
- inline struct RFC2833Payload *getRaw2833Payload(void)
- {return (struct RFC2833Payload *)getPayload();}
+ /**
+ * Fetch a raw 2833 packet.
+ *
+ * @return low level 2833 data structure.
+ */
+ inline struct RFC2833Payload *getRaw2833Payload(void)
+ {return (struct RFC2833Payload *)getPayload();}
- /**
- * Fetch 2833 duration field.
- *
- * @return 2833 duration in native host machine byte order.
- */
- inline uint16 get2833Duration(void)
- {return ntohs(getRaw2833Payload()->duration);}
+ /**
+ * Fetch 2833 duration field.
+ *
+ * @return 2833 duration in native host machine byte order.
+ */
+ inline uint16 get2833Duration(void)
+ {return ntohs(getRaw2833Payload()->duration);}
- /**
- * Set 2833 duration field.
- *
- * @param timestamp to use, native host machine byte order.
- */
- inline void set2833Duration(uint16 timestamp)
- {getRaw2833Payload()->duration = htons(timestamp);}
+ /**
+ * Set 2833 duration field.
+ *
+ * @param timestamp to use, native host machine byte order.
+ */
+ inline void set2833Duration(uint16 timestamp)
+ {getRaw2833Payload()->duration = htons(timestamp);}
};
/**
@@ -510,143 +508,143 @@
class __EXPORT OutgoingRTPPkt : public RTPPacket
{
public:
- /**
- * Construct a new packet to be sent, containing several
- * contributing source identifiers, header extensions and
- * payload.
+ /**
+ * Construct a new packet to be sent, containing several
+ * contributing source identifiers, header extensions and
+ * payload.
*
* A new copy in memory (holding all this components
- * along with the fixed header) is created. If the pointer
+ * along with the fixed header) is created. If the pointer
* to the SRTP CryptoContext is not NULL and holds a CryptoContext
* for the SSRC take the SSRC data into account when computing
* the required memory buffer.
- *
- * @param csrcs array of countributing source 32-bit
- * identifiers, in host order.
- * @param numcsrc number of CSRC identifiers in the array.
- * @param hdrext whole header extension.
- * @param hdrextlen size of whole header extension, in octets.
- * @param data payload.
- * @param datalen payload length, in octets.
- * @param paddinglen pad packet to a multiple of paddinglen.
+ *
+ * @param csrcs array of countributing source 32-bit
+ * identifiers, in host order.
+ * @param numcsrc number of CSRC identifiers in the array.
+ * @param hdrext whole header extension.
+ * @param hdrextlen size of whole header extension, in octets.
+ * @param data payload.
+ * @param datalen payload length, in octets.
+ * @param paddinglen pad packet to a multiple of paddinglen.
* @param pcc Pointer to the SRTP CryptoContext, defaults to NULL
* if not specified.
- *
- * @note For efficiency purposes, since this constructor is
- * valid for all packets but is too complex for the common
- * case, two simpler others are provided.
- **/
- OutgoingRTPPkt(const uint32* const csrcs, uint16 numcsrc,
- const unsigned char* const hdrext, uint32 hdrextlen,
- const unsigned char* const data, size_t datalen,
+ *
+ * @note For efficiency purposes, since this constructor is
+ * valid for all packets but is too complex for the common
+ * case, two simpler others are provided.
+ **/
+ OutgoingRTPPkt(const uint32* const csrcs, uint16 numcsrc,
+ const unsigned char* const hdrext, uint32 hdrextlen,
+ const unsigned char* const data, size_t datalen,
uint8 paddinglen= 0, CryptoContext* pcc= NULL);
- /**
- * Construct a new packet to be sent, containing several
- * contributing source identifiers and payload.
+ /**
+ * Construct a new packet to be sent, containing several
+ * contributing source identifiers and payload.
*
* A new copy in
- * memory (holding all this components along with the fixed
+ * memory (holding all this components along with the fixed
* header) is created. If the pointer
* to the SRTP CryptoContext is not NULL and holds a CryptoContext
* for the SSRC take the SSRC data into account when computing
* the required memory buffer.
- *
- * @param csrcs array of countributing source 32-bit
- * identifiers, in host order.
- * @param numcsrc number of CSRC identifiers in the array.
- * @param data payload.
- * @param datalen payload length, in octets.
- * @param paddinglen pad packet to a multiple of paddinglen.
+ *
+ * @param csrcs array of countributing source 32-bit
+ * identifiers, in host order.
+ * @param numcsrc number of CSRC identifiers in the array.
+ * @param data payload.
+ * @param datalen payload length, in octets.
+ * @param paddinglen pad packet to a multiple of paddinglen.
* @param pcc Pointer to the SRTP CryptoContext, defaults to NULL
* if not specified.
**/
- OutgoingRTPPkt(const uint32* const csrcs, uint16 numcsrc,
- const unsigned char* const data, size_t datalen,
+ OutgoingRTPPkt(const uint32* const csrcs, uint16 numcsrc,
+ const unsigned char* const data, size_t datalen,
uint8 paddinglen= 0, CryptoContext* pcc= NULL);
- /**
- * Construct a new packet (fast variant, with no contributing
- * sources and no header extension) to be sent.
+ /**
+ * Construct a new packet (fast variant, with no contributing
+ * sources and no header extension) to be sent.
*
* A new copy in
* memory (holding the whole packet) is created. If the pointer
* to the SRTP CryptoContext is not NULL and holds a CryptoContext
* for the SSRC take the SSRC data into account when computing
* the required memory buffer.
- *
- * @param data payload.
- * @param datalen payload length, in octets.
- * @param paddinglen pad packet to a multiple of paddinglen.
+ *
+ * @param data payload.
+ * @param datalen payload length, in octets.
+ * @param paddinglen pad packet to a multiple of paddinglen.
* @param pcc Pointer to the SRTP CryptoContext, defaults to NULL
* if not specified.
**/
- OutgoingRTPPkt(const unsigned char* const data, size_t datalen,
+ OutgoingRTPPkt(const unsigned char* const data, size_t datalen,
uint8 paddinglen= 0, CryptoContext* pcc= NULL);
- ~OutgoingRTPPkt()
- { }
+ ~OutgoingRTPPkt()
+ { }
- /**
- * @param pt Packet payload type.
- **/
- inline void
- setPayloadType(PayloadType pt)
- { getHeader()->payload = pt; }
+ /**
+ * @param pt Packet payload type.
+ **/
+ inline void
+ setPayloadType(PayloadType pt)
+ { getHeader()->payload = pt; }
- /**
+ /**
* Sets the sequence number in the header.
*
- * @param seq Packet sequence number, in host order.
- **/
- inline void
- setSeqNum(uint16 seq)
- {
- cachedSeqNum = seq;
- getHeader()->sequence = htons(seq);
- }
+ * @param seq Packet sequence number, in host order.
+ **/
+ inline void
+ setSeqNum(uint16 seq)
+ {
+ cachedSeqNum = seq;
+ getHeader()->sequence = htons(seq);
+ }
- /**
- * @param pts Packet timestamp, in host order.
- **/
- inline void
- setTimestamp(uint32 pts)
- {
- cachedTimestamp = pts;
- getHeader()->timestamp = htonl(pts);
- }
+ /**
+ * @param pts Packet timestamp, in host order.
+ **/
+ inline void
+ setTimestamp(uint32 pts)
+ {
+ cachedTimestamp = pts;
+ getHeader()->timestamp = htonl(pts);
+ }
- /**
- * Set synchronization source numeric identifier.
- *
- * @param ssrc 32-bit Synchronization SouRCe numeric
- * identifier, in host order.
- **/
- inline void
- setSSRC(uint32 ssrc) const
- { getHeader()->sources[0] = htonl(ssrc); }
+ /**
+ * Set synchronization source numeric identifier.
+ *
+ * @param ssrc 32-bit Synchronization SouRCe numeric
+ * identifier, in host order.
+ **/
+ inline void
+ setSSRC(uint32 ssrc) const
+ { getHeader()->sources[0] = htonl(ssrc); }
- /**
- * Set synchronization source numeric identifier. Special
- * version to save endianness conversion.
- *
- * @param ssrc 32-bit Synchronization SouRCe numeric
- * identifier, in network order.
- **/
- inline void
- setSSRCNetwork(uint32 ssrc) const
- { getHeader()->sources[0] = ssrc; }
+ /**
+ * Set synchronization source numeric identifier. Special
+ * version to save endianness conversion.
+ *
+ * @param ssrc 32-bit Synchronization SouRCe numeric
+ * identifier, in network order.
+ **/
+ inline void
+ setSSRCNetwork(uint32 ssrc) const
+ { getHeader()->sources[0] = ssrc; }
- /**
- * Specify the value of the marker bit. By default, the marker
- * bit of outgoing packets is false/0. This method allows to
- * explicity specify and change that value.
- *
- * @param mark value for the market bit.
- */
- inline void
- setMarker(bool mark)
- { getHeader()->marker = mark; }
+ /**
+ * Specify the value of the marker bit. By default, the marker
+ * bit of outgoing packets is false/0. This method allows to
+ * explicity specify and change that value.
+ *
+ * @param mark value for the market bit.
+ */
+ inline void
+ setMarker(bool mark)
+ { getHeader()->marker = mark; }
/**
* Called packet is setup.
@@ -656,39 +654,39 @@
*/
void protect(uint32 ssrc, CryptoContext* pcc);
- /**
- * Outgoing packets are equal if their sequence numbers match.
- **/
- inline bool
- operator==(const OutgoingRTPPkt &p) const
- { return ( this->getSeqNum() == p.getSeqNum() ); }
+ /**
+ * Outgoing packets are equal if their sequence numbers match.
+ **/
+ inline bool
+ operator==(const OutgoingRTPPkt &p) const
+ { return ( this->getSeqNum() == p.getSeqNum() ); }
- /**
- * Outgoing packets are not equal if their sequence numbers differ.
- **/
- inline bool
- operator!=(const OutgoingRTPPkt &p) const
- { return ( this->getSeqNum() != p.getSeqNum() ); }
+ /**
+ * Outgoing packets are not equal if their sequence numbers differ.
+ **/
+ inline bool
+ operator!=(const OutgoingRTPPkt &p) const
+ { return ( this->getSeqNum() != p.getSeqNum() ); }
private:
- /**
- * Copy constructor from objects of its same kind, declared
- * private to avoid its use.
- **/
- OutgoingRTPPkt(const OutgoingRTPPkt &o);
+ /**
+ * Copy constructor from objects of its same kind, declared
+ * private to avoid its use.
+ **/
+ OutgoingRTPPkt(const OutgoingRTPPkt &o);
- /**
- * Assignment operator from objects of its same kind, declared
- * private to avoid its use.
- **/
- OutgoingRTPPkt&
- operator=(const OutgoingRTPPkt &o);
+ /**
+ * Assignment operator from objects of its same kind, declared
+ * private to avoid its use.
+ **/
+ OutgoingRTPPkt&
+ operator=(const OutgoingRTPPkt &o);
- /**
- * Set the list of CSRC identifiers in an RTP packet,
- * switching host to network order.
- */
- void setCSRCArray(const uint32* const csrcs, uint16 numcsrc);
+ /**
+ * Set the list of CSRC identifiers in an RTP packet,
+ * switching host to network order.
+ */
+ void setCSRCArray(const uint32* const csrcs, uint16 numcsrc);
};
@@ -707,41 +705,41 @@
class __EXPORT IncomingRTPPkt : public RTPPacket
{
public:
- /**
- * Build an RTP packet object from a data buffer. This
- * constructor first performs a generic RTP data packet header
- * check, whose result can be checked via isHeaderValid().
- *
- * @param block pointer to the buffer the whole packet is stored in.
- * @param len length of the whole packet, expressed in octets.
- *
- * @note If check fails, the packet object is
- * incomplete. checking isHeaderValid() is recommended before
- * using a new RTPPacket object.
- **/
- IncomingRTPPkt(const unsigned char* block, size_t len);
+ /**
+ * Build an RTP packet object from a data buffer. This
+ * constructor first performs a generic RTP data packet header
+ * check, whose result can be checked via isHeaderValid().
+ *
+ * @param block pointer to the buffer the whole packet is stored in.
+ * @param len length of the whole packet, expressed in octets.
+ *
+ * @note If check fails, the packet object is
+ * incomplete. checking isHeaderValid() is recommended before
+ * using a new RTPPacket object.
+ **/
+ IncomingRTPPkt(const unsigned char* block, size_t len);
- ~IncomingRTPPkt()
- { }
+ ~IncomingRTPPkt()
+ { }
- /**
- * Get validity of this packet
- * @return whether the header check performed at construction
- * time ended successfully.
- **/
- inline bool
- isHeaderValid()
- { return headerValid; }
+ /**
+ * Get validity of this packet
+ * @return whether the header check performed at construction
+ * time ended successfully.
+ **/
+ inline bool
+ isHeaderValid()
+ { return headerValid; }
- /**
- * Get synchronization source numeric identifier.
- *
- * @return 32-bits Synchronization SouRCe numeric identifier,
- * in host order.
- **/
- inline uint32
- getSSRC() const
- { return cachedSSRC; }
+ /**
+ * Get synchronization source numeric identifier.
+ *
+ * @return 32-bits Synchronization SouRCe numeric identifier,
+ * in host order.
+ **/
+ inline uint32
+ getSSRC() const
+ { return cachedSSRC; }
/**
* Unprotect a received packet.
@@ -756,53 +754,51 @@
int32
unprotect(CryptoContext* pcc);
- /**
- * Two incoming packets are equal if they come from sources
- * with the same SSRC and have the same sequence number.
- **/
- inline bool
- operator==(const IncomingRTPPkt &p) const
- { return ( (this->getSeqNum() == p.getSeqNum()) &&
- (this->getSSRC() == p.getSSRC()) ); }
+ /**
+ * Two incoming packets are equal if they come from sources
+ * with the same SSRC and have the same sequence number.
+ **/
+ inline bool
+ operator==(const IncomingRTPPkt &p) const
+ { return ( (this->getSeqNum() == p.getSeqNum()) &&
+ (this->getSSRC() == p.getSSRC()) ); }
- /**
- * Two incoming packets are not equal if they come from
- * different sources or have different sequence numbers.
- **/
- inline bool
- operator!=(const IncomingRTPPkt &p) const
- { return !( *this == p ); }
+ /**
+ * Two incoming packets are not equal if they come from
+ * different sources or have different sequence numbers.
+ **/
+ inline bool
+ operator!=(const IncomingRTPPkt &p) const
+ { return !( *this == p ); }
private:
- /**
- * Copy constructor from objects of its same kind, declared
- * private to avoid its use.
- **/
- IncomingRTPPkt(const IncomingRTPPkt &ip);
+ /**
+ * Copy constructor from objects of its same kind, declared
+ * private to avoid its use.
+ **/
+ IncomingRTPPkt(const IncomingRTPPkt &ip);
- /**
- * Assignment operator from objects of its same kind, declared
- * private to avoid its use.
- */
- IncomingRTPPkt&
- operator=(const IncomingRTPPkt &ip);
+ /**
+ * Assignment operator from objects of its same kind, declared
+ * private to avoid its use.
+ */
+ IncomingRTPPkt&
+ operator=(const IncomingRTPPkt &ip);
- /// Header validity, checked at construction time.
- bool headerValid;
- /// SSRC 32-bit identifier in host order.
- uint32 cachedSSRC;
- // Masks for RTP header validation: types matching RTCP SR or
- // RR must be rejected to avoid accepting misaddressed RTCP
- // packets.
- static const uint16 RTP_INVALID_PT_MASK;
- static const uint16 RTP_INVALID_PT_VALUE;
+ /// Header validity, checked at construction time.
+ bool headerValid;
+ /// SSRC 32-bit identifier in host order.
+ uint32 cachedSSRC;
+ // Masks for RTP header validation: types matching RTCP SR or
+ // RR must be rejected to avoid accepting misaddressed RTCP
+ // packets.
+ static const uint16 RTP_INVALID_PT_MASK;
+ static const uint16 RTP_INVALID_PT_VALUE;
};
/** @}*/ // rtppacket
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif // ndef CCXX_RTP_RTPPKT_H_
diff --git a/jni/libccrtp/sources/src/ccrtp/sources.h b/jni/libccrtp/sources/src/ccrtp/sources.h
index 86852e1..eb12988 100644
--- a/jni/libccrtp/sources/src/ccrtp/sources.h
+++ b/jni/libccrtp/sources/src/ccrtp/sources.h
@@ -1,27 +1,27 @@
// Copyright (C) 2001,2002,2003,2004 Federico Montesino Pouzols <fedemp@altern.org>.
-//
+//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
-//
+//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
+// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-//
+//
// As a special exception, you may use this file as part of a free software
// library without restriction. Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License. This exception does not however
+// the GNU General Public License. This exception does not however
// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// the GNU General Public License.
//
// This exception applies only to the code released under the name GNU
// ccRTP. If you copy code from other releases into a copy of GNU
@@ -35,21 +35,19 @@
// If you do not wish that, delete this exception notice.
//
-/**
- * @file sources.h
+/**
+ * @file sources.h
*
* @short Sources of synchronization and participants related clases.
**/
-#ifndef CCXX_RTP_SOURCES_H_
+#ifndef CCXX_RTP_SOURCES_H_
#define CCXX_RTP_SOURCES_H_
#include <string>
#include <ccrtp/rtcppkt.h>
-#ifdef CCXX_NAMESPACES
-namespace ost {
-#endif
+NAMESPACE_COMMONCPP
/**
* @defgroup sources Participants and synchronization sources.
@@ -67,40 +65,40 @@
class __EXPORT SDESItemsHolder
{
public:
- const std::string&
- getItem(SDESItemType type) const;
+ const std::string&
+ getItem(SDESItemType type) const;
- inline const std::string&
- getPRIVPrefix() const
- { return sdesItems[SDESItemTypeEND]; }
+ inline const std::string&
+ getPRIVPrefix() const
+ { return sdesItems[SDESItemTypeEND]; }
- void
- setItem(SDESItemType item, const std::string& val);
-
- inline void
- setPRIVPrefix(const std::string& val)
- { sdesItems[SDESItemTypeEND] = val; }
+ void
+ setItem(SDESItemType item, const std::string& val);
+
+ inline void
+ setPRIVPrefix(const std::string& val)
+ { sdesItems[SDESItemTypeEND] = val; }
protected:
- SDESItemsHolder()
- { }
-
- inline virtual ~SDESItemsHolder()
- { }
-
+ SDESItemsHolder()
+ { }
+
+ inline virtual ~SDESItemsHolder()
+ { }
+
private:
- // SDES items for a participant.
- // sdesItems[0] (== sdesItems[SDESItemTypeEND]) holds the prefix
- // value for the PRIV item. The rest of entries hold the
- // correponding SDES item value.
- std::string sdesItems[SDESItemTypeLast + 1];
+ // SDES items for a participant.
+ // sdesItems[0] (== sdesItems[SDESItemTypeEND]) holds the prefix
+ // value for the PRIV item. The rest of entries hold the
+ // correponding SDES item value.
+ std::string sdesItems[SDESItemTypeLast + 1];
};
-/**
+/**
* @class Participant
* @short A class of objects representing remote participants (RTP
* applications) in a multimedia session.
- *
+ *
* Any RTP socket/queue class that directly or indirectly inherits
* from QueueRTCPManager (and hence has RTCP support) will represent
* participants from which any RTP or RTCP packet has been received
@@ -117,7 +115,7 @@
* (for instance, it is included in the destination list), there will
* be a Participant object that corresponds to the "local participant"
* (RTPApplication) object.
- *
+ *
* @author Federico Montesino Pouzols <fedemp@altern.org>
*
* @todo implement reference counting from sources, so that when a
@@ -127,58 +125,58 @@
class __EXPORT Participant : private SDESItemsHolder
{
public:
- /**
- * Get the value of an SDES item. For instance,
- * getSDESItem(SDESItemTypeCNAME), return the CNAME of this
- * Participant.
- *
- * @param type type of SDES item to get value of.
- *
- * @return value of the SDES item as a string.
- * @retval empty string when the value is not known (no RTCP
- * packet with the requested SDES item has been received from this
- * source).
- **/
- const std::string&
- getSDESItem(SDESItemType type) const
- { return SDESItemsHolder::getItem(type); }
+ /**
+ * Get the value of an SDES item. For instance,
+ * getSDESItem(SDESItemTypeCNAME), return the CNAME of this
+ * Participant.
+ *
+ * @param type type of SDES item to get value of.
+ *
+ * @return value of the SDES item as a string.
+ * @retval empty string when the value is not known (no RTCP
+ * packet with the requested SDES item has been received from this
+ * source).
+ **/
+ const std::string&
+ getSDESItem(SDESItemType type) const
+ { return SDESItemsHolder::getItem(type); }
- /**
- * Get the prefix value for the PRIV SDES item.
- *
- * @return PRIV SDES item prefix as a string.
- * @retval empty string when no PRIV SDES item has been
- * received from this source.
- **/
- inline const std::string&
- getPRIVPrefix() const
- { return SDESItemsHolder::getPRIVPrefix(); }
+ /**
+ * Get the prefix value for the PRIV SDES item.
+ *
+ * @return PRIV SDES item prefix as a string.
+ * @retval empty string when no PRIV SDES item has been
+ * received from this source.
+ **/
+ inline const std::string&
+ getPRIVPrefix() const
+ { return SDESItemsHolder::getPRIVPrefix(); }
- /**
- * Construct a new participant.
- *
- * @param cname Unique CNAME identifier.
- **/
- Participant(const std::string& cname);
+ /**
+ * Construct a new participant.
+ *
+ * @param cname Unique CNAME identifier.
+ **/
+ Participant(const std::string& cname);
- ~Participant();
+ ~Participant();
private:
- friend class ParticipantHandler;
+ friend class ParticipantHandler;
- /**
- * Set the value of a SDES item.
- **/
- inline void
- setSDESItem(SDESItemType item, const std::string& val)
- { SDESItemsHolder::setItem(item,val); }
+ /**
+ * Set the value of a SDES item.
+ **/
+ inline void
+ setSDESItem(SDESItemType item, const std::string& val)
+ { SDESItemsHolder::setItem(item,val); }
- /**
- * Set prefix value for the PRIV SDES item.
- **/
- inline void
- setPRIVPrefix(const std::string val)
- { SDESItemsHolder::setPRIVPrefix(val); }
+ /**
+ * Set prefix value for the PRIV SDES item.
+ **/
+ inline void
+ setPRIVPrefix(const std::string val)
+ { SDESItemsHolder::setPRIVPrefix(val); }
};
/**
@@ -195,153 +193,153 @@
class __EXPORT SyncSource
{
public:
- /**
- * @enum State
- *
- * @short Synchronization source states during an RTP session.
- *
- * In general, new synchronization sources are not considered
- * valid until multiple valid data packets or a valid RTCP
- * compound packet has been received from the new source (@see
- * IncomingDataQueue::setMinValidPacketSequence()). Thus, the
- * source will probably be in statePrevalid before reaching
- * one of the two states that indicate a valid source:
- * stateActive and stateInactive.
- *
- * A valid participant is in stateActive state if RTP and/or
- * RTCP packets are currently being received from it. If,
- * after a small number of RTCP report intervals (see
- * IncomingDataQueue::setSourceExpirationPeriod() ), no
- * packets are received, it will reach the stateInactive
- * state. If, after a small number of RTCP report intervals,
- * no packet is received from an inactive source, it will be
- * deleted.
- *
- * If RTCP is being used, after receiving a BYE RTCP packet
- * from a synchronization source, it will reach the
- * stateLeaving state and will be deleted after a delay (see
- * QueueRTCPManager::setLeavingDelay()).
- *
- * Sources in statePrevalid and stateLeaving are not counted
- * for the number of session members estimation.
- **/
- typedef enum {
- stateUnknown, ///< No valid packet has been received.
- statePrevalid, ///< Some packets have been
- ///received, but source validity not
- ///yet guaranteed.
- stateActive, ///< We currently receive packets
- ///(data or control) from this source.
- stateInactive, ///< Was active in the near past but
- ///no packet from this source has
- ///been received lately.
- stateLeaving ///< An RTCP BYE has been received
- ///from the source.
- } State;
+ /**
+ * @enum State
+ *
+ * @short Synchronization source states during an RTP session.
+ *
+ * In general, new synchronization sources are not considered
+ * valid until multiple valid data packets or a valid RTCP
+ * compound packet has been received from the new source (@see
+ * IncomingDataQueue::setMinValidPacketSequence()). Thus, the
+ * source will probably be in statePrevalid before reaching
+ * one of the two states that indicate a valid source:
+ * stateActive and stateInactive.
+ *
+ * A valid participant is in stateActive state if RTP and/or
+ * RTCP packets are currently being received from it. If,
+ * after a small number of RTCP report intervals (see
+ * IncomingDataQueue::setSourceExpirationPeriod() ), no
+ * packets are received, it will reach the stateInactive
+ * state. If, after a small number of RTCP report intervals,
+ * no packet is received from an inactive source, it will be
+ * deleted.
+ *
+ * If RTCP is being used, after receiving a BYE RTCP packet
+ * from a synchronization source, it will reach the
+ * stateLeaving state and will be deleted after a delay (see
+ * QueueRTCPManager::setLeavingDelay()).
+ *
+ * Sources in statePrevalid and stateLeaving are not counted
+ * for the number of session members estimation.
+ **/
+ typedef enum {
+ stateUnknown, ///< No valid packet has been received.
+ statePrevalid, ///< Some packets have been
+ ///received, but source validity not
+ ///yet guaranteed.
+ stateActive, ///< We currently receive packets
+ ///(data or control) from this source.
+ stateInactive, ///< Was active in the near past but
+ ///no packet from this source has
+ ///been received lately.
+ stateLeaving ///< An RTCP BYE has been received
+ ///from the source.
+ } State;
- /**
- * @param ssrc SSRC identifier of the source, unique in each
- * session.
- */
- SyncSource(uint32 ssrc);
+ /**
+ * @param ssrc SSRC identifier of the source, unique in each
+ * session.
+ */
+ SyncSource(uint32 ssrc);
- ~SyncSource();
+ ~SyncSource();
- State
- getState() const
- { return state; }
+ State
+ getState() const
+ { return state; }
- /**
- * Whether this source sends RTP data packets.
- **/
- bool isSender() const
- { return activeSender; }
+ /**
+ * Whether this source sends RTP data packets.
+ **/
+ bool isSender() const
+ { return activeSender; }
- uint32 getID() const
- { return SSRC; }
+ uint32 getID() const
+ { return SSRC; }
- /**
- * Get the participant this synchronization source is
- * asociated to.
- *
- * @retval NULL if the stack has not been yet able to identify
- * the participant this source is associated to.
- **/
- inline Participant*
- getParticipant() const
- { return participant; }
+ /**
+ * Get the participant this synchronization source is
+ * asociated to.
+ *
+ * @retval NULL if the stack has not been yet able to identify
+ * the participant this source is associated to.
+ **/
+ inline Participant*
+ getParticipant() const
+ { return participant; }
- tpport_t getDataTransportPort() const
- { return dataTransportPort; }
+ tpport_t getDataTransportPort() const
+ { return dataTransportPort; }
- tpport_t getControlTransportPort() const
- { return controlTransportPort; }
-
- const InetAddress& getNetworkAddress() const
- { return networkAddress; }
+ tpport_t getControlTransportPort() const
+ { return controlTransportPort; }
+
+ const InetAddress& getNetworkAddress() const
+ { return networkAddress; }
protected:
- /**
- * @param source The RTPSource object being copied
- */
- SyncSource(const SyncSource& source);
+ /**
+ * @param source The RTPSource object being copied
+ */
+ SyncSource(const SyncSource& source);
- SyncSource&
- operator=(const SyncSource& source);
+ SyncSource&
+ operator=(const SyncSource& source);
private:
- friend class SyncSourceHandler;
+ friend class SyncSourceHandler;
- inline void
- setState(State st)
- { state = st; }
+ inline void
+ setState(State st)
+ { state = st; }
- /**
- * Mark this source as an active sender.
- **/
- inline void
- setSender(bool active)
- { activeSender = active; }
+ /**
+ * Mark this source as an active sender.
+ **/
+ inline void
+ setSender(bool active)
+ { activeSender = active; }
- inline void
- setParticipant(Participant& p)
- { participant = &p; }
-
- void setDataTransportPort(tpport_t p)
- { dataTransportPort = p; }
+ inline void
+ setParticipant(Participant& p)
+ { participant = &p; }
- void setControlTransportPort(tpport_t p)
- { controlTransportPort = p; }
+ void setDataTransportPort(tpport_t p)
+ { dataTransportPort = p; }
- void setNetworkAddress(InetAddress addr)
- { networkAddress = addr; }
+ void setControlTransportPort(tpport_t p)
+ { controlTransportPort = p; }
- inline void
- setLink(void *l)
- { link = l; }
+ void setNetworkAddress(InetAddress addr)
+ { networkAddress = addr; }
- void *getLink() const
- { return link; }
+ inline void
+ setLink(void *l)
+ { link = l; }
- // validity state of this source
- State state;
- // 32-bit SSRC identifier.
- uint32 SSRC;
- // A valid source not always is active
+ void *getLink() const
+ { return link; }
+
+ // validity state of this source
+ State state;
+ // 32-bit SSRC identifier.
+ uint32 SSRC;
+ // A valid source not always is active
bool activeSender;
- // The corresponding participant.
- Participant* participant;
+ // The corresponding participant.
+ Participant* participant;
- // Network protocol address for data and control connection
- // (both are assumed to be the same).
- InetAddress networkAddress;
- tpport_t dataTransportPort;
- tpport_t controlTransportPort;
+ // Network protocol address for data and control connection
+ // (both are assumed to be the same).
+ InetAddress networkAddress;
+ tpport_t dataTransportPort;
+ tpport_t controlTransportPort;
- // Pointer to the SyncSourceLink or similar object in the
- // service queue. Saves a lot of searches in the membership
- // table.
- void* link;
+ // Pointer to the SyncSourceLink or similar object in the
+ // service queue. Saves a lot of searches in the membership
+ // table.
+ void* link;
};
/**
@@ -367,129 +365,129 @@
class __EXPORT RTPApplication : private SDESItemsHolder
{
private:
- struct ParticipantLink;
+ struct ParticipantLink;
public:
- /**
- * Create a new RTP application. If the CNAME string provided
- * has zero length, it is guessed from the user and machine
- * name.
- *
- * @param cname Local participant canonical name.
- **/
- RTPApplication(const std::string& cname);
+ /**
+ * Create a new RTP application. If the CNAME string provided
+ * has zero length, it is guessed from the user and machine
+ * name.
+ *
+ * @param cname Local participant canonical name.
+ **/
+ RTPApplication(const std::string& cname);
- ~RTPApplication();
+ ~RTPApplication();
- inline void
- setSDESItem(SDESItemType item, const std::string& val)
- { SDESItemsHolder::setItem(item,val); }
+ inline void
+ setSDESItem(SDESItemType item, const std::string& val)
+ { SDESItemsHolder::setItem(item,val); }
- inline void
- setPRIVPrefix(const std::string& val)
- { SDESItemsHolder::setPRIVPrefix(val); }
+ inline void
+ setPRIVPrefix(const std::string& val)
+ { SDESItemsHolder::setPRIVPrefix(val); }
- const std::string&
- getSDESItem(SDESItemType item) const
- { return SDESItemsHolder::getItem(item); }
+ const std::string&
+ getSDESItem(SDESItemType item) const
+ { return SDESItemsHolder::getItem(item); }
- inline const std::string&
- getPRIVPrefix() const
- { return SDESItemsHolder::getPRIVPrefix(); }
+ inline const std::string&
+ getPRIVPrefix() const
+ { return SDESItemsHolder::getPRIVPrefix(); }
- /**
- * Iterator through the list of participants in this
- * session. Somehow resembles and standard const_iterator
- **/
- class ParticipantsIterator
- {
- public:
- typedef std::forward_iterator_tag iterator_category;
- typedef Participant value_type;
- typedef ptrdiff_t difference_type;
- typedef const Participant* pointer;
- typedef const Participant& reference;
+ /**
+ * Iterator through the list of participants in this
+ * session. Somehow resembles and standard const_iterator
+ **/
+ class ParticipantsIterator
+ {
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef Participant value_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef const Participant* pointer;
+ typedef const Participant& reference;
- ParticipantsIterator(ParticipantLink* p = NULL) :
- link(p)
- { }
+ ParticipantsIterator(ParticipantLink* p = NULL) :
+ link(p)
+ { }
- ParticipantsIterator(const ParticipantsIterator& pi) :
- link(pi.link)
- { }
+ ParticipantsIterator(const ParticipantsIterator& pi) :
+ link(pi.link)
+ { }
- reference operator*() const
- { return *(link->getParticipant()); }
+ reference operator*() const
+ { return *(link->getParticipant()); }
- pointer operator->() const
- { return link->getParticipant(); }
+ pointer operator->() const
+ { return link->getParticipant(); }
- ParticipantsIterator& operator++() {
- link = link->getNext();
- return *this;
- }
+ ParticipantsIterator& operator++() {
+ link = link->getNext();
+ return *this;
+ }
- ParticipantsIterator operator++(int) {
- ParticipantsIterator result(*this);
- ++(*this);
- return result;
- }
- friend bool operator==(const ParticipantsIterator& l,
- const ParticipantsIterator& r)
- { return l.link == r.link; }
+ ParticipantsIterator operator++(int) {
+ ParticipantsIterator result(*this);
+ ++(*this);
+ return result;
+ }
+ friend bool operator==(const ParticipantsIterator& l,
+ const ParticipantsIterator& r)
+ { return l.link == r.link; }
- friend bool operator!=(const ParticipantsIterator& l,
- const ParticipantsIterator& r)
- { return l.link != r.link; }
- private:
- ParticipantLink *link;
- };
+ friend bool operator!=(const ParticipantsIterator& l,
+ const ParticipantsIterator& r)
+ { return l.link != r.link; }
+ private:
+ ParticipantLink *link;
+ };
- ParticipantsIterator begin()
- { return ParticipantsIterator(firstPart); }
-
- ParticipantsIterator end()
- { return ParticipantsIterator(NULL); }
+ ParticipantsIterator begin()
+ { return ParticipantsIterator(firstPart); }
- const Participant*
- getParticipant(const std::string& cname) const;
-
+ ParticipantsIterator end()
+ { return ParticipantsIterator(NULL); }
+
+ const Participant*
+ getParticipant(const std::string& cname) const;
+
private:
- friend class ApplicationHandler;
+ friend class ApplicationHandler;
- struct ParticipantLink {
- ParticipantLink(Participant& p,
- ParticipantLink* l) :
- participant(&p), next(l)
- { }
- inline ~ParticipantLink() { delete participant; }
- inline Participant* getParticipant() { return participant; }
- inline ParticipantLink* getPrev() { return prev; }
- inline ParticipantLink* getNext() { return next; }
- inline void setPrev(ParticipantLink* l) { prev = l; }
- inline void setNext(ParticipantLink* l) { next = l; }
- Participant* participant;
- ParticipantLink* next, *prev;
- };
+ struct ParticipantLink {
+ ParticipantLink(Participant& p,
+ ParticipantLink* l) :
+ participant(&p), next(l)
+ { }
+ inline ~ParticipantLink() { delete participant; }
+ inline Participant* getParticipant() { return participant; }
+ inline ParticipantLink* getPrev() { return prev; }
+ inline ParticipantLink* getNext() { return next; }
+ inline void setPrev(ParticipantLink* l) { prev = l; }
+ inline void setNext(ParticipantLink* l) { next = l; }
+ Participant* participant;
+ ParticipantLink* next, *prev;
+ };
- void
- addParticipant(Participant& part);
+ void
+ addParticipant(Participant& part);
- void
- removeParticipant(ParticipantLink* part);
+ void
+ removeParticipant(ParticipantLink* part);
- /**
- * Find out the local CNAME as user\@host and store it as part
- * of the internal state of this class.
- */
- void
- findCNAME();
+ /**
+ * Find out the local CNAME as user\@host and store it as part
+ * of the internal state of this class.
+ */
+ void
+ findCNAME();
- /// Hash table with sources of RTP and RTCP packets.
- static const size_t defaultParticipantsNum;
- Participant** participants;
- /// List of participants, ordered from older to newer.
- ParticipantLink* firstPart, * lastPart;
+ /// Hash table with sources of RTP and RTCP packets.
+ static const size_t defaultParticipantsNum;
+ Participant** participants;
+ /// List of participants, ordered from older to newer.
+ ParticipantLink* firstPart, * lastPart;
};
/**
@@ -505,9 +503,7 @@
/** @}*/ // sources
-#ifdef CCXX_NAMESPACES
-}
-#endif
+END_NAMESPACE
#endif //CCXX_RTP_SOURCES_H_