static GstFlowReturn
gst_neonhttp_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
{
  GstNeonhttpSrc *src;
  GstBaseSrc *basesrc;
  GstFlowReturn ret;
  gint read;

  src = GST_NEONHTTP_SRC (psrc);
  basesrc = GST_BASE_SRC_CAST (psrc);

  /* The caller should know the number of bytes and not read beyond EOS. */
  if (G_UNLIKELY (src->eos))
    goto eos;

  /* Create the buffer. */
  ret = gst_pad_alloc_buffer (GST_BASE_SRC_PAD (basesrc),
      basesrc->segment.last_stop, basesrc->blocksize,
      src->icy_caps ? src->icy_caps :
      GST_PAD_CAPS (GST_BASE_SRC_PAD (basesrc)), outbuf);

  if (G_UNLIKELY (ret != GST_FLOW_OK))
    goto done;

  read = gst_neonhttp_src_request_dispatch (src, *outbuf);
  if (G_UNLIKELY (read < 0))
    goto read_error;

  GST_LOG_OBJECT (src, "returning %u bytes", GST_BUFFER_SIZE (*outbuf));

done:
  return ret;

  /* ERRORS */
eos:
  {
    GST_DEBUG_OBJECT (src, "EOS reached");
    return GST_FLOW_UNEXPECTED;
  }
read_error:
  {
    GST_ELEMENT_ERROR (src, RESOURCE, READ,
        (NULL), ("Could not read any bytes (%i, %s)", read,
            ne_get_error (src->session)));
    gst_buffer_unref (*outbuf);
    *outbuf = NULL;
    return GST_FLOW_ERROR;
  }
}
static GstFlowReturn
gst_neonhttp_src_fill (GstPushSrc * psrc, GstBuffer * outbuf)
{
    GstNeonhttpSrc *src;
    gint read;

    src = GST_NEONHTTP_SRC (psrc);

    /* The caller should know the number of bytes and not read beyond EOS. */
    if (G_UNLIKELY (src->eos))
        goto eos;

    read = gst_neonhttp_src_request_dispatch (src, outbuf);
    if (G_UNLIKELY (read < 0))
        goto read_error;

    GST_LOG_OBJECT (src, "returning %" G_GSIZE_FORMAT " bytes, "
                    "offset %" G_GUINT64_FORMAT, gst_buffer_get_size (outbuf),
                    GST_BUFFER_OFFSET (outbuf));

    return GST_FLOW_OK;

    /* ERRORS */
eos:
    {
        GST_DEBUG_OBJECT (src, "EOS reached");
        return GST_FLOW_EOS;
    }
read_error:
    {
        GST_ELEMENT_ERROR (src, RESOURCE, READ,
                           (NULL), ("Could not read any bytes (%i, %s)", read,
                                    ne_get_error (src->session)));
        return GST_FLOW_ERROR;
    }
}