diff options
author | Brendan Long <self@brendanlong.com> | 2013-12-03 13:52:40 -0800 |
---|---|---|
committer | Brendan Long <self@brendanlong.com> | 2013-12-03 13:52:40 -0800 |
commit | dc30a028035524d52e9e6f0c06ea542c03a4061a (patch) | |
tree | 1a7ac5e80fa45021e4d14b85dc4e6ebb892eddb6 | |
parent | 693803bf3db5fb029d55eff290949b2dddb92e74 (diff) | |
parent | 628d356b9c0b45de1ac38ee590336fe56ba0cc93 (diff) |
Merge pull request #125 from cablelabs/dlnasrc-56-duration-props
Continuing work with getting WebKitWebSrc support. Changed "is-standalo...
-rw-r--r-- | src/gstdlnasrc.c | 172 | ||||
-rw-r--r-- | src/gstdlnasrc.h | 3 |
2 files changed, 96 insertions, 79 deletions
diff --git a/src/gstdlnasrc.c b/src/gstdlnasrc.c index 6dd6257..ca3b34b 100644 --- a/src/gstdlnasrc.c +++ b/src/gstdlnasrc.c @@ -45,11 +45,8 @@ enum PROP_URI, PROP_SUPPORTED_RATES, PROP_DTCP_BLOCKSIZE, - PROP_IS_STANDALONE, + PROP_PASSTHRU_MODE, PROP_IS_DLNA, - PROP_IS_ENCRYPTED, - PROP_DTCP_HOST, - PROP_DTCP_PORT, PROP_DURATION_BYTES, PROP_DURATION_TIME, PROP_IS_SEEKABLE @@ -201,6 +198,13 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_STATIC_CAPS ("ANY") ); +static GstStaticPadTemplate gst_dlna_sink_pad_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_SOMETIMES, + GST_STATIC_CAPS ("ANY") + ); + static void gst_dlna_src_finalize (GObject * object); static void gst_dlna_src_set_property (GObject * object, guint prop_id, @@ -398,6 +402,9 @@ gst_dlna_src_class_init (GstDlnaSrcClass * klass) gst_element_class_add_pad_template (gstelement_klass, gst_static_pad_template_get (&gst_dlna_src_pad_template)); + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&gst_dlna_sink_pad_template)); + gobject_klass->set_property = gst_dlna_src_set_property; gobject_klass->get_property = gst_dlna_src_get_property; @@ -416,31 +423,16 @@ gst_dlna_src_class_init (GstDlnaSrcClass * klass) "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_PASSTHRU_MODE, + g_param_spec_boolean ("passthru-mode", "Operating in Passthru Mode", + "DLNA server is not acting as source, it is installed after source", + FALSE, G_PARAM_READWRITE | 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)); - g_object_class_install_property (gobject_klass, PROP_DURATION_TIME, g_param_spec_uint64 ("duration-nanos", "duration of npt content in nanos", "Duration of content in normal play time nanoseconds", 0, @@ -481,7 +473,7 @@ gst_dlna_src_init (GstDlnaSrc * dlna_src) dlna_src->soup_session = NULL; dlna_src->soup_msg = NULL; - dlna_src->is_standalone = FALSE; + dlna_src->passthru_mode = FALSE; dlna_src->is_dlna = FALSE; dlna_src->server_info = NULL; @@ -570,10 +562,13 @@ gst_dlna_src_set_property (GObject * object, guint prop_id, 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); + case PROP_PASSTHRU_MODE: + dlna_src->passthru_mode = g_value_get_boolean (value); + GST_INFO_OBJECT (dlna_src, "Set passthru mode: %d", + dlna_src->passthru_mode); + if (!dlna_src_setup_bin (dlna_src)) { + GST_ERROR_OBJECT (dlna_src, "Problems setting up bin"); + } break; default: @@ -634,22 +629,12 @@ 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); + case PROP_PASSTHRU_MODE: + g_value_set_boolean (value, dlna_src->passthru_mode); break; - case PROP_DTCP_HOST: - if (dlna_src->server_info) - g_value_set_string (value, dlna_src->server_info->dtcp_host); - break; - - case PROP_DTCP_PORT: - if (dlna_src->server_info) - g_value_set_uint (value, dlna_src->server_info->dtcp_port); + case PROP_IS_DLNA: + g_value_set_boolean (value, dlna_src->is_dlna); break; case PROP_DURATION_TIME: @@ -1106,6 +1091,11 @@ dlna_src_handle_event_seek (GstDlnaSrc * dlna_src, GstPad * pad, guint32 new_seqnum; gboolean convert_start = FALSE; + if (dlna_src->passthru_mode) { + GST_INFO_OBJECT (dlna_src, "In passthru mode, not handling event yet"); + return FALSE; + } + if ((dlna_src->uri == NULL) || (dlna_src->server_info == NULL)) { GST_INFO_OBJECT (dlna_src, "No URI and/or HEAD response info, event handled"); @@ -1614,13 +1604,10 @@ dlna_src_uri_init (GstDlnaSrc * dlna_src) 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"); + if (!dlna_src_setup_bin (dlna_src)) { + GST_ERROR_OBJECT (dlna_src, "Problems setting up bin"); + return FALSE; + } dlna_src->is_uri_initialized = TRUE; @@ -1642,25 +1629,32 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) guint64 content_size; GstPad *pad = NULL; - GST_INFO_OBJECT (dlna_src, "called"); - - /* Setup souphttpsrc as source element for this bin */ - dlna_src->http_src = - gst_element_factory_make ("souphttpsrc", ELEMENT_NAME_SOUP_HTTP_SRC); - if (!dlna_src->http_src) { - GST_ERROR_OBJECT (dlna_src, - "The http soup source element could not be created."); - return FALSE; + if (dlna_src->dtcp_decrypter) { + GST_INFO_OBJECT (dlna_src, "returning, bin already setup"); + return TRUE; } - gst_bin_add (GST_BIN (&dlna_src->bin), dlna_src->http_src); + if (!dlna_src->passthru_mode) { + GST_INFO_OBJECT (dlna_src, "Setting up bin with souphttpsrc"); - if (dlna_src->uri) { - GST_INFO_OBJECT (dlna_src, "Setting URI of souphttpsrc"); - g_object_set (G_OBJECT (dlna_src->http_src), "location", dlna_src->uri, - NULL); - } else - GST_INFO_OBJECT (dlna_src, "Not setting URI of souphttpsrc"); + /* Setup souphttpsrc as source element for this bin */ + dlna_src->http_src = + gst_element_factory_make ("souphttpsrc", ELEMENT_NAME_SOUP_HTTP_SRC); + if (!dlna_src->http_src) { + GST_ERROR_OBJECT (dlna_src, + "The http soup source element could not be created."); + return FALSE; + } + + gst_bin_add (GST_BIN (&dlna_src->bin), dlna_src->http_src); + + if (dlna_src->uri) { + GST_INFO_OBJECT (dlna_src, "Setting URI of souphttpsrc"); + g_object_set (G_OBJECT (dlna_src->http_src), "location", dlna_src->uri, + NULL); + } else + GST_INFO_OBJECT (dlna_src, "Not setting URI of souphttpsrc"); + } /* Setup dtcp element regardless */ if (!dlna_src_setup_dtcp (dlna_src)) { @@ -1669,7 +1663,6 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) } /* Create src ghost pad of dlna src so playbin will recognize element as a src */ - GST_DEBUG_OBJECT (dlna_src, "Getting decrypter src pad"); pad = gst_element_get_static_pad (dlna_src->dtcp_decrypter, "src"); if (!pad) { GST_ERROR_OBJECT (dlna_src, @@ -1677,7 +1670,6 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) return FALSE; } - GST_DEBUG_OBJECT (dlna_src, "Got src pad to use for ghostpad of dlnasrc bin"); dlna_src->src_pad = gst_ghost_pad_new ("src", pad); gst_pad_set_active (dlna_src->src_pad, TRUE); @@ -1690,7 +1682,31 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) gst_pad_set_query_function (dlna_src->src_pad, (GstPadQueryFunction) gst_dlna_src_query); - if (dlna_src->byte_total && dlna_src->http_src) { + if (dlna_src->passthru_mode) { + GST_INFO_OBJECT (dlna_src, "Setting up sink pad to support passthru mode"); + + /* Create sink ghost pad of dlna src so it can be used as a passthru */ + pad = gst_element_get_static_pad (dlna_src->dtcp_decrypter, "sink"); + if (!pad) { + GST_ERROR_OBJECT (dlna_src, + "Could not get sink pad to ghost pad for dlnasrc. Exiting."); + return FALSE; + } + + dlna_src->sink_pad = gst_ghost_pad_new ("sink", pad); + gst_pad_set_active (dlna_src->sink_pad, TRUE); + + gst_element_add_pad (GST_ELEMENT (&dlna_src->bin), dlna_src->sink_pad); + gst_object_unref (pad); + + gst_pad_set_event_function (dlna_src->sink_pad, + (GstPadEventFunction) gst_dlna_src_event); + + gst_pad_set_query_function (dlna_src->sink_pad, + (GstPadQueryFunction) gst_dlna_src_query); + } + + if (!dlna_src->passthru_mode && dlna_src->byte_total && dlna_src->http_src) { content_size = dlna_src->byte_total; g_object_set (G_OBJECT (dlna_src->http_src), "content-size", content_size, @@ -1712,8 +1728,6 @@ dlna_src_setup_bin (GstDlnaSrc * dlna_src) static gboolean dlna_src_setup_dtcp (GstDlnaSrc * dlna_src) { - GST_INFO_OBJECT (dlna_src, "Setup for dtcp content"); - if (dlna_src->dtcp_decrypter) { GST_INFO_OBJECT (dlna_src, "Already setup for dtcp content"); return TRUE; @@ -1738,14 +1752,16 @@ dlna_src_setup_dtcp (GstDlnaSrc * dlna_src) gst_bin_add (GST_BIN (&dlna_src->bin), dlna_src->dtcp_decrypter); - if (!gst_element_link_many - (dlna_src->http_src, dlna_src->dtcp_decrypter, NULL)) { - GST_ERROR_OBJECT (dlna_src, "Problems linking elements in src. Exiting."); - return FALSE; + if (!dlna_src->passthru_mode) { + if (!gst_element_link_many + (dlna_src->http_src, dlna_src->dtcp_decrypter, NULL)) { + GST_ERROR_OBJECT (dlna_src, "Problems linking elements in src. Exiting."); + return FALSE; + } + /* Setup the block size for dtcp */ + g_object_set (dlna_src->http_src, "blocksize", dlna_src->dtcp_blocksize, + NULL); } - /* Setup the block size for dtcp */ - g_object_set (dlna_src->http_src, "blocksize", dlna_src->dtcp_blocksize, - NULL); /* Make sure passthru mode is either disabled or enabled depending on content encryption */ g_object_set (dlna_src->dtcp_decrypter, "passthru-mode", @@ -2075,7 +2091,7 @@ dlna_src_update_overall_info (GstDlnaSrc * dlna_src, dlna_src->byte_seek_supported = TRUE; /* Make sure content size has been set for souphttpsrc */ - if (dlna_src->byte_total && dlna_src->http_src) { + if (!dlna_src->passthru_mode && dlna_src->byte_total && dlna_src->http_src) { content_size = dlna_src->byte_total; g_object_set (G_OBJECT (dlna_src->http_src), "content-size", content_size, diff --git a/src/gstdlnasrc.h b/src/gstdlnasrc.h index f436392..a3aa917 100644 --- a/src/gstdlnasrc.h +++ b/src/gstdlnasrc.h @@ -57,6 +57,7 @@ struct _GstDlnaSrc GstElement* dtcp_decrypter; GstPad* src_pad; + GstPad* sink_pad; guint dtcp_blocksize; @@ -65,7 +66,7 @@ struct _GstDlnaSrc SoupSession *soup_session; SoupMessage *soup_msg; - gboolean is_standalone; + gboolean passthru_mode; gboolean is_dlna; GstDlnaSrcHeadResponse* server_info; |