Exemplo n.º 1
0
GstEncodingProfile *
rb_gst_get_encoding_profile (const char *media_type)
{
	const GList *l;
	GstEncodingTarget *target;
	target = rb_gst_get_default_encoding_target ();

	for (l = gst_encoding_target_get_profiles (target); l != NULL; l = l->next) {
		GstEncodingProfile *profile = l->data;
		if (rb_gst_media_type_matches_profile (profile, media_type)) {
			gst_encoding_profile_ref (profile);
			return profile;
		}
	}

	return NULL;
}
static gboolean
select_profile_for_entry (RBTrackTransferBatch *batch, RhythmDBEntry *entry, GstEncodingProfile **rprofile, gboolean allow_missing)
{
	const char *source_media_type = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_MEDIA_TYPE);
	const GList *p;
	int best = 0;

	for (p = gst_encoding_target_get_profiles (batch->priv->target); p != NULL; p = p->next) {
		GstEncodingProfile *profile = GST_ENCODING_PROFILE (p->data);
		char *profile_media_type;
		const char *preferred_media_type;
		gboolean transcode_lossless;
		gboolean is_preferred;
		gboolean is_lossless;
		gboolean is_source;
		gboolean is_missing;
		int rank;

		profile_media_type = rb_gst_encoding_profile_get_media_type (profile);
		if (batch->priv->settings) {
			preferred_media_type = g_settings_get_string (batch->priv->settings, "media-type");
			if (rb_gst_media_type_is_lossless (preferred_media_type)) {
				transcode_lossless = FALSE;
			} else {
				transcode_lossless = g_settings_get_boolean (batch->priv->settings, "transcode-lossless");
			}

			is_preferred = (rb_gst_media_type_matches_profile (profile, preferred_media_type));
		} else {
			preferred_media_type = NULL;
			transcode_lossless = FALSE;
			is_preferred = FALSE;
		}

		is_missing = (g_list_find (batch->priv->missing_plugin_profiles, profile) != NULL);
		if (g_str_has_prefix (source_media_type, "audio/x-raw") == FALSE) {
			is_source = rb_gst_media_type_matches_profile (profile, source_media_type);
		} else {
			/* always transcode raw audio */
			is_source = FALSE;
		}

		if (profile_media_type != NULL) {
			is_lossless = (rb_gst_media_type_is_lossless (profile_media_type));
		} else {
			is_lossless = (rb_gst_media_type_is_lossless (source_media_type));
		}

		if (is_missing && allow_missing == FALSE && is_source == FALSE) {
			/* this only applies if transcoding would be required */
			rb_debug ("can't use encoding %s due to missing plugins", profile_media_type);
			rank = 0;
		} else if (transcode_lossless && is_lossless) {
			/* this overrides is_source so all lossless files get transcoded */
			rb_debug ("don't want lossless encoding %s", profile_media_type);
			rank = 0;
		} else if (is_source) {
			/* this overrides is_preferred so we don't transcode unneccessarily */
			rb_debug ("can use source encoding %s", profile_media_type);
			rank = 100;
			profile = NULL;
		} else if (is_preferred) {
			/* otherwise, always use the preferred encoding if available */
			rb_debug ("can use preferred encoding %s", profile_media_type);
			rank = 50;
		} else if (is_lossless == FALSE) {
			/* if we can't use the preferred encoding, we prefer lossy encodings over lossless, for space reasons */
			rb_debug ("can use lossy encoding %s", profile_media_type);
			rank = 25;
		} else {
			rb_debug ("can use lossless encoding %s", profile_media_type);
			rank = 10;
		}

		g_free (profile_media_type);
		if (rank > best) {
			*rprofile = profile;
			best = rank;
		}
	}

	return (best > 0);
}
static gboolean
select_profile_for_entry (RBTrackTransferBatch *batch, RhythmDBEntry *entry, GstEncodingProfile **rprofile, gboolean allow_missing)
{
	/* probably want a way to pass in some policy about lossless encoding
	 * here.  possibilities:
	 * - convert everything to lossy
	 * - if transcoding is required, use lossy
	 * - keep lossless encoded files lossless
	 * - if transcoding is required, use lossless
	 * - convert everything to lossless
	 *
	 * of course this only applies to targets that include lossless profiles..
	 */

	const char *media_type = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_MEDIA_TYPE);
	GstEncodingProfile *lossless = NULL;
	gboolean found_lossy = FALSE;
	const GList *p;

	for (p = gst_encoding_target_get_profiles (batch->priv->target); p != NULL; p = p->next) {
		GstEncodingProfile *profile = GST_ENCODING_PROFILE (p->data);
		char *profile_media_type;
		gboolean is_missing;
		gboolean skip;

		if (g_str_has_prefix (media_type, "audio/x-raw") == FALSE &&
		    rb_gst_media_type_matches_profile (profile, media_type)) {
			/* source file is already in a supported encoding, so just copy it */
			*rprofile = NULL;
			return TRUE;
		}

		skip = FALSE;
		is_missing = (g_list_find (batch->priv->missing_plugin_profiles, profile) != NULL);

		profile_media_type = rb_gst_encoding_profile_get_media_type (profile);
		if (profile_media_type == NULL) {
			if (g_str_has_prefix (media_type, "audio/x-raw")) {
				skip = TRUE;
			}
		} else if (rb_gst_media_type_is_lossless (profile_media_type)) {
			skip = TRUE;
			if (allow_missing == FALSE && is_missing) {
				/* ignore entirely */
			} else if (lossless == NULL) {
				/* remember the first lossless profile that works */
				lossless = profile;
			}
		} else {
			found_lossy = TRUE;
			if (allow_missing == FALSE && is_missing) {
				skip = TRUE;
			}
		}

		if (skip == FALSE && *rprofile == NULL) {
			*rprofile = profile;
		}
		g_free (profile_media_type);
	}

	/* if we only found a lossless encoding, use it */
	if (*rprofile == NULL && found_lossy == FALSE && lossless != NULL) {
		*rprofile = lossless;
	}

	return (*rprofile != NULL);
}