static void
gst_gl_view_convert_element_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstGLViewConvertElement *convert = GST_GL_VIEW_CONVERT_ELEMENT (object);

  switch (prop_id) {
    case PROP_INPUT_LAYOUT:
    case PROP_INPUT_FLAGS:
      g_object_set_property (G_OBJECT (convert->viewconvert), pspec->name,
          value);
      gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (convert));
      break;
    case PROP_OUTPUT_LAYOUT:
    case PROP_OUTPUT_FLAGS:
      g_object_set_property (G_OBJECT (convert->viewconvert), pspec->name,
          value);
      gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (convert));
      break;
    case PROP_OUTPUT_DOWNMIX_MODE:
      g_object_set_property (G_OBJECT (convert->viewconvert), pspec->name,
          value);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
static void
gst_caps_setter_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstCapsSetter *filter = GST_CAPS_SETTER (object);

  switch (prop_id) {
    case PROP_CAPS:{
      GstCaps *new_caps;
      const GstCaps *new_caps_val = gst_value_get_caps (value);
      gint i;

      if (new_caps_val == NULL) {
        new_caps = gst_caps_new_any ();
      } else {
        new_caps = gst_caps_copy (new_caps_val);
      }

      for (i = 0; new_caps && (i < gst_caps_get_size (new_caps)); ++i) {
        GstStructure *s;

        s = gst_caps_get_structure (new_caps, i);
        if (!gst_structure_foreach (s, gst_caps_is_fixed_foreach, NULL)) {
          GST_ERROR_OBJECT (filter, "rejected unfixed caps: %" GST_PTR_FORMAT,
              new_caps);
          gst_caps_unref (new_caps);
          new_caps = NULL;
          break;
        }
      }

      if (new_caps) {
        GST_OBJECT_LOCK (filter);
        gst_caps_replace (&filter->caps, new_caps);
        /* drop extra ref */
        gst_caps_unref (new_caps);
        GST_OBJECT_UNLOCK (filter);

        GST_DEBUG_OBJECT (filter, "set new caps %" GST_PTR_FORMAT, new_caps);
      }

      /* try to activate these new caps next time around */
      gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (filter));
      break;
    }
    case PROP_JOIN:
      filter->join = g_value_get_boolean (value);
      break;
    case PROP_REPLACE:
      filter->replace = g_value_get_boolean (value);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
static void
gst_video_scale_set_property (GObject * object, guint prop_id,
                              const GValue * value, GParamSpec * pspec)
{
    GstVideoScale *vscale = GST_VIDEO_SCALE (object);

    switch (prop_id) {
    case PROP_METHOD:
        GST_OBJECT_LOCK (vscale);
        vscale->method = g_value_get_enum (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_ADD_BORDERS:
        GST_OBJECT_LOCK (vscale);
        vscale->add_borders = g_value_get_boolean (value);
        GST_OBJECT_UNLOCK (vscale);
        gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (vscale));
        break;
    case PROP_SHARPNESS:
        GST_OBJECT_LOCK (vscale);
        vscale->sharpness = g_value_get_double (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_SHARPEN:
        GST_OBJECT_LOCK (vscale);
        vscale->sharpen = g_value_get_double (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_DITHER:
        GST_OBJECT_LOCK (vscale);
        vscale->dither = g_value_get_boolean (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_SUBMETHOD:
        GST_OBJECT_LOCK (vscale);
        vscale->submethod = g_value_get_int (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_ENVELOPE:
        GST_OBJECT_LOCK (vscale);
        vscale->envelope = g_value_get_double (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    case PROP_GAMMA_DECODE:
        GST_OBJECT_LOCK (vscale);
        vscale->gamma_decode = g_value_get_boolean (value);
        GST_OBJECT_UNLOCK (vscale);
        break;
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
        break;
    }
}
static void
gst_video_rate_set_property (GObject * object,
    guint prop_id, const GValue * value, GParamSpec * pspec)
{
  GstVideoRate *videorate = GST_VIDEO_RATE (object);
  gboolean latency_changed = FALSE;

  GST_OBJECT_LOCK (videorate);
  switch (prop_id) {
    case PROP_SILENT:
      videorate->silent = g_value_get_boolean (value);
      break;
    case PROP_NEW_PREF:
      videorate->new_pref = g_value_get_double (value);
      break;
    case PROP_SKIP_TO_FIRST:
      videorate->skip_to_first = g_value_get_boolean (value);
      break;
    case PROP_DROP_ONLY:{
      gboolean new_value = g_value_get_boolean (value);

      /* Latency changes if we switch drop-only mode */
      latency_changed = new_value != videorate->drop_only;
      videorate->drop_only = g_value_get_boolean (value);
      goto reconfigure;
    }
    case PROP_AVERAGE_PERIOD:
      videorate->average_period_set = g_value_get_uint64 (value);
      break;
    case PROP_MAX_RATE:
      g_atomic_int_set (&videorate->max_rate, g_value_get_int (value));
      goto reconfigure;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (videorate);
  return;

reconfigure:
  GST_OBJECT_UNLOCK (videorate);
  gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (videorate));

  if (latency_changed) {
    gst_element_post_message (GST_ELEMENT (videorate),
        gst_message_new_latency (GST_OBJECT (videorate)));
  }
}
static void
gst_video_rate_set_property (GObject * object,
    guint prop_id, const GValue * value, GParamSpec * pspec)
{
  GstVideoRate *videorate = GST_VIDEO_RATE (object);

  GST_OBJECT_LOCK (videorate);
  switch (prop_id) {
    case PROP_SILENT:
      videorate->silent = g_value_get_boolean (value);
      GST_OBJECT_UNLOCK (videorate);
      break;
    case PROP_NEW_PREF:
      videorate->new_pref = g_value_get_double (value);
      GST_OBJECT_UNLOCK (videorate);
      break;
    case PROP_SKIP_TO_FIRST:
      videorate->skip_to_first = g_value_get_boolean (value);
      GST_OBJECT_UNLOCK (videorate);
      break;
    case PROP_DROP_ONLY:
      videorate->drop_only = g_value_get_boolean (value);
      goto reconfigure;
      break;
    case PROP_AVERAGE_PERIOD:
      videorate->average_period_set = g_value_get_uint64 (value);
      GST_OBJECT_UNLOCK (videorate);
      break;
    case PROP_MAX_RATE:
      g_atomic_int_set (&videorate->max_rate, g_value_get_int (value));
      goto reconfigure;
      break;
    case PROP_RATE:
      videorate->rate = g_value_get_double (value);
      GST_OBJECT_UNLOCK (videorate);
      gst_videorate_update_duration (videorate);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      GST_OBJECT_UNLOCK (videorate);
      break;
  }
  return;

reconfigure:
  GST_OBJECT_UNLOCK (videorate);
  gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (videorate));
}
static void
gst_video_crop_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstVideoCrop *video_crop;

  video_crop = GST_VIDEO_CROP (object);

  GST_OBJECT_LOCK (video_crop);
  switch (prop_id) {
    case ARG_LEFT:
      gst_video_crop_set_crop (video_crop, g_value_get_int (value),
          &video_crop->prop_left);
      break;
    case ARG_RIGHT:
      gst_video_crop_set_crop (video_crop, g_value_get_int (value),
          &video_crop->prop_right);
      break;
    case ARG_TOP:
      gst_video_crop_set_crop (video_crop, g_value_get_int (value),
          &video_crop->prop_top);
      break;
    case ARG_BOTTOM:
      gst_video_crop_set_crop (video_crop, g_value_get_int (value),
          &video_crop->prop_bottom);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_LOG_OBJECT (video_crop, "l=%d,r=%d,b=%d,t=%d",
      video_crop->crop_left, video_crop->crop_right, video_crop->crop_bottom,
      video_crop->crop_top);

  GST_OBJECT_UNLOCK (video_crop);

  gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (video_crop));
}
Beispiel #7
0
static void
gst_dewarp_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  gdouble v;
  gboolean need_reconfigure;
  int disp_mode;
  GstDewarp *filter = GST_DEWARP (object);

  need_reconfigure = FALSE;

  GST_OBJECT_LOCK (filter);

  switch (prop_id) {
    case PROP_X_CENTER:
      v = g_value_get_double (value);
      if (v != filter->x_center) {
        filter->x_center = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "x center setted to %f", filter->x_center);
      }
      break;
    case PROP_Y_CENTER:
      v = g_value_get_double (value);
      if (v != filter->y_center) {
        filter->y_center = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "y center setted to %f", filter->y_center);
      }
      break;
    case PROP_INNER_RADIUS:
      v = g_value_get_double (value);
      if (v != filter->inner_radius) {
        filter->inner_radius = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "inner radius setted to %f",
            filter->inner_radius);
      }
      break;
    case PROP_OUTER_RADIUS:
      v = g_value_get_double (value);
      if (v != filter->outer_radius) {
        filter->outer_radius = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "outer radius setted to %f",
            filter->outer_radius);
      }
      break;
    case PROP_REMAP_X_CORRECTION:
      v = g_value_get_double (value);
      if (v != filter->remap_correction_x) {
        filter->remap_correction_x = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "x remap correction setted to %f",
            filter->remap_correction_x);
      }
      break;
    case PROP_REMAP_Y_CORRECTION:
      v = g_value_get_double (value);
      if (v != filter->remap_correction_y) {
        filter->remap_correction_y = v;
        filter->need_map_update = TRUE;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "y remap correction setted to %f",
            filter->remap_correction_y);
      }
      break;
    case PROP_INTERPOLATION_MODE:
      filter->interpolation_mode = g_value_get_enum (value);
      GST_LOG_OBJECT (filter, "interpolation mode setted to %" G_GINT32_FORMAT,
          filter->interpolation_mode);
      break;
    case PROP_DISPLAY_MODE:
      disp_mode = g_value_get_enum (value);
      if (disp_mode != filter->display_mode) {
        filter->display_mode = disp_mode;
        need_reconfigure = TRUE;
        GST_LOG_OBJECT (filter, "display mode setted to %" G_GINT32_FORMAT,
            filter->display_mode);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }

  if (filter->need_map_update)
    GST_LOG_OBJECT (filter, "need map update after property change");

  GST_OBJECT_UNLOCK (filter);

  if (need_reconfigure) {
    GST_DEBUG_OBJECT (filter, "Reconfigure src after property change");
    gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (filter));
  } else {
    GST_DEBUG_OBJECT (filter,
        "No property value changed, reconfigure src is not" " needed");
  }
}
static void
gst_gl_alpha_update_properties (GstGLAlpha * glalpha)
{
  GstBaseTransform *base = GST_BASE_TRANSFORM (glalpha);
  gboolean current_passthrough, passthrough;
  gfloat kgl;
  gfloat tmp;
  gfloat target_r, target_g, target_b;
  gfloat target_y, target_u, target_v;
  const float *matrix = cog_rgb_to_ycbcr_matrix_8bit_sdtv;

  GST_OBJECT_LOCK (glalpha);
  switch (glalpha->method) {
    case ALPHA_METHOD_GREEN:
      target_r = 0.0;
      target_g = 1.0;
      target_b = 0.0;
      break;
    case ALPHA_METHOD_BLUE:
      target_r = 0.0;
      target_g = 0.0;
      target_b = 1.0;
      break;
    default:
      target_r = (gfloat) glalpha->target_r / 255.0;
      target_g = (gfloat) glalpha->target_g / 255.0;
      target_b = (gfloat) glalpha->target_b / 255.0;
      break;
  }

  target_y =
      matrix[0] * target_r + matrix[1] * target_g + matrix[2] * target_b +
      matrix[3];
  /* Cb,Cr without offset here because the chroma keying
   * works with them being in range [-128,127]
   */
  target_u = matrix[4] * target_r + matrix[5] * target_g + matrix[6] * target_b;
  target_v =
      matrix[8] * target_r + matrix[9] * target_g + matrix[10] * target_b;

  tmp = target_u * target_u + target_v * target_v;
  kgl = sqrt (tmp);
  glalpha->cb = target_u / kgl * 0.5;
  glalpha->cr = target_v / kgl * 0.5;

  tmp = 15 * tan (M_PI * glalpha->angle / 180);
  tmp = MIN (tmp, 255);
  glalpha->accept_angle_tg = tmp;
  tmp = 15 / tan (M_PI * glalpha->angle / 180);
  tmp = MIN (tmp, 255);
  glalpha->accept_angle_ctg = tmp;
  glalpha->one_over_kc = wrap (2 / kgl - 255, 0, 256);
  tmp = 15 * target_y / kgl;
  tmp = MIN (tmp, 255);
  glalpha->kfgy_scale = tmp;
  glalpha->kg = MIN (kgl, 0.5);

  glalpha->noise_level2 =
      glalpha->noise_level / 256.0 * glalpha->noise_level / 256.0;

  GST_INFO_OBJECT (glalpha, "target yuv: %f, %f, %f, "
      "kgl: %f, cb: %f, cr: %f, accept_angle_tg: %f, accept_angle_ctg: %f, "
      "one_over_kc: %f, kgfy_scale: %f, kg: %f, noise level: %f",
      (float) target_y, (float) target_u, (float) target_v, (float) kgl,
      (float) glalpha->cb, (float) glalpha->cr,
      (float) glalpha->accept_angle_tg, (float) glalpha->accept_angle_ctg,
      (float) glalpha->one_over_kc, (float) glalpha->kfgy_scale,
      (float) glalpha->kg, (float) glalpha->noise_level2);

  passthrough = gst_gl_alpha_is_passthrough (glalpha);
  GST_OBJECT_UNLOCK (glalpha);
  current_passthrough = gst_base_transform_is_passthrough (base);

  gst_base_transform_set_passthrough (base, passthrough);
  if (current_passthrough != passthrough)
    gst_base_transform_reconfigure_src (base);
}