avtp: Use nicely abstracted process function in base depayloader class

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9412>
This commit is contained in:
Olivier Crête 2025-03-06 16:14:04 -05:00 committed by GStreamer Marge Bot
parent 0398e376b0
commit 134ff5b45f
5 changed files with 59 additions and 29 deletions

View File

@ -59,8 +59,8 @@ G_DEFINE_TYPE (GstAvtpAafDepay, gst_avtp_aaf_depay,
GST_ELEMENT_REGISTER_DEFINE (avtpaafdepay, "avtpaafdepay", GST_RANK_NONE, GST_ELEMENT_REGISTER_DEFINE (avtpaafdepay, "avtpaafdepay", GST_RANK_NONE,
GST_TYPE_AVTP_AAF_DEPAY); GST_TYPE_AVTP_AAF_DEPAY);
static GstFlowReturn gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent, static GstFlowReturn gst_avtp_aaf_depay_process (GstAvtpBaseDepayload *
GstBuffer * buffer); basedepay, GstBuffer * buffer);
static void static void
gst_avtp_aaf_depay_class_init (GstAvtpAafDepayClass * klass) gst_avtp_aaf_depay_class_init (GstAvtpAafDepayClass * klass)
@ -77,7 +77,7 @@ gst_avtp_aaf_depay_class_init (GstAvtpAafDepayClass * klass)
"Extracts raw audio from AAF AVTPDUs", "Extracts raw audio from AAF AVTPDUs",
"Andre Guedes <andre.guedes@intel.com>"); "Andre Guedes <andre.guedes@intel.com>");
avtpbasedepayload_class->chain = GST_DEBUG_FUNCPTR (gst_avtp_aaf_depay_chain); avtpbasedepayload_class->process = gst_avtp_aaf_depay_process;
GST_DEBUG_CATEGORY_INIT (avtpaafdepay_debug, "avtpaafdepay", 0, GST_DEBUG_CATEGORY_INIT (avtpaafdepay_debug, "avtpaafdepay", 0,
"AAF AVTP Depayloader"); "AAF AVTP Depayloader");
@ -207,7 +207,8 @@ gst_avtp_aaf_depay_are_audio_features_valid (GstAvtpAafDepay * avtpaafdepay,
} }
static GstFlowReturn static GstFlowReturn
gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) gst_avtp_aaf_depay_process (GstAvtpBaseDepayload * avtpbasedepayload,
GstBuffer * buffer)
{ {
int res; int res;
GstMapInfo info; GstMapInfo info;
@ -217,7 +218,6 @@ gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
struct avtp_stream_pdu *pdu; struct avtp_stream_pdu *pdu;
guint64 channels, depth, rate, format, tstamp, seqnum, streamid, guint64 channels, depth, rate, format, tstamp, seqnum, streamid,
streamid_valid, data_len; streamid_valid, data_len;
GstAvtpBaseDepayload *avtpbasedepayload = GST_AVTP_BASE_DEPAYLOAD (parent);
GstAvtpAafDepay *avtpaafdepay = GST_AVTP_AAF_DEPAY (avtpbasedepayload); GstAvtpAafDepay *avtpaafdepay = GST_AVTP_AAF_DEPAY (avtpbasedepayload);
if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) {

View File

@ -48,7 +48,12 @@ static void gst_avtp_base_depayload_set_property (GObject * object,
static void gst_avtp_base_depayload_get_property (GObject * object, static void gst_avtp_base_depayload_get_property (GObject * object,
guint prop_id, GValue * value, GParamSpec * pspec); guint prop_id, GValue * value, GParamSpec * pspec);
static gboolean gst_avtp_base_depayload_sink_event (GstPad * pad, static gboolean gst_avtp_base_depayload_sink_event (GstAvtpBaseDepayload * self,
GstEvent * event);
static GstFlowReturn avtp_base_depayload_chain (GstPad * pad,
GstObject * parent, GstBuffer * buffer);
static gboolean avtp_base_depayload_sink_event (GstPad * pad,
GstObject * parent, GstEvent * event); GstObject * parent, GstEvent * event);
GType GType
@ -92,8 +97,7 @@ gst_avtp_base_depayload_class_init (GstAvtpBaseDepayloadClass * klass)
DEFAULT_STREAMID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | DEFAULT_STREAMID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
GST_PARAM_MUTABLE_PAUSED)); GST_PARAM_MUTABLE_PAUSED));
klass->chain = NULL; klass->sink_event = gst_avtp_base_depayload_sink_event;
klass->sink_event = GST_DEBUG_FUNCPTR (gst_avtp_base_depayload_sink_event);
GST_DEBUG_CATEGORY_INIT (avtpbasedepayload_debug, "avtpbasedepayload", 0, GST_DEBUG_CATEGORY_INIT (avtpbasedepayload_debug, "avtpbasedepayload", 0,
"Base class for AVTP depayloaders"); "Base class for AVTP depayloaders");
@ -111,7 +115,7 @@ gst_avtp_base_depayload_init (GstAvtpBaseDepayload * avtpbasedepayload,
GstAvtpBaseDepayloadClass *avtpbasedepayload_class = GstAvtpBaseDepayloadClass *avtpbasedepayload_class =
GST_AVTP_BASE_DEPAYLOAD_CLASS (g_class); GST_AVTP_BASE_DEPAYLOAD_CLASS (g_class);
g_assert (avtpbasedepayload_class->chain != NULL); g_assert (avtpbasedepayload_class->process != NULL);
templ = gst_element_class_get_pad_template (element_class, "src"); templ = gst_element_class_get_pad_template (element_class, "src");
g_assert (templ != NULL); g_assert (templ != NULL);
@ -122,9 +126,9 @@ gst_avtp_base_depayload_init (GstAvtpBaseDepayload * avtpbasedepayload,
avtpbasedepayload->sinkpad = avtpbasedepayload->sinkpad =
gst_pad_new_from_static_template (&sink_template, "sink"); gst_pad_new_from_static_template (&sink_template, "sink");
gst_pad_set_chain_function (avtpbasedepayload->sinkpad, gst_pad_set_chain_function (avtpbasedepayload->sinkpad,
avtpbasedepayload_class->chain); avtp_base_depayload_chain);
gst_pad_set_event_function (avtpbasedepayload->sinkpad, gst_pad_set_event_function (avtpbasedepayload->sinkpad,
avtpbasedepayload_class->sink_event); avtp_base_depayload_sink_event);
gst_element_add_pad (element, avtpbasedepayload->sinkpad); gst_element_add_pad (element, avtpbasedepayload->sinkpad);
avtpbasedepayload->streamid = DEFAULT_STREAMID; avtpbasedepayload->streamid = DEFAULT_STREAMID;
@ -169,14 +173,21 @@ gst_avtp_base_depayload_get_property (GObject * object, guint prop_id,
} }
} }
static gboolean static GstFlowReturn
gst_avtp_base_depayload_sink_event (GstPad * pad, GstObject * parent, avtp_base_depayload_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
GstEvent * event)
{ {
GstAvtpBaseDepayload *avtpbasedepayload = GST_AVTP_BASE_DEPAYLOAD (parent); GstAvtpBaseDepayload *avtpbasedepayload = GST_AVTP_BASE_DEPAYLOAD (parent);
GstAvtpBaseDepayloadClass *klass =
GST_AVTP_BASE_DEPAYLOAD_GET_CLASS (avtpbasedepayload);
GST_DEBUG_OBJECT (avtpbasedepayload, "event %s", GST_EVENT_TYPE_NAME (event)); return klass->process (avtpbasedepayload, buffer);
}
static gboolean
gst_avtp_base_depayload_sink_event (GstAvtpBaseDepayload * avtpbasedepayload,
GstEvent * event)
{
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEGMENT: case GST_EVENT_SEGMENT:
/* Once the first AVTPDU is received, proper CAPS and SEGMENT events are /* Once the first AVTPDU is received, proper CAPS and SEGMENT events are
@ -192,10 +203,24 @@ gst_avtp_base_depayload_sink_event (GstPad * pad, GstObject * parent,
gst_event_unref (event); gst_event_unref (event);
return TRUE; return TRUE;
default: default:
return gst_pad_event_default (pad, parent, event); return gst_pad_event_default (avtpbasedepayload->sinkpad,
GST_OBJECT (avtpbasedepayload), event);
} }
} }
static gboolean
avtp_base_depayload_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event)
{
GstAvtpBaseDepayload *avtpbasedepayload = GST_AVTP_BASE_DEPAYLOAD (parent);
GstAvtpBaseDepayloadClass *klass =
GST_AVTP_BASE_DEPAYLOAD_GET_CLASS (avtpbasedepayload);
GST_DEBUG_OBJECT (avtpbasedepayload, "event %s", GST_EVENT_TYPE_NAME (event));
return klass->sink_event (avtpbasedepayload, event);
}
/* Helper function to convert AVTP timestamp to AVTP presentation time. Since /* Helper function to convert AVTP timestamp to AVTP presentation time. Since
* AVTP timestamp represents the lower 32-bit part from AVTP presentation time, * AVTP timestamp represents the lower 32-bit part from AVTP presentation time,
* the helper requires a reference time ('ref' argument) to convert it properly. * the helper requires a reference time ('ref' argument) to convert it properly.

View File

@ -35,6 +35,9 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVTP_BASE_DEPAYLOAD)) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVTP_BASE_DEPAYLOAD))
#define GST_IS_AVTP_BASE_DEPAYLOAD_CLASS(klass) \ #define GST_IS_AVTP_BASE_DEPAYLOAD_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVTP_BASE_DEPAYLOAD)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVTP_BASE_DEPAYLOAD))
#define GST_AVTP_BASE_DEPAYLOAD_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_AVTP_BASE_DEPAYLOAD, \
GstAvtpBaseDepayloadClass))
typedef struct _GstAvtpBaseDepayload GstAvtpBaseDepayload; typedef struct _GstAvtpBaseDepayload GstAvtpBaseDepayload;
typedef struct _GstAvtpBaseDepayloadClass GstAvtpBaseDepayloadClass; typedef struct _GstAvtpBaseDepayloadClass GstAvtpBaseDepayloadClass;
@ -59,9 +62,8 @@ struct _GstAvtpBaseDepayloadClass
GstElementClass parent_class; GstElementClass parent_class;
/* Pure virtual function. */ /* Pure virtual function. */
GstPadChainFunction chain; GstFlowReturn (*process) (GstAvtpBaseDepayload *base, GstBuffer *buf);
gboolean (*sink_event) (GstAvtpBaseDepayload *base, GstEvent *event);
GstPadEventFunction sink_event;
gpointer _gst_reserved[GST_PADDING]; gpointer _gst_reserved[GST_PADDING];
}; };

