From: <wt...@ke...> - 2008-10-28 10:08:05
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Oct 28 2008 10:02:03 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): * gst/rtp/gstrtpchannels.c: (check_channels), (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), (gst_rtp_channels_create_default): * gst/rtp/gstrtpchannels.h: Add mappings for multichannel support. Does not completely just work because the getcaps function does not yet return the allowed channel mappings. See #556641. Modified files: . : ChangeLog gst/rtp : gstrtpL16depay.c gstrtpL16pay.c Added files: gst/rtp : gstrtpchannels.c gstrtpchannels.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3784&r2=1.3785 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3784 retrieving revision 1.3785 diff -u -d -r1.3784 -r1.3785 --- ChangeLog 28 Oct 2008 06:50:50 -0000 1.3784 +++ ChangeLog 28 Oct 2008 10:01:46 -0000 1.3785 @@ -1,3 +1,16 @@ +2008-10-28 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), + (gst_rtp_L16_pay_getcaps): + * gst/rtp/gstrtpchannels.c: (check_channels), + (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), + (gst_rtp_channels_create_default): + * gst/rtp/gstrtpchannels.h: + Add mappings for multichannel support. Does not completely just work + because the getcaps function does not yet return the allowed channel + mappings. See #556641. 2008-10-28 Stefan Kost <en...@us...> * gst/goom/Makefile.am: Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstrtpL16depay.c 27 Oct 2008 11:03:48 -0000 1.31 +++ gstrtpL16depay.c 28 Oct 2008 10:01:48 -0000 1.32 @@ -24,7 +24,11 @@ #include <string.h> #include <stdlib.h> +#include <gst/audio/audio.h> +#include <gst/audio/multichannel.h> #include "gstrtpL16depay.h" +#include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpL16depay_debug); #define GST_CAT_DEFAULT (rtpL16depay_debug) @@ -146,6 +150,8 @@ gint channels; GstCaps *srccaps; gboolean res; + const gchar *channel_order; + const GstRTPChannelOrder *order; rtpL16depay = GST_RTP_L16_DEPAY (depayload); @@ -163,6 +169,7 @@ clock_rate = 44100; break; default: + /* no fixed mapping, we need channels and clock-rate */ channels = 0; clock_rate = 0; @@ -189,6 +196,25 @@ "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); + /* add channel positions */ + channel_order = gst_structure_get_string (structure, "channel-order"); + order = gst_rtp_channels_get_by_order (channels, channel_order); + if (order) { + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), + order->pos); + } else { + GstAudioChannelPosition *pos; + GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, + (NULL), ("Unknown channel order '%s' for %d channels", + GST_STR_NULL (channel_order), channels)); + /* create default NONE layout */ + pos = gst_rtp_channels_create_default (channels); + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); + g_free (pos); + } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtpL16pay.c 27 Oct 2008 11:28:30 -0000 1.28 +++ gstrtpL16pay.c 28 Oct 2008 10:01:49 -0000 1.29 @@ -23,9 +23,12 @@ #include <gst/rtp/gstrtpbuffer.h> #include "gstrtpL16pay.h" GST_DEBUG_CATEGORY_STATIC (rtpL16pay_debug); #define GST_CAT_DEFAULT (rtpL16pay_debug) @@ -173,6 +176,8 @@ gint channels, rate; gchar *params; + GstAudioChannelPosition *pos; rtpL16pay = GST_RTP_L16_PAY (basepayload); @@ -185,13 +190,33 @@ if (!gst_structure_get_int (structure, "channels", &channels)) goto no_channels; + /* 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_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); params = g_strdup_printf ("%d", channels); - res = gst_basertppayload_set_outcaps (basepayload, - "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, - channels, NULL); + if (!order && channels > 2) { + GST_ELEMENT_WARNING (rtpL16pay, STREAM, DECODE, + (NULL), ("Unknown channel order for %d channels", channels)); + if (order && order->name) { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, "channel-order", G_TYPE_STRING, order->name, NULL); + channels, NULL); g_free (params); + g_free (pos); rtpL16pay->rate = rate; rtpL16pay->channels = channels; --- NEW FILE: gstrtpchannels.c --- /* GStreamer * Copyright (C) <2008> Wim Taymans <wim...@gm...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * 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. */ #include <string.h> #include <stdlib.h> #include "gstrtpchannels.h" /* * RTP channel positions as discussed in RFC 3551 and also RFC 3555 * We can't really represent the described channel positions in GStreamer but we * implement a (very rough) approximation here. static gboolean check_channels (const GstRTPChannelOrder * order, const GstAudioChannelPosition * pos) { gint i; gboolean res = TRUE; for (i = 0; i < order->channels; i++) { if (order->pos[i] != pos[i]) { res = FALSE; break; } } return res; } /** * gst_rtp_channels_get_by_pos: * @channels: the amount of channels * @pos: a channel layout * Return a description of the channel layout. * Returns: a #GstRTPChannelOrder with the channel information or NULL when @pos * is not a valid layout. const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition * pos) const GstRTPChannelOrder *res = NULL; g_return_val_if_fail (pos != NULL, NULL); for (i = 0; channel_orders[i].pos; i++) { if (channel_orders[i].channels != channels) continue; if (check_channels (&channel_orders[i], pos)) { res = &channel_orders[i]; * gst_rtp_channels_create_default: * @order: a channel order * Get the channel order info the @order and @channels. * Returns: a #GstRTPChannelOrder with the channel information or NULL when * @order is not a know layout for @channels. gst_rtp_channels_get_by_order (gint channels, const gchar * order) /* no name but channels match, continue */ if (!channel_orders[i].name || !order) { /* compare names */ if (g_ascii_strcasecmp (channel_orders[i].name, order)) { * Create a default none channel mapping for @channels. * Returns: a #GstAudioChannelPosition with all the channel position info set to * #GST_AUDIO_CHANNEL_POSITION_NONE. GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels) GstAudioChannelPosition *posn; g_return_val_if_fail (channels > 0, NULL); posn = g_new (GstAudioChannelPosition, channels); for (i = 0; i < channels; i++) posn[i] = GST_AUDIO_CHANNEL_POSITION_NONE; return posn; --- NEW FILE: gstrtpchannels.h --- #include <gst/audio/audio.h> #include <gst/audio/multichannel.h> typedef struct const gchar *name; gint channels; const GstAudioChannelPosition *pos; } GstRTPChannelOrder; static const GstAudioChannelPosition pos_4_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT }; static const GstAudioChannelPosition pos_4_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE static const GstAudioChannelPosition pos_4_3[] = { static const GstAudioChannelPosition pos_5_1[] = { GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER static const GstAudioChannelPosition pos_6_1[] = { static const GstAudioChannelPosition pos_6_2[] = { GST_AUDIO_CHANNEL_POSITION_LFE, static const GstAudioChannelPosition pos_8_1[] = { GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT static const GstAudioChannelPosition pos_8_2[] = { static const GstAudioChannelPosition pos_8_3[] = { static const GstAudioChannelPosition pos_def_1[] = { GST_AUDIO_CHANNEL_POSITION_NONE static const GstAudioChannelPosition pos_def_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT static const GstAudioChannelPosition pos_def_3[] = { static const GstAudioChannelPosition pos_def_4[] = { static const GstAudioChannelPosition pos_def_5[] = { static const GstAudioChannelPosition pos_def_6[] = { static const GstRTPChannelOrder channel_orders[] = /* 4 channels */ { "DV.LRLsRs", 4, pos_4_1 }, { "DV.LRCS", 4, pos_4_2 }, { "DV.LRCWo", 4, pos_4_3 }, /* 5 channels */ { "DV.LRLsRsC", 5, pos_5_1 }, /* 6 channels */ { "DV.LRLsRsCS", 6, pos_6_1 }, { "DV.LmixRmixTWoQ1Q2", 6, pos_6_2 }, /* 8 channels */ { "DV.LRCWoLsRsLmixRmix", 8, pos_8_1 }, { "DV.LRCWoLs1Rs1Ls2Rs2", 8, pos_8_2 }, { "DV.LRCWoLsRsLcRc", 8, pos_8_3 }, /* default layouts */ { NULL, 1, pos_def_1 }, { NULL, 2, pos_def_2 }, { NULL, 3, pos_def_3 }, { NULL, 4, pos_def_4 }, { NULL, 5, pos_def_5 }, { NULL, 6, pos_def_6 }, /* terminator, invalid entry */ { NULL, 0, NULL }, const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition *pos); const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, const gchar *order); GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels); |