diff --git a/gstlal-calibration/gst/lal/gstlal_insertgap.c b/gstlal-calibration/gst/lal/gstlal_insertgap.c index 614e9f4bb6e761a67487d7d8ffb12efbbb8d62a7..246e179c1790812591cca48338e7ab650de398cd 100644 --- a/gstlal-calibration/gst/lal/gstlal_insertgap.c +++ b/gstlal-calibration/gst/lal/gstlal_insertgap.c @@ -149,6 +149,28 @@ G_DEFINE_TYPE_WITH_CODE( */ +/* + * set the metadata on an output buffer + */ + + +static void set_metadata(GSTLALInsertGap *element, GstBuffer *buf, guint64 outsamples, gboolean gap, gboolean discont) { + + GST_BUFFER_OFFSET(buf) = element->next_out_offset; + element->next_out_offset += outsamples; + GST_BUFFER_OFFSET_END(buf) = element->next_out_offset; + GST_BUFFER_PTS(buf) = element->t0 + gst_util_uint64_scale_int_round(GST_BUFFER_OFFSET(buf) - element->offset0, GST_SECOND, element->rate); + GST_BUFFER_DURATION(buf) = element->t0 + gst_util_uint64_scale_int_round(GST_BUFFER_OFFSET_END(buf) - element->offset0, GST_SECOND, element->rate) - GST_BUFFER_TIMESTAMP(buf); + GST_BUFFER_FLAG_UNSET(buf, GST_BUFFER_FLAG_GAP); + if(discont) + GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_DISCONT); + if(gap) + GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_GAP); + else + GST_BUFFER_FLAG_UNSET(buf, GST_BUFFER_FLAG_GAP); +} + + #define DEFINE_CHECK_DATA(DTYPE) \ static gboolean check_data_ ## DTYPE(DTYPE *data, double *bad_data_intervals, int array_length, int num_checks, gboolean remove_nan, gboolean remove_inf) { \ int i, j; \ @@ -174,7 +196,7 @@ DEFINE_CHECK_DATA(guint32); #define DEFINE_PROCESS_INBUF(DTYPE,COMPLEX) \ -static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *indata, DTYPE COMPLEX *outdata, GSTLALInsertGap *element, gboolean sinkbuf_gap, gboolean sinkbuf_discont, guint64 sinkbuf_offset, guint64 sinkbuf_offset_end, GstClockTime sinkbuf_dur, GstClockTime sinkbuf_pts, gboolean complex_data) \ +static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *indata, DTYPE COMPLEX *outdata, GSTLALInsertGap *element, gboolean sinkbuf_gap, gboolean sinkbuf_discont, guint64 sinkbuf_offset, guint64 sinkbuf_offset_end, GstClockTime sinkbuf_dur, GstClockTime sinkbuf_pts, gboolean complex_data, gboolean empty_sinkbuf) \ { \ GstFlowReturn result = GST_FLOW_OK; \ guint64 blocks, max_block_length; \ @@ -182,14 +204,17 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind /* * First, deal with discontinuity if necessary */ \ - if(element->fill_discont && (element->last_sinkbuf_offset_end != 0) && (sinkbuf_pts != element->last_sinkbuf_ets)) { \ + if(element->fill_discont && (element->last_sinkbuf_ets != 0) && (sinkbuf_pts != element->last_sinkbuf_ets)) { \ \ + g_print("Filling Discont!\n"); \ guint64 standard_blocks, last_block_length, buffer_num, sample_num, missing_samples = 0; \ DTYPE COMPLEX sample_value; \ \ /* Track discont length and number of zero-length buffers */ \ element->discont_time += (sinkbuf_pts - element->last_sinkbuf_ets); \ - element->empty_bufs += (sinkbuf_dur ? 0 : 1); \ + element->empty_bufs += (empty_sinkbuf ? 1 : 0); \ + /* If there was no zero-length buffer, but the "duration" passed to this function was zero, then the timer sent this buffer. */ \ + element->timeout_bufs += (empty_sinkbuf || sinkbuf_dur ? 0 : 1); \ \ /* Find number of missing samples and max block length in samples */ \ missing_samples = gst_util_uint64_scale_int_round(sinkbuf_pts - element->last_sinkbuf_ets, element->rate, 1000000000); \ @@ -199,8 +224,8 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind g_assert_cmpuint(max_block_length, >, 0); \ \ /* Message for debugging */ \ - if(sinkbuf_dur && sinkbuf_offset != sinkbuf_offset_end) \ - GST_WARNING_OBJECT(element, "filling discontinuity lasting %f seconds (%lu samples) including %lu zero-length buffers and starting at %f seconds (offset %lu)", (((double) element->discont_time) / 1000000000.0), gst_util_uint64_scale_int_round(element->discont_time, element->rate, 1000000000), element->empty_bufs, (double) sinkbuf_pts / 1000000000.0 - (double) element->discont_time / 1000000000.0, sinkbuf_offset); \ + if(sinkbuf_dur && (sinkbuf_offset != sinkbuf_offset_end || element->empty_bufs || element->timeout_bufs)) \ + GST_WARNING_OBJECT(element, "filling discontinuity lasting %f seconds (%lu samples) including %lu zero-length buffers and %lu timeout buffers, starting at %f seconds (offset %lu)", (((double) element->discont_time) / 1000000000.0), gst_util_uint64_scale_int_round(element->discont_time, element->rate, 1000000000), element->empty_bufs, element->timeout_bufs, (double) sinkbuf_pts / 1000000000.0 - (double) element->discont_time / 1000000000.0, sinkbuf_offset); \ \ standard_blocks = missing_samples / max_block_length; \ last_block_length = missing_samples % max_block_length; \ @@ -226,16 +251,8 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind goto done; \ } \ \ - /* set flags, caps, offset, and timestamps. */ \ - GST_BUFFER_OFFSET(discont_buf) = element->last_sinkbuf_offset_end + element->discont_offset + buffer_num * max_block_length; \ - GST_BUFFER_OFFSET_END(discont_buf) = GST_BUFFER_OFFSET(discont_buf) + max_block_length; \ - GST_BUFFER_PTS(discont_buf) = element->last_sinkbuf_ets + gst_util_uint64_scale_round(sinkbuf_pts - element->last_sinkbuf_ets, (guint64) buffer_num * max_block_length, missing_samples); \ - GST_BUFFER_DURATION(discont_buf) = element->last_sinkbuf_ets + gst_util_uint64_scale_round(sinkbuf_pts - element->last_sinkbuf_ets, ((guint64) buffer_num + 1) * max_block_length, missing_samples) - GST_BUFFER_PTS(discont_buf); \ - GST_BUFFER_FLAG_UNSET(discont_buf, GST_BUFFER_FLAG_DISCONT); \ - if(element->insert_gap) \ - GST_BUFFER_FLAG_SET(discont_buf, GST_BUFFER_FLAG_GAP); \ - else \ - GST_BUFFER_FLAG_UNSET(discont_buf, GST_BUFFER_FLAG_GAP); \ + /* set flags, offsets, and timestamps. */ \ + set_metadata(element, discont_buf, max_block_length, element->insert_gap, FALSE); \ \ /* push buffer downstream */ \ GST_DEBUG_OBJECT(element, "pushing sub-buffer %" GST_BUFFER_BOUNDARIES_FORMAT, GST_BUFFER_BOUNDARIES_ARGS(discont_buf)); \ @@ -264,16 +281,8 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind goto done; \ } \ \ - /* set flags, caps, offset, and timestamps. */ \ - GST_BUFFER_OFFSET(last_discont_buf) = element->last_sinkbuf_offset_end + element->discont_offset + missing_samples - last_block_length; \ - GST_BUFFER_OFFSET_END(last_discont_buf) = GST_BUFFER_OFFSET(last_discont_buf) + last_block_length; \ - GST_BUFFER_PTS(last_discont_buf) = element->last_sinkbuf_ets + gst_util_uint64_scale_round(sinkbuf_pts - element->last_sinkbuf_ets, missing_samples - last_block_length, missing_samples); \ - GST_BUFFER_DURATION(last_discont_buf) = sinkbuf_pts - GST_BUFFER_PTS(last_discont_buf); \ - GST_BUFFER_FLAG_UNSET(last_discont_buf, GST_BUFFER_FLAG_DISCONT); \ - if(element->insert_gap) \ - GST_BUFFER_FLAG_SET(last_discont_buf, GST_BUFFER_FLAG_GAP); \ - else \ - GST_BUFFER_FLAG_UNSET(last_discont_buf, GST_BUFFER_FLAG_GAP); \ + /* set flags, offsets, and timestamps. */ \ + set_metadata(element, last_discont_buf, last_block_length, element->insert_gap, FALSE); \ \ /* push buffer downstream */ \ GST_DEBUG_OBJECT(element, "pushing sub-buffer %" GST_BUFFER_BOUNDARIES_FORMAT, GST_BUFFER_BOUNDARIES_ARGS(last_discont_buf)); \ @@ -283,13 +292,13 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind goto done; \ } \ } \ - element->discont_offset += missing_samples; \ } \ if(!sinkbuf_dur) \ goto done; \ \ element->discont_time = 0; \ element->empty_bufs = 0; \ + element->timeout_bufs = 0; \ \ /* * Now, use data on input buffer to make next output buffer(s) @@ -352,25 +361,15 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind result = GST_FLOW_ERROR; \ goto done; \ } \ - \ - /* set flags, caps, offset, and timestamps. */ \ - GST_BUFFER_OFFSET(srcbuf) = sinkbuf_offset + element->discont_offset + offset + 1 - current_srcbuf_length; \ - GST_BUFFER_OFFSET_END(srcbuf) = GST_BUFFER_OFFSET(srcbuf) + current_srcbuf_length; \ - GST_BUFFER_PTS(srcbuf) = sinkbuf_pts + gst_util_uint64_scale_int_round(sinkbuf_dur, offset + 1 - current_srcbuf_length, length); \ - GST_BUFFER_DURATION(srcbuf) = sinkbuf_pts + gst_util_uint64_scale_int_round(sinkbuf_dur, offset + 1, length) - GST_BUFFER_PTS(srcbuf); \ - if(srcbuf_gap) \ - GST_BUFFER_FLAG_SET(srcbuf, GST_BUFFER_FLAG_GAP); \ - else \ - GST_BUFFER_FLAG_UNSET(srcbuf, GST_BUFFER_FLAG_GAP); \ \ /* * only the first subbuffer of a buffer flagged as a * discontinuity is a discontinuity. */ \ - if(sinkbuf_discont && (offset + 1 - current_srcbuf_length == 0) && ((!(element->fill_discont)) || (element->last_sinkbuf_ets == 0))) \ - GST_BUFFER_FLAG_SET(srcbuf, GST_BUFFER_FLAG_DISCONT); \ - else \ - GST_BUFFER_FLAG_UNSET(srcbuf, GST_BUFFER_FLAG_DISCONT); \ + gboolean need_discont = sinkbuf_discont && (offset + 1 - current_srcbuf_length == 0) && ((!(element->fill_discont)) || (element->last_sinkbuf_ets == 0)); \ + /* set flags, offsets, and timestamps. */ \ + set_metadata(element, srcbuf, current_srcbuf_length, srcbuf_gap, need_discont); \ + \ if(srcbuf_gap_next != srcbuf_gap) { \ /* We need to reset our place in the input buffer */ \ offset++; \ @@ -392,7 +391,6 @@ static GstFlowReturn process_inbuf_ ## DTYPE ## COMPLEX(const DTYPE COMPLEX *ind } \ done: \ element->last_sinkbuf_ets = sinkbuf_pts + sinkbuf_dur; \ - element->last_sinkbuf_offset_end = sinkbuf_offset_end ? sinkbuf_offset_end : element->last_sinkbuf_offset_end; \ return result; \ } @@ -421,7 +419,10 @@ static void *input_buffer_timer(void *void_element) { */ /* don't hog a billion CPUs */ - sleep(1); + if(element->block_duration < G_MAXUINT64 / 2) + sleep(element->block_duration / 1000000000.0); + else + sleep(1); /* Get the current real time as a string */ GstDateTime *current_gst_time = gst_date_time_new_now_utc(); @@ -431,28 +432,40 @@ static void *input_buffer_timer(void *void_element) { struct tm tm; strptime(current_utc_time, "%Y-%m-%dT%H:%M:%SZ", &tm); - /* time in nanoseconds */ + /* Time in nanoseconds */ guint64 current_time = (guint64) XLALUTCToGPS(&tm) * 1000000000 + (guint64) gst_date_time_get_microsecond(current_gst_time) * 1000; + /* + * The minimum allowable current buffer timestamp. If the input buffer + * has an earlier timestamp, we will push output buffers without waiting + * any longer for input. + */ + guint64 ets_min = current_time - element->wait_time; + /* It needs to be a multiple of the sample period. */ + ets_min = gst_util_uint64_scale_int_round(gst_util_uint64_scale_int(ets_min, element->rate, 1000000000), 1000000000, element->rate); - if(element->last_sinkbuf_ets + element->wait_time < current_time) { - /* Then we need to push a buffer */ - g_mutex_lock(&element->mutex); + g_mutex_lock(&element->mutex); + if((double) ets_min - (double) element->last_sinkbuf_ets + 1000000000.0 - (double) (rand() % 2000000000) > 1000000000.0 / element->rate) { + g_print("input_buffer_timer going to push a buffer: ets_min=%lu, last_sinkbuf_ets=%lu\n", ets_min, element->last_sinkbuf_ets); + /* + * Then we need to push a buffer. Note the requirement that the + * time is late enough for us to produce at least one full sample. + */ GstFlowReturn result; switch(element->data_type) { case GSTLAL_INSERTGAP_U32: - result = process_inbuf_guint32(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, current_time - element->wait_time, FALSE); + result = process_inbuf_guint32(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, ets_min, FALSE, FALSE); break; case GSTLAL_INSERTGAP_F32: - result = process_inbuf_float(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, current_time - element->wait_time, FALSE); + result = process_inbuf_float(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, ets_min, FALSE, FALSE); break; case GSTLAL_INSERTGAP_F64: - result = process_inbuf_double(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, current_time - element->wait_time, FALSE); + result = process_inbuf_double(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, ets_min, FALSE, FALSE); break; case GSTLAL_INSERTGAP_Z64: - result = process_inbuf_floatcomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, current_time - element->wait_time, TRUE); + result = process_inbuf_floatcomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, ets_min, TRUE, FALSE); break; case GSTLAL_INSERTGAP_Z128: - result = process_inbuf_doublecomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, current_time - element->wait_time, TRUE); + result = process_inbuf_doublecomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, ets_min, TRUE, FALSE); break; default: g_assert_not_reached(); @@ -461,11 +474,14 @@ static void *input_buffer_timer(void *void_element) { if(G_UNLIKELY(result != GST_FLOW_OK)) GST_WARNING_OBJECT(element, "push failed in function input_buffer_timer(): %s", gst_flow_get_name(result)); - g_mutex_unlock(&element->mutex); + g_print("input_buffer_timer pushed a buffer\n"); } + g_mutex_unlock(&element->mutex); - if(element->finished_running) + if(element->finished_running) { + g_print("input_buffer_timer pthread_exit()\n"); pthread_exit(NULL); + } } } @@ -552,6 +568,7 @@ static GstFlowReturn chain(GstPad *pad, GstObject *parent, GstBuffer *sinkbuf) if(GST_BUFFER_PTS_IS_VALID(sinkbuf)) { /* Set the timestamp of the first output sample) */ if(element->t0 == GST_CLOCK_TIME_NONE) { + element->offset0 = element->next_out_offset = GST_BUFFER_OFFSET(sinkbuf) + gst_util_uint64_scale_int_round(element->chop_length, element->rate, GST_SECOND); element->t0 = GST_BUFFER_PTS(sinkbuf) + element->chop_length; if(element->wait_time > 0) { /* @@ -604,19 +621,19 @@ static GstFlowReturn chain(GstPad *pad, GstObject *parent, GstBuffer *sinkbuf) g_mutex_lock(&element->mutex); switch(element->data_type) { case GSTLAL_INSERTGAP_U32: - result = process_inbuf_guint32(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE); + result = process_inbuf_guint32(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE, TRUE); break; case GSTLAL_INSERTGAP_F32: - result = process_inbuf_float(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE); + result = process_inbuf_float(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE, TRUE); break; case GSTLAL_INSERTGAP_F64: - result = process_inbuf_double(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE); + result = process_inbuf_double(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), FALSE, TRUE); break; case GSTLAL_INSERTGAP_Z64: - result = process_inbuf_floatcomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), TRUE); + result = process_inbuf_floatcomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), TRUE, TRUE); break; case GSTLAL_INSERTGAP_Z128: - result = process_inbuf_doublecomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), TRUE); + result = process_inbuf_doublecomplex(NULL, NULL, element, TRUE, TRUE, 0, 0, 0, GST_BUFFER_PTS(sinkbuf), TRUE, TRUE); break; default: g_assert_not_reached(); @@ -633,13 +650,22 @@ static GstFlowReturn chain(GstPad *pad, GstObject *parent, GstBuffer *sinkbuf) /* We'll need these to decide gaps, offsets, and timestamps on the outgoing buffer(s) */ gboolean sinkbuf_gap = GST_BUFFER_FLAG_IS_SET(sinkbuf, GST_BUFFER_FLAG_GAP); - gboolean sinkbuf_discont = GST_BUFFER_FLAG_IS_SET(sinkbuf, GST_BUFFER_FLAG_DISCONT); + gboolean sinkbuf_discont = G_UNLIKELY(GST_BUFFER_IS_DISCONT(sinkbuf) || GST_BUFFER_OFFSET(sinkbuf) != element->next_out_offset || !GST_CLOCK_TIME_IS_VALID(element->t0)); guint64 sinkbuf_offset = GST_BUFFER_OFFSET(sinkbuf); guint64 sinkbuf_offset_end = GST_BUFFER_OFFSET_END(sinkbuf); GstClockTime sinkbuf_dur = GST_BUFFER_DURATION(sinkbuf); GstClockTime sinkbuf_pts = GST_BUFFER_PTS(sinkbuf); + /* If we're not filling discontinuities, reset the timestamp and offset bookkeeping. */ + if(!element->fill_discont && element->t0 != GST_CLOCK_TIME_NONE) { + element->offset0 = element->next_out_offset = GST_BUFFER_OFFSET(sinkbuf); + element->t0 = GST_BUFFER_PTS(sinkbuf); + } + if(sinkbuf_pts >= element->last_sinkbuf_ets) { + g_print("chain pushing buffer\n"); + if(sinkbuf_pts == element->last_sinkbuf_ets) + g_print("chain pushing buffer no discont\n"); GstMapInfo inmap; gst_buffer_map(sinkbuf, &inmap, GST_MAP_READ); @@ -653,19 +679,19 @@ static GstFlowReturn chain(GstPad *pad, GstObject *parent, GstBuffer *sinkbuf) switch(element->data_type) { case GSTLAL_INSERTGAP_U32: - result = process_inbuf_guint32((guint32 *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE); + result = process_inbuf_guint32((guint32 *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE, FALSE); break; case GSTLAL_INSERTGAP_F32: - result = process_inbuf_float((float *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE); + result = process_inbuf_float((float *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE, FALSE); break; case GSTLAL_INSERTGAP_F64: - result = process_inbuf_double((double *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE); + result = process_inbuf_double((double *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, FALSE, FALSE); break; case GSTLAL_INSERTGAP_Z64: - result = process_inbuf_floatcomplex((float complex *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, TRUE); + result = process_inbuf_floatcomplex((float complex *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, TRUE, FALSE); break; case GSTLAL_INSERTGAP_Z128: - result = process_inbuf_doublecomplex((double complex *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, TRUE); + result = process_inbuf_doublecomplex((double complex *) inmap.data, outdata, element, sinkbuf_gap, sinkbuf_discont, sinkbuf_offset, sinkbuf_offset_end, sinkbuf_dur, sinkbuf_pts, TRUE, FALSE); break; default: @@ -675,6 +701,7 @@ static GstFlowReturn chain(GstPad *pad, GstObject *parent, GstBuffer *sinkbuf) g_free(outdata); outdata = NULL; gst_buffer_unmap(sinkbuf, &inmap); + g_print("chain done pushing buffer\n"); } gst_buffer_unref(sinkbuf); @@ -1056,18 +1083,19 @@ static void gstlal_insertgap_init(GSTLALInsertGap *element) element->srcpad = pad; /* internal data */ - g_mutex_init(&element->mutex); element->t0 = GST_CLOCK_TIME_NONE; + element->offset0 = GST_BUFFER_OFFSET_NONE; + element->next_out_offset = GST_BUFFER_OFFSET_NONE; + g_mutex_init(&element->mutex); element->bad_data_intervals = NULL; element->array_length = 0; element->rate = 0; element->channels = 0; element->unit_size = 0; element->last_sinkbuf_ets = 0; - element->last_sinkbuf_offset_end = 0; - element->discont_offset = 0; element->discont_time = 0; element->empty_bufs = 0; + element->timeout_bufs = 0; /* Needed for thread used to time input buffers */ element->finished_running = FALSE; diff --git a/gstlal-calibration/gst/lal/gstlal_insertgap.h b/gstlal-calibration/gst/lal/gstlal_insertgap.h index 1707ea5d069f15d2135d9ad9c998945f539c43c7..3fa09ac34ac304d89bb03f83c1e6c5c08ad59f05 100644 --- a/gstlal-calibration/gst/lal/gstlal_insertgap.h +++ b/gstlal-calibration/gst/lal/gstlal_insertgap.h @@ -75,16 +75,17 @@ struct _GSTLALInsertGap { GSTLAL_INSERTGAP_Z128 } data_type; - guint64 last_sinkbuf_ets; - guint64 last_sinkbuf_offset_end; - guint64 discont_offset; - guint64 discont_time; guint64 empty_bufs; + guint64 timeout_bufs; GMutex mutex; gboolean finished_running; /* timestamp bookkeeping */ GstClockTime t0; + guint64 offset0; + guint64 next_out_offset; + guint64 last_sinkbuf_ets; + guint64 discont_time; /* properties */ gboolean insert_gap; diff --git a/gstlal-calibration/gst/lal/gstlal_typecast.c b/gstlal-calibration/gst/lal/gstlal_typecast.c index 218c68159cfb487aeb3874dac9ddbe6fe1840fd3..b71e1542ca75021c30baa9d27ebc599e825062f9 100644 --- a/gstlal-calibration/gst/lal/gstlal_typecast.c +++ b/gstlal-calibration/gst/lal/gstlal_typecast.c @@ -1105,6 +1105,11 @@ static void gstlal_typecast_class_init(GSTLALTypeCastClass *klass) { static void gstlal_typecast_init(GSTLALTypeCast *element) { + element->t0 = GST_CLOCK_TIME_NONE; + element->offset0 = GST_BUFFER_OFFSET_NONE; + element->next_in_offset = GST_BUFFER_OFFSET_NONE; + element->next_out_offset = GST_BUFFER_OFFSET_NONE; + element->need_discont = TRUE; element->unit_size_in = 0; element->unit_size_out = 0; element->channels = 0;