summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorLorenzo Miniero <lminiero@gmail.com>2016-11-29 16:31:21 +0100
committerLorenzo Miniero <lminiero@gmail.com>2017-01-23 13:25:31 +0100
commit1061539b75811d9115dcbc0be46967515bd9e2d1 (patch)
tree5c1996f9a2943cc130c067546960732d2d81129b /main
parent31268e0a280110748f33314a2c09563c576243de (diff)
media: Add experimental support for RTCP feedback.
This change adds experimental support for providing RTCP feedback information to codec modules so they can dynamically change themselves based on conditions. ASTERISK-26584 Change-Id: Ifd6aa77fb4a7ff546c6025900fc2baf332c31857
Diffstat (limited to 'main')
-rw-r--r--main/channel.c10
-rw-r--r--main/frame.c8
-rw-r--r--main/translate.c11
3 files changed, 29 insertions, 0 deletions
diff --git a/main/channel.c b/main/channel.c
index 00cfa31aa..68c45a260 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -1531,6 +1531,7 @@ int ast_is_deferrable_frame(const struct ast_frame *frame)
case AST_FRAME_IAX:
case AST_FRAME_CNG:
case AST_FRAME_MODEM:
+ case AST_FRAME_RTCP:
return 0;
}
return 0;
@@ -2866,6 +2867,7 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay)
case AST_FRAME_IMAGE:
case AST_FRAME_HTML:
case AST_FRAME_MODEM:
+ case AST_FRAME_RTCP:
done = 1;
break;
case AST_FRAME_CONTROL:
@@ -4348,6 +4350,14 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
*/
ast_read_generator_actions(chan, f);
break;
+ case AST_FRAME_RTCP:
+ /* Incoming RTCP feedback needs to get to the translator for
+ * outgoing media, which means we treat it as an ast_write */
+ if (ast_channel_writetrans(chan)) {
+ ast_translate(ast_channel_writetrans(chan), f, 0);
+ }
+ ast_frfree(f);
+ f = &ast_null_frame;
default:
/* Just pass it on! */
break;
diff --git a/main/frame.c b/main/frame.c
index 0175c7226..71feacb61 100644
--- a/main/frame.c
+++ b/main/frame.c
@@ -533,6 +533,8 @@ void ast_frame_subclass2str(struct ast_frame *f, char *subclass, size_t slen, ch
break;
}
break;
+ case AST_FRAME_RTCP:
+ ast_copy_string(subclass, "RTCP", slen);
default:
ast_copy_string(subclass, "Unknown Subclass", slen);
break;
@@ -584,6 +586,9 @@ void ast_frame_type2str(enum ast_frame_type frame_type, char *ftype, size_t len)
case AST_FRAME_VIDEO:
ast_copy_string(ftype, "Video", len);
break;
+ case AST_FRAME_RTCP:
+ ast_copy_string(ftype, "RTCP", len);
+ break;
default:
snprintf(ftype, len, "Unknown Frametype '%u'", frame_type);
break;
@@ -621,6 +626,9 @@ void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix)
if (f->frametype == AST_FRAME_VIDEO) {
return;
}
+ if (f->frametype == AST_FRAME_RTCP) {
+ return;
+ }
ast_frame_type2str(f->frametype, ftype, sizeof(ftype));
ast_frame_subclass2str(f, subclass, sizeof(subclass), moreinfo, sizeof(moreinfo));
diff --git a/main/translate.c b/main/translate.c
index fa606e71b..168a72a4b 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -530,6 +530,17 @@ struct ast_frame *ast_translate(struct ast_trans_pvt *path, struct ast_frame *f,
long len;
int seqno;
+ if (f->frametype == AST_FRAME_RTCP) {
+ /* Just pass the feedback to the right callback, if it exists.
+ * This "translation" does nothing so return a null frame. */
+ struct ast_trans_pvt *tp;
+ for (tp = p; tp; tp = tp->next) {
+ if (tp->t->feedback)
+ tp->t->feedback(tp, f);
+ }
+ return &ast_null_frame;
+ }
+
has_timing_info = ast_test_flag(f, AST_FRFLAG_HAS_TIMING_INFO);
ts = f->ts;
len = f->len;