static GstStateChangeReturn gst_rtp_mp4v_depay_change_state (GstElement * element, GstStateChange transition) { GstRtpMP4VDepay *rtpmp4vdepay; GstStateChangeReturn ret; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4vdepay->adapter); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { default: break; } return ret; }
static GstBuffer * gst_rtp_mp4v_depay_process (GstRTPBaseDepayload * depayload, GstBuffer * buf) { GstRtpMP4VDepay *rtpmp4vdepay; GstBuffer *pbuf, *outbuf = NULL; GstRTPBuffer rtp = { NULL }; gboolean marker; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) gst_adapter_clear (rtpmp4vdepay->adapter); gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp); pbuf = gst_rtp_buffer_get_payload_buffer (&rtp); marker = gst_rtp_buffer_get_marker (&rtp); gst_rtp_buffer_unmap (&rtp); gst_adapter_push (rtpmp4vdepay->adapter, pbuf); /* if this was the last packet of the VOP, create and push a buffer */ if (marker) { guint avail; avail = gst_adapter_available (rtpmp4vdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4vdepay->adapter, avail); GST_DEBUG ("gst_rtp_mp4v_depay_chain: pushing buffer of size %" G_GSIZE_FORMAT, gst_buffer_get_size (outbuf)); } return outbuf; }
static GstBuffer * gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) { GstRtpMP4VDepay *rtpmp4vdepay; GstBuffer *outbuf; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) gst_adapter_clear (rtpmp4vdepay->adapter); outbuf = gst_rtp_buffer_get_payload_buffer (buf); gst_adapter_push (rtpmp4vdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ if (gst_rtp_buffer_get_marker (buf)) { guint avail; avail = gst_adapter_available (rtpmp4vdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4vdepay->adapter, avail); GST_DEBUG ("gst_rtp_mp4v_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } return NULL; }
static void gst_rtp_mp4v_depay_finalize (GObject * object) { GstRtpMP4VDepay *rtpmp4vdepay; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (object); g_object_unref (rtpmp4vdepay->adapter); rtpmp4vdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); }