diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-06 00:31:28 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-06 00:31:28 +0000 |
commit | c5ed562d7932c1937740098921264d4e410159ed (patch) | |
tree | dcaae76c6a0e07f2e8d93598bfe88af97afba4e6 /main | |
parent | 2770244abda6d47e561e5e760d31e5435f688396 (diff) |
Merged revisions 135851 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r135851 | mmichelson | 2008-08-05 19:30:53 -0500 (Tue, 05 Aug 2008) | 48 lines
Merged revisions 135841,135847,135850 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r135841 | mmichelson | 2008-08-05 19:25:10 -0500 (Tue, 05 Aug 2008) | 27 lines
Merging the issue11259 branch.
The purpose of this branch was to take into account
"burps" which could cause jitterbuffers to misbehave.
One such example is if the L option to Dial() were used
to inject audio into a bridged conversation at regular
intervals. Since the audio here was not passed through
the jitterbuffer, it would cause a gap in the jitterbuffer's
timestamps which would cause a frames to be dropped for a
brief period.
Now ast_generic_bridge will empty and reset the jitterbuffer
each time it is called. This causes injected audio to be handled
properly.
ast_generic_bridge also will empty and reset the jitterbuffer
if it receives an AST_CONTROL_SRCUPDATE frame since the change
in audio source could negatively affect the jitterbuffer.
All of this was made possible by adding a new public API call
to the abstract_jb called ast_jb_empty_and_reset.
(closes issue #11259)
Reported by: plack
Tested by: putnopvut
........
r135847 | mmichelson | 2008-08-05 19:27:54 -0500 (Tue, 05 Aug 2008) | 4 lines
Revert inadvertent changes to app_skel that occurred when
I was testing for a memory leak
........
r135850 | mmichelson | 2008-08-05 19:29:54 -0500 (Tue, 05 Aug 2008) | 3 lines
Remove properties that should not be here
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@135852 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/abstract_jb.c | 58 | ||||
-rw-r--r-- | main/channel.c | 5 | ||||
-rw-r--r-- | main/fixedjitterbuf.h | 1 |
3 files changed, 55 insertions, 9 deletions
diff --git a/main/abstract_jb.c b/main/abstract_jb.c index 29338a97b..2599cb179 100644 --- a/main/abstract_jb.c +++ b/main/abstract_jb.c @@ -67,7 +67,8 @@ typedef long (*jb_next_impl)(void *jb); typedef int (*jb_remove_impl)(void *jb, struct ast_frame **fout); /*! \brief Force resynch */ typedef void (*jb_force_resynch_impl)(void *jb); - +/*! \brief Empty and reset jb */ +typedef void (*jb_empty_and_reset_impl)(void *jb); /*! * \brief Jitterbuffer implementation private struct. @@ -83,6 +84,7 @@ struct ast_jb_impl jb_next_impl next; jb_remove_impl remove; jb_force_resynch_impl force_resync; + jb_empty_and_reset_impl empty_and_reset; }; /* Implementation functions */ @@ -95,6 +97,7 @@ static int jb_get_fixed(void *jb, struct ast_frame **fout, long now, long interp static long jb_next_fixed(void *jb); static int jb_remove_fixed(void *jb, struct ast_frame **fout); static void jb_force_resynch_fixed(void *jb); +static void jb_empty_and_reset_fixed(void *jb); /* adaptive */ static void * jb_create_adaptive(struct ast_jb_conf *general_config, long resynch_threshold); static void jb_destroy_adaptive(void *jb); @@ -104,6 +107,7 @@ static int jb_get_adaptive(void *jb, struct ast_frame **fout, long now, long int static long jb_next_adaptive(void *jb); static int jb_remove_adaptive(void *jb, struct ast_frame **fout); static void jb_force_resynch_adaptive(void *jb); +static void jb_empty_and_reset_adaptive(void *jb); /* Available jb implementations */ static struct ast_jb_impl avail_impl[] = @@ -117,7 +121,8 @@ static struct ast_jb_impl avail_impl[] = .get = jb_get_fixed, .next = jb_next_fixed, .remove = jb_remove_fixed, - .force_resync = jb_force_resynch_fixed + .force_resync = jb_force_resynch_fixed, + .empty_and_reset = jb_empty_and_reset_fixed, }, { .name = "adaptive", @@ -128,7 +133,8 @@ static struct ast_jb_impl avail_impl[] = .get = jb_get_adaptive, .next = jb_next_adaptive, .remove = jb_remove_adaptive, - .force_resync = jb_force_resynch_adaptive + .force_resync = jb_force_resynch_adaptive, + .empty_and_reset = jb_empty_and_reset_adaptive, } }; @@ -223,7 +229,7 @@ int ast_jb_do_usecheck(struct ast_channel *c0, struct ast_channel *c1) } ast_set_flag(jb0, JB_TIMEBASE_INITIALIZED); } - + if (!c0_jb_created) { jb_choose_impl(c0); } @@ -603,22 +609,37 @@ void ast_jb_get_config(const struct ast_channel *chan, struct ast_jb_conf *conf) memcpy(conf, &chan->jb.conf, sizeof(*conf)); } +void ast_jb_empty_and_reset(struct ast_channel *c0, struct ast_channel *c1) +{ + struct ast_jb *jb0 = &c0->jb; + struct ast_jb *jb1 = &c1->jb; + int c0_use_jb = ast_test_flag(jb0, JB_USE); + int c0_jb_is_created = ast_test_flag(jb0, JB_CREATED); + int c1_use_jb = ast_test_flag(jb1, JB_USE); + int c1_jb_is_created = ast_test_flag(jb1, JB_CREATED); + + if (c0_use_jb && c0_jb_is_created && jb0->impl->empty_and_reset) { + jb0->impl->empty_and_reset(jb0->jbobj); + } + + if (c1_use_jb && c1_jb_is_created && jb1->impl->empty_and_reset) { + jb1->impl->empty_and_reset(jb1->jbobj); + } +} /* Implementation functions */ /* fixed */ - static void * jb_create_fixed(struct ast_jb_conf *general_config, long resynch_threshold) { struct fixed_jb_conf conf; - + conf.jbsize = general_config->max_size; conf.resync_threshold = resynch_threshold; - + return fixed_jb_new(&conf); } - static void jb_destroy_fixed(void *jb) { struct fixed_jb *fixedjb = (struct fixed_jb *) jb; @@ -691,6 +712,15 @@ static void jb_force_resynch_fixed(void *jb) fixed_jb_set_force_resynch(fixedjb); } +static void jb_empty_and_reset_fixed(void *jb) +{ + struct fixed_jb *fixedjb = jb; + struct fixed_jb_frame f; + + while (fixed_jb_remove(fixedjb, &f) == FIXED_JB_OK) { + ast_frfree(f.data); + } +} /* adaptive */ @@ -773,3 +803,15 @@ static int jb_remove_adaptive(void *jb, struct ast_frame **fout) static void jb_force_resynch_adaptive(void *jb) { } + +static void jb_empty_and_reset_adaptive(void *jb) +{ + jitterbuf *adaptivejb = jb; + jb_frame f; + + while (jb_getall(adaptivejb, &f) == JB_OK) { + ast_frfree(f.data); + } + + jb_reset(adaptivejb); +} diff --git a/main/channel.c b/main/channel.c index 4c427dcc9..511d16316 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4173,6 +4173,8 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct /* Check the need of a jitterbuffer for each channel */ jb_in_use = ast_jb_do_usecheck(c0, c1); + if (jb_in_use) + ast_jb_empty_and_reset(c0, c1); ast_poll_channel_add(c0, c1); @@ -4238,6 +4240,9 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct case AST_CONTROL_VIDUPDATE: case AST_CONTROL_SRCUPDATE: ast_indicate_data(other, f->subclass, f->data, f->datalen); + if (jb_in_use) { + ast_jb_empty_and_reset(c0, c1); + } break; default: *fo = f; diff --git a/main/fixedjitterbuf.h b/main/fixedjitterbuf.h index 541e99d2d..868e24b66 100644 --- a/main/fixedjitterbuf.h +++ b/main/fixedjitterbuf.h @@ -85,7 +85,6 @@ int fixed_jb_remove(struct fixed_jb *jb, struct fixed_jb_frame *frameout); void fixed_jb_set_force_resynch(struct fixed_jb *jb); - #if defined(__cplusplus) || defined(c_plusplus) } #endif |