rendered paste bodystatic GstFlowReturn
gst_mimenc_chain (GstPad *pad, GstBuffer *in)
{
GstMimEnc *mimenc;
GstBuffer *out_buf, *buf;
guchar *data;
gint buffer_size;
g_return_if_fail (GST_IS_PAD (pad));
g_return_if_fail (buf != NULL);
mimenc = GST_MIMENC (GST_OBJECT_PARENT (pad));
g_return_if_fail (GST_IS_MIMENC (mimenc));
if (!GST_PAD_IS_LINKED (mimenc->srcpad)) {
return;
}
if (mimenc->enc == NULL) {
mimenc->enc = mimic_open ();
if (mimenc->enc == NULL) {
GST_WARNING ("mimic_open error\n");
return GST_FLOW_ERROR;
}
if (!mimic_encoder_init (mimenc->enc, mimenc->res)) {
GST_WARNING ("mimic_encoder_init error\n");
mimic_close (mimenc->enc);
mimenc->enc = NULL;
return GST_FLOW_ERROR;
}
if (!mimic_get_property (mimenc->enc, "buffer_size", &mimenc->buffer_size)) {
GST_WARNING ("mimic_get_property('buffer_size') error\n");
mimic_close (mimenc->enc);
mimenc->enc = NULL;
return GST_FLOW_ERROR;
}
}
buf = in;
data = GST_BUFFER_DATA (buf);
GST_DEBUG ("incoming buf size %d, mimicenc buffer_size %d", GST_BUFFER_SIZE(buf), mimenc->buffer_size);
out_buf = gst_buffer_new_and_alloc (mimenc->buffer_size);
GST_BUFFER_TIMESTAMP(out_buf) = GST_BUFFER_TIMESTAMP(buf);
buffer_size = mimenc->buffer_size;
if (!mimic_encode_frame (mimenc->enc, data, GST_BUFFER_DATA (out_buf),
&buffer_size, ((mimenc->frames % MAX_INTERFRAMES) == 0 ? TRUE : FALSE))) {
GST_WARNING ("mimic_encode_frame error\n");
gst_buffer_unref (out_buf);
gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
++mimenc->frames;
gst_pad_push (mimenc->srcpad, out_buf);
gst_buffer_unref (buf);
return GST_FLOW_OK;
}