avtp: crf: Use double for average period calculation

to also support CRF intervals like every 1,333,333ns 64 events

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1073>
This commit is contained in:
Timo Wischer 2020-11-11 16:50:28 +01:00 committed by GStreamer Marge Bot
parent 6a576938ac
commit 5a25eb61b7
3 changed files with 36 additions and 35 deletions

View file

@ -137,7 +137,8 @@ gst_avtp_crf_base_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
thread_data->past_periods =
g_malloc0 (sizeof (guint64) * MAX_NUM_PERIODS_STORED);
g_malloc0 (sizeof (thread_data->past_periods[0]) *
MAX_NUM_PERIODS_STORED);
thread_data->mr = -1;
thread_data->is_running = TRUE;
thread_data->thread =
@ -408,7 +409,7 @@ calculate_average_period (GstAvtpCrfBase * avtpcrfbase,
GstAvtpCrfThreadData *data = &avtpcrfbase->thread_data;
GstClockTime first_pkt_tstamp, last_pkt_tstamp;
int num_pkt_tstamps, past_periods_iter;
GstClockTime accumulate_period = 0;
gdouble accumulate_period = 0;
num_pkt_tstamps = data->num_pkt_tstamps;
past_periods_iter = data->past_periods_iter;
@ -430,7 +431,7 @@ calculate_average_period (GstAvtpCrfBase * avtpcrfbase,
if (!data->last_received_tstamp ||
((data->last_seqnum + 1) % 255 != seqnum)) {
GstClockTime average_period = data->average_period;
gdouble average_period = data->average_period;
if (!data->last_received_tstamp) {
gdouble base_freq_mult;
@ -451,13 +452,13 @@ calculate_average_period (GstAvtpCrfBase * avtpcrfbase,
}
data->past_periods[past_periods_iter] =
(first_pkt_tstamp - data->last_received_tstamp) /
(gdouble) (first_pkt_tstamp - data->last_received_tstamp) /
data->timestamp_interval;
data->last_received_tstamp = first_pkt_tstamp;
data->last_seqnum = seqnum;
} else {
data->past_periods[past_periods_iter] =
(last_pkt_tstamp - first_pkt_tstamp) /
(gdouble) (last_pkt_tstamp - first_pkt_tstamp) /
(data->timestamp_interval * (num_pkt_tstamps - 1));
}
@ -509,7 +510,8 @@ crf_listener_thread_func (GstAvtpCrfBase * avtpcrfbase)
g_assert (res == 0);
if (media_clk_reset != data->mr) {
memset (data->past_periods, 0, sizeof (gint64) * MAX_NUM_PERIODS_STORED);
memset (data->past_periods, 0,
sizeof (data->past_periods[0]) * MAX_NUM_PERIODS_STORED);
data->periods_stored = 0;
data->average_period = 0;
data->current_ts = 0;

View file

@ -51,13 +51,13 @@ struct _GstAvtpCrfThreadData
guint64 type;
guint64 mr;
GstClockTime *past_periods;
gdouble *past_periods;
int past_periods_iter;
int periods_stored;
/** The time in ns between two events. The type of the event is depending on
* the CRF type: Audio sample, video frame sync, video line sync, ...
*/
GstClockTime average_period;
gdouble average_period;
GstClockTime current_ts;
GstClockTime last_received_tstamp;
guint64 last_seqnum;

View file

@ -481,8 +481,7 @@ GST_START_TEST (test_gst_base_freq_multiplier)
GST_END_TEST;
static void
setup_thread_defaults (GstAvtpCrfBase * avtpcrfbase,
GstClockTime * past_periods)
setup_thread_defaults (GstAvtpCrfBase * avtpcrfbase, gdouble * past_periods)
{
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -501,7 +500,7 @@ GST_START_TEST (test_calculate_average_period_multiple_crf_tstamps)
{
int data_len = 64;
struct avtp_crf_pdu *crf_pdu = generate_crf_pdu (data_len, 1000);
GstClockTime past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
gdouble past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -513,8 +512,8 @@ GST_START_TEST (test_calculate_average_period_multiple_crf_tstamps)
thread_data->periods_stored = 2;
calculate_average_period (avtpcrfbase, crf_pdu);
fail_unless_equals_uint64 (thread_data->average_period, 20777);
fail_unless_equals_uint64 (thread_data->past_periods[2], 20833);
fail_unless_equals_float (thread_data->average_period, 20777.7775);
fail_unless_equals_float (thread_data->past_periods[2], 20833.3325);
fail_unless_equals_uint64 (thread_data->current_ts, 1000);
gst_object_unref (avtpcrfbase);
@ -532,7 +531,7 @@ GST_START_TEST
int data_len = 64;
struct avtp_crf_pdu *crf_pdu =
generate_crf_pdu (data_len, 18446744073709501615ULL);
GstClockTime past_periods[10] =
gdouble past_periods[10] =
{ 21000, 20500, 21220, 21345, 20990, 21996, 20220, 20915, 21324, 23123 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -545,8 +544,8 @@ GST_START_TEST
thread_data->periods_stored = 10;
calculate_average_period (avtpcrfbase, crf_pdu);
fail_unless_equals_uint64 (thread_data->average_period, 21147);
fail_unless_equals_uint64 (thread_data->past_periods[5], 20833);
fail_unless_equals_float (thread_data->average_period, 21147.03325);
fail_unless_equals_float (thread_data->past_periods[5], 20833.3325);
fail_unless_equals_uint64 (thread_data->current_ts, 18446744073709501615ULL);
g_free (crf_pdu);
@ -563,7 +562,7 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp)
{
int data_len = 8;
struct avtp_crf_pdu *crf_pdu = generate_crf_pdu (data_len, 21833);
GstClockTime past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
gdouble past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -579,8 +578,8 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp)
avtp_crf_pdu_set (crf_pdu, AVTP_CRF_FIELD_SEQ_NUM, 10);
calculate_average_period (avtpcrfbase, crf_pdu);
fail_unless_equals_uint64 (thread_data->average_period, 20777);
fail_unless_equals_uint64 (thread_data->past_periods[2], 20833);
fail_unless_equals_float (thread_data->average_period, 20777.6666666);
fail_unless_equals_float (thread_data->past_periods[2], 20833);
fail_unless_equals_uint64 (thread_data->last_seqnum, 10);
fail_unless_equals_uint64 (thread_data->last_received_tstamp, 21833);
fail_unless_equals_uint64 (thread_data->current_ts, 21833);
@ -600,7 +599,7 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_init)
int data_len = 8;
struct avtp_crf_pdu *crf_pdu1 = generate_crf_pdu (data_len, 1000);
struct avtp_crf_pdu *crf_pdu2 = generate_crf_pdu (data_len, 21833);
GstClockTime past_periods[10] = { 0 };
gdouble past_periods[10] = { 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -613,15 +612,15 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_init)
avtp_crf_pdu_set (crf_pdu2, AVTP_CRF_FIELD_SEQ_NUM, 11);
calculate_average_period (avtpcrfbase, crf_pdu1);
fail_unless_equals_uint64 (thread_data->past_periods[0], 0);
fail_unless_equals_float (thread_data->past_periods[0], 0);
fail_unless_equals_uint64 (thread_data->last_seqnum, 10);
fail_unless_equals_uint64 (thread_data->average_period, 20854);
fail_unless_equals_float (thread_data->average_period, 20854);
fail_unless_equals_uint64 (thread_data->current_ts, 1000);
calculate_average_period (avtpcrfbase, crf_pdu2);
fail_unless_equals_uint64 (thread_data->past_periods[0], 20833);
fail_unless_equals_float (thread_data->past_periods[0], 20833);
fail_unless_equals_uint64 (thread_data->last_seqnum, 11);
fail_unless_equals_uint64 (thread_data->average_period, 20833);
fail_unless_equals_float (thread_data->average_period, 20833);
fail_unless_equals_uint64 (thread_data->current_ts, 21833);
g_free (crf_pdu1);
@ -645,7 +644,7 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_interval)
* = 1/48kHz * 160 + 1000
*/
struct avtp_crf_pdu *crf_pdu2 = generate_crf_pdu (data_len, 3334280);
GstClockTime past_periods[10] = { 0 };
gdouble past_periods[10] = { 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -658,15 +657,15 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_interval)
avtp_crf_pdu_set (crf_pdu2, AVTP_CRF_FIELD_SEQ_NUM, 11);
calculate_average_period (avtpcrfbase, crf_pdu1);
fail_unless_equals_uint64 (thread_data->past_periods[0], 0);
fail_unless_equals_float (thread_data->past_periods[0], 0);
fail_unless_equals_uint64 (thread_data->last_seqnum, 10);
fail_unless_equals_uint64 (thread_data->average_period, 20854);
fail_unless_equals_float (thread_data->average_period, 20854);
fail_unless_equals_uint64 (thread_data->current_ts, 1000);
calculate_average_period (avtpcrfbase, crf_pdu2);
fail_unless_equals_uint64 (thread_data->past_periods[0], 20833);
fail_unless_equals_float (thread_data->past_periods[0], 20833);
fail_unless_equals_uint64 (thread_data->last_seqnum, 11);
fail_unless_equals_uint64 (thread_data->average_period, 20833);
fail_unless_equals_float (thread_data->average_period, 20833);
fail_unless_equals_uint64 (thread_data->current_ts, 3334280);
g_free (crf_pdu1);
@ -684,7 +683,7 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_64_bit_overflow)
{
int data_len = 8;
struct avtp_crf_pdu *crf_pdu = generate_crf_pdu (data_len, 20833);
GstClockTime past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
gdouble past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -700,8 +699,8 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_64_bit_overflow)
avtp_crf_pdu_set (crf_pdu, AVTP_CRF_FIELD_SEQ_NUM, 10);
calculate_average_period (avtpcrfbase, crf_pdu);
fail_unless_equals_uint64 (thread_data->average_period, 20778);
fail_unless_equals_uint64 (thread_data->past_periods[2], 20834);
fail_unless_equals_float (thread_data->average_period, 20778);
fail_unless_equals_float (thread_data->past_periods[2], 20834);
fail_unless_equals_uint64 (thread_data->last_seqnum, 10);
fail_unless_equals_uint64 (thread_data->last_received_tstamp, 20833);
fail_unless_equals_uint64 (thread_data->current_ts, 20833);
@ -721,7 +720,7 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_seq_num_skip)
{
int data_len = 8;
struct avtp_crf_pdu *crf_pdu = generate_crf_pdu (data_len, 21833);
GstClockTime past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
gdouble past_periods[10] = { 21000, 20500, 0, 0, 0, 0, 0, 0, 0, 0 };
GstAvtpCrfBase *avtpcrfbase = g_object_new (GST_TYPE_AVTP_CRF_BASE, NULL);
GstAvtpCrfThreadData *thread_data = &avtpcrfbase->thread_data;
@ -737,8 +736,8 @@ GST_START_TEST (test_calculate_average_period_single_crf_tstamp_seq_num_skip)
avtp_crf_pdu_set (crf_pdu, AVTP_CRF_FIELD_SEQ_NUM, 12);
calculate_average_period (avtpcrfbase, crf_pdu);
fail_unless_equals_uint64 (thread_data->average_period, 20750);
fail_unless_equals_uint64 (thread_data->past_periods[2], 0);
fail_unless_equals_float (thread_data->average_period, 20750);
fail_unless_equals_float (thread_data->past_periods[2], 0);
fail_unless_equals_uint64 (thread_data->last_seqnum, 12);
fail_unless_equals_uint64 (thread_data->last_received_tstamp, 21833);
fail_unless_equals_uint64 (thread_data->current_ts, 21833);