aboutsummaryrefslogtreecommitdiffstats
path: root/main/slinfactory.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-16 19:34:39 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-16 19:34:39 +0000
commitead89445f73e8edaeb9b99299cf42e41a291f71f (patch)
tree75740195043cd9c6649193c994d42ff06f34b9ed /main/slinfactory.c
parent6821d6b8031c8a0912bff41d68822ce36a8ccfa4 (diff)
Merged revisions 201056,201090 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r201056 | kpfleming | 2009-06-16 13:54:30 -0500 (Tue, 16 Jun 2009) | 18 lines Merged revisions 200991 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r200991 | kpfleming | 2009-06-16 12:05:38 -0500 (Tue, 16 Jun 2009) | 11 lines Improve support for media paths that can generate multiple frames at once. There are various media paths in Asterisk (codec translators and UDPTL, primarily) that can generate more than one frame to be generated when the application calling them expects only a single frame. This patch addresses a number of those cases, at least the primary ones to solve the known problems. In addition it removes the broken TRACE_FRAMES support, fixes a number of bugs in various frame-related API functions, and cleans up various code paths affected by these changes. https://reviewboard.asterisk.org/r/175/ ........ ................ r201090 | kpfleming | 2009-06-16 14:27:12 -0500 (Tue, 16 Jun 2009) | 5 lines Another minor fix to compiler attribute checking. Defaulting to 'static' for the function scope was bad... so remove it. ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@201093 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/slinfactory.c')
-rw-r--r--main/slinfactory.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/main/slinfactory.c b/main/slinfactory.c
index 4b71db42d..529c2557c 100644
--- a/main/slinfactory.c
+++ b/main/slinfactory.c
@@ -54,7 +54,7 @@ void ast_slinfactory_destroy(struct ast_slinfactory *sf)
int ast_slinfactory_feed(struct ast_slinfactory *sf, struct ast_frame *f)
{
struct ast_frame *begin_frame = f, *duped_frame = NULL, *frame_ptr;
- unsigned int x;
+ unsigned int x = 0;
/* In some cases, we can be passed a frame which has no data in it, but
* which has a positive number of samples defined. Once such situation is
@@ -80,15 +80,17 @@ int ast_slinfactory_feed(struct ast_slinfactory *sf, struct ast_frame *f)
sf->format = f->subclass;
}
- if (!(begin_frame = ast_translate(sf->trans, f, 0)))
+ if (!(begin_frame = ast_translate(sf->trans, f, 0))) {
return 0;
+ }
- duped_frame = ast_frdup(begin_frame);
-
- ast_frfree(begin_frame);
-
- if (!duped_frame)
+ if (!(duped_frame = ast_frisolate(begin_frame))) {
return 0;
+ }
+
+ if (duped_frame != begin_frame) {
+ ast_frfree(begin_frame);
+ }
} else {
if (sf->trans) {
ast_translator_free_path(sf->trans);
@@ -98,13 +100,16 @@ int ast_slinfactory_feed(struct ast_slinfactory *sf, struct ast_frame *f)
return 0;
}
- x = 0;
AST_LIST_TRAVERSE(&sf->queue, frame_ptr, frame_list)
x++;
- AST_LIST_INSERT_TAIL(&sf->queue, duped_frame, frame_list);
-
- sf->size += duped_frame->samples;
+ /* if the frame was translated, the translator may have returned multiple
+ frames, so process each of them
+ */
+ for (begin_frame = duped_frame; begin_frame; begin_frame = AST_LIST_NEXT(begin_frame, frame_list)) {
+ AST_LIST_INSERT_TAIL(&sf->queue, begin_frame, frame_list);
+ sf->size += begin_frame->samples;
+ }
return x;
}