[svn-commits] file: branch group/media_formats-reviewed-trunk r418613 - in /team/group/medi...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jul 14 17:32:16 CDT 2014


Author: file
Date: Mon Jul 14 17:32:12 2014
New Revision: 418613

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=418613
Log:
codec_resample / translate: Allow translators to provide an explicit output format and fix double unref of format.

Review: https://reviewboard.asterisk.org/r/3783/

Modified:
    team/group/media_formats-reviewed-trunk/codecs/codec_resample.c
    team/group/media_formats-reviewed-trunk/main/translate.c

Modified: team/group/media_formats-reviewed-trunk/codecs/codec_resample.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/codecs/codec_resample.c?view=diff&rev=418613&r1=418612&r2=418613
==============================================================================
--- team/group/media_formats-reviewed-trunk/codecs/codec_resample.c (original)
+++ team/group/media_formats-reviewed-trunk/codecs/codec_resample.c Mon Jul 14 17:32:12 2014
@@ -107,7 +107,6 @@
 {
 	SpeexResamplerState *resamp_pvt = pvt->pvt;
 
-	ao2_cleanup(pvt->f.subclass.format);
 	speex_resampler_destroy(resamp_pvt);
 }
 

Modified: team/group/media_formats-reviewed-trunk/main/translate.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/main/translate.c?view=diff&rev=418613&r1=418612&r2=418613
==============================================================================
--- team/group/media_formats-reviewed-trunk/main/translate.c (original)
+++ team/group/media_formats-reviewed-trunk/main/translate.c Mon Jul 14 17:32:12 2014
@@ -289,6 +289,18 @@
  * wrappers around the translator routines.
  */
 
+static void destroy(struct ast_trans_pvt *pvt)
+{
+	struct ast_translator *t = pvt->t;
+
+	if (t->destroy) {
+		t->destroy(pvt);
+	}
+	ao2_cleanup(pvt->f.subclass.format);
+	ast_free(pvt);
+	ast_module_unref(t->module);
+}
+
 /*!
  * \brief Allocate the descriptor, required outbuf space,
  * and possibly desc.
@@ -296,7 +308,6 @@
 static struct ast_trans_pvt *newpvt(struct ast_translator *t)
 {
 	struct ast_trans_pvt *pvt;
-	struct ast_format *dst_format = NULL;
 	int len;
 	char *ofs;
 
@@ -320,48 +331,49 @@
 	if (t->buf_size) {/* finally buffer and header */
 		pvt->outbuf.c = ofs + AST_FRIENDLY_OFFSET;
 	}
+
+	ast_module_ref(t->module);
+
 	/* call local init routine, if present */
 	if (t->newpvt && t->newpvt(pvt)) {
 		ast_free(pvt);
+		ast_module_unref(t->module);
 		return NULL;
 	}
 
-	if (!ast_strlen_zero(pvt->t->format)) {
-		dst_format = ast_format_cache_get(pvt->t->format);
-	}
-
-	if (!dst_format) {
-		struct ast_codec *codec = ast_codec_get(t->dst_codec.name,
-			t->dst_codec.type, t->dst_codec.sample_rate);
-		if (!codec) {
-			ast_log(LOG_ERROR, "Unable to get destination codec\n");
-			ast_free(pvt);
-			return NULL;
-		}
-		dst_format = ast_format_create(codec);
-		ao2_ref(codec, -1);
-	}
-
-	pvt->f.subclass.format = dst_format;
+	/* Setup normal static translation frame. */
 	pvt->f.frametype = AST_FRAME_VOICE;
 	pvt->f.mallocd = 0;
 	pvt->f.offset = AST_FRIENDLY_OFFSET;
 	pvt->f.src = pvt->t->name;
 	pvt->f.data.ptr = pvt->outbuf.c;
 
-	ast_module_ref(t->module);
+	/* if the translator has not provided a format find one in the cache or create one */
+	if (!pvt->f.subclass.format) {
+		if (!ast_strlen_zero(pvt->t->format)) {
+			pvt->f.subclass.format = ast_format_cache_get(pvt->t->format);
+		}
+
+		if (!pvt->f.subclass.format) {
+			struct ast_codec *codec = ast_codec_get(t->dst_codec.name,
+				t->dst_codec.type, t->dst_codec.sample_rate);
+			if (!codec) {
+				ast_log(LOG_ERROR, "Unable to get destination codec\n");
+				destroy(pvt);
+				return NULL;
+			}
+			pvt->f.subclass.format = ast_format_create(codec);
+			ao2_ref(codec, -1);
+		}
+
+		if (!pvt->f.subclass.format) {
+			ast_log(LOG_ERROR, "Unable to create format\n");
+			destroy(pvt);
+			return NULL;
+		}
+	}
+
 	return pvt;
-}
-
-static void destroy(struct ast_trans_pvt *pvt)
-{
-	struct ast_translator *t = pvt->t;
-
-	if (t->destroy)
-		t->destroy(pvt);
-	ao2_cleanup(pvt->f.subclass.format);
-	ast_free(pvt);
-	ast_module_unref(t->module);
 }
 
 /*! \brief framein wrapper, deals with bound checks.  */




More information about the svn-commits mailing list