r3551 - in trunk/libminisip: . include include/libminisip/media source source/subsystem_media

erik at minisip.org erik at minisip.org
Tue Dec 11 21:05:20 CET 2007


Author: erik
Date: 2007-12-11 21:05:20 +0100 (Tue, 11 Dec 2007)
New Revision: 3551

Added:
   trunk/libminisip/include/libminisip/media/RealtimeMedia.h
   trunk/libminisip/source/subsystem_media/RealtimeMedia.cxx
Modified:
   trunk/libminisip/Makefile.am
   trunk/libminisip/include/Makefile.am
   trunk/libminisip/include/libminisip/media/AudioMedia.h
   trunk/libminisip/include/libminisip/media/Media.h
   trunk/libminisip/include/libminisip/media/MediaStream.h
   trunk/libminisip/source/Minisip.cxx
   trunk/libminisip/source/subsystem_media/AudioMedia.cxx
   trunk/libminisip/source/subsystem_media/CallRecorder.cxx
   trunk/libminisip/source/subsystem_media/Media.cxx
   trunk/libminisip/source/subsystem_media/MediaHandler.cxx
   trunk/libminisip/source/subsystem_media/MediaStream.cxx
Log:

 * Preparing for support for services that uses reliable transport
   (TCP/TLS/...).

   We used to have "Media" that handled (S)RTP based media sending
   and receiving. With this commit, all SRTP handling specific
   code is moved to a sub-class called RealtimeMedia.

      Media
        ^
	|
  RealtimeMedia

 



Modified: trunk/libminisip/Makefile.am
===================================================================
--- trunk/libminisip/Makefile.am	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/Makefile.am	2007-12-11 20:05:20 UTC (rev 3551)
@@ -76,6 +76,7 @@
 			source/subsystem_media/Session.h \
 			source/subsystem_media/MediaStream.cxx \
 			source/subsystem_media/Media.cxx \
+			source/subsystem_media/RealtimeMedia.cxx \
 			source/subsystem_media/RtpReceiver.cxx \
 			source/subsystem_media/MediaCommandString.cxx \
 			source/subsystem_media/AudioMedia.cxx \

Modified: trunk/libminisip/include/Makefile.am
===================================================================
--- trunk/libminisip/include/Makefile.am	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/include/Makefile.am	2007-12-11 20:05:20 UTC (rev 3551)
@@ -10,6 +10,7 @@
 			libminisip/media/AudioMedia.h \
 			libminisip/media/SubsystemMedia.h \
 			libminisip/media/Media.h \
+			libminisip/media/RealtimeMedia.h \
 			libminisip/media/MediaStream.h \
 			libminisip/media/RtpReceiver.h \
 			libminisip/media/CallRecorder.h \

Modified: trunk/libminisip/include/libminisip/media/AudioMedia.h
===================================================================
--- trunk/libminisip/include/libminisip/media/AudioMedia.h	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/include/libminisip/media/AudioMedia.h	2007-12-11 20:05:20 UTC (rev 3551)
@@ -27,8 +27,8 @@
 
 #include<libminisip/libminisip_config.h>
 
-#include<libminisip/media/Media.h>
-#include<libminisip/media/soundcard/SoundSource.h>
+#include<libminisip/media/RealtimeMedia.h>
+#include<libminisip/media/soundcard/SoundIO.h>
 
 #ifdef AEC_SUPPORT
 #include<libminisip/media/aec/aec.h>		//hanning
@@ -47,7 +47,7 @@
  * play out audio data. It is created upon startup, or when the
  * media configuration changes.
  */
