static void guess_audio_profile (GstDiscovererInfo *info, gchar **name, gchar **mime, GList *profiles) { GList *i; GUPnPDLNAProfile *profile; GstEncodingProfile *enc_profile; for (i = profiles; i; i = i->next) { profile = (GUPnPDLNAProfile *)(i->data); enc_profile = gupnp_dlna_profile_get_encoding_profile (profile); gupnp_dlna_debug ("Checking DLNA profile %s", gupnp_dlna_profile_get_name (profile)); if (!check_audio_profile (info, enc_profile)) gupnp_dlna_debug (" Audio did not match"); else if (!check_container (info, enc_profile)) gupnp_dlna_debug (" Container did not match"); else { *name = g_strdup (gupnp_dlna_profile_get_name (profile)); *mime = g_strdup (gupnp_dlna_profile_get_mime (profile)); break; } } }
/** * gupnp_dlna_discoverer_get_profile: * @self: The #GUPnPDLNADiscoverer object * @name: The name of the DLNA profile to be retrieved * * Given @name, this finds the corresponding DLNA profile information (stored * as a #GUPnPDLNAProfile). * * Returns: (transfer full): a #GUPnPDLNAProfile on success, NULL otherwise. **/ GUPnPDLNAProfile * gupnp_dlna_discoverer_get_profile (GUPnPDLNADiscoverer *self, const gchar *name) { GList *i; GUPnPDLNADiscovererClass *klass; GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self); gboolean relaxed = priv->relaxed_mode; gboolean extended = priv->extended_mode; g_return_val_if_fail (self != NULL, NULL); klass = GUPNP_DLNA_DISCOVERER_GET_CLASS (self); for (i = klass->profiles_list [relaxed][extended]; i != NULL; i = i->next) { GUPnPDLNAProfile *profile = (GUPnPDLNAProfile *) i->data; if (g_str_equal (gupnp_dlna_profile_get_name (profile), name)) { g_object_ref (profile); return profile; } } return NULL; }
static void print_profile (GUPnPDLNAProfile *profile, gpointer unused) { GstEncodingProfile *enc_profile; const GList *tmp; gchar *caps_str; enc_profile = gupnp_dlna_profile_get_encoding_profile (profile); tmp = gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (enc_profile)); g_print ("%s %-30s%-35s", gupnp_dlna_profile_get_extended (profile) ? "*" : " ", gupnp_dlna_profile_get_name (profile), gupnp_dlna_profile_get_mime (profile)); if (verbose) { caps_str = gst_caps_to_string (gst_encoding_profile_get_format (enc_profile)); g_print ("\n`- container: %s\n", caps_str); g_free (caps_str); while (tmp) { print_caps (gst_encoding_profile_get_format (GST_ENCODING_PROFILE (tmp->data))); tmp = tmp->next; } } g_print ("\n"); gst_encoding_profile_unref (enc_profile); }
static void guess_video_profile (GstDiscovererInfo *info, gchar **name, gchar **mime, GList *profiles) { GUPnPDLNAProfile *profile = NULL; GstEncodingProfile *enc_profile; GList *i; for (i = profiles; i; i = i->next) { profile = (GUPnPDLNAProfile *)(i->data); enc_profile = gupnp_dlna_profile_get_encoding_profile (profile); gupnp_dlna_debug ("Checking DLNA profile %s", gupnp_dlna_profile_get_name (profile)); if (check_video_profile (info, enc_profile)) { *name = g_strdup (gupnp_dlna_profile_get_name (profile)); *mime = g_strdup (gupnp_dlna_profile_get_mime (profile)); break; } } }
static void guess_image_profile (GstDiscovererStreamInfo *info, gchar **name, gchar **mime, GList *profiles) { GstCaps *caps; GList *i; gboolean found = FALSE; GUPnPDLNAProfile *profile; GstEncodingProfile *enc_profile; const GstDiscovererVideoInfo *video_info = GST_DISCOVERER_VIDEO_INFO (info); if (!info || !gst_discoverer_video_info_is_image (video_info)) return; caps = caps_from_video_stream_info (info); for (i = profiles; !found && i; i = i->next) { profile = (GUPnPDLNAProfile *)(i->data); enc_profile = gupnp_dlna_profile_get_encoding_profile (profile); /* Optimisation TODO: this can be pre-computed */ if (!is_video_profile (enc_profile)) continue; if (match_profile (enc_profile, caps, GST_TYPE_ENCODING_VIDEO_PROFILE)) { /* Found a match */ *name = g_strdup (gupnp_dlna_profile_get_name (profile)); *mime = g_strdup (gupnp_dlna_profile_get_mime (profile)); break; } } gst_caps_unref (caps); }
static void prv_compute_mime_and_dlna_header(const gchar *filename, gchar **mime_type, gchar **dlna_header, GError **error) { gchar *uri; GString *header; GUPnPDLNAProfile *profile; GUPnPDLNAProfileGuesser *guesser; gboolean relaxed_mode = TRUE; gboolean extended_mode = TRUE; const char *profile_name; const char *dlna_mime_type; GUPnPDLNAOperation operation; GUPnPDLNAFlags flags; GUPnPDLNAConversion conversion; gchar *content_type = NULL; *mime_type = NULL; *dlna_header = NULL; *error = NULL; header = g_string_new(""); guesser = gupnp_dlna_profile_guesser_new(relaxed_mode, extended_mode); uri = g_filename_to_uri(filename, NULL, error); if (uri == NULL) { DLEYNA_LOG_WARNING("Unable to convert filename: %s", filename); if (*error) { DLEYNA_LOG_WARNING("Error: %s", (*error)->message); g_error_free(*error); *error = NULL; } goto on_error; } profile = gupnp_dlna_profile_guesser_guess_profile_sync(guesser, uri, 5000, NULL, error); if (profile == NULL) { DLEYNA_LOG_WARNING("Unable to guess profile for URI: %s", uri); if (*error) { DLEYNA_LOG_WARNING("Error: %s", (*error)->message); g_error_free(*error); *error = NULL; } goto on_error; } profile_name = gupnp_dlna_profile_get_name(profile); if (profile_name != NULL) g_string_append_printf(header, "DLNA.ORG_PN=%s;", profile_name); operation = GUPNP_DLNA_OPERATION_RANGE; g_string_append_printf(header, "DLNA.ORG_OP=%.2x;", operation); conversion = GUPNP_DLNA_CONVERSION_NONE; g_string_append_printf(header, "DLNA.ORG_CI=%.2x;", conversion); dlna_mime_type = gupnp_dlna_profile_get_mime(profile); if (dlna_mime_type != NULL) { *mime_type = g_strdup(dlna_mime_type); flags = GUPNP_DLNA_FLAGS_BACKGROUND_TRANSFER_MODE; flags |= GUPNP_DLNA_FLAGS_CONNECTION_STALL; flags |= GUPNP_DLNA_FLAGS_DLNA_V15; if (g_content_type_is_a(dlna_mime_type, "image/*")) { flags |= GUPNP_DLNA_FLAGS_INTERACTIVE_TRANSFER_MODE; } else if (g_content_type_is_a(dlna_mime_type, "audio/*") || g_content_type_is_a(dlna_mime_type, "video/*")) { flags |= GUPNP_DLNA_FLAGS_STREAMING_TRANSFER_MODE; } else { DLEYNA_LOG_WARNING("Unsupported Mime Type: %s", dlna_mime_type); goto on_error; } g_string_append_printf(header, "DLNA.ORG_FLAGS=%.8x", flags); g_string_append_printf(header, "000000000000000000000000"); } else { DLEYNA_LOG_WARNING("Unable to discover mime_type"); } on_error: if (*mime_type == NULL) { content_type = g_content_type_guess(filename, NULL, 0, NULL); if (content_type != NULL) { *mime_type = g_content_type_get_mime_type(content_type); if (*mime_type == NULL) *error = g_error_new(DLEYNA_SERVER_ERROR, DLEYNA_ERROR_BAD_MIME, "Unable to determine MIME Type for %s", filename); g_free(content_type); } else { *error = g_error_new(DLEYNA_SERVER_ERROR, DLEYNA_ERROR_BAD_MIME, "Unable to determine Content Type for %s", filename); } } DLEYNA_LOG_DEBUG("contentFeatures.dlna.org: %s", header->str); g_object_unref(guesser); g_free(uri); if (*mime_type) *dlna_header = g_string_free(header, FALSE); else (void) g_string_free(header, TRUE); return; }