From 2720baee89226eb065ffd1dc1e3705c94a768737 Mon Sep 17 00:00:00 2001 From: Yelin Jeong Date: Thu, 13 Jun 2024 18:53:16 +0900 Subject: [PATCH] [query] Set tensor query caps when state changes from PAUSED to PLAYING This patch makes to set tensor query caps, when state changes from PAUSED to PLAYING. When the tensor_query_server is stopped, edge_handle is released. So we need to set caps again when restarted. If caps are not set, client connection is not possible after restart tensor_query_server. Signed-off-by: Yelin Jeong --- .../tensor_query/tensor_query_serversink.c | 6 ++++ .../tensor_query/tensor_query_serversrc.c | 37 +++++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/gst/nnstreamer/tensor_query/tensor_query_serversink.c b/gst/nnstreamer/tensor_query/tensor_query_serversink.c index d06e57a..6f04b2b 100644 --- a/gst/nnstreamer/tensor_query/tensor_query_serversink.c +++ b/gst/nnstreamer/tensor_query/tensor_query_serversink.c @@ -171,7 +171,9 @@ gst_tensor_query_serversink_change_state (GstElement * element, GstStateChange transition) { GstTensorQueryServerSink *sink = GST_TENSOR_QUERY_SERVERSINK (element); + GstBaseSink *bsink = GST_BASE_SINK (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstCaps *caps; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: @@ -200,6 +202,10 @@ gst_tensor_query_serversink_change_state (GstElement * element, case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gst_tensor_query_server_release_edge_handle (sink->sink_id); break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + caps = gst_pad_peer_query_caps (GST_BASE_SINK_PAD (bsink), NULL); + gst_tensor_query_serversink_set_caps(bsink, caps); + break; default: break; } diff --git a/gst/nnstreamer/tensor_query/tensor_query_serversrc.c b/gst/nnstreamer/tensor_query/tensor_query_serversrc.c index a9766d0..e1b6994 100644 --- a/gst/nnstreamer/tensor_query/tensor_query_serversrc.c +++ b/gst/nnstreamer/tensor_query/tensor_query_serversrc.c @@ -67,6 +67,8 @@ static void gst_tensor_query_serversrc_get_property (GObject * object, static void gst_tensor_query_serversrc_finalize (GObject * object); static GstFlowReturn gst_tensor_query_serversrc_create (GstPushSrc * psrc, GstBuffer ** buf); +static gboolean gst_tensor_query_serversrc_set_caps (GstBaseSrc * bsrc, + GstCaps * caps); /** * @brief initialize the query_serversrc class @@ -274,7 +276,9 @@ gst_tensor_query_serversrc_change_state (GstElement * element, GstStateChange transition) { GstTensorQueryServerSrc *src = GST_TENSOR_QUERY_SERVERSRC (element); + GstBaseSrc *bsrc = GST_BASE_SRC (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstCaps *caps; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: @@ -308,6 +312,10 @@ gst_tensor_query_serversrc_change_state (GstElement * element, case GST_STATE_CHANGE_PAUSED_TO_READY: gst_tensor_query_server_remove_data (src->src_id); break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + caps = gst_pad_peer_query_caps (GST_BASE_SRC_PAD (bsrc), NULL); + gst_tensor_query_serversrc_set_caps (bsrc, caps); + break; default: break; } @@ -491,19 +499,12 @@ gst_tensor_query_serversrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) GstState state = GST_STATE_NULL; if (!src->configured) { - gchar *caps_str, *new_caps_str; - GstCaps *caps = gst_pad_peer_query_caps (GST_BASE_SRC_PAD (bsrc), NULL); if (gst_caps_is_fixed (caps)) { gst_base_src_set_caps (bsrc, caps); } - caps_str = gst_caps_to_string (caps); - - new_caps_str = g_strdup_printf ("@query_server_src_caps@%s", caps_str); - gst_tensor_query_server_set_caps (src->src_id, new_caps_str); - g_free (new_caps_str); - g_free (caps_str); + gst_tensor_query_serversrc_set_caps (bsrc, caps); gst_caps_unref (caps); src->configured = TRUE; @@ -523,3 +524,23 @@ gst_tensor_query_serversrc_create (GstPushSrc * psrc, GstBuffer ** outbuf) return GST_FLOW_OK; } + +/** + * @brief An implementation of the set_caps vmethod in GstBaseSrcClass + */ +static gboolean +gst_tensor_query_serversrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) +{ + GstTensorQueryServerSrc *src = GST_TENSOR_QUERY_SERVERSRC (bsrc); + gchar *caps_str, *new_caps_str; + + caps_str = gst_caps_to_string (caps); + + new_caps_str = g_strdup_printf ("@query_server_src_caps@%s", caps_str); + gst_tensor_query_server_set_caps (src->src_id, new_caps_str); + + g_free (new_caps_str); + g_free (caps_str); + + return TRUE; +} -- 2.7.4