[Freeswitch-svn] [commit] r7908 - in freeswitch/trunk/src: . include include/private

Freeswitch SVN anthm at freeswitch.org
Mon Mar 17 19:26:39 EDT 2008


Author: anthm
Date: Mon Mar 17 19:26:38 2008
New Revision: 7908

Modified:
   freeswitch/trunk/src/include/private/switch_core_pvt.h
   freeswitch/trunk/src/include/switch_core.h
   freeswitch/trunk/src/switch_core_codec.c
   freeswitch/trunk/src/switch_core_io.c
   freeswitch/trunk/src/switch_core_media_bug.c

Log:
update

Modified: freeswitch/trunk/src/include/private/switch_core_pvt.h
==============================================================================
--- freeswitch/trunk/src/include/private/switch_core_pvt.h	(original)
+++ freeswitch/trunk/src/include/private/switch_core_pvt.h	Mon Mar 17 19:26:38 2008
@@ -138,6 +138,7 @@
 	switch_frame_t enc_read_frame;
 	uint8_t raw_read_buf[SWITCH_RECOMMENDED_BUFFER_SIZE];
 	uint8_t enc_read_buf[SWITCH_RECOMMENDED_BUFFER_SIZE];
+	switch_codec_t bug_codec;
 };
 
 struct switch_media_bug {

Modified: freeswitch/trunk/src/include/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/switch_core.h	(original)
+++ freeswitch/trunk/src/include/switch_core.h	Mon Mar 17 19:26:38 2008
@@ -1025,6 +1025,8 @@
 													   int channels,
 													   uint32_t flags, const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool);
 
+SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, switch_codec_t *new_codec, switch_memory_pool_t *pool);
+
 /*! 
   \brief Encode data using a codec handle
   \param codec the codec handle to use

Modified: freeswitch/trunk/src/switch_core_codec.c
==============================================================================
--- freeswitch/trunk/src/switch_core_codec.c	(original)
+++ freeswitch/trunk/src/switch_core_codec.c	Mon Mar 17 19:26:38 2008
@@ -154,6 +154,35 @@
 }
 
 
+SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, switch_codec_t *new_codec, switch_memory_pool_t *pool)
+{
+	switch_status_t status;
+
+	switch_assert(codec != NULL);
+	switch_assert(new_codec != NULL);
+
+	if (pool) {
+		new_codec->memory_pool = pool;
+	} else {
+		if ((status = switch_core_new_memory_pool(&new_codec->memory_pool)) != SWITCH_STATUS_SUCCESS) {
+			return status;
+		}
+		switch_set_flag(new_codec, SWITCH_CODEC_FLAG_FREE_POOL);
+	}
+
+	new_codec->codec_interface = codec->codec_interface;
+	new_codec->implementation = codec->implementation;
+	new_codec->flags = codec->flags;
+	
+	if (codec->fmtp_in) {
+		new_codec->fmtp_in = switch_core_strdup(new_codec->memory_pool, codec->fmtp_in);
+	}
+	
+	new_codec->implementation->init(new_codec, new_codec->flags, NULL);
+	
+	return SWITCH_STATUS_SUCCESS;	
+}
+
 SWITCH_DECLARE(switch_status_t) switch_core_codec_init(switch_codec_t *codec, char *codec_name, char *fmtp,
 													   uint32_t rate, int ms, int channels, uint32_t flags,
 													   const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool)
@@ -305,6 +334,8 @@
 		switch_core_destroy_memory_pool(&codec->memory_pool);
 	}
 
+	memset(codec, 0, sizeof(*codec));
+
 	return SWITCH_STATUS_SUCCESS;
 }
 

Modified: freeswitch/trunk/src/switch_core_io.c
==============================================================================
--- freeswitch/trunk/src/switch_core_io.c	(original)
+++ freeswitch/trunk/src/switch_core_io.c	Mon Mar 17 19:26:38 2008
@@ -186,7 +186,7 @@
 
 		if (read_frame->codec || is_cng) {
 			session->raw_read_frame.datalen = session->raw_read_frame.buflen;
-
+			
 			if (is_cng) {
 				memset(session->raw_read_frame.data, 255, read_frame->codec->implementation->bytes_per_frame);
 				session->raw_read_frame.datalen = read_frame->codec->implementation->bytes_per_frame;
@@ -194,7 +194,15 @@
 				read_frame = &session->raw_read_frame;
 				status = SWITCH_STATUS_SUCCESS;
 			} else {
-				status = switch_core_codec_decode(read_frame->codec,
+				switch_codec_t *use_codec = read_frame->codec;
+				if (do_bugs) {
+					if (!session->bug_codec.implementation) {
+						switch_core_codec_copy(read_frame->codec, &session->bug_codec, switch_core_session_get_pool(session));
+					}
+					use_codec = &session->bug_codec;
+				}
+
+				status = switch_core_codec_decode(use_codec,
 												  session->read_codec,
 												  read_frame->data,
 												  read_frame->datalen,

Modified: freeswitch/trunk/src/switch_core_media_bug.c
==============================================================================
--- freeswitch/trunk/src/switch_core_media_bug.c	(original)
+++ freeswitch/trunk/src/switch_core_media_bug.c	Mon Mar 17 19:26:38 2008
@@ -288,6 +288,10 @@
 		return SWITCH_STATUS_SUCCESS;
 	}
 	
+	if (session->bug_codec.implementation) {
+		switch_core_codec_destroy(&session->bug_codec);
+	}
+
 	return SWITCH_STATUS_FALSE;
 }
 
@@ -342,6 +346,10 @@
 		switch_thread_rwlock_unlock(session->bug_rwlock);
 		status = switch_core_media_bug_close(&bp);
 	}
+
+	if (!session->bugs && session->bug_codec.implementation) {
+		switch_core_codec_destroy(&session->bug_codec);
+	}
 	
 	return status;
 }



More information about the Freeswitch-svn mailing list