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_TYPE_AVTP_AAF_DEPAY);
static GstFlowReturn gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent,
GstBuffer * buffer);
static GstFlowReturn gst_avtp_aaf_depay_process (GstAvtpBaseDepayload *
basedepay, GstBuffer * buffer);
static void
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",
"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,
"AAF AVTP Depayloader");
@ -207,7 +207,8 @@ gst_avtp_aaf_depay_are_audio_features_valid (GstAvtpAafDepay * avtpaafdepay,
}
static GstFlowReturn
gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
gst_avtp_aaf_depay_process (GstAvtpBaseDepayload * avtpbasedepayload,
GstBuffer * buffer)
{
int res;
GstMapInfo info;
@ -217,7 +218,6 @@ gst_avtp_aaf_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
struct avtp_stream_pdu *pdu;
guint64 channels, depth, rate, format, tstamp, seqnum, streamid,
streamid_valid, data_len;
GstAvtpBaseDepayload *avtpbasedepayload = GST_AVTP_BASE_DEPAYLOAD (parent);
GstAvtpAafDepay *avtpaafdepay = GST_AVTP_AAF_DEPAY (avtpbasedepayload);
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,
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);
GType
@ -92,8 +97,7 @@ gst_avtp_base_depayload_class_init (GstAvtpBaseDepayloadClass * klass)
DEFAULT_STREAMID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
GST_PARAM_MUTABLE_PAUSED));
klass->chain = NULL;
klass->sink_event = GST_DEBUG_FUNCPTR (gst_avtp_base_depayload_sink_event);
klass->sink_event = gst_avtp_base_depayload_sink_event;
GST_DEBUG_CATEGORY_INIT (avtpbasedepayload_debug, "avtpbasedepayload", 0,
"Base class for AVTP depayloaders");
@ -111,7 +115,7 @@ gst_avtp_base_depayload_init (GstAvtpBaseDepayload * avtpbasedepayload,
GstAvtpBaseDepayloadClass *avtpbasedepayload_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");
g_assert (templ != NULL);
@ -122,9 +126,9 @@ gst_avtp_base_depayload_init (GstAvtpBaseDepayload * avtpbasedepayload,
avtpbasedepayload->sinkpad =
gst_pad_new_from_static_template (&sink_template, "sink");
gst_pad_set_chain_function (avtpbasedepayload->sinkpad,
avtpbasedepayload_class->chain);
avtp_base_depayload_chain);
gst_pad_set_event_function (avtpbasedepayload->sinkpad,
avtpbasedepayload_class->sink_event);
avtp_base_depayload_sink_event);
gst_element_add_pad (element, avtpbasedepayload->sinkpad);
avtpbasedepayload->streamid = DEFAULT_STREAMID;
@ -169,14 +173,21 @@ gst_avtp_base_depayload_get_property (GObject * object, guint prop_id,
}
}
static gboolean
gst_avtp_base_depayload_sink_event (GstPad * pad, GstObject * parent,
GstEvent * event)
static GstFlowReturn
avtp_base_depayload_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
{
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)) {
case GST_EVENT_SEGMENT:
/* 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);
return TRUE;
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
* AVTP timestamp represents the lower 32-bit part from AVTP presentation time,
* 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))
#define GST_IS_AVTP_BASE_DEPAYLOAD_CLASS(klass) \
(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 _GstAvtpBaseDepayloadClass GstAvtpBaseDepayloadClass;
@ -59,9 +62,8 @@ struct _GstAvtpBaseDepayloadClass
GstElementClass parent_class;
/* Pure virtual function. */
GstPadChainFunction chain;
GstPadEventFunction sink_event;
GstFlowReturn (*process) (GstAvtpBaseDepayload *base, GstBuffer *buf);
gboolean (*sink_event) (GstAvtpBaseDepayload *base, GstEvent *event);
gpointer _gst_reserved[GST_PADDING];
};

View File

@ -49,8 +49,8 @@ GST_DEBUG_CATEGORY_STATIC (avtpcvfdepay_debug);
/* prototypes */
static GstFlowReturn gst_avtp_cvf_depay_chain (GstPad * pad, GstObject * parent,
GstBuffer * buffer);
static GstFlowReturn gst_avtp_cvf_depay_process (GstAvtpBaseDepayload *
avtpbasedepayload, GstBuffer * buffer);
static gboolean gst_avtp_cvf_depay_push_caps (GstAvtpVfDepayBase * avtpvfdepay);
#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",
"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 =
GST_DEBUG_FUNCPTR (gst_avtp_cvf_depay_push_caps);
@ -574,9 +574,10 @@ gst_avtp_cvf_depay_handle_single_nal (GstAvtpCvfDepay * avtpcvfdepay,
}
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;
gboolean lost_packet;
GstMapInfo map;

View File

@ -50,8 +50,8 @@ GST_DEBUG_CATEGORY_STATIC (avtprvfdepay_debug);
/* prototypes */
static GstFlowReturn gst_avtp_rvf_depay_chain (GstPad * pad, GstObject * parent,
GstBuffer * buffer);
static GstFlowReturn gst_avtp_rvf_depay_process (GstAvtpBaseDepayload *
basedepay, GstBuffer * buffer);
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",
"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 =
GST_DEBUG_FUNCPTR (gst_avtp_rvf_depay_push_caps);
@ -682,9 +683,10 @@ gst_avtp_rvf_depay_handle_single_fragment (GstAvtpRvfDepay * avtprvfdepay,
}
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;
gboolean lost_packet;
GstMapInfo map;