static GstCaps * gst_rtp_opus_pay_getcaps (GstRTPBasePayload * payload, GstPad * pad, GstCaps * filter) { GstCaps *caps, *peercaps, *tcaps; GstStructure *s; const gchar *stereo; if (pad == GST_RTP_BASE_PAYLOAD_SRCPAD (payload)) return GST_RTP_BASE_PAYLOAD_CLASS (gst_rtp_opus_pay_parent_class)->get_caps (payload, pad, filter); tcaps = gst_pad_get_pad_template_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload)); peercaps = gst_pad_peer_query_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload), tcaps); gst_caps_unref (tcaps); if (!peercaps) return GST_RTP_BASE_PAYLOAD_CLASS (gst_rtp_opus_pay_parent_class)->get_caps (payload, pad, filter); if (gst_caps_is_empty (peercaps)) return peercaps; caps = gst_pad_get_pad_template_caps (GST_RTP_BASE_PAYLOAD_SINKPAD (payload)); s = gst_caps_get_structure (peercaps, 0); stereo = gst_structure_get_string (s, "stereo"); if (stereo != NULL) { caps = gst_caps_make_writable (caps); if (!strcmp (stereo, "1")) { GstCaps *caps2 = gst_caps_copy (caps); gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL); gst_caps_set_simple (caps2, "channels", G_TYPE_INT, 1, NULL); caps = gst_caps_merge (caps, caps2); } else if (!strcmp (stereo, "0")) { GstCaps *caps2 = gst_caps_copy (caps); gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); gst_caps_set_simple (caps2, "channels", G_TYPE_INT, 2, NULL); caps = gst_caps_merge (caps, caps2); } } gst_caps_unref (peercaps); if (filter) { GstCaps *tmp = gst_caps_intersect_full (caps, filter, GST_CAPS_INTERSECT_FIRST); gst_caps_unref (caps); caps = tmp; } GST_DEBUG_OBJECT (payload, "Returning caps: %" GST_PTR_FORMAT, caps); return caps; }
static gboolean gst_rtp_base_payload_audio_sink_event (GstRTPBasePayload * basep, GstEvent * event) { GstRTPBaseAudioPayload *payload; gboolean res = FALSE; payload = GST_RTP_BASE_AUDIO_PAYLOAD (basep); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* flush remaining bytes in the adapter */ gst_rtp_base_audio_payload_flush (payload, -1, -1); break; case GST_EVENT_FLUSH_STOP: gst_adapter_clear (payload->priv->adapter); break; default: break; } /* let parent handle the remainder of the event */ res = GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->sink_event (basep, event); return res; }
static gboolean gst_rtp_mp4g_pay_sink_event (GstRTPBasePayload * payload, GstEvent * event) { GstRtpMP4GPay *rtpmp4gpay; rtpmp4gpay = GST_RTP_MP4G_PAY (payload); GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: case GST_EVENT_EOS: /* This flush call makes sure that the last buffer is always pushed * to the base payloader */ gst_rtp_mp4g_pay_flush (rtpmp4gpay); break; case GST_EVENT_FLUSH_STOP: gst_rtp_mp4g_pay_reset (rtpmp4gpay); break; default: break; } /* let parent handle event too */ return GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->sink_event (payload, event); }
static gboolean gst_rtp_sbc_pay_sink_event (GstRTPBasePayload * payload, GstEvent * event) { GstRtpSBCPay *sbcpay = GST_RTP_SBC_PAY (payload); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: gst_rtp_sbc_pay_flush_buffers (sbcpay); break; default: break; } return GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->sink_event (payload, event); }
static GstFlowReturn gst_rtp_L16_pay_handle_buffer (GstRTPBasePayload * basepayload, GstBuffer * buffer) { GstRtpL16Pay *rtpL16pay; rtpL16pay = GST_RTP_L16_PAY (basepayload); buffer = gst_buffer_make_writable (buffer); if (rtpL16pay->order && !gst_audio_buffer_reorder_channels (buffer, rtpL16pay->info.finfo->format, rtpL16pay->info.channels, rtpL16pay->info.position, rtpL16pay->order->pos)) { return GST_FLOW_ERROR; } return GST_RTP_BASE_PAYLOAD_CLASS (parent_class)->handle_buffer (basepayload, buffer); }
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; }
static void gst_rtp_sbc_pay_class_init (GstRtpSBCPayClass * klass) { GstRTPBasePayloadClass *payload_class = GST_RTP_BASE_PAYLOAD_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = gst_rtp_sbc_pay_finalize; gobject_class->set_property = gst_rtp_sbc_pay_set_property; gobject_class->get_property = gst_rtp_sbc_pay_get_property; payload_class->set_caps = GST_DEBUG_FUNCPTR (gst_rtp_sbc_pay_set_caps); payload_class->handle_buffer = GST_DEBUG_FUNCPTR (gst_rtp_sbc_pay_handle_buffer); payload_class->sink_event = GST_DEBUG_FUNCPTR (gst_rtp_sbc_pay_sink_event); /* properties */ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MIN_FRAMES, g_param_spec_int ("min-frames", "minimum frame number", "Minimum quantity of frames to send in one packet " "(-1 for maximum allowed by the mtu)", -1, G_MAXINT, DEFAULT_MIN_FRAMES, G_PARAM_READWRITE)); gst_element_class_add_static_pad_template (element_class, &gst_rtp_sbc_pay_sink_factory); gst_element_class_add_static_pad_template (element_class, &gst_rtp_sbc_pay_src_factory); gst_element_class_set_static_metadata (element_class, "RTP packet payloader", "Codec/Payloader/Network", "Payload SBC audio as RTP packets", "Thiago Sousa Santos <*****@*****.**>"); GST_DEBUG_CATEGORY_INIT (gst_rtp_sbc_pay_debug, "rtpsbcpay", 0, "RTP SBC payloader"); }