-class LIBMINISIP_API AudioMedia : public Media, public SoundRecorderCallback{
+class LIBMINISIP_API AudioMedia : public RealtimeMedia, public SoundRecorderCallback{
 
 	public:
 		/**

Modified: trunk/libminisip/include/libminisip/media/Media.h
===================================================================
--- trunk/libminisip/include/libminisip/media/Media.h	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/include/libminisip/media/Media.h	2007-12-11 20:05:20 UTC (rev 3551)
@@ -31,25 +31,15 @@
 #include<libmutil/MPlugin.h>
 #include<libmutil/MSingleton.h>
 
-#include<libminisip/media/soundcard/SoundIO.h>
-#include<libminisip/media/codecs/Codec.h>
-#include<libminisip/media/rtp/RtpPacket.h>
-#include<libminisip/media/MediaStream.h>
-
-class SoundIO;
-class MediaStreamSender;
 class SdpHeaderM;
 class SipSoftPhoneConfiguration;
 class SubsystemMedia;
 class MediaHandler;
 
+
 /**
- * The Media class is a representation of a medium type, namely
- * video or audio. It holds a list of the CODEC relevant for
- * that medium, and other objects used by the medium (SoundIO 
- * for audio, Grabber and Display for video).
- * Media sessions register their MediaStreamSender objects to
- * the Media objects.
+ * The Media class is a representation of a medium type, for
+ * example video or audio.  
  */
 class LIBMINISIP_API Media : public MObject{
 	public:
@@ -64,85 +54,6 @@
 
 		
 		/**
-		 * Returns a reference to the CODEC given its RTP
-		 * payload type. The payload type is the one
-		 * used by minisip, not necessarily the one
-		 * used by the peers.
-		 * @param payloadType the RTP payload type
-		 * @returns a reference to the corresponding CODEC, or 
-		 * NULL if no such CODEC was found
-		 */
-		virtual MRef<Codec*> getCodec( uint8_t payloadType );
-
-		/**
-		 * Play the given RTP packet on this medium. This includes
-		 * decoding if relevant.
-		 * @param rtpPacket the RTP packet to play
-		 */
-		virtual void playData( MRef<RtpPacket *> rtpPacket )=0;
-		
-		/**
-		 * Send the data to all the registered MediaStreamSender.
-		 * If relevant, the data is first encoded using the
-		 * MediaStream's selected CODEC.
-		 * @param data pointer to the data to send
-		 * @param length length of the data buffer
-		 * @param ts timestamp to use in the RTP header
-		 * @param marker whether or not the marker should be set
-		 * in the RTP header
-		 */
-		virtual void sendData( byte_t * data, uint32_t length, uint32_t ts, bool marker=false );
-
-		/**
-		 * Used by the media sessions to register a MediaStreamSender.
-		 * When a MediaStreamSender is registered to a Media object,
-		 * it will be used to send sampled media from the corresponding
-		 * medium
-		 * @param sender a reference to the MediaStreamSender object to
-		 * register
-		 */
-		virtual void registerMediaSender( MRef<MediaStreamSender *> sender );
-		
-		/**
-		 * Used by the media sessions to unregister a MediaStreamSender,
-		 * when a media session ends.
-		 * @param sender a reference to the MediaStreamSender object to
-		 * unregister
-		 */
-		virtual void unRegisterMediaSender( MRef<MediaStreamSender *> sender );
-
-		/**
-		 * Used to register a new media source. Called upon discovery
-		 * of a new SSRC identifier. Each media source may use
-		 * a different decoder.
-		 * @param ssrc the SSRC identifier used by the new media source
-		 */
-		virtual void registerMediaSource( uint32_t ssrc, std::string callId )=0;
-		
-		/**
-		 * Used to unregister a media source when the session ends. 
-		 * @param ssrc the SSRC identifier used by the media source to
-		 * unregister
-		 */
-		virtual void unRegisterMediaSource( uint32_t ssrc)=0;
-		
-		/**
-		 * deprecated...
-		 */
-		bool receive;
-		bool send;
-		
-		/**
-		 * Used to query available CODECs for that medium. The
-		 * CODEC are returned in a list sorted according
-		 * to the user's preferences. Used by the media Session
-		 * to generate the session description.
-		 * @returns a list of reference to Codec objects, sorted
-		 * according to user preferences (first is preferred)
-		 */
-		std::list< MRef<Codec *> >  getAvailableCodecs();
-
-		/**
 		 * Used to query media specific attributes to add in the
 		 * session description (e.g. framesize).
 		 * @returns a list of attributes (as string) to add in
@@ -167,31 +78,9 @@
 		 */
 		virtual void handleMHeader( MRef<SdpHeaderM *> m );
 
-		/**
-		 * Used to create a CODEC instance for the given RTP
-		 * payload type. The payload type corresponds to the
-		 * one used by minisip, not necessarily the one
-		 * used by the peer.
-		 * @param payloadType the RTP payload type of the CODEC
-		 * of which an instance should be created
-		 * @returns a reference to the CODEC instance created, or
-		 * NULL if no CODEC with this payload type was available
-		 */
-		MRef<CodecState *> createCodecInstance( uint8_t payloadType );
-
 	protected:
 		Media();
-		Media( MRef<Codec *> defaultCodec );
-
-		Media( std::list<MRef<Codec *> > codecList );
-
-		std::list< MRef<Codec *> > codecList;
-		Mutex codecListLock;
 		
-		std::list< MRef<MediaStreamSender *> > senders;
-		Mutex sendersLock;
-		Mutex sourcesLock;
-		
 		std::list<std::string> sdpAttributes;
 };
 
@@ -219,7 +108,7 @@
 		friend class MSingleton<MediaRegistry>;
 };
 
-#endif
-
 #include<libminisip/signaling/sip/SipSoftPhoneConfiguration.h>
 #include<libminisip/media/SubsystemMedia.h>
+
+#endif

Modified: trunk/libminisip/include/libminisip/media/MediaStream.h
===================================================================
--- trunk/libminisip/include/libminisip/media/MediaStream.h	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/include/libminisip/media/MediaStream.h	2007-12-11 20:05:20 UTC (rev 3551)
@@ -30,7 +30,7 @@
 #include<libmutil/MemObject.h>
 
 #include<libminisip/media/rtp/CryptoContext.h>
-#include<libminisip/media/Media.h>
+#include<libminisip/media/RealtimeMedia.h>
 #include"RtpReceiver.h"
 #include<libminisip/media/rtp/SRtpPacket.h>
 
@@ -44,7 +44,7 @@
 class UDPSocket;
 class SdpHeaderM;
 class IpProvider;
-class Media;
+class RealtimeMedia;
 
 /**
  * Abstract class that implements common functions to a
@@ -121,7 +121,7 @@
 		Returns an MRef to the Media object used by this media stream.
 		Use with care.
 		*/
-		MRef<Media *> getMedia() { return media; }
+		MRef<RealtimeMedia *> getMedia() { return media; }
 #ifdef ZRTP_SUPPORT
 		/**
 		 * Set the ZRTP implementation host brigde for this media stream.
@@ -160,9 +160,9 @@
 
 	protected:
 		MRef<CryptoContext *> getCryptoContext( uint32_t ssrc, uint16_t seq_no );
-		MediaStream( std::string callId, MRef<Media *> );
+		MediaStream( std::string callId, MRef<RealtimeMedia *> );
 		std::string callId;
-		MRef<Media *> media;
+		MRef<RealtimeMedia *> media;
 		uint32_t csbId;
 
 		uint8_t localPayloadType;
@@ -197,7 +197,7 @@
 		 * traversal mechanism
 		 */
 		MediaStreamReceiver( std::string callId,
-				MRef<Media *> media,
+				MRef<RealtimeMedia *> media,
 				MRef<RtpReceiver *> rtpReceiver,
 				MRef<RtpReceiver *> rtp6Receiver = NULL );
 
@@ -318,7 +318,7 @@
 		 * is created
 		 */
 		MediaStreamSender( std::string callId,
-				   MRef<Media *> media,
+				   MRef<RealtimeMedia *> media,
 				   MRef<UDPSocket *> senderSock=NULL,
 				   MRef<UDPSocket *> sender6Sock=NULL );
 

Added: trunk/libminisip/include/libminisip/media/RealtimeMedia.h
===================================================================
--- trunk/libminisip/include/libminisip/media/RealtimeMedia.h	                        (rev 0)
+++ trunk/libminisip/include/libminisip/media/RealtimeMedia.h	2007-12-11 20:05:20 UTC (rev 3551)
@@ -0,0 +1,156 @@
+/*
+ Copyright (C) 2004-2007 the Minisip Team
+ 
+ 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
+ */
+
+/* Copyright (C) 2004-2007
+ *
+ * Authors: Erik Eliasson <ere at kth.se>
+ *          Johan Bilien <jobi at via.ecp.fr>
+*/
+
+
+
+#ifndef REALTIMEMEDIA
+#define REALTIMEMEDIA
+
+#include<libminisip/libminisip_config.h>
+
+#include<libminisip/media/Media.h>
+#include<libminisip/media/codecs/Codec.h>
+#include<libminisip/media/rtp/RtpPacket.h>
+#include<libminisip/media/MediaStream.h>
+
+class MediaStreamSender;
+
+
+/**
+ * Handles RTP based media (typically audio and video streams).
+ * It holds a list of the CODEC relevant for
+ * that medium, and other objects used by the medium (SoundIO 
+ * for audio, Grabber and Display for video).
+ * Media sessions register their MediaStreamSender objects to
+ * the Media objects.
+ */
+class LIBMINISIP_API RealtimeMedia : public Media {
+	public:
+		~RealtimeMedia();
+		/**
+		 * Returns a reference to the CODEC given its RTP
+		 * payload type. The payload type is the one
+		 * used by minisip, not necessarily the one
+		 * used by the peers.
+		 * @param payloadType the RTP payload type
+		 * @returns a reference to the corresponding CODEC, or 
+		 * NULL if no such CODEC was found
+		 */
+		virtual MRef<Codec*> getCodec( uint8_t payloadType );
+
+		/**
+		 * Play the given RTP packet on this medium. This includes
+		 * decoding if relevant.
+		 * @param rtpPacket the RTP packet to play
+		 */
+		virtual void playData( MRef<RtpPacket *> rtpPacket )=0;
+		
+		/**
+		 * Send the data to all the registered MediaStreamSender.
+		 * If relevant, the data is first encoded using the
+		 * MediaStream's selected CODEC.
+		 * @param data pointer to the data to send
+		 * @param length length of the data buffer
+		 * @param ts timestamp to use in the RTP header
+		 * @param marker whether or not the marker should be set
+		 * in the RTP header
+		 */
+		virtual void sendData( byte_t * data, uint32_t length, uint32_t ts, bool marker=false );
+
+		/**
+		 * Used by the media sessions to register a MediaStreamSender.
+		 * When a MediaStreamSender is registered to a Media object,
+		 * it will be used to send sampled media from the corresponding
+		 * medium
+		 * @param sender a reference to the MediaStreamSender object to
+		 * register
+		 */
+		virtual void registerMediaSender( MRef<MediaStreamSender *> sender );
+		
+		/**
+		 * Used by the media sessions to unregister a MediaStreamSender,
+		 * when a media session ends.
+		 * @param sender a reference to the MediaStreamSender object to
+		 * unregister
+		 */
+		virtual void unRegisterMediaSender( MRef<MediaStreamSender *> sender );
+
+		/**
+		 * Used to register a new media source. Called upon discovery
+		 * of a new SSRC identifier. Each media source may use
+		 * a different decoder.
+		 * @param ssrc the SSRC identifier used by the new media source
+		 */
+		virtual void registerMediaSource( uint32_t ssrc, std::string callId )=0;
+		
+		/**
+		 * Used to unregister a media source when the session ends. 
+		 * @param ssrc the SSRC identifier used by the media source to
+		 * unregister
+		 */
+		virtual void unRegisterMediaSource( uint32_t ssrc)=0;
+		
+		/**
+		 * deprecated...
+		 */
+		bool receive;
+		bool send;
+		
+		/**
+		 * Used to query available CODECs for that medium. The
+		 * CODEC are returned in a list sorted according
+		 * to the user's preferences. Used by the media Session
+		 * to generate the session description.
+		 * @returns a list of reference to Codec objects, sorted
+		 * according to user preferences (first is preferred)
+		 */
+		std::list< MRef<Codec *> >  getAvailableCodecs();
+
+		/**
+		 * Used to create a CODEC instance for the given RTP
+		 * payload type. The payload type corresponds to the
+		 * one used by minisip, not necessarily the one
+		 * used by the peer.
+		 * @param payloadType the RTP payload type of the CODEC
+		 * of which an instance should be created
+		 * @returns a reference to the CODEC instance created, or
+		 * NULL if no CODEC with this payload type was available
+		 */
+		MRef<CodecState *> createCodecInstance( uint8_t payloadType );
+
+	protected:
+		RealtimeMedia( MRef<Codec *> defaultCodec );
+
+		RealtimeMedia( std::list<MRef<Codec *> > codecList );
+
+		std::list< MRef<Codec *> > codecList;
+		Mutex codecListLock;
+		
+		std::list< MRef<MediaStreamSender *> > senders;
+		Mutex sendersLock;
+		Mutex sourcesLock;
+};
+
+
+#endif

Modified: trunk/libminisip/source/Minisip.cxx
===================================================================
--- trunk/libminisip/source/Minisip.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/Minisip.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -72,7 +72,7 @@
 #include<libminisip/gui/LogEntry.h>
 #include<libminisip/contacts/ContactDb.h>
 #include<libminisip/media/SubsystemMedia.h>
-#include<libminisip/media/Media.h>
+#include<libminisip/media/RealtimeMedia.h>
 #include<libminisip/ipprovider/IpProvider.h>
 #include<libminisip/signaling/conference/ConferenceControl.h>
 #include<libminisip/signaling/conference/ConfCallback.h>
@@ -80,6 +80,7 @@
 #include<libminisip/contacts/PhoneBook.h>
 #include<libminisip/signaling/conference/ConfMessageRouter.h>
 #include<libminisip/media/soundcard/SoundDriverRegistry.h>
+#include<libminisip/media/soundcard/Resampler.h>
 #include<libminisip/media/codecs/Codec.h>
 
 #ifdef ZRTP_SUPPORT

Modified: trunk/libminisip/source/subsystem_media/AudioMedia.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/AudioMedia.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/subsystem_media/AudioMedia.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -74,7 +74,7 @@
 //                soundIo(soundIo){
 AudioMedia::AudioMedia( MRef<SoundIO *> soundIo_, 
 			std::list<MRef<Codec *> > codecList_):
-							Media(codecList_),
+							RealtimeMedia(codecList_),
 							soundIo(soundIo_){
 						
 	// for audio media, we assume that we can both send and receive

Modified: trunk/libminisip/source/subsystem_media/CallRecorder.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/CallRecorder.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/subsystem_media/CallRecorder.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -41,7 +41,7 @@
 CallRecorder::CallRecorder(  MRef<AudioMedia *> aMedia, 
 				MRef<RtpReceiver *> rtpReceiver_,
 				MRef<IpProvider *> ipProvider ):
-		MediaStreamReceiver( "callrecorder", (Media *)*aMedia, rtpReceiver_ ),
+		MediaStreamReceiver( "callrecorder", (RealtimeMedia *)*aMedia, rtpReceiver_ ),
 		enabledMic(false),
 		enabledNtwk(false),
 		fileDev( NULL ),

Modified: trunk/libminisip/source/subsystem_media/Media.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/Media.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/subsystem_media/Media.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -45,76 +45,11 @@
 
 Media::Media(){
 }
-// pn430 Function rewritten for multicodec
-//Media::Media( MRef<Codec *> codec ):codec(codec){
-//}
-Media::Media(MRef<Codec *> codec ){
-	codecList.push_back(codec);
-	//selectedCodec = codec;
-}
 
-// pn430 Function added for multicodec
-Media::Media( std::list<MRef<Codec *> > codecListing ){
-	codecList = codecListing;
-	//selectedCodec = defaultCodec;
-}
-
 Media::~Media(){
 
 }
 
-// pn507 Added for being able to change the current codec
-// pn507 NOTE Using this during a conference call will most likely cause complete havoc.
-MRef<Codec *> Media::getCodec( uint8_t payloadType ){
-	std::list< MRef<Codec *> >::iterator iCodec;
-	
-	for( iCodec = codecList.begin(); iCodec != codecList.end(); iCodec ++ ){
-		if ( (*iCodec)->getSdpMediaType() == payloadType ) {
-//			selectedCodec = (*iCodec);
-			return *iCodec;
-		}
-	}
-	
-	return NULL;
-}
-
-std::list< MRef<Codec *> >  Media::getAvailableCodecs(){
-	list<MRef<Codec *> > copy;
-	codecListLock.lock();
-	copy = codecList;
-	codecListLock.unlock();
-	return copy;
-}
-
-void Media::registerMediaSender( MRef<MediaStreamSender *> sender ){
-	sendersLock.lock();
-	senders.push_back( sender );
-	sendersLock.unlock();
-}
-
-void Media::unRegisterMediaSender( MRef<MediaStreamSender *> sender ){
-	sendersLock.lock();
-	senders.remove( sender );
-	sendersLock.unlock();
-}
-
-void Media::sendData( byte_t * data, uint32_t length, uint32_t ts, bool marker ){
-	list< MRef<MediaStreamSender *> >::iterator i;
-	sendersLock.lock();
-	for( i = senders.begin(); i != senders.end(); i++ ){
-		//only send if active sender, or if muted only if keep-alive
-		if( (*i)->isMuted () ) {
-			if( (*i)->muteKeepAlive( 50 ) ) { //send one packet of every 50
-				memset( data, 0, length );
-			} else {
-				continue;
-			}
-		}
-		(*i)->send( data, length, &ts, marker );
-	}
-	sendersLock.unlock();
-}
-
 list<string> Media::getSdpAttributes(){
 	return sdpAttributes;
 }
@@ -126,18 +61,6 @@
 void Media::handleMHeader( MRef< SdpHeaderM * > m ){
 }
 
-MRef<CodecState *> Media::createCodecInstance( uint8_t payloadType ){
-	std::list< MRef<Codec *> >::iterator iC;
-
-	for( iC = codecList.begin(); iC != codecList.end(); iC ++ ){
-		if( (*iC)->getSdpMediaType() == payloadType ){
-			return (*iC)->newInstance();
-		}
-	}
-	return NULL;
-}
-
-
 MediaPlugin::MediaPlugin( MRef<Library*> lib ): MPlugin( lib ){
 }
 
@@ -148,3 +71,4 @@
 MediaRegistry::MediaRegistry(){
 	registerPlugin( new AudioPlugin( NULL ) );
 }
+

Modified: trunk/libminisip/source/subsystem_media/MediaHandler.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/MediaHandler.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/subsystem_media/MediaHandler.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -121,8 +121,9 @@
 
 	for( i = media.begin(); i != media.end(); i++ ){
 		MRef<Media *> m = *i;
+		MRef<RealtimeMedia*> rm = dynamic_cast<RealtimeMedia*>(*m);
 
-		if( m->receive ){
+		if( rm && rm->receive ){
 			if( ipProvider )
 				rtpReceiver = new RtpReceiver( ipProvider, callId );
 
@@ -130,12 +131,12 @@
 				rtp6Receiver = new RtpReceiver( ip6Provider, callId );
 
 			MRef<MediaStreamReceiver *> rStream;
-			rStream = new MediaStreamReceiver( callId, m, rtpReceiver, rtp6Receiver );
+			rStream = new MediaStreamReceiver( callId, rm, rtpReceiver, rtp6Receiver );
 			session->addMediaStreamReceiver( rStream );
 
 			// Need to dereference MRef:s, Can't compare MRef:s
 			// of different types
-			if( *m == *audioMedia ) {
+			if( *rm == *audioMedia ) {
 				CallRecorder * cr;
 				cr = new CallRecorder( audioMedia, rtpReceiver, ipProvider );
 				session->callRecorder = cr;
@@ -153,7 +154,7 @@
 #endif
 		}
 		
-		if( m->send ){
+		if( rm->send ){
 		    if( !rtpReceiver && !ipProvider.isNull() ){
 			rtpReceiver = new RtpReceiver( ipProvider, callId );
 		    }
@@ -171,7 +172,7 @@
 			    sock6 = rtp6Receiver->getSocket();
 
 		    MRef<MediaStreamSender *> sStream;
-		    sStream = new MediaStreamSender( callId, m, sock, sock6 );
+		    sStream = new MediaStreamSender( callId, rm, sock, sock6 );
 		    session->addMediaStreamSender( sStream );
 #ifdef ZRTP_SUPPORT
 		    if(/*securityConfig.use_zrtp*/ id->use_zrtp) {

Modified: trunk/libminisip/source/subsystem_media/MediaStream.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/MediaStream.cxx	2007-12-11 14:04:10 UTC (rev 3550)
+++ trunk/libminisip/source/subsystem_media/MediaStream.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -47,7 +47,7 @@
 
 using namespace std;
 
-MediaStream::MediaStream( string cid, MRef<Media *> m) : callId(cid), media(m),ka(NULL) {
+MediaStream::MediaStream( string cid, MRef<RealtimeMedia *> m) : callId(cid), media(m),ka(NULL) {
 	disabled = false;
 #ifdef ZRTP_SUPPORT
 	zrtpBridge = NULL;
@@ -277,7 +277,7 @@
 
 #endif
 
-MediaStreamReceiver::MediaStreamReceiver( string callid, MRef<Media *> m,
+MediaStreamReceiver::MediaStreamReceiver( string callid, MRef<RealtimeMedia *> m,
 		MRef<RtpReceiver *> rtpRecv, 
 		MRef<RtpReceiver *> rtp6Recv ):
 			MediaStream( callid,  m ),
@@ -443,7 +443,7 @@
 }
 
 
-MediaStreamSender::MediaStreamSender( string callid, MRef<Media *> m, 
+MediaStreamSender::MediaStreamSender( string callid, MRef<RealtimeMedia *> m, 
 		MRef<UDPSocket *> senderSocket, 
 		MRef<UDPSocket *> sender6Socket ):
 			MediaStream( callid, m ){

Added: trunk/libminisip/source/subsystem_media/RealtimeMedia.cxx
===================================================================
--- trunk/libminisip/source/subsystem_media/RealtimeMedia.cxx	                        (rev 0)
+++ trunk/libminisip/source/subsystem_media/RealtimeMedia.cxx	2007-12-11 20:05:20 UTC (rev 3551)
@@ -0,0 +1,85 @@
+
+#include<libminisip/media/RealtimeMedia.h>
+
+using namespace std;
+
+RealtimeMedia::RealtimeMedia(MRef<Codec *> codec ){
+	codecList.push_back(codec);
+	//selectedCodec = codec;
+}
+
+// pn430 Function added for multicodec
+RealtimeMedia::RealtimeMedia( std::list<MRef<Codec *> > codecListing ){
+	codecList = codecListing;
+	//selectedCodec = defaultCodec;
+}
+
+RealtimeMedia::~RealtimeMedia(){
+
+}
+
+// pn507 Added for being able to change the current codec
+// pn507 NOTE Using this during a conference call will most likely cause complete havoc.
+MRef<Codec *> RealtimeMedia::getCodec( uint8_t payloadType ){
+	std::list< MRef<Codec *> >::iterator iCodec;
+	
+	for( iCodec = codecList.begin(); iCodec != codecList.end(); iCodec ++ ){
+		if ( (*iCodec)->getSdpMediaType() == payloadType ) {
+//			selectedCodec = (*iCodec);
+			return *iCodec;
+		}
+	}
+	
+	return NULL;
+}
+
+list< MRef<Codec *> >  RealtimeMedia::getAvailableCodecs(){
+	list<MRef<Codec *> > copy;
+	codecListLock.lock();
+	copy = codecList;
+	codecListLock.unlock();
+	return copy;
+}
+
+void RealtimeMedia::registerMediaSender( MRef<MediaStreamSender *> sender ){
+	sendersLock.lock();
+	senders.push_back( sender );
+	sendersLock.unlock();
+}
+
+void RealtimeMedia::unRegisterMediaSender( MRef<MediaStreamSender *> sender ){
+	sendersLock.lock();
+	senders.remove( sender );
+	sendersLock.unlock();
+}
+
+void RealtimeMedia::sendData( byte_t * data, uint32_t length, uint32_t ts, bool marker ){
+	list< MRef<MediaStreamSender *> >::iterator i;
+	sendersLock.lock();
+	for( i = senders.begin(); i != senders.end(); i++ ){
+		//only send if active sender, or if muted only if keep-alive
+		if( (*i)->isMuted () ) {
+			if( (*i)->muteKeepAlive( 50 ) ) { //send one packet of every 50
+				memset( data, 0, length );
+			} else {
+				continue;
+			}
+		}
+		(*i)->send( data, length, &ts, marker );
+	}
+	sendersLock.unlock();
+}
+
+
+MRef<CodecState *> RealtimeMedia::createCodecInstance( uint8_t payloadType ){
+	std::list< MRef<Codec *> >::iterator iC;
+
+	for( iC = codecList.begin(); iC != codecList.end(); iC ++ ){
+		if( (*iC)->getSdpMediaType() == payloadType ){
+			return (*iC)->newInstance();
+		}
+	}
+	return NULL;
+}
+
+



More information about the Minisip-devel mailing list