/** * gst_encoding_profile_is_equal: * @a: a #GstEncodingProfile * @b: a #GstEncodingProfile * * Checks whether the two #GstEncodingProfile are equal * * Returns: %TRUE if @a and @b are equal, else %FALSE. */ gboolean gst_encoding_profile_is_equal (GstEncodingProfile * a, GstEncodingProfile * b) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (a), FALSE); g_return_val_if_fail (GST_IS_ENCODING_PROFILE (b), FALSE); return (_compare_encoding_profiles (a, b) == 0); }
/** * ges_project_add_encoding_profile: * @project: A #GESProject * @profile: A #GstEncodingProfile to add to the project. If a profile with * the same name already exists, it will be replaced * * Adds @profile to the project. It lets you save in what format * the project has been renders and keep a reference to those formats. * Also, those formats will be saves to the project file when possible. * * Returns: %TRUE if @profile could be added, %FALSE otherwize */ gboolean ges_project_add_encoding_profile (GESProject * project, GstEncodingProfile * profile) { GList *tmp; GESProjectPrivate *priv; g_return_val_if_fail (GES_IS_PROJECT (project), FALSE); g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); priv = project->priv; for (tmp = priv->encoding_profiles; tmp; tmp = tmp->next) { GstEncodingProfile *tmpprofile = GST_ENCODING_PROFILE (tmp->data); if (g_strcmp0 (gst_encoding_profile_get_name (tmpprofile), gst_encoding_profile_get_name (profile)) == 0) { GST_INFO_OBJECT (project, "Already have profile: %s, replacing it", gst_encoding_profile_get_name (profile)); gst_object_unref (tmp->data); tmp->data = gst_object_ref (profile); return TRUE; } } priv->encoding_profiles = g_list_prepend (priv->encoding_profiles, gst_object_ref (profile)); return TRUE; }
/** * gst_encoding_profile_get_allow_dynamic_output: * @profile: a #GstEncodingProfile * * Get whether the format that has been negotiated in at some point can be renegotiated * later during the encoding. */ gboolean gst_encoding_profile_get_allow_dynamic_output (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); return profile->allow_dynamic_output; }
/** * gst_encoding_profile_get_presence: * @profile: a #GstEncodingProfile * * Returns: The number of times the profile is used in its parent * container profile. If 0, it is not a mandatory stream. */ guint gst_encoding_profile_get_presence (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), 0); return profile->presence; }
/** * gst_encoding_profile_set_presence: * @profile: a #GstEncodingProfile * @presence: the number of time the profile can be used * * Set the number of time the profile is used in its parent * container profile. If 0, it is not a mandatory stream */ void gst_encoding_profile_set_presence (GstEncodingProfile * profile, guint presence) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); profile->presence = presence; }
/** * gst_encoding_profile_get_enabled: * @profile: a #GstEncodingProfile * * Returns: Whther @profile is enabled or not */ gboolean gst_encoding_profile_is_enabled (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); return profile->enabled; }
/** * gst_encoding_profile_get_preset_name: * @profile: a #GstEncodingProfile * * Returns: the name of the #GstPreset factory to be used in the profile. */ const gchar * gst_encoding_profile_get_preset_name (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); return profile->preset_name; }
/** * gst_encoding_profile_get_format: * @profile: a #GstEncodingProfile * * Returns: (transfer full): the #GstCaps corresponding to the media format used * in the profile. Unref after usage. */ GstCaps * gst_encoding_profile_get_format (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); return (profile->format ? gst_caps_ref (profile->format) : NULL); }
/** * gst_encoding_profile_get_description: * @profile: a #GstEncodingProfile * * Returns: the description of the profile, can be %NULL. */ const gchar * gst_encoding_profile_get_description (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); return profile->description; }
/** * gst_encoding_profile_set_allow_dynamic_output: * @profile: a #GstEncodingProfile * @allow_dynamic_output: Whether the format that has been negotiated first can be renegotiated * during the encoding * * Sets whether the format that has been negotiated in at some point can be renegotiated * later during the encoding. */ void gst_encoding_profile_set_allow_dynamic_output (GstEncodingProfile * profile, gboolean allow_dynamic_output) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); profile->allow_dynamic_output = allow_dynamic_output; }
/** * gst_encoding_profile_set_enabled: * @profile: a #GstEncodingProfile * @enabled: %FALSE to disable #profile, %TRUE to enable it * * Set whether the profile should be used or not. */ void gst_encoding_profile_set_enabled (GstEncodingProfile * profile, gboolean enabled) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); profile->enabled = enabled; }
/** * gst_encoding_profile_set_name: * @profile: a #GstEncodingProfile * @name: the name to set on the profile * * Set @name as the given name for the @profile. A copy of @name will be made * internally. */ void gst_encoding_profile_set_name (GstEncodingProfile * profile, const gchar * name) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); g_free (profile->name); profile->name = g_strdup (name); }
/** * gst_encoding_profile_get_restriction: * @profile: a #GstEncodingProfile * * Returns: (transfer full): The restriction #GstCaps to apply before the encoder * that will be used in the profile. The fields present in restriction caps are * properties of the raw stream (that is before encoding), such as height and * width for video and depth and sampling rate for audio. Does not apply to * #GstEncodingContainerProfile (since there is no corresponding raw stream). * Can be %NULL. Unref after usage. */ GstCaps * gst_encoding_profile_get_restriction (GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); return (profile->restriction ? gst_caps_ref (profile->restriction) : NULL); }
/** * gst_encoding_profile_set_preset: * @profile: a #GstEncodingProfile * @preset: the element preset to use * * Sets the name of the #GstElement that implements the #GstPreset interface * to use for the profile. * This is the name that has been set when saving the preset. */ void gst_encoding_profile_set_preset (GstEncodingProfile * profile, const gchar * preset) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); g_free (profile->preset); profile->preset = g_strdup (preset); }
/** * gst_encoding_profile_set_format: * @profile: a #GstEncodingProfile * @format: the media format to use in the profile. * * Sets the media format used in the profile. */ void gst_encoding_profile_set_format (GstEncodingProfile * profile, GstCaps * format) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); if (profile->format) gst_caps_unref (profile->format); profile->format = gst_caps_ref (format); }
/** * gst_encoding_profile_set_description: * @profile: a #GstEncodingProfile * @description: the description to set on the profile * * Set @description as the given description for the @profile. A copy of * @description will be made internally. */ void gst_encoding_profile_set_description (GstEncodingProfile * profile, const gchar * description) { g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); g_free (profile->description); profile->description = g_strdup (description); }
/** * gst_encoding_container_profile_contains_profile: * @container: a #GstEncodingContainerProfile * @profile: a #GstEncodingProfile * * Checks if @container contains a #GstEncodingProfile identical to * @profile. * * Returns: %TRUE if @container contains a #GstEncodingProfile identical * to @profile, else %FALSE. */ gboolean gst_encoding_container_profile_contains_profile (GstEncodingContainerProfile * container, GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_CONTAINER_PROFILE (container), FALSE); g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); return (g_list_find_custom (container->encodingprofiles, profile, (GCompareFunc) _compare_encoding_profiles) != NULL); }
/** * gst_encoding_profile_set_restriction: * @profile: a #GstEncodingProfile * @restriction: (transfer full): the restriction to apply * * Set the restriction #GstCaps to apply before the encoder * that will be used in the profile. See gst_encoding_profile_get_restriction() * for more about restrictions. Does not apply to #GstEncodingContainerProfile. */ void gst_encoding_profile_set_restriction (GstEncodingProfile * profile, GstCaps * restriction) { g_return_if_fail (GST_IS_CAPS (restriction)); g_return_if_fail (GST_IS_ENCODING_PROFILE (profile)); if (profile->restriction) gst_caps_unref (profile->restriction); profile->restriction = restriction; g_object_notify_by_pspec (G_OBJECT (profile), _properties[PROP_RESTRICTION_CAPS]); }
static gboolean gst_encoding_profile_has_format (GstEncodingProfile * profile, const gchar * media_type) { GstCaps *caps; gboolean ret; g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); caps = gst_encoding_profile_get_format (profile); ret = gst_structure_has_name (gst_caps_get_structure (caps, 0), media_type); gst_caps_unref (caps); return ret; }
/** * gst_encoding_profile_get_input_caps: * @profile: a #GstEncodingProfile * * Computes the full output caps that this @profile will be able to consume. * * Returns: (transfer full): The full caps the given @profile can consume. Call * gst_caps_unref() when you are done with the caps. */ GstCaps * gst_encoding_profile_get_input_caps (GstEncodingProfile * profile) { GstCaps *out, *tmp; GList *ltmp; GstStructure *st, *outst; GQuark out_name; guint i, len; GstCaps *fcaps; g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) { GstCaps *res = gst_caps_new_empty (); for (ltmp = GST_ENCODING_CONTAINER_PROFILE (profile)->encodingprofiles; ltmp; ltmp = ltmp->next) { GstEncodingProfile *sprof = (GstEncodingProfile *) ltmp->data; res = gst_caps_merge (res, gst_encoding_profile_get_input_caps (sprof)); } return res; } fcaps = profile->format; /* fast-path */ if ((profile->restriction == NULL) || gst_caps_is_any (profile->restriction)) return gst_caps_ref (fcaps); /* Combine the format with the restriction caps */ outst = gst_caps_get_structure (fcaps, 0); out_name = gst_structure_get_name_id (outst); tmp = gst_caps_new_empty (); len = gst_caps_get_size (profile->restriction); for (i = 0; i < len; i++) { st = gst_structure_copy (gst_caps_get_structure (profile->restriction, i)); st->name = out_name; gst_caps_append_structure (tmp, st); } out = gst_caps_intersect (tmp, fcaps); gst_caps_unref (tmp); return out; }
/** * gst_encoding_container_profile_add_profile: * @container: the #GstEncodingContainerProfile to use * @profile: (transfer full): the #GstEncodingProfile to add. * * Add a #GstEncodingProfile to the list of profiles handled by @container. * * No copy of @profile will be made, if you wish to use it elsewhere after this * method you should increment its reference count. * * Returns: %TRUE if the @stream was properly added, else %FALSE. */ gboolean gst_encoding_container_profile_add_profile (GstEncodingContainerProfile * container, GstEncodingProfile * profile) { g_return_val_if_fail (GST_IS_ENCODING_CONTAINER_PROFILE (container), FALSE); g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); if (g_list_find_custom (container->encodingprofiles, profile, (GCompareFunc) _compare_encoding_profiles)) { GST_ERROR ("Encoding profile already contains an identical GstEncodingProfile"); return FALSE; } container->encodingprofiles = g_list_append (container->encodingprofiles, profile); return TRUE; }
gboolean gst_encoding_target_add_profile (GstEncodingTarget * target, GstEncodingProfile * profile) { GList *tmp; g_return_val_if_fail (GST_IS_ENCODING_TARGET (target), FALSE); g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), FALSE); /* Make sure profile isn't already controlled by this target */ for (tmp = target->profiles; tmp; tmp = tmp->next) { GstEncodingProfile *prof = (GstEncodingProfile *) tmp->data; if (!g_strcmp0 (gst_encoding_profile_get_name (profile), gst_encoding_profile_get_name (prof))) { GST_WARNING ("Profile already present in target"); return FALSE; } } target->profiles = g_list_append (target->profiles, profile); return TRUE; }
/** * gst_encoding_profile_get_file_extension: * @profile: a #GstEncodingProfile * * Returns: a suitable file extension for @profile, or NULL. */ const gchar * gst_encoding_profile_get_file_extension (GstEncodingProfile * profile) { GstEncodingContainerProfile *cprofile; const gchar *ext = NULL; gboolean has_video; GstCaps *caps; guint num_children; g_return_val_if_fail (GST_IS_ENCODING_PROFILE (profile), NULL); caps = gst_encoding_profile_get_format (profile); ext = pb_utils_get_file_extension_from_caps (caps); if (!GST_IS_ENCODING_CONTAINER_PROFILE (profile)) goto done; cprofile = GST_ENCODING_CONTAINER_PROFILE (profile); num_children = g_list_length (cprofile->encodingprofiles); /* if it's a tag container profile (e.g. id3mux/apemux), we need * to look at what's inside it */ if (pb_utils_is_tag (caps)) { GST_DEBUG ("tag container profile"); if (num_children == 1) { GstEncodingProfile *child_profile = cprofile->encodingprofiles->data; ext = gst_encoding_profile_get_file_extension (child_profile); } else { GST_WARNING ("expected exactly one child profile with tag profile"); } goto done; } if (num_children == 0) goto done; /* special cases */ has_video = gst_encoding_container_profile_has_video (cprofile); /* Ogg */ if (strcmp (ext, "ogg") == 0) { /* ogg with video => .ogv */ if (has_video) { ext = "ogv"; goto done; } /* ogg with just speex audio => .spx */ if (num_children == 1) { GstEncodingProfile *child_profile = cprofile->encodingprofiles->data; if (GST_IS_ENCODING_AUDIO_PROFILE (child_profile) && gst_encoding_profile_has_format (child_profile, "audio/x-speex")) { ext = "spx"; goto done; } } /* does anyone actually use .oga for ogg audio files? */ goto done; } /* Matroska */ if (has_video && strcmp (ext, "mka") == 0) { ext = "mkv"; goto done; } /* Windows Media / ASF */ if (gst_encoding_profile_has_format (profile, "video/x-ms-asf")) { const GList *l; guint num_wmv = 0, num_wma = 0, num_other = 0; for (l = cprofile->encodingprofiles; l != NULL; l = l->next) { if (gst_encoding_profile_has_format (l->data, "video/x-wmv")) ++num_wmv; else if (gst_encoding_profile_has_format (l->data, "audio/x-wma")) ++num_wma; else ++num_other; } if (num_other > 0) ext = "asf"; else if (num_wmv > 0) ext = "wmv"; else if (num_wma > 0) ext = "wma"; goto done; } done: GST_INFO ("caps %" GST_PTR_FORMAT ", ext: %s", caps, GST_STR_NULL (ext)); gst_caps_unref (caps); return ext; }