Exemplo n.º 1
0
/*
 * This function sends a dummy event to force blocked probe to be called
 */
static void
send_dummy_event (GstPad * pad)
{
  GstElement *parent = gst_pad_get_parent_element (pad);

  if (parent == NULL) {
    return;
  }

  if (GST_PAD_IS_SINK (pad)) {
    gst_pad_send_event (pad,
        gst_event_new_custom (GST_EVENT_TYPE_DOWNSTREAM |
            GST_EVENT_TYPE_SERIALIZED,
            gst_structure_new_from_string ("dummy")));
  } else {
    gst_pad_send_event (pad,
        gst_event_new_custom (GST_EVENT_TYPE_UPSTREAM |
            GST_EVENT_TYPE_SERIALIZED,
            gst_structure_new_from_string ("dummy")));
  }

  g_object_unref (parent);
}
static gboolean
change_input_cb (gpointer pipeline)
{
  GstBin *pipe = GST_BIN (pipeline);
  GstPad *sink;
  GstElement *agnosticbin2 = gst_bin_get_by_name (pipe, "agnosticbin_2");

  sink = gst_element_get_static_pad (agnosticbin2, "sink");
  gst_pad_add_probe (sink, GST_PAD_PROBE_TYPE_BLOCK, block_agnostic_sink,
      pipeline, NULL);
  // HACK: Sending a dummy event to ensure the block probe is called
  gst_pad_send_event (sink,
      gst_event_new_custom (GST_EVENT_TYPE_DOWNSTREAM,
          gst_structure_new_from_string ("dummy")));

  g_object_unref (agnosticbin2);
  g_object_unref (sink);
  return FALSE;
}
void
GStreamerFilter::setCommandProperties (string rest_token)
{
  std::vector<std::string>  words;
  std::vector<std::string>::iterator it;
  gchar **elements;
  GRegex *regex;
  gint i;
  GObjectClass *elementClass;

  regex = g_regex_new ("([a-zA-Z0-9\\- ]*=[ ]*[a-zA-Z0-9\\-\\/\",=]+)",
                       G_REGEX_ANCHORED, G_REGEX_MATCH_ANCHORED, NULL);
  elements = g_regex_split (regex, rest_token.c_str(),
                            G_REGEX_MATCH_NOTEMPTY_ATSTART);
  g_regex_unref (regex);
  i = 0;

  while (elements[i] != NULL) {
    if (g_strcmp0 (elements [i], "") == 0) {
      i++;
      continue;
    }

    std::string aux (elements[i]);
    std::string::iterator end_pos = std::remove (aux.begin(), aux.end(), ' ');
    aux.erase (end_pos, aux.end() );
    words.push_back (aux);
    i++;
  }

  g_strfreev (elements);

  elementClass = G_OBJECT_GET_CLASS (this->filter);

  regex = g_regex_new ("^([a-zA-Z0-9\\-]+)",
                       G_REGEX_OPTIMIZE, G_REGEX_MATCH_ANCHORED, NULL);

  for (std::string aux : words) {
    int i;
    GParamSpec *pspec;

    elements = g_regex_split (regex, aux.c_str(), G_REGEX_MATCH_NOTEMPTY_ATSTART);
    i = 0;

    while (elements[i] != NULL) {
      i++;
    }

    if ( i != 3) {
      g_strfreev (elements);
      continue;
    }

    pspec = g_object_class_find_property (elementClass, elements[1]);

    if (pspec == NULL) {
      GST_ERROR ("Property %s not found", elements[1]);
      g_strfreev (elements);
      continue;
    }

    if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_STRING) {
      g_object_set (G_OBJECT (this->filter), elements[1], (elements[2] + 1), NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( (G_PARAM_SPEC_VALUE_TYPE (pspec) ) == G_TYPE_BOOLEAN) {
      if (g_ascii_strcasecmp ( (elements[2] + 1), "true") == 0 ) {
        g_object_set (G_OBJECT (this->filter), elements[1], TRUE, NULL);
      }

      if (g_ascii_strcasecmp ( (elements[2] + 1), "false") == 0 ) {
        g_object_set (G_OBJECT (this->filter), elements[1], FALSE, NULL);
      }

      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_INT) {
      gint aux;
      sscanf (elements[2] + 1, "%d", &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_UINT) {
      guint aux;
      sscanf (elements[2] + 1, "%d", &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_FLOAT) {
      gfloat aux;
      sscanf (elements[2] + 1, "%f", &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_DOUBLE) {
      gdouble aux;
      sscanf (elements[2] + 1, "%lf", &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_INT64) {
      gint64 aux;
      sscanf (elements[2] + 1, "%" G_GINT64_FORMAT, &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_UINT64) {
      guint64 aux;
      sscanf (elements[2] + 1, "%" G_GUINT64_FORMAT, &aux);
      g_object_set (G_OBJECT (this->filter), elements[1], aux, NULL);
      GST_DEBUG ("Setting %s = %s as %s", elements[1], elements[2] + 1,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    } else if ( G_TYPE_IS_ENUM (G_PARAM_SPEC_VALUE_TYPE (pspec) ) ) {
      GEnumValue *value;
      GEnumClass *enumClass;
      gint aux;

      enumClass = G_ENUM_CLASS (g_type_class_ref (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );

      if (enumClass == NULL) {
        g_strfreev (elements);
        continue;
      }

      //try to get the enum value from its integer value.
      sscanf (elements[2] + 1, "%d", &aux);
      value = g_enum_get_value (enumClass, aux);

      if (value != NULL) {
        g_object_set (G_OBJECT (this->filter), elements[1], value->value, NULL);
        GST_DEBUG ("Setting %s = %s as %s, %s", elements[1], elements[2] + 1,
                   g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ), value->value_nick);
      } else {
        //try to get the enum value from its name.
        value = g_enum_get_value_by_nick (enumClass, elements[2] + 1);

        if (value != NULL) {
          g_object_set (G_OBJECT (this->filter), elements[1], value->value, NULL);
          GST_DEBUG ("Setting %s = %s as %s, %s", elements[1], elements[2] + 1,
                     g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ), value->value_nick);
        } else {
          GST_ERROR ("Enum value not found");
        }
      }
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == GST_TYPE_CAPS) {
      GstCaps *caps = gst_caps_from_string ( (elements[2] + 1) );

      g_object_set (G_OBJECT (this->filter), elements[1], caps, NULL);
      GST_DEBUG ("Setting %s = %" GST_PTR_FORMAT " as %s", elements[1], caps,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
      gst_caps_unref (caps);
    } else if ( G_PARAM_SPEC_VALUE_TYPE (pspec) == GST_TYPE_STRUCTURE) {
      GstStructure *st = gst_structure_new_from_string ( (elements[2] + 1) );

      g_object_set (G_OBJECT (this->filter), elements[1], st, NULL);
      GST_DEBUG ("Setting %s = %" GST_PTR_FORMAT " as %s", elements[1], st,
                 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
      gst_structure_free (st);
    } else {
      GST_DEBUG ("Unknown param %s = %s as type %s", elements[1],
                 (elements[2] + 1), g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec) ) );
    }

    g_strfreev (elements);
  }

  g_regex_unref (regex);
  words.clear ();
}