Merged revisions 201056 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/
  ........
................


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@201096 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin P. Fleming
2009-06-16 19:42:08 +00:00
parent 21da1c5fde
commit bbfd73e692
11 changed files with 332 additions and 195 deletions

View File

@@ -80,7 +80,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
@@ -106,15 +106,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);
@@ -124,13 +126,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;
}