static 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; }