Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
static inline gboolean pending_range_stop(ProgressBuffer *element)
{
    return (VALID_RANGE(element->range_stop) &&
            element->sink_segment.position < element->range_stop);
}
Esempio n. 4
0
static inline gboolean pending_range_start(ProgressBuffer *element)
{
    return (VALID_RANGE(element->range_start) &&
            element->sink_segment.start > element->range_start);
}