diff --git a/include/upipe-srt/upipe_srt_receiver.h b/include/upipe-srt/upipe_srt_receiver.h index 226e71893..77e490f3c 100644 --- a/include/upipe-srt/upipe_srt_receiver.h +++ b/include/upipe-srt/upipe_srt_receiver.h @@ -39,6 +39,24 @@ extern "C" { #define UPIPE_SRT_RECEIVER_SIGNATURE UBASE_FOURCC('s','r','t','r') #define UPIPE_SRT_RECEIVER_OUTPUT_SIGNATURE UBASE_FOURCC('s','r','r','o') +enum upipe_srt_receiver_command { + UPIPE_SRTR_SENTINEL = UPIPE_CONTROL_LOCAL, + + /** get counters (unsigned *, unsigned *, size_t *, size_t *, size_t *, size_t *, size_t *) */ + UPIPE_SRTR_GET_STATS, +}; + +static inline int upipe_srt_receiver_get_stats(struct upipe *upipe, + unsigned *expected_seqnum, unsigned *last_output_seqnum, + size_t *buffered, size_t *nacks, size_t *repaired, + size_t *lost, size_t *duplicates) +{ + return upipe_control(upipe, UPIPE_SRTR_GET_STATS, + UPIPE_SRT_RECEIVER_SIGNATURE, expected_seqnum, last_output_seqnum, + buffered, nacks, repaired, lost, duplicates); +} + + /** @This returns the management structure for all srt receiver sources. * * @return pointer to manager diff --git a/lib/upipe-srt/upipe_srt_receiver.c b/lib/upipe-srt/upipe_srt_receiver.c index 095c0c381..445606025 100644 --- a/lib/upipe-srt/upipe_srt_receiver.c +++ b/lib/upipe-srt/upipe_srt_receiver.c @@ -955,6 +955,33 @@ static int _upipe_srt_receiver_control(struct upipe *upipe, return UBASE_ERR_NONE; } + case UPIPE_SRTR_GET_STATS: { + UBASE_SIGNATURE_CHECK(args, UPIPE_SRT_RECEIVER_SIGNATURE) + unsigned *expected_seqnum = va_arg(args, unsigned*); + unsigned *last_output_seqnum = va_arg(args, unsigned*); + size_t *buffered = va_arg(args, size_t*); + size_t *nacks = va_arg(args, size_t*); + size_t *repaired = va_arg(args, size_t*); + size_t *loss = va_arg(args, size_t*); + size_t *dups = va_arg(args, size_t*); + + struct upipe_srt_receiver *upipe_srt_receiver = upipe_srt_receiver_from_upipe(upipe); + *buffered = upipe_srt_receiver->buffered; + *expected_seqnum = upipe_srt_receiver->expected_seqnum; + *last_output_seqnum = upipe_srt_receiver->last_output_seqnum; + *nacks = upipe_srt_receiver->nacks; + *repaired = upipe_srt_receiver->repaired; + *loss = upipe_srt_receiver->loss; + *dups = upipe_srt_receiver->dups; + + upipe_srt_receiver->nacks = 0; + upipe_srt_receiver->repaired = 0; + upipe_srt_receiver->loss = 0; + upipe_srt_receiver->dups = 0; + + return UBASE_ERR_NONE; + } + default: return UBASE_ERR_UNHANDLED; }