aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-05 01:54:16 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-05 01:54:16 +0000
commit6d9959cc34117781b3458268aae5ba418121b504 (patch)
tree210032a142b3c0eb0ce597ad9a35516cd3754139
parent4be40c5d13ed6d3782e2c9940e5468c25aed6c4b (diff)
Merged revisions 105932 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r105932 | russell | 2008-03-04 19:52:18 -0600 (Tue, 04 Mar 2008) | 5 lines Fix a bug that I just noticed in the RTP code. The calculation for setting the len field in an ast_frame of audio was wrong when G.722 is in use. The len field represents the number of ms of audio that the frame contains. It would have set the value to be twice what it should be. ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@105933 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--include/asterisk/frame.h11
-rw-r--r--main/rtp.c2
-rw-r--r--main/translate.c14
3 files changed, 15 insertions, 12 deletions
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 012f7a952..3206f860f 100644
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -611,6 +611,17 @@ int ast_frame_adjust_volume(struct ast_frame *f, int adjustment);
*/
int ast_frame_slinear_sum(struct ast_frame *f1, struct ast_frame *f2);
+/*!
+ * \brief Get the sample rate for a given format.
+ */
+static force_inline int ast_format_rate(int format)
+{
+ if (format == AST_FORMAT_G722 || format == AST_FORMAT_SLINEAR16)
+ return 16000;
+
+ return 8000;
+}
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
diff --git a/main/rtp.c b/main/rtp.c
index 9777a5183..5be0586c6 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -1612,7 +1612,7 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
/* Add timing data to let ast_generic_bridge() put the frame into a jitterbuf */
ast_set_flag(&rtp->f, AST_FRFLAG_HAS_TIMING_INFO);
rtp->f.ts = timestamp / 8;
- rtp->f.len = rtp->f.samples / 8;
+ rtp->f.len = rtp->f.samples / ( (ast_format_rate(rtp->f.subclass) == 16000) ? 16 : 8 );
} else if(rtp->f.subclass & AST_FORMAT_VIDEO_MASK) {
/* Video -- samples is # of samples vs. 90000 */
if (!rtp->lastividtimestamp)
diff --git a/main/translate.c b/main/translate.c
index 83a93a4d2..be10b11b2 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -298,14 +298,6 @@ struct ast_trans_pvt *ast_translator_build_path(int dest, int source)
return head;
}
-static inline int format_rate(int format)
-{
- if (format == AST_FORMAT_G722 || format == AST_FORMAT_SLINEAR16)
- return 16000;
-
- return 8000;
-}
-
/*! \brief do the actual translation */
struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f, int consume)
{
@@ -342,7 +334,7 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f,
path->nextout = f->delivery;
}
/* Predict next incoming sample */
- path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, format_rate(f->subclass)));
+ path->nextin = ast_tvadd(path->nextin, ast_samp2tv(f->samples, ast_format_rate(f->subclass)));
}
delivery = f->delivery;
for ( ; out && p ; p = p->next) {
@@ -366,7 +358,7 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f,
/* Predict next outgoing timestamp from samples in this
frame. */
- path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, format_rate(out->subclass)));
+ path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, ast_format_rate(out->subclass)));
} else {
out->delivery = ast_tv(0, 0);
ast_set2_flag(out, has_timing_info, AST_FRFLAG_HAS_TIMING_INFO);
@@ -390,7 +382,7 @@ static void calc_cost(struct ast_translator *t, int seconds)
struct rusage start;
struct rusage end;
int cost;
- int out_rate = format_rate(t->dstfmt);
+ int out_rate = ast_format_rate(t->dstfmt);
if (!seconds)
seconds = 1;