CI: Various updates to buildAsterisk.sh
[asterisk/asterisk.git] / main / abstract_jb.c
index 264ee97..b375739 100644 (file)
@@ -65,6 +65,7 @@ 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);
+static int jb_is_late_fixed(void *jb, long ts);
 /* adaptive */
 static void * jb_create_adaptive(struct ast_jb_conf *general_config);
 static void jb_destroy_adaptive(void *jb);
@@ -75,6 +76,7 @@ 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);
+static int jb_is_late_adaptive(void *jb, long ts);
 
 /* Available jb implementations */
 static const struct ast_jb_impl avail_impl[] = {
@@ -90,6 +92,7 @@ static const struct ast_jb_impl avail_impl[] = {
                .remove = jb_remove_fixed,
                .force_resync = jb_force_resynch_fixed,
                .empty_and_reset = jb_empty_and_reset_fixed,
+               .is_late = jb_is_late_fixed,
        },
        {
                .name = "adaptive",
@@ -103,6 +106,7 @@ static const struct ast_jb_impl avail_impl[] = {
                .remove = jb_remove_adaptive,
                .force_resync = jb_force_resynch_adaptive,
                .empty_and_reset = jb_empty_and_reset_adaptive,
+               .is_late = jb_is_late_adaptive,
        }
 };
 
@@ -439,7 +443,7 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
 
        /* Create a frame log file */
        if (ast_test_flag(jbconf, AST_JB_LOG)) {
-               RAII_VAR(struct ast_channel *, bridged, ast_channel_bridge_peer(chan), ast_channel_cleanup);
+               struct ast_channel *bridged = ast_channel_bridge_peer(chan);
                char safe_logfile[30] = "/tmp/logfile-XXXXXX";
                int safe_fd;
 
@@ -475,6 +479,8 @@ static int create_jb(struct ast_channel *chan, struct ast_frame *frr)
                        jb_framelog("JB_PUT_FIRST {now=%ld}: Dropped frame with ts=%ld and len=%ld\n",
                                now, frr->ts, frr->len);
                }
+
+               ast_channel_cleanup(bridged);
        }
 
        ast_verb(3, "%s jitterbuffer created on channel %s\n", jbimpl->name, ast_channel_name(chan));
@@ -704,6 +710,11 @@ static void jb_empty_and_reset_fixed(void *jb)
        }
 }
 
+static int jb_is_late_fixed(void *jb, long ts)
+{
+       return fixed_jb_is_late(jb, ts);
+}
+
 /* adaptive */
 
 static void *jb_create_adaptive(struct ast_jb_conf *general_config)
@@ -810,6 +821,11 @@ const struct ast_jb_impl *ast_jb_get_impl(enum ast_jb_type type)
        return NULL;
 }
 
+static int jb_is_late_adaptive(void *jb, long ts)
+{
+       return jb_is_late(jb, ts);
+}
+
 #define DEFAULT_TIMER_INTERVAL 20
 #define DEFAULT_SIZE  200
 #define DEFAULT_TARGET_EXTRA  40
@@ -893,7 +909,22 @@ static struct ast_frame *hook_event_cb(struct ast_channel *chan, struct ast_fram
                }
        }
 
-       if (!frame) {
+       /*
+        * If the frame has been requeued (for instance when the translate core returns
+        * more than one frame) then if the frame is late we want to immediately return
+        * it. Otherwise attempt to insert it into the jitterbuffer.
+        *
+        * If the frame is requeued and late then in all likely hood it's a frame that
+        * that was previously retrieved from the jitterbuffer, passed to the translate
+        * core, and then put back into the channel read queue. Even if it had not been
+        * in the jitterbuffer prior to now it needs to be the next frame "out".
+        *
+        * However late arriving frames that have not been requeued (i.e. regular frames)
+        * need to be passed to the jitterbuffer so they can be appropriately dropped. As
+        * well any requeued frames that are not late should be put into the jitterbuffer.
+        */
+       if (!frame || (ast_test_flag(frame, AST_FRFLAG_REQUEUED) &&
+                      framedata->jb_impl->is_late(framedata->jb_obj, frame->ts))) {
                return frame;
        }