コード例 #1
0
static gboolean
gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
{
  GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
  GstRingBufferSpec *spec;

  spec = &src->ringbuffer->spec;

  spec->buffer_time = src->buffer_time;
  spec->latency_time = src->latency_time;

  if (!gst_ring_buffer_parse_caps (spec, caps))
    goto parse_error;

  /* calculate suggested segsize and segtotal */
  spec->segsize =
      spec->rate * spec->bytes_per_sample * spec->latency_time / GST_MSECOND;
  spec->segtotal = spec->buffer_time / spec->latency_time;

  GST_DEBUG ("release old ringbuffer");

  gst_ring_buffer_release (src->ringbuffer);

  gst_ring_buffer_debug_spec_buff (spec);

  GST_DEBUG ("acquire new ringbuffer");

  if (!gst_ring_buffer_acquire (src->ringbuffer, spec))
    goto acquire_error;

  /* calculate actual latency and buffer times */
  spec->latency_time =
      spec->segsize * GST_MSECOND / (spec->rate * spec->bytes_per_sample);
  spec->buffer_time =
      spec->segtotal * spec->segsize * GST_MSECOND / (spec->rate *
      spec->bytes_per_sample);

  gst_ring_buffer_debug_spec_buff (spec);

  g_object_notify (G_OBJECT (src), "actual-buffer-time");
  g_object_notify (G_OBJECT (src), "actual-latency-time");

  return TRUE;

  /* ERRORS */
parse_error:
  {
    GST_DEBUG ("could not parse caps");
    return FALSE;
  }
acquire_error:
  {
    GST_DEBUG ("could not acquire ringbuffer");
    return FALSE;
  }
}
static gboolean
gst_audio_ringbuffer_setcaps (GstPad * pad, GstCaps * caps)
{
  GstAudioRingbuffer *ringbuffer;
  GstRingBufferSpec *spec;

  ringbuffer = GST_AUDIO_RINGBUFFER (GST_PAD_PARENT (pad));

  if (!ringbuffer->buffer)
    return FALSE;

  spec = &ringbuffer->buffer->spec;

  GST_DEBUG_OBJECT (ringbuffer, "release old ringbuffer");

  /* release old ringbuffer */
  gst_ring_buffer_activate (ringbuffer->buffer, FALSE);
  gst_ring_buffer_release (ringbuffer->buffer);

  GST_DEBUG_OBJECT (ringbuffer, "parse caps");

  spec->buffer_time = ringbuffer->buffer_time;
  spec->latency_time = ringbuffer->segment_time;

  /* parse new caps */
  if (!gst_ring_buffer_parse_caps (spec, caps))
    goto parse_error;

  gst_ring_buffer_debug_spec_buff (spec);

  GST_DEBUG_OBJECT (ringbuffer, "acquire ringbuffer");
  if (!gst_ring_buffer_acquire (ringbuffer->buffer, spec))
    goto acquire_error;

  GST_DEBUG_OBJECT (ringbuffer, "activate ringbuffer");
  gst_ring_buffer_activate (ringbuffer->buffer, TRUE);

  /* calculate actual latency and buffer times. 
   * FIXME: In 0.11, store the latency_time internally in ns */
  spec->latency_time = gst_util_uint64_scale (spec->segsize,
      (GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample);

  spec->buffer_time = spec->segtotal * spec->latency_time;

  gst_ring_buffer_debug_spec_buff (spec);

  return TRUE;

  /* ERRORS */
parse_error:
  {
    GST_DEBUG_OBJECT (ringbuffer, "could not parse caps");
    GST_ELEMENT_ERROR (ringbuffer, STREAM, FORMAT,
        (NULL), ("cannot parse audio format."));
    return FALSE;
  }
acquire_error:
  {
    GST_DEBUG_OBJECT (ringbuffer, "could not acquire ringbuffer");
    return FALSE;
  }
}