summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrendan Long <self@brendanlong.com>2013-11-26 14:31:06 -0800
committerBrendan Long <self@brendanlong.com>2013-11-26 14:31:06 -0800
commitf9900dfb064b33739f077519b043941457e26f74 (patch)
tree9393b2dd78fd5de6251796b1e3c1df61a00d4011
parenta7a10d24ce963dd9cb20495abcd2e89aad2f59ee (diff)
parent7b5e0eba2ec61330b66f613b15ff1e648f5866dc (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.c137
-rw-r--r--src/gstdlnasrc.h4
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;