View File

@ -49,8 +49,8 @@ GST_DEBUG_CATEGORY_STATIC (avtpcvfdepay_debug);
/* prototypes */ /* prototypes */
static GstFlowReturn gst_avtp_cvf_depay_chain (GstPad * pad, GstObject * parent, static GstFlowReturn gst_avtp_cvf_depay_process (GstAvtpBaseDepayload *
GstBuffer * buffer); avtpbasedepayload, GstBuffer * buffer);
static gboolean gst_avtp_cvf_depay_push_caps (GstAvtpVfDepayBase * avtpvfdepay); static gboolean gst_avtp_cvf_depay_push_caps (GstAvtpVfDepayBase * avtpvfdepay);
#define AVTP_CVF_H264_HEADER_SIZE (sizeof(struct avtp_stream_pdu) + sizeof(guint32)) #define AVTP_CVF_H264_HEADER_SIZE (sizeof(struct avtp_stream_pdu) + sizeof(guint32))
@ -102,7 +102,7 @@ gst_avtp_cvf_depay_class_init (GstAvtpCvfDepayClass * klass)
"Extracts compressed video from CVF AVTPDUs", "Extracts compressed video from CVF AVTPDUs",
"Ederson de Souza <ederson.desouza@intel.com>"); "Ederson de Souza <ederson.desouza@intel.com>");
avtpbasedepayload_class->chain = GST_DEBUG_FUNCPTR (gst_avtp_cvf_depay_chain); avtpbasedepayload_class->process = gst_avtp_cvf_depay_process;
avtpvfdepaybase_class->depay_push_caps = avtpvfdepaybase_class->depay_push_caps =
GST_DEBUG_FUNCPTR (gst_avtp_cvf_depay_push_caps); GST_DEBUG_FUNCPTR (gst_avtp_cvf_depay_push_caps);
@ -574,9 +574,10 @@ gst_avtp_cvf_depay_handle_single_nal (GstAvtpCvfDepay * avtpcvfdepay,
} }
static GstFlowReturn static GstFlowReturn
gst_avtp_cvf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) gst_avtp_cvf_depay_process (GstAvtpBaseDepayload * avtpbasedepayload,
GstBuffer * buffer)
{ {
GstAvtpCvfDepay *avtpcvfdepay = GST_AVTP_CVF_DEPAY (parent); GstAvtpCvfDepay *avtpcvfdepay = GST_AVTP_CVF_DEPAY (avtpbasedepayload);
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
gboolean lost_packet; gboolean lost_packet;
GstMapInfo map; GstMapInfo map;

View File

@ -50,8 +50,8 @@ GST_DEBUG_CATEGORY_STATIC (avtprvfdepay_debug);
/* prototypes */ /* prototypes */
static GstFlowReturn gst_avtp_rvf_depay_chain (GstPad * pad, GstObject * parent, static GstFlowReturn gst_avtp_rvf_depay_process (GstAvtpBaseDepayload *
GstBuffer * buffer); basedepay, GstBuffer * buffer);
static gboolean gst_avtp_rvf_depay_push_caps (GstAvtpVfDepayBase * avtpvfdepay); static gboolean gst_avtp_rvf_depay_push_caps (GstAvtpVfDepayBase * avtpvfdepay);
@ -91,7 +91,8 @@ gst_avtp_rvf_depay_class_init (GstAvtpRvfDepayClass * klass)
"Extracts raw video from RVF AVTPDUs", "Extracts raw video from RVF AVTPDUs",
"Adrian Fiergolski <Adrian.Fiergolski@fastree3d.com>"); "Adrian Fiergolski <Adrian.Fiergolski@fastree3d.com>");
avtpbasedepayload_class->chain = GST_DEBUG_FUNCPTR (gst_avtp_rvf_depay_chain); avtpbasedepayload_class->process =
GST_DEBUG_FUNCPTR (gst_avtp_rvf_depay_process);
avtpvfdepaybase_class->depay_push_caps = avtpvfdepaybase_class->depay_push_caps =
GST_DEBUG_FUNCPTR (gst_avtp_rvf_depay_push_caps); GST_DEBUG_FUNCPTR (gst_avtp_rvf_depay_push_caps);
@ -682,9 +683,10 @@ gst_avtp_rvf_depay_handle_single_fragment (GstAvtpRvfDepay * avtprvfdepay,
} }
static GstFlowReturn static GstFlowReturn
gst_avtp_rvf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) gst_avtp_rvf_depay_process (GstAvtpBaseDepayload * basedepay,
GstBuffer * buffer)
{ {
GstAvtpRvfDepay *avtprvfdepay = GST_AVTP_RVF_DEPAY (parent); GstAvtpRvfDepay *avtprvfdepay = GST_AVTP_RVF_DEPAY (basedepay);
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
gboolean lost_packet; gboolean lost_packet;
GstMapInfo map; GstMapInfo map;