static gpointer progress_buffer_range_monitor(ProgressBuffer *element) { g_mutex_lock(&element->lock); check_loop: while (element->srcresult == GST_FLOW_OK && !pending_eos(element) && (pending_range_start(element) || pending_range_stop(element) || !VALID_RANGE(element->range_start) && !VALID_RANGE(element->range_stop))) { g_cond_wait(&element->add_cond, &element->lock); } if (element->srcresult == GST_FLOW_OK && (VALID_RANGE(element->range_start) || VALID_RANGE(element->range_stop))) { element->range_stop = element->range_start = NO_RANGE_REQUEST; g_mutex_unlock(&element->lock); gst_pad_push_event(element->srcpad, gst_event_new_custom(FX_EVENT_RANGE_READY, NULL)); g_mutex_lock(&element->lock); goto check_loop; } else g_mutex_unlock(&element->lock); return NULL; }
static pic_value pic_blob_bytevector_copy(pic_state *pic) { unsigned char *buf; int n, start, end, len; n = pic_get_args(pic, "b|ii", &buf, &len, &start, &end); switch (n) { case 1: start = 0; case 2: end = len; } VALID_RANGE(pic, len, start, end); return pic_blob_value(pic, buf + start, end - start); }
static inline gboolean pending_range_stop(ProgressBuffer *element) { return (VALID_RANGE(element->range_stop) && element->sink_segment.position < element->range_stop); }
static inline gboolean pending_range_start(ProgressBuffer *element) { return (VALID_RANGE(element->range_start) && element->sink_segment.start > element->range_start); }