@@ -299,8 +299,6 @@ _redblock_new(GArray* seq, guint16 fec_seq,
299
299
g_array_set_size (block -> fec_seqs , num_redundant_packets );
300
300
block -> fec_states = g_array_new (FALSE, FALSE, sizeof (TWCCPktState ));
301
301
g_array_set_size (block -> fec_states , num_redundant_packets );
302
- g_array_index (block -> fec_states , TWCCPktState , idx_redundant_packets )
303
- = RTP_TWCC_FECBLOCK_PKT_UNKNOWN ;
304
302
for (guint16 i = 0 ; i < num_redundant_packets ; i ++ )
305
303
{
306
304
g_array_index (block -> fec_states , TWCCPktState , i )
@@ -379,6 +377,9 @@ _redblock_reconsider (RTPTWCCManager * twcc, RedBlock * block)
379
377
gsize nrecovered = 0 ;
380
378
gsize lost = 0 ;
381
379
380
+ gchar states_media [48 ];
381
+ gchar states_fec [16 ];
382
+
382
383
/* Special case for RTX: lost RTX introduces extra complexity which
383
384
is easier to handle separately
384
385
*/
@@ -409,45 +410,59 @@ _redblock_reconsider (RTPTWCCManager * twcc, RedBlock * block)
409
410
g_array_index (block -> seqs , guint16 , i ));
410
411
if (!pkt || pkt -> state == RTP_TWCC_FECBLOCK_PKT_UNKNOWN ) {
411
412
unknowns = TRUE;
413
+ if (i < G_N_ELEMENTS (states_media )) states_media [i ] = 'U' ;
412
414
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECEIVED ) {
413
415
nreceived ++ ;
416
+ if (i < G_N_ELEMENTS (states_media )) states_media [i ] = '+' ;
414
417
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECOVERED ) {
415
418
recovered = TRUE;
419
+ if (i < G_N_ELEMENTS (states_media )) states_media [i ] = 'R' ;
416
420
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_LOST ) {
417
421
lost ++ ;
422
+ if (i < G_N_ELEMENTS (states_media )) states_media [i ] = '-' ;
418
423
}
419
424
420
425
if (pkt ) {
421
426
pkt -> update_stats = FALSE;
422
427
}
423
428
}
429
+ states_media [block -> seqs -> len ] = '\0' ;
424
430
425
431
/* Walk through all fec packets */
426
432
for (gsize i = 0 ; i < block -> fec_seqs -> len ; ++ i ) {
427
433
if (g_array_index (block -> fec_states , TWCCPktState , i )
428
434
== RTP_TWCC_FECBLOCK_PKT_UNKNOWN ) {
429
435
unknowns = TRUE;
436
+ if (i < G_N_ELEMENTS (states_fec )) states_fec [i ] = 'U' ;
430
437
continue ;
431
438
}
432
439
SentPacket * pkt = _find_stats_sentpacket (twcc ,
433
440
g_array_index (block -> fec_seqs , guint16 , i ));
434
441
if (!pkt || pkt -> state == RTP_TWCC_FECBLOCK_PKT_UNKNOWN ) {
435
442
unknowns = TRUE;
443
+ if (i < G_N_ELEMENTS (states_fec )) states_fec [i ] = 'U' ;
436
444
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECEIVED ) {
437
445
nreceived ++ ;
446
+ if (i < G_N_ELEMENTS (states_fec )) states_fec [i ] = '+' ;
438
447
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECOVERED ) {
439
448
recovered = TRUE;
449
+ if (i < G_N_ELEMENTS (states_fec )) states_fec [i ] = 'R' ;
440
450
} else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_LOST ) {
441
451
lost ++ ;
452
+ if (i < G_N_ELEMENTS (states_fec )) states_fec [i ] = '-' ;
442
453
}
443
454
444
455
if (pkt ) {
445
456
pkt -> update_stats = FALSE;
446
457
}
447
458
}
459
+ states_fec [block -> fec_seqs -> len ] = '\0' ;
460
+
448
461
449
462
/* We have packet[s] that was not reported about in feedbacks yet */
450
463
if (unknowns ) {
464
+ GST_INFO ("Media: %s; FEC: %s" , states_media , states_fec );
465
+ GST_INFO ("The FEC block has unknown packets" );
451
466
return 0 ;
452
467
}
453
468
@@ -479,6 +494,8 @@ _redblock_reconsider (RTPTWCCManager * twcc, RedBlock * block)
479
494
}
480
495
}
481
496
497
+ GST_INFO ("Media: %s; FEC: %s; recovered: %lu" , states_media , states_fec ,
498
+ nrecovered );
482
499
return nrecovered ;
483
500
}
484
501
@@ -715,7 +732,7 @@ twcc_stats_ctx_calculate_windowed_stats (RTPTWCCManager * twcc, TWCCStatsCtx * c
715
732
last_local_pkt = pkt ;
716
733
}
717
734
718
- if (GST_CLOCK_TIME_IS_VALID ( pkt -> remote_ts ) ) {
735
+ if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECEIVED ) {
719
736
/* don't count the bits for the first packet in the window */
720
737
if (first_remote_pkt == NULL ) {
721
738
first_remote_pkt = pkt ;
@@ -724,13 +741,13 @@ twcc_stats_ctx_calculate_windowed_stats (RTPTWCCManager * twcc, TWCCStatsCtx * c
724
741
}
725
742
last_remote_pkt = pkt ;
726
743
packets_recv ++ ;
727
- } else {
728
- GST_LOG ("Packet #%u is lost, recovered=%u" , pkt -> seqnum ,
729
- pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECOVERED );
744
+ } else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECOVERED ) {
745
+ GST_LOG ("Packet #%u is lost and recovered" );
746
+ packets_lost ++ ;
747
+ packets_recovered ++ ;
748
+ } else if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_LOST ) {
749
+ GST_LOG ("Packet #%u is lost" );
730
750
packets_lost ++ ;
731
- if (pkt -> state == RTP_TWCC_FECBLOCK_PKT_RECOVERED ) {
732
- packets_recovered ++ ;
733
- }
734
751
}
735
752
736
753
if (!prev ) {
@@ -2404,8 +2421,8 @@ rtp_twcc_manager_get_windowed_stats (RTPTWCCManager * twcc,
2404
2421
change them to twcc seqnums. */
2405
2422
2406
2423
GRealArray * protect_seqnums_array_real = (GRealArray * )pkt -> protects_seqnums ;
2407
- GST_WARNING_OBJECT (twcc , "protect_seqnums refcount: %d" ,
2408
- protect_seqnums_array_real -> ref_count );
2424
+ GST_WARNING_OBJECT (twcc , "protect_seqnums protects ssrc: %u, refcount: %d" ,
2425
+ pkt -> protects_ssrc , protect_seqnums_array_real -> ref_count );
2409
2426
2410
2427
if (pkt -> redundant_idx < 0 || pkt -> redundant_num <= 0
2411
2428
|| pkt -> redundant_idx >= pkt -> redundant_num ) {
@@ -2459,6 +2476,10 @@ rtp_twcc_manager_get_windowed_stats (RTPTWCCManager * twcc,
2459
2476
/* Add every data packet into seqnum_2_redblocks */
2460
2477
block = _redblock_new (pkt -> protects_seqnums , pkt -> seqnum ,
2461
2478
pkt -> redundant_idx , pkt -> redundant_num );
2479
+ g_array_index (block -> fec_seqs , guint16 , (gsize )pkt -> redundant_idx )
2480
+ = pkt -> seqnum ;
2481
+ g_array_index (block -> fec_states , TWCCPktState ,
2482
+ (gsize )pkt -> redundant_idx ) = pkt -> state ;
2462
2483
g_hash_table_insert (twcc -> redund_2_redblocks , key , block );
2463
2484
/* Link this seqnum to the block in order to be able to
2464
2485
release the block once this packet leave its lifetime */
@@ -2483,10 +2504,8 @@ rtp_twcc_manager_get_windowed_stats (RTPTWCCManager * twcc,
2483
2504
}
2484
2505
}
2485
2506
const gsize packets_recovered = _redblock_reconsider (twcc , block );
2486
- if (packets_recovered > 0 ) {
2487
- GST_LOG ("Reconsider block because of packet #%u, recovered %lu pckt" ,
2488
- pkt -> seqnum , packets_recovered );
2489
- }
2507
+ GST_LOG ("Reconsider block because of packet #%u, recovered %lu pckt" ,
2508
+ pkt -> seqnum , packets_recovered );
2490
2509
/* RTX of FEC */
2491
2510
} else {
2492
2511
RedBlock * block ;
@@ -2500,10 +2519,8 @@ rtp_twcc_manager_get_windowed_stats (RTPTWCCManager * twcc,
2500
2519
}
2501
2520
}
2502
2521
const gsize packets_recovered = _redblock_reconsider (twcc , block );
2503
- if (packets_recovered > 0 ) {
2504
- GST_LOG ("Reconsider block because of packet #%u, "
2505
- "recovered %lu pckt" , pkt -> seqnum , packets_recovered );
2506
- }
2522
+ GST_LOG ("Reconsider block because of packet #%u, "
2523
+ "recovered %lu pckt" , pkt -> seqnum , packets_recovered );
2507
2524
}
2508
2525
}
2509
2526
} /* for array */
0 commit comments