diff --git a/daemon/media_socket.c b/daemon/media_socket.c index d1730c198..32fd89a37 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1764,16 +1764,19 @@ static int do_rtcp(struct packet_handler_ctx *phc) { int ret = -1; GQueue rtcp_list = G_QUEUE_INIT; - if (rtcp_parse(&rtcp_list, &phc->mp)) + int rtcp_ret = rtcp_parse(&rtcp_list, &phc->mp); + if (rtcp_ret < 0) goto out; + if (rtcp_ret == 1) + goto ok; if (phc->rtcp_filter) if (phc->rtcp_filter(&phc->mp, &rtcp_list)) goto out; // queue for output codec_add_raw_packet(&phc->mp); +ok: ret = 0; - out: rtcp_list_free(&rtcp_list); return ret; diff --git a/daemon/rtcp.c b/daemon/rtcp.c index f93f4d2f4..1596bc7d5 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -247,6 +247,9 @@ struct rtcp_process_ctx { // Homer stats GString *json; int json_init_len; + + // verdict + int discard:1; }; // all available methods struct rtcp_handler { @@ -646,6 +649,7 @@ void rtcp_list_free(GQueue *q) { +// returns: 0 = ok, forward, -1 = error, drop, 1 = ok, but discard (no forward) int rtcp_parse(GQueue *q, struct media_packet *mp) { struct rtcp_header *hdr; struct rtcp_chain_element *el; @@ -714,7 +718,7 @@ next: CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, &mp->tv); CAH(destroy); - return 0; + return log_ctx->discard ? 1 : 0; error: CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, &mp->tv);