static void
gst_circle_set_property (GObject * object, guint prop_id, const GValue * value,
    GParamSpec * pspec)
{
  GstCircle *circle;
  GstGeometricTransform *gt;
  gdouble v;
  gint h;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
  circle = GST_CIRCLE_CAST (object);

  GST_OBJECT_LOCK (circle);
  switch (prop_id) {
    case PROP_ANGLE:
      v = g_value_get_double (value);
      if (v != circle->angle) {
        circle->angle = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_SPREAD_ANGLE:
      v = g_value_get_double (value);
      if (v != circle->spread_angle) {
        circle->spread_angle = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_HEIGHT:
      h = g_value_get_int (value);
      if (h != circle->height) {
        circle->height = h;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (circle);
}
static void
gst_kaleidoscope_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstKaleidoscope *kaleidoscope;
  GstGeometricTransform *gt;
  gdouble v;
  gint s;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
  kaleidoscope = GST_KALEIDOSCOPE_CAST (object);

  GST_OBJECT_LOCK (gt);
  switch (prop_id) {
    case PROP_ANGLE:
      v = g_value_get_double (value);
      if (v != kaleidoscope->angle) {
        kaleidoscope->angle = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_ANGLE2:
      v = g_value_get_double (value);
      if (v != kaleidoscope->angle2) {
        kaleidoscope->angle2 = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_SIDES:
      s = g_value_get_int (value);
      if (s != kaleidoscope->sides) {
        kaleidoscope->sides = s;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (gt);
}
static void
gst_circle_geometric_transform_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstCircleGeometricTransform *cgt;
  GstGeometricTransform *gt;
  gdouble v;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
  cgt = GST_CIRCLE_GEOMETRIC_TRANSFORM_CAST (object);

  GST_OBJECT_LOCK (cgt);
  switch (prop_id) {
    case PROP_X_CENTER:
      v = g_value_get_double (value);
      if (v != cgt->x_center) {
        cgt->x_center = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_Y_CENTER:
      v = g_value_get_double (value);
      if (v != cgt->y_center) {
        cgt->y_center = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_RADIUS:
      v = g_value_get_double (value);
      if (v != cgt->radius) {
        cgt->radius = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (cgt);
}
Example #4
0
static void
gst_water_ripple_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstWaterRipple *water_ripple;
  GstGeometricTransform *gt;
  gdouble v;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
  water_ripple = GST_WATER_RIPPLE_CAST (object);

  GST_OBJECT_LOCK (gt);
  switch (prop_id) {
    case PROP_AMPLITUDE:
      v = g_value_get_double (value);
      if (v != water_ripple->amplitude) {
        water_ripple->amplitude = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_PHASE:
      v = g_value_get_double (value);
      if (v != water_ripple->phase) {
        water_ripple->phase = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    case PROP_WAVELENGTH:
      v = g_value_get_double (value);
      if (v != water_ripple->wavelength) {
        water_ripple->wavelength = v;
        gst_geometric_transform_set_need_remap (gt);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (gt);
}
static gboolean
gst_geometric_transform_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
    GstCaps * outcaps)
{
  GstGeometricTransform *gt;
  gboolean ret;
  gint old_width;
  gint old_height;
  GstGeometricTransformClass *klass;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (btrans);
  klass = GST_GEOMETRIC_TRANSFORM_GET_CLASS (gt);

  old_width = gt->width;
  old_height = gt->height;

  ret = gst_video_format_parse_caps (incaps, &gt->format, &gt->width,
      &gt->height);
  if (ret) {
    gt->row_stride = gst_video_format_get_row_stride (gt->format, 0, gt->width);
    gt->pixel_stride = gst_video_format_get_pixel_stride (gt->format, 0);

    /* regenerate the map */
    GST_OBJECT_LOCK (gt);
    if (gt->map == NULL || old_width == 0 || old_height == 0
        || gt->width != old_width || gt->height != old_height) {
      if (klass->prepare_func)
        if (!klass->prepare_func (gt)) {
          GST_OBJECT_UNLOCK (gt);
          return FALSE;
        }
      if (gt->precalc_map)
        gst_geometric_transform_generate_map (gt);
    }
    GST_OBJECT_UNLOCK (gt);
  }
  return ret;
}
static gboolean
gst_geometric_transform_set_info (GstVideoFilter * vfilter, GstCaps * incaps,
    GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
{
  GstGeometricTransform *gt;
  gboolean ret = TRUE;
  gint old_width;
  gint old_height;
  GstGeometricTransformClass *klass;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (vfilter);
  klass = GST_GEOMETRIC_TRANSFORM_GET_CLASS (gt);

  old_width = gt->width;
  old_height = gt->height;

  gt->width = in_info->width;
  gt->height = in_info->height;
  gt->row_stride = in_info->stride[0];
  gt->pixel_stride = GST_VIDEO_INFO_COMP_PSTRIDE (in_info, 0);

  /* regenerate the map */
  GST_OBJECT_LOCK (gt);
  if (gt->map == NULL || old_width == 0 || old_height == 0
      || gt->width != old_width || gt->height != old_height) {
    if (klass->prepare_func)
      if (!klass->prepare_func (gt)) {
        GST_OBJECT_UNLOCK (gt);
        return FALSE;
      }
    if (gt->precalc_map)
      gst_geometric_transform_generate_map (gt);
  }
  GST_OBJECT_UNLOCK (gt);
  return ret;
}
static GstFlowReturn
gst_geometric_transform_transform_frame (GstVideoFilter * vfilter,
    GstVideoFrame * in_frame, GstVideoFrame * out_frame)
{
  GstGeometricTransform *gt;
  GstGeometricTransformClass *klass;
  gint x, y;
  GstFlowReturn ret = GST_FLOW_OK;
  gdouble *ptr;
  guint8 *in_data;
  guint8 *out_data;

  gt = GST_GEOMETRIC_TRANSFORM_CAST (vfilter);
  klass = GST_GEOMETRIC_TRANSFORM_GET_CLASS (gt);

  in_data = GST_VIDEO_FRAME_PLANE_DATA (in_frame, 0);
  out_data = GST_VIDEO_FRAME_PLANE_DATA (out_frame, 0);

  if (GST_VIDEO_FRAME_FORMAT (out_frame) == GST_VIDEO_FORMAT_AYUV) {
    /* in AYUV black is not just all zeros:
     * 0x10 is black for Y,
     * 0x80 is black for Cr and Cb */
    for (int i = 0; i < out_frame->map[0].size; i += 4)
      GST_WRITE_UINT32_BE (out_data + i, 0xff108080);
  } else {
    memset (out_data, 0, out_frame->map[0].size);
  }

  GST_OBJECT_LOCK (gt);
  if (gt->precalc_map) {
    if (gt->needs_remap) {
      if (klass->prepare_func)
        if (!klass->prepare_func (gt)) {
          ret = FALSE;
          goto end;
        }
      gst_geometric_transform_generate_map (gt);
    }
    g_return_val_if_fail (gt->map, GST_FLOW_ERROR);
    ptr = gt->map;
    for (y = 0; y < gt->height; y++) {
      for (x = 0; x < gt->width; x++) {
        /* do the mapping */
        gst_geometric_transform_do_map (gt, in_data, out_data, x, y, ptr[0],
            ptr[1]);
        ptr += 2;
      }
    }
  } else {
    for (y = 0; y < gt->height; y++) {
      for (x = 0; x < gt->width; x++) {
        gdouble in_x, in_y;

        if (klass->map_func (gt, x, y, &in_x, &in_y)) {
          gst_geometric_transform_do_map (gt, in_data, out_data, x, y, in_x,
              in_y);
        } else {
          GST_WARNING_OBJECT (gt, "Failed to do mapping for %d %d", x, y);
          ret = GST_FLOW_ERROR;
          goto end;
        }
      }
    }
  }
end:
  GST_OBJECT_UNLOCK (gt);
  return ret;
}