All pastes #17808 Raw Edit

Untitled

public text v1 · immutable
#17808 ·published 2005-07-15 22:23 UTC
rendered paste body
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;
}