Example #1
0
static void
gst_jasper_enc_get_property (GObject * object, guint prop_id,
    GValue * value, GParamSpec * pspec)
{
  GstJasperEnc *filter;

  filter = GST_JASPER_ENC (object);

  switch (prop_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
Example #2
0
static GstFlowReturn
gst_jasper_enc_chain (GstPad * pad, GstBuffer * buf)
{
    GstJasperEnc *enc;
    GstFlowReturn ret = GST_FLOW_OK;
    GstBuffer *outbuf = NULL;
    guint8 *data;
    gboolean discont = FALSE;

    enc = GST_JASPER_ENC (gst_pad_get_parent (pad));

    if (enc->fmt < 0)
        goto not_negotiated;

    GST_LOG_OBJECT (enc, "buffer with ts: %" GST_TIME_FORMAT,
                    GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));

    discont = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT);

    /* now really feed the data to encoder */
    data = GST_BUFFER_DATA (buf);
    ret = gst_jasper_enc_get_data (enc, data, &outbuf);

    if (outbuf) {
        gst_buffer_copy_metadata (outbuf, buf, GST_BUFFER_COPY_TIMESTAMPS);
        if (discont)
            GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
    }

    if (ret == GST_FLOW_OK && outbuf)
        ret = gst_pad_push (enc->srcpad, outbuf);

done:
    gst_buffer_unref (buf);
    gst_object_unref (enc);

    return ret;

    /* ERRORS */
not_negotiated:
    {
        GST_ELEMENT_ERROR (enc, CORE, NEGOTIATION, (NULL),
                           ("format wasn't negotiated before chain function"));
        ret = GST_FLOW_NOT_NEGOTIATED;
        goto done;
    }
}
Example #3
0
static GstStateChangeReturn
gst_jasper_enc_change_state (GstElement * element, GstStateChange transition)
{
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
    GstJasperEnc *enc = GST_JASPER_ENC (element);

    switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
        if (jas_init ())
            goto fail_init;
        break;
    case GST_STATE_CHANGE_READY_TO_PAUSED:
        break;
    default:
        break;
    }

    ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
    if (ret == GST_STATE_CHANGE_FAILURE)
        return ret;

    switch (transition) {
    case GST_STATE_CHANGE_PAUSED_TO_READY:
        gst_jasper_enc_reset (enc);
        break;
    case GST_STATE_CHANGE_READY_TO_NULL:
        jas_cleanup ();
        break;
    default:
        break;
    }

    return ret;

    /* ERRORS */
fail_init:
    {
        GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL), (NULL));
        return GST_STATE_CHANGE_FAILURE;
    }
}
Example #4
0
static gboolean
gst_jasper_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
{
    GstJasperEnc *enc;
    GstVideoFormat format;
    gint width, height;
    gint fps_num, fps_den;
    gint par_num, par_den;
    gint i;

    enc = GST_JASPER_ENC (GST_PAD_PARENT (pad));

    /* get info from caps */
    if (!gst_video_format_parse_caps (caps, &format, &width, &height))
        goto refuse_caps;
    /* optional; pass along if present */
    fps_num = fps_den = -1;
    par_num = par_den = -1;
    gst_video_parse_caps_framerate (caps, &fps_num, &fps_den);
    gst_video_parse_caps_pixel_aspect_ratio (caps, &par_num, &par_den);

    if (width == enc->width && height == enc->height && enc->format == format
            && fps_num == enc->fps_num && fps_den == enc->fps_den
            && par_num == enc->par_num && par_den == enc->par_den)
        return TRUE;

    /* store input description */
    enc->format = format;
    enc->width = width;
    enc->height = height;
    enc->fps_num = fps_num;
    enc->fps_den = fps_den;
    enc->par_num = par_num;
    enc->par_den = par_den;

    /* prepare a cached image description  */
    enc->channels = 3 + (gst_video_format_has_alpha (format) ? 1 : 0);
    for (i = 0; i < enc->channels; ++i) {
        enc->cwidth[i] = gst_video_format_get_component_width (format, i, width);
        enc->cheight[i] = gst_video_format_get_component_height (format, i, height);
        enc->offset[i] = gst_video_format_get_component_offset (format, i, width,
                         height);
        enc->stride[i] = gst_video_format_get_row_stride (format, i, width);
        enc->inc[i] = gst_video_format_get_pixel_stride (format, i);
    }

    if (!gst_jasper_enc_set_src_caps (enc))
        goto setcaps_failed;
    if (!gst_jasper_enc_init_encoder (enc))
        goto setup_failed;

    return TRUE;

    /* ERRORS */
setup_failed:
    {
        GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), (NULL));
        return FALSE;
    }
setcaps_failed:
    {
        GST_WARNING_OBJECT (enc, "Setting src caps failed");
        GST_ELEMENT_ERROR (enc, LIBRARY, SETTINGS, (NULL), (NULL));
        return FALSE;
    }
refuse_caps:
    {
        GST_WARNING_OBJECT (enc, "refused caps %" GST_PTR_FORMAT, caps);
        gst_object_unref (enc);
        return FALSE;
    }
}