diff options
author | Brendan Long <self@brendanlong.com> | 2013-11-26 14:31:06 -0800 |
---|---|---|
committer | Brendan Long <self@brendanlong.com> | 2013-11-26 14:31:06 -0800 |
commit | f9900dfb064b33739f077519b043941457e26f74 (patch) | |
tree | 9393b2dd78fd5de6251796b1e3c1df61a00d4011 | |
parent | a7a10d24ce963dd9cb20495abcd2e89aad2f59ee (diff) | |
parent | 7b5e0eba2ec61330b66f613b15ff1e648f5866dc (diff) |
Merge pull request #121 from cablelabs/dlnasrc-56-standalone-mode
Added a "standalone" mode where dlnasrc can supply information about URI...
-rw-r--r-- | src/gstdlnasrc.c | 137 | ||||
-rw-r--r-- | src/gstdlnasrc.h | 4 |
2 files changed, 101 insertions, 40 deletions
diff --git a/src/gstdlnasrc.c b/src/gstdlnasrc.c index b360624..5f0e249 100644 --- a/src/gstdlnasrc.c +++ b/src/gstdlnasrc.c @@ -45,6 +45,11 @@ enum PROP_URI, PROP_SUPPORTED_RATES, PROP_DTCP_BLOCKSIZE, + PROP_IS_STANDALONE, + PROP_IS_DLNA, + PROP_IS_ENCRYPTED, + PROP_DTCP_HOST, + PROP_DTCP_PORT }; #define DEFAULT_DTCP_BLOCKSIZE 524288 @@ -398,16 +403,41 @@ gst_dlna_src_class_init (GstDlnaSrcClass * klass) "Sets URI A/V stream", NULL, G_PARAM_READWRITE)); g_object_class_install_property (gobject_klass, PROP_SUPPORTED_RATES, - g_param_spec_boxed ("supported_rates", + g_param_spec_boxed ("supported-rates", "Supported Playspeed rates", "List of supported playspeed rates of DLNA server content", G_TYPE_ARRAY, G_PARAM_READABLE)); g_object_class_install_property (gobject_klass, PROP_DTCP_BLOCKSIZE, - g_param_spec_uint ("dtcp_blocksize", "DTCP Block size", + g_param_spec_uint ("dtcp-blocksize", "DTCP Block size", "Size in bytes to read per buffer when content is dtcp encrypted (-1 = default)", 0, G_MAXUINT, DEFAULT_DTCP_BLOCKSIZE, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_klass, PROP_IS_STANDALONE, + g_param_spec_boolean ("is-standalone", "Operating in Standalone Mode", + "DLNA server is not acting as source, it is only providing information", + FALSE, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_klass, PROP_IS_DLNA, + g_param_spec_boolean ("is-dlna", "DLNA Server Content", + "Content associated with URI is served by DLNA server", + FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_klass, PROP_IS_ENCRYPTED, + g_param_spec_boolean ("is-encrypted", "Content is encrypted", + "Content associated with URI is DTCP/IP encrypted", + FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_klass, PROP_DTCP_HOST, + g_param_spec_string ("dtcpip-host", "dtcpip host address", + "Network address for dtcpip host of encrypted content", + NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_klass, PROP_DTCP_PORT, + g_param_spec_uint ("dtcpip-port", "dtcpip host port number", + "Port number to use for dtcp/ip encrypted content", 0, + G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_dlna_src_finalize); gstelement_klass->change_state = gst_dlna_src_change_state; } @@ -429,11 +459,12 @@ gst_dlna_src_init (GstDlnaSrc * dlna_src) dlna_src->dtcp_blocksize = DEFAULT_DTCP_BLOCKSIZE; dlna_src->src_pad = NULL; - dlna_src->dtcp_key_storage = NULL; dlna_src->uri = NULL; dlna_src->soup_session = NULL; dlna_src->soup_msg = NULL; + dlna_src->is_standalone = FALSE; + dlna_src->is_dlna = FALSE; dlna_src->server_info = NULL; dlna_src->rate = 1.0; @@ -482,7 +513,6 @@ gst_dlna_src_finalize (GObject * object) dlna_src_head_response_free_struct (dlna_src, dlna_src->server_info); - g_free (dlna_src->dtcp_key_storage); g_free (dlna_src->uri); if (dlna_src->soup_msg) g_object_unref (dlna_src->soup_msg); @@ -504,7 +534,7 @@ gst_dlna_src_set_property (GObject * object, guint prop_id, { GstDlnaSrc *dlna_src = GST_DLNA_SRC (object); - GST_INFO_OBJECT (dlna_src, "Setting property: %d", prop_id); + GST_DEBUG_OBJECT (dlna_src, "Setting property: %d", prop_id); switch (prop_id) { @@ -522,6 +552,13 @@ gst_dlna_src_set_property (GObject * object, guint prop_id, GST_INFO_OBJECT (dlna_src, "Set DTCP blocksize: %d", dlna_src->dtcp_blocksize); break; + + case PROP_IS_STANDALONE: + dlna_src->is_standalone = g_value_get_boolean (value); + GST_INFO_OBJECT (dlna_src, "Set is standalone: %d", + dlna_src->is_standalone); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -541,7 +578,6 @@ gst_dlna_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstDlnaSrc *dlna_src = GST_DLNA_SRC (object); - int i = 0; GArray *garray = NULL; gfloat rate = 0; @@ -550,10 +586,9 @@ gst_dlna_src_get_property (GObject * object, guint prop_id, GValue * value, switch (prop_id) { case PROP_URI: - GST_LOG_OBJECT (dlna_src, "Getting property: uri"); if (dlna_src->uri != NULL) { g_value_set_string (value, dlna_src->uri); - GST_LOG_OBJECT (dlna_src, "Get property returning: %s", + GST_LOG_OBJECT (dlna_src, "Get uri returning: %s", g_value_get_string (value)); } break; @@ -582,6 +617,22 @@ gst_dlna_src_get_property (GObject * object, guint prop_id, GValue * value, g_value_set_uint (value, dlna_src->dtcp_blocksize); break; + case PROP_IS_DLNA: + g_value_set_boolean (value, dlna_src->is_dlna); + break; + + case PROP_IS_ENCRYPTED: + g_value_set_boolean (value, dlna_src->is_encrypted); + break; + + case PROP_DTCP_HOST: + g_value_set_string (value, dlna_src->server_info->dtcp_host); + break; + + case PROP_DTCP_PORT: + g_value_set_uint (value, dlna_src->server_info->dtcp_port); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -1498,6 +1549,9 @@ dlna_src_uri_assign (GstDlnaSrc * dlna_src, const gchar * uri, GError ** error) if (uri == NULL) return FALSE; + if (dlna_src->uri && (strcmp (dlna_src->uri, uri) == 0)) + return TRUE; + if (dlna_src->uri) { dlna_src_head_response_free_struct (dlna_src, dlna_src->server_info); g_free (dlna_src->uri); @@ -1528,10 +1582,13 @@ dlna_src_uri_init (GstDlnaSrc * dlna_src) return FALSE; } - if (!dlna_src_setup_bin (dlna_src)) { - GST_ERROR_OBJECT (dlna_src, "Problems setting up dtcp elements"); - return FALSE; - } + if (!dlna_src->is_standalone) { + if (!dlna_src_setup_bin (dlna_src)) { + GST_ERROR_OBJECT (dlna_src, "Problems setting up bin"); + return FALSE; + } + } else + GST_INFO_OBJECT (dlna_src, "Not setting up bin since in standalone mode"); dlna_src->is_uri_initialized = TRUE; @@ -1609,7 +1666,6 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) GST_INFO_OBJECT (dlna_src, "Set HTTP src content size: %" G_GUINT64_FORMAT, content_size); } - return TRUE; } @@ -1641,11 +1697,11 @@ dlna_src_setup_dtcp (GstDlnaSrc * dlna_src) } if (dlna_src->is_encrypted) { - g_object_set (G_OBJECT (dlna_src->dtcp_decrypter), "dtcp1host", - dlna_src->server_info->dtcp_host, NULL); + g_object_set (G_OBJECT (dlna_src->dtcp_decrypter), "dtcp1host", + dlna_src->server_info->dtcp_host, NULL); - g_object_set (G_OBJECT (dlna_src->dtcp_decrypter), "dtcp1port", - dlna_src->server_info->dtcp_port, NULL); + g_object_set (G_OBJECT (dlna_src->dtcp_decrypter), "dtcp1port", + dlna_src->server_info->dtcp_port, NULL); } gst_bin_add (GST_BIN (&dlna_src->bin), dlna_src->dtcp_decrypter); @@ -2407,8 +2463,8 @@ dlna_src_head_response_assign_field_value (GstDlnaSrc * dlna_src, break; case HEADER_INDEX_CONTENT_RANGE: - if (!dlna_src_parse_byte_range (dlna_src, field_value, HEADER_INDEX_BYTES, - &head_response->content_range_start, + if (!dlna_src_parse_byte_range (dlna_src, field_value, + HEADER_INDEX_BYTES, &head_response->content_range_start, &head_response->content_range_end, &head_response->content_range_total)) GST_WARNING_OBJECT (dlna_src, @@ -2443,8 +2499,8 @@ dlna_src_head_response_assign_field_value (GstDlnaSrc * dlna_src, break; case HEADER_INDEX_TIMESEEKRANGE: - if (!dlna_src_head_response_parse_time_seek (dlna_src, head_response, idx, - field_value)) + if (!dlna_src_head_response_parse_time_seek (dlna_src, head_response, + idx, field_value)) GST_WARNING_OBJECT (dlna_src, "Problems with HEAD response field header %s, value: %s", HEAD_RESPONSE_HEADERS[idx], field_value); @@ -2456,11 +2512,16 @@ dlna_src_head_response_assign_field_value (GstDlnaSrc * dlna_src, GST_WARNING_OBJECT (dlna_src, "Problems with HEAD response field header %s, value: %s", HEAD_RESPONSE_HEADERS[idx], field_value); + else { + GST_INFO_OBJECT (dlna_src, + "Content features supplied, considering content DLNA"); + dlna_src->is_dlna = TRUE; + } break; case HEADER_INDEX_DTCP_RANGE: - if (!dlna_src_parse_byte_range (dlna_src, field_value, HEADER_INDEX_BYTES, - &head_response->dtcp_range_start, + if (!dlna_src_parse_byte_range (dlna_src, field_value, + HEADER_INDEX_BYTES, &head_response->dtcp_range_start, &head_response->dtcp_range_end, &head_response->dtcp_range_total)) GST_WARNING_OBJECT (dlna_src, "Problems with HEAD response field header %s, value: %s", @@ -2848,17 +2909,17 @@ dlna_src_head_response_parse_content_features (GstDlnaSrc * dlna_src, } } if (op_str != NULL) { - if (!dlna_src_head_response_parse_operations (dlna_src, head_response, idx, - op_str)) { - GST_WARNING_OBJECT (dlna_src, "Problems parsing operations sub field: %s", - op_str); + if (!dlna_src_head_response_parse_operations (dlna_src, head_response, + idx, op_str)) { + GST_WARNING_OBJECT (dlna_src, + "Problems parsing operations sub field: %s", op_str); } } if (ps_str != NULL) { - if (!dlna_src_head_response_parse_playspeeds (dlna_src, head_response, idx, - ps_str)) { - GST_WARNING_OBJECT (dlna_src, "Problems parsing playspeeds sub field: %s", - ps_str); + if (!dlna_src_head_response_parse_playspeeds (dlna_src, head_response, + idx, ps_str)) { + GST_WARNING_OBJECT (dlna_src, + "Problems parsing playspeeds sub field: %s", ps_str); } } if (flags_str != NULL) { @@ -3023,9 +3084,8 @@ dlna_src_head_response_parse_playspeeds (GstDlnaSrc * dlna_src, "Problems converting playspeed %s into numeric value", *ptr); return FALSE; } else { - head_response->content_features-> - playspeeds[head_response->content_features->playspeeds_cnt] = - rate; + head_response->content_features->playspeeds[head_response-> + content_features->playspeeds_cnt] = rate; } } else { /* Handle conversion of fractional string into float, needed when specifying rate */ @@ -3037,9 +3097,8 @@ dlna_src_head_response_parse_playspeeds (GstDlnaSrc * dlna_src, } else { rate = (gfloat) n / (gfloat) d; - head_response->content_features-> - playspeeds[head_response->content_features->playspeeds_cnt] = - rate; + head_response->content_features->playspeeds[head_response-> + content_features->playspeeds_cnt] = rate; } } head_response->content_features->playspeeds_cnt++; @@ -3675,8 +3734,8 @@ dlna_src_convert_bytes_to_npt_nanos (GstDlnaSrc * dlna_src, guint64 bytes, * @return TRUE if conversion was successful, false otherwise */ static gboolean -dlna_src_convert_npt_nanos_to_bytes (GstDlnaSrc * dlna_src, guint64 npt_nanos, - guint64 * bytes) +dlna_src_convert_npt_nanos_to_bytes (GstDlnaSrc * dlna_src, + guint64 npt_nanos, guint64 * bytes) { /* Issue head to get conversion info */ GstDlnaSrcHeadResponse *head_response = NULL; diff --git a/src/gstdlnasrc.h b/src/gstdlnasrc.h index e414e6f..f436392 100644 --- a/src/gstdlnasrc.h +++ b/src/gstdlnasrc.h @@ -59,13 +59,15 @@ struct _GstDlnaSrc GstPad* src_pad; guint dtcp_blocksize; - gchar* dtcp_key_storage; gchar *uri; SoupSession *soup_session; SoupMessage *soup_msg; + gboolean is_standalone; + gboolean is_dlna; + GstDlnaSrcHeadResponse* server_info; gfloat rate; |