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