X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Frtp%2FgstrtpL16pay.c;h=7e358d3d0fd27d5a9ac07accede38fee4f0510c0;hb=775ccdf9775bd7051929b257444b3be915e88ec6;hp=2d4543ba574e6349770fe2177e937fb8250d897b;hpb=4bb2b140e9bc2b4ec98fee84796d5fb98d41f965;p=platform%2Fupstream%2Fgst-plugins-good.git diff --git a/gst/rtp/gstrtpL16pay.c b/gst/rtp/gstrtpL16pay.c index 2d4543b..7e358d3 100644 --- a/gst/rtp/gstrtpL16pay.c +++ b/gst/rtp/gstrtpL16pay.c @@ -13,8 +13,24 @@ * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/** + * SECTION:element-rtpL16pay + * @title: rtpL16pay + * @see_also: rtpL16depay + * + * Payload raw audio into RTP packets according to RFC 3551. + * For detailed information see: http://www.rfc-editor.org/rfc/rfc3551.txt + * + * ## Example pipeline + * |[ + * gst-launch-1.0 -v audiotestsrc ! audioconvert ! rtpL16pay ! udpsink + * ]| This example pipeline will payload raw audio. Refer to + * the rtpL16depay example to depayload and play the RTP stream. + * */ #ifdef HAVE_CONFIG_H @@ -24,7 +40,6 @@ #include #include -#include #include #include "gstrtpL16pay.h" @@ -37,11 +52,9 @@ static GstStaticPadTemplate gst_rtp_L16_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BIG_ENDIAN, " - "signed = (boolean) true, " - "width = (int) 16, " - "depth = (int) 16, " + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) S16BE, " + "layout = (string) interleaved, " "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") ); @@ -67,33 +80,37 @@ static GstStaticPadTemplate gst_rtp_L16_pay_src_template = "clock-rate = (int) 44100") ); -static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, +static gboolean gst_rtp_L16_pay_setcaps (GstRTPBasePayload * basepayload, GstCaps * caps); -static GstCaps *gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, +static GstCaps *gst_rtp_L16_pay_getcaps (GstRTPBasePayload * rtppayload, GstPad * pad, GstCaps * filter); +static GstFlowReturn +gst_rtp_L16_pay_handle_buffer (GstRTPBasePayload * basepayload, + GstBuffer * buffer); #define gst_rtp_L16_pay_parent_class parent_class -G_DEFINE_TYPE (GstRtpL16Pay, gst_rtp_L16_pay, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); +G_DEFINE_TYPE (GstRtpL16Pay, gst_rtp_L16_pay, GST_TYPE_RTP_BASE_AUDIO_PAYLOAD); static void gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass) { GstElementClass *gstelement_class; - GstBaseRTPPayloadClass *gstbasertppayload_class; + GstRTPBasePayloadClass *gstrtpbasepayload_class; gstelement_class = (GstElementClass *) klass; - gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + gstrtpbasepayload_class = (GstRTPBasePayloadClass *) klass; - gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps; - gstbasertppayload_class->get_caps = gst_rtp_L16_pay_getcaps; + gstrtpbasepayload_class->set_caps = gst_rtp_L16_pay_setcaps; + gstrtpbasepayload_class->get_caps = gst_rtp_L16_pay_getcaps; + gstrtpbasepayload_class->handle_buffer = gst_rtp_L16_pay_handle_buffer; - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_rtp_L16_pay_src_template)); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&gst_rtp_L16_pay_sink_template)); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_L16_pay_src_template); + gst_element_class_add_static_pad_template (gstelement_class, + &gst_rtp_L16_pay_sink_template); - gst_element_class_set_details_simple (gstelement_class, "RTP audio payloader", - "Codec/Payloader/Network/RTP", + gst_element_class_set_static_metadata (gstelement_class, + "RTP audio payloader", "Codec/Payloader/Network/RTP", "Payload-encode Raw audio into RTP packets (RFC 3551)", "Wim Taymans "); @@ -104,98 +121,80 @@ gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass) static void gst_rtp_L16_pay_init (GstRtpL16Pay * rtpL16pay) { - GstBaseRTPAudioPayload *basertpaudiopayload; + GstRTPBaseAudioPayload *rtpbaseaudiopayload; - basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpL16pay); + rtpbaseaudiopayload = GST_RTP_BASE_AUDIO_PAYLOAD (rtpL16pay); - /* tell basertpaudiopayload that this is a sample based codec */ - gst_base_rtp_audio_payload_set_sample_based (basertpaudiopayload); + /* tell rtpbaseaudiopayload that this is a sample based codec */ + gst_rtp_base_audio_payload_set_sample_based (rtpbaseaudiopayload); } static gboolean -gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) +gst_rtp_L16_pay_setcaps (GstRTPBasePayload * basepayload, GstCaps * caps) { GstRtpL16Pay *rtpL16pay; - GstStructure *structure; - gint channels, rate; gboolean res; gchar *params; - GstAudioChannelPosition *pos; + GstAudioInfo *info; const GstRTPChannelOrder *order; - GstBaseRTPAudioPayload *basertpaudiopayload; + GstRTPBaseAudioPayload *rtpbaseaudiopayload; - basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basepayload); + rtpbaseaudiopayload = GST_RTP_BASE_AUDIO_PAYLOAD (basepayload); rtpL16pay = GST_RTP_L16_PAY (basepayload); - structure = gst_caps_get_structure (caps, 0); - - /* first parse input caps */ - if (!gst_structure_get_int (structure, "rate", &rate)) - goto no_rate; + info = &rtpL16pay->info; + gst_audio_info_init (info); + if (!gst_audio_info_from_caps (info, caps)) + goto invalid_caps; - if (!gst_structure_get_int (structure, "channels", &channels)) - goto no_channels; + order = gst_rtp_channels_get_by_pos (info->channels, info->position); + rtpL16pay->order = order; - /* get the channel order */ - pos = gst_audio_get_channel_positions (structure); - if (pos) - order = gst_rtp_channels_get_by_pos (channels, pos); - else - order = NULL; + gst_rtp_base_payload_set_options (basepayload, "audio", TRUE, "L16", + info->rate); + params = g_strdup_printf ("%d", info->channels); - gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); - params = g_strdup_printf ("%d", channels); - - if (!order && channels > 2) { + if (!order && info->channels > 2) { GST_ELEMENT_WARNING (rtpL16pay, STREAM, DECODE, - (NULL), ("Unknown channel order for %d channels", channels)); + (NULL), ("Unknown channel order for %d channels", info->channels)); } if (order && order->name) { - res = gst_basertppayload_set_outcaps (basepayload, + res = gst_rtp_base_payload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, - channels, "channel-order", G_TYPE_STRING, order->name, NULL); + info->channels, "channel-order", G_TYPE_STRING, order->name, NULL); } else { - res = gst_basertppayload_set_outcaps (basepayload, + res = gst_rtp_base_payload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, - channels, NULL); + info->channels, NULL); } g_free (params); - g_free (pos); - - rtpL16pay->rate = rate; - rtpL16pay->channels = channels; /* octet-per-sample is 2 * channels for L16 */ - gst_base_rtp_audio_payload_set_sample_options (basertpaudiopayload, - 2 * rtpL16pay->channels); + gst_rtp_base_audio_payload_set_sample_options (rtpbaseaudiopayload, + 2 * info->channels); return res; /* ERRORS */ -no_rate: - { - GST_DEBUG_OBJECT (rtpL16pay, "no rate given"); - return FALSE; - } -no_channels: +invalid_caps: { - GST_DEBUG_OBJECT (rtpL16pay, "no channels given"); + GST_DEBUG_OBJECT (rtpL16pay, "invalid caps"); return FALSE; } } static GstCaps * -gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad, +gst_rtp_L16_pay_getcaps (GstRTPBasePayload * rtppayload, GstPad * pad, GstCaps * filter) { GstCaps *otherpadcaps; GstCaps *caps; - otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); - caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + caps = gst_pad_get_pad_template_caps (pad); + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); if (otherpadcaps) { if (!gst_caps_is_empty (otherpadcaps)) { GstStructure *structure; @@ -204,20 +203,21 @@ gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad, gint rate; structure = gst_caps_get_structure (otherpadcaps, 0); + caps = gst_caps_make_writable (caps); if (gst_structure_get_int (structure, "channels", &channels)) { gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL); } else if (gst_structure_get_int (structure, "payload", &pt)) { - if (pt == 10) + if (pt == GST_RTP_PAYLOAD_L16_STEREO) gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL); - else if (pt == 11) + else if (pt == GST_RTP_PAYLOAD_L16_MONO) gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); } if (gst_structure_get_int (structure, "clock-rate", &rate)) { gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL); } else if (gst_structure_get_int (structure, "payload", &pt)) { - if (pt == 10 || pt == 11) + if (pt == GST_RTP_PAYLOAD_L16_STEREO || pt == GST_RTP_PAYLOAD_L16_MONO) gst_caps_set_simple (caps, "rate", G_TYPE_INT, 44100, NULL); } @@ -235,6 +235,26 @@ gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad, return caps; } +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); +} + gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin) {