[asterisk-dev] [asterisk-commits] russell: branch 1.4 r97976 - /branches/1.4/main/translate.c
Luigi Rizzo
rizzo at icir.org
Thu Jan 10 17:34:56 CST 2008
On Thu, Jan 10, 2008 at 11:30:41PM -0000, SVN commits to the Asterisk project wrote:
> Author: russell
> Date: Thu Jan 10 17:30:40 2008
> New Revision: 97976
>
> URL: http://svn.digium.com/view/asterisk?view=rev&rev=97976
> Log:
> Fix various timing calculations that made assumptions that the audio being
> processed was at a sample rate of 8 kHz.
instead of
int is16kHz(int format)
why don't you define a function
int format_rate(int format)
which returns the data rate for the format, so we don't have to
return on this next time we introduce some other sampling rate ?
(maybe we will if there are hidden assumption of the rates being
one the double of each other, but at least we have one less place
to fix)
cheers
luigi
> Modified:
> branches/1.4/main/translate.c
>
> Modified: branches/1.4/main/translate.c
> URL: http://svn.digium.com/view/asterisk/branches/1.4/main/translate.c?view=diff&rev=97976&r1=97975&r2=97976
> ==============================================================================
> --- branches/1.4/main/translate.c (original)
> +++ branches/1.4/main/translate.c Thu Jan 10 17:30:40 2008
> @@ -294,6 +294,14 @@
> return head;
> }
>
> +static inline int is16kHz(int format)
> +{
> + if (format == AST_FORMAT_G722)
> + return 1;
> +
> + return 0;
> +}
> +
> /*! \brief do the actual translation */
> struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f, int consume)
> {
> @@ -312,6 +320,11 @@
>
> /* XXX hmmm... check this below */
> if (!ast_tvzero(f->delivery)) {
> + int in_rate = 8000;
> +
> + if (is16kHz(f->subclass))
> + in_rate = 16000;
> +
> if (!ast_tvzero(path->nextin)) {
> /* Make sure this is in line with what we were expecting */
> if (!ast_tveq(path->nextin, f->delivery)) {
> @@ -330,7 +343,7 @@
> path->nextout = f->delivery;
> }
> /* Predict next incoming sample */
> - path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, 8000));
> + path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, in_rate));
> }
> delivery = f->delivery;
> for ( ; out && p ; p = p->next) {
> @@ -343,6 +356,11 @@
> return NULL;
> /* we have a frame, play with times */
> if (!ast_tvzero(delivery)) {
> + int out_rate = 8000;
> +
> + if (is16kHz(out->subclass))
> + out_rate = 16000;
> +
> /* Regenerate prediction after a discontinuity */
> if (ast_tvzero(path->nextout))
> path->nextout = ast_tvnow();
> @@ -352,7 +370,7 @@
>
> /* Predict next outgoing timestamp from samples in this
> frame. */
> - path->nextout = ast_tvadd(path->nextout, ast_samp2tv( out->samples, 8000));
> + path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, out_rate));
> } else {
> out->delivery = ast_tv(0, 0);
> out->has_timing_info = has_timing_info;
> @@ -371,10 +389,14 @@
> /*! \brief compute the cost of a single translation step */
> static void calc_cost(struct ast_translator *t, int seconds)
> {
> - int sofar=0;
> + int num_samples = 0;
> struct ast_trans_pvt *pvt;
> struct timeval start;
> int cost;
> + int out_rate = 8000;
> +
> + if (is16kHz(t->dstfmt))
> + out_rate = 16000;
>
> if (!seconds)
> seconds = 1;
> @@ -385,15 +407,18 @@
> t->cost = 99999;
> return;
> }
> +
> pvt = newpvt(t);
> if (!pvt) {
> ast_log(LOG_WARNING, "Translator '%s' appears to be broken and will probably fail.\n", t->name);
> t->cost = 99999;
> return;
> }
> +
> start = ast_tvnow();
> +
> /* Call the encoder until we've processed the required number of samples */
> - while (sofar < seconds * 8000) {
> + while (num_samples < seconds * out_rate) {
> struct ast_frame *f = t->sample();
> if (!f) {
> ast_log(LOG_WARNING, "Translator '%s' failed to produce a sample frame.\n", t->name);
> @@ -404,13 +429,17 @@
> framein(pvt, f);
> ast_frfree(f);
> while ((f = t->frameout(pvt))) {
> - sofar += f->samples;
> + num_samples += f->samples;
> ast_frfree(f);
> }
> }
> +
> cost = ast_tvdiff_ms(ast_tvnow(), start);
> +
> destroy(pvt);
> +
> t->cost = cost / seconds;
> +
> if (!t->cost)
> t->cost = 1;
> }
>
>
> _______________________________________________
> --Bandwidth and Colocation Provided by http://www.api-digital.com--
>
> asterisk-commits mailing list
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-commits
More information about the asterisk-dev
mailing list