summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLori Anderson <lori@rkymtnhi.com>2013-11-26 15:04:34 -0700
committerLori Anderson <lori@rkymtnhi.com>2013-11-26 15:04:34 -0700
commit7b5e0eba2ec61330b66f613b15ff1e648f5866dc (patch)
tree9393b2dd78fd5de6251796b1e3c1df61a00d4011
parenta7a10d24ce963dd9cb20495abcd2e89aad2f59ee (diff)
Added a "standalone" mode where dlnasrc can supply information about URI. This allows webkitwebsrc to remain the src when running in WebKit but reuse logic in dlnasrc for gathering info about dlna content. Also added a property which will indicate if supplied URI is dlna content. Added a "is-encrypted" property which indicates if the dlna content is encrypted. Added methods to retrieve the DTCP/IP host and port for encrypted content. Changed existing properties to a consistent naming scheme, use "-" rather than "_". Removed an used member variable "dtcp_key_storage". Added logic to check if new URI is assigned and not perform unnecessary logic. If dlnasrc is in "standalone" mode, don't setup bin. There are some white space changes which gst-indent insists upon - making lines shorter.
-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;