71#define PBUF_MAGIC 0xcafebabe
79 "STATS_INTERVAL must be divisible by (sizeof(ull) * CHAR_BIT)");
80#define MOD_NAME "[Pbuf] "
104 unsigned long long packets[(1<<16) /
sizeof(
unsigned long long) / 8];
129 cpb = playout_buf->
frst;
131 while (cpb != NULL) {
133 assert(cpb->
prv == ppb);
134 if (cpb->
prv != NULL) {
135 assert(cpb->
prv->
nxt == cpb);
142 if (cpb->
nxt != NULL) {
143 assert(cpb->
nxt->
prv == cpb);
145 assert(cpb = playout_buf->
last);
147 if (cpb->
cdata != NULL) {
151 while (ccd != NULL) {
152 assert(ccd->
prv == pcd);
153 if (ccd->
prv != NULL) {
154 assert(ccd->
prv->
nxt == ccd);
157 assert(ccd->
data != NULL);
159 if (ccd->
nxt != NULL) {
160 assert(ccd->
nxt->
prv == ccd);
176 struct pbuf *playout_buf = NULL;
178 playout_buf = (
struct pbuf *) calloc(1,
sizeof(
struct pbuf));
179 if (playout_buf != NULL) {
180 playout_buf->
frst = NULL;
181 playout_buf->
last = NULL;
190 debug_msg(
"Failed to allocate memory for playout buffer\n");
209 while (curr != NULL) {
211 if (curr == playout_buf->
frst) {
214 if (curr == playout_buf->
last) {
217 if (curr->
nxt != NULL) {
220 if (curr->
prv != NULL) {
239 assert(node->
cdata != NULL);
248 tmp->
seqno = pkt->seq;
250 node->
mbit |= pkt->m;
259 while (curr != NULL && ((int16_t)(tmp->
seqno - curr->
seqno) < 0)){
267 }
else if ((int16_t)(tmp->
seqno - curr->
seqno) > 0){
293 if (tmp->
cdata != NULL) {
320 if (packets == ULLONG_MAX) {
324 int longest_gap = __builtin_clzll(packets);
325 while (packets != 0) {
326 longest_gap =
MAX(longest_gap, __builtin_ctzll(packets));
336 int leading_zeros = packets == 0 ?
NUMBER_WORD_BITS : __builtin_clzll(packets);
337 int trailing_zeros = packets == 0 ?
NUMBER_WORD_BITS : __builtin_ctzll(packets);
338 *accumulated_loss += trailing_zeros;
339 *longest_gap =
MAX(*longest_gap, *accumulated_loss);
341 *accumulated_loss = leading_zeros;
349 playout_buf->
last_seq = pkt->seq - 1;
359 int dist = ((pkt->seq + (1<<16U)) - playout_buf->
last_seq) % (1<<16U);
360 dist = dist < 1<<15U ? dist :
abs(dist - (1<<16U));
365 playout_buf->
dups += 1;
371 int accumulated_loss = 0;
392 char oo_dups_str[1024];
393 oo_dups_str[0] =
'\0';
397 if (playout_buf->
dups > 0) {
398 snprintf(oo_dups_str + strlen(oo_dups_str),
sizeof oo_dups_str - strlen(oo_dups_str),
", %d dups", playout_buf->
dups);
406 if (new_val < 1U<<14U) {
416 playout_buf->
dups = 0;
427 if (playout_buf->
frst == NULL && playout_buf->
last == NULL) {
430 playout_buf->
last = playout_buf->
frst;
450 playout_buf->
last = tmp;
452 bool discard_pkt =
false;
457 debug_msg(
"A very old packet - discarded\n");
461 (
"A packet for a previous frame, but might still be useful\n");
477 (
"Oops... dropped packet with M bit set\n");
490 while (head != NULL) {
508 curr = playout_buf->
frst;
509 while (curr != NULL) {
512 if (curr == playout_buf->
frst) {
515 if (curr == playout_buf->
last) {
518 if (curr->
nxt != NULL) {
521 if (curr->
prv != NULL) {
550 return (
frame->mbit == 1 ||
frame->completed ==
true);
555 if (playout_buf->
frst == NULL)
572 curr = playout_buf->
frst;
573 while (curr != NULL) {
580 int ret = decode_func(curr->
cdata, data, &stats);
588 (
"Unable to decode frame due to missing data (RTP TS=%u)\n",
struct video_frame * frame
static __device__ vec2 abs(const vec2 &v)
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_INFO
normal reporting
#define LOG_LEVEL_VERBOSE
#define debug_msg(...)
#define debug_msg(...) log_msg(LOG_LEVEL_DEBUG, "[pid/%d +%d %s] ", getpid(), LINE,...
void pbuf_destroy(struct pbuf *playout_buf)
int pbuf_decode(struct pbuf *playout_buf, time_ns_t curr_time, decode_frame_t decode_func, void *data)
static void pbuf_validate(struct pbuf *playout_buf)
static struct pbuf_node * create_new_pnode(rtp_packet *pkt, long long playout_delay_us)
void pbuf_set_playout_delay(struct pbuf *playout_buf, double playout_delay)
static void free_cdata(struct coded_data *head)
static int get_consecutive_zeros(unsigned long long int packets) __attribute__((const))
static void add_coded_unit(struct pbuf_node *node, rtp_packet *pkt)
static void compute_longest_gap(int *longest_gap, int *accumulated_loss, unsigned long long int packets)
int pbuf_is_empty(struct pbuf *playout_buf)
void pbuf_insert(struct pbuf *playout_buf, rtp_packet *pkt)
struct pbuf * pbuf_init(volatile int *delay_ms)
void pbuf_remove(struct pbuf *playout_buf, time_ns_t curr_time)
static int frame_complete(struct pbuf_node *frame)
static void pbuf_process_stats(struct pbuf *playout_buf, rtp_packet *pkt)
int decode_frame_t(struct coded_data *cdata, void *decode_data, struct pbuf_stats *stats)
struct __attribute__((packed))
struct coded_data * cdata
long long int expected_pkts_cum
int max_out_of_order_dist
long long int received_pkts_cum
unsigned long long packets[(1<< 16)/sizeof(unsigned long long)/8]
long long int playout_delay_us
static time_ns_t get_time_in_ns()