static GstFlowReturn gst_rtp_mpa_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { GstRtpMPAPay *rtpmpapay; GstFlowReturn ret; guint size, avail; guint packet_len; GstClockTime duration, timestamp; rtpmpapay = GST_RTP_MPA_PAY (basepayload); size = gst_buffer_get_size (buffer); duration = GST_BUFFER_DURATION (buffer); timestamp = GST_BUFFER_PTS (buffer); if (GST_BUFFER_IS_DISCONT (buffer)) { GST_DEBUG_OBJECT (rtpmpapay, "DISCONT"); gst_rtp_mpa_pay_reset (rtpmpapay); } avail = gst_adapter_available (rtpmpapay->adapter); /* get packet length of previous data and this new data, * payload length includes a 4 byte header */ packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); /* if this buffer is going to overflow the packet, flush what we * have. */ if (gst_rtp_base_payload_is_filled (basepayload, packet_len, rtpmpapay->duration + duration)) { ret = gst_rtp_mpa_pay_flush (rtpmpapay); avail = 0; } else { ret = GST_FLOW_OK; } if (avail == 0) { GST_DEBUG_OBJECT (rtpmpapay, "first packet, save timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); rtpmpapay->first_ts = timestamp; rtpmpapay->duration = 0; } gst_adapter_push (rtpmpapay->adapter, buffer); rtpmpapay->duration = duration; return ret; }
static GstFlowReturn gst_rtp_mpa_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpMPAPay *rtpmpapay; GstFlowReturn ret; guint size, avail; guint packet_len; GstClockTime duration; rtpmpapay = GST_RTP_MPA_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); duration = GST_BUFFER_DURATION (buffer); avail = gst_adapter_available (rtpmpapay->adapter); if (avail == 0) { rtpmpapay->first_ts = GST_BUFFER_TIMESTAMP (buffer); rtpmpapay->duration = 0; } /* get packet length of previous data and this new data, * payload length includes a 4 byte header */ packet_len = gst_rtp_buffer_calc_packet_len (4 + avail + size, 0, 0); /* if this buffer is going to overflow the packet, flush what we * have. */ if (gst_basertppayload_is_filled (basepayload, packet_len, rtpmpapay->duration + duration)) { ret = gst_rtp_mpa_pay_flush (rtpmpapay); rtpmpapay->first_ts = GST_BUFFER_TIMESTAMP (buffer); rtpmpapay->duration = 0; } else { ret = GST_FLOW_OK; } gst_adapter_push (rtpmpapay->adapter, buffer); rtpmpapay->duration += duration; return ret; }
static gboolean gst_rtp_mpa_pay_sink_event (GstRTPBasePayload * payload, GstEvent * event) { gboolean ret; GstRtpMPAPay *rtpmpapay; rtpmpapay = GST_RTP_MPA_PAY (payload); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* make sure we push the last packets in the adapter on EOS */ gst_rtp_mpa_pay_flush (rtpmpapay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mpa_pay_reset (rtpmpapay); break; default: break; } ret = GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->sink_event (payload, event); return ret; }