]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_echo: forward and generate VIDUPDATE frames 91/2491/1
authorJacek Konieczny <jkonieczny@eggsoft.pl>
Fri, 25 Mar 2016 15:42:12 +0000 (16:42 +0100)
committerJoshua Colp <jcolp@digium.com>
Tue, 29 Mar 2016 15:39:49 +0000 (10:39 -0500)
When using app_echo via WebRTC with VP8 video the video would appear
only after a few minutes, because there would be nothing to request
a full reference frame.

This fixes the problem in both ways:
- echos any VIDUPDATE frames received on the channel
- sends one such frame when first video frame is to be forwarded

This makes the echo work with Firefox and Chrome WebRTC implementation.

ASTERISK-25867 #close

Change-Id: I73bda87bf7532ee8bfb28d917045a21034908c1e

apps/app_echo.c

index 2ec9d709b4e949b451236058980d6bbd4302a934..972e59f0aedc627d314c8bebe2128ce420203ace 100644 (file)
@@ -58,6 +58,7 @@ static const char app[] = "Echo";
 static int echo_exec(struct ast_channel *chan, const char *data)
 {
        int res = -1;
+       int fir_sent = 0;
 
        while (ast_waitfor(chan, -1) > -1) {
                struct ast_frame *f = ast_read(chan);
@@ -66,6 +67,22 @@ static int echo_exec(struct ast_channel *chan, const char *data)
                }
                f->delivery.tv_sec = 0;
                f->delivery.tv_usec = 0;
+               if (f->frametype == AST_FRAME_CONTROL
+                       && f->subclass.integer == AST_CONTROL_VIDUPDATE) {
+                       if (ast_write(chan, f) < 0) {
+                               ast_frfree(f);
+                               goto end;
+                       }
+                       fir_sent = 1;
+               }
+               if (!fir_sent && f->frametype == AST_FRAME_VIDEO) {
+                       struct ast_frame frame = {
+                               .frametype = AST_FRAME_CONTROL,
+                               .subclass.integer = AST_CONTROL_VIDUPDATE,
+                       };
+                       ast_write(chan, &frame);
+                       fir_sent = 1;
+               }
                if (f->frametype != AST_FRAME_CONTROL
                        && f->frametype != AST_FRAME_MODEM
                        && f->frametype != AST_FRAME_NULL