mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
gst-libs/gst/audio/multichannel.c: Allow non-standard 2 channel layouts.
Original commit message from CVS: * gst-libs/gst/audio/multichannel.c: (gst_audio_check_channel_positions): Allow non-standard 2 channel layouts. * tests/check/elements/audioconvert.c: (GST_START_TEST): Add some tests for converting and remapping non-standard 1 and 2 channel layouts.
This commit is contained in:
parent
d47bd6d7bc
commit
d03bbd1e3e
3 changed files with 245 additions and 0 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2008-05-21 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
|
* gst-libs/gst/audio/multichannel.c:
|
||||||
|
(gst_audio_check_channel_positions):
|
||||||
|
Allow non-standard 2 channel layouts.
|
||||||
|
|
||||||
|
* tests/check/elements/audioconvert.c: (GST_START_TEST):
|
||||||
|
Add some tests for converting and remapping non-standard 1 and 2
|
||||||
|
channel layouts.
|
||||||
|
|
||||||
2008-05-21 Sebastian Dröge <slomo@circular-chaos.org>
|
2008-05-21 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
* gst/audioconvert/gstchannelmix.c:
|
* gst/audioconvert/gstchannelmix.c:
|
||||||
|
|
|
@ -135,12 +135,14 @@ gst_audio_check_channel_positions (const GstAudioChannelPosition * pos,
|
||||||
|
|
||||||
/* Throw warning if we encounter an unusual 2-channel configuration,
|
/* Throw warning if we encounter an unusual 2-channel configuration,
|
||||||
* at least until someone finds a reason why we should not */
|
* at least until someone finds a reason why we should not */
|
||||||
|
#if 0
|
||||||
if (channels == 2 && (pos[0] != GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT ||
|
if (channels == 2 && (pos[0] != GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT ||
|
||||||
pos[1] != GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT)) {
|
pos[1] != GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT)) {
|
||||||
g_warning ("channels=2 implies stereo, but channel positions are "
|
g_warning ("channels=2 implies stereo, but channel positions are "
|
||||||
"< %d, %d>", pos[0], pos[1]);
|
"< %d, %d>", pos[0], pos[1]);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -827,6 +827,119 @@ GST_START_TEST (test_multichannel_conversion)
|
||||||
TRUE));
|
TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2 };
|
||||||
|
gint16 out[] = { 1, 1, 2, 2 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
GstAudioChannelPosition out_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 1, in_layout);
|
||||||
|
set_channel_positions (out_caps, 2, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("1 channels to 2 with standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2 };
|
||||||
|
gint16 out[] = { 1, 0, 2, 0 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
|
||||||
|
GstAudioChannelPosition out_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 1, in_layout);
|
||||||
|
set_channel_positions (out_caps, 2, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("1 channels to 2 with non-standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 2, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 2, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels to 1 with standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 2, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 1, 3 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels to 1 with non-standard layout", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
@ -923,6 +1036,126 @@ GST_START_TEST (test_channel_remapping)
|
||||||
RUN_CONVERSION ("3 channels layout remapping float32 --> int16", in,
|
RUN_CONVERSION ("3 channels layout remapping float32 --> int16", in,
|
||||||
in_caps, out, out_caps);
|
in_caps, out, out_caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 2 channels and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { -1, 2, -2, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_LFE
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 2, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 2 channels and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 2, 1, 4, 3 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 2, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 2 channels and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { -1, 2, -3, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (2, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER
|
||||||
|
};
|
||||||
|
GstAudioChannelPosition out_layout[2] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 2, in_layout);
|
||||||
|
set_channel_positions (out_caps, 2, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("2 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 1 channel and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 0, 0, 0, 0 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT };
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 1, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 1 channel and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { 1, 2, 3, 4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 1, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gint16 to gint16 with 1 channel and non-standard layout */
|
||||||
|
{
|
||||||
|
gint16 in[] = { 1, 2, 3, 4 };
|
||||||
|
gint16 out[] = { -1, -2, -3, -4 };
|
||||||
|
GstCaps *in_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstCaps *out_caps = get_int_mc_caps (1, "BYTE_ORDER", 16, 16, TRUE, FALSE);
|
||||||
|
GstAudioChannelPosition in_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_FRONT_MONO };
|
||||||
|
GstAudioChannelPosition out_layout[1] =
|
||||||
|
{ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT };
|
||||||
|
|
||||||
|
set_channel_positions (in_caps, 1, in_layout);
|
||||||
|
set_channel_positions (out_caps, 1, out_layout);
|
||||||
|
|
||||||
|
RUN_CONVERSION ("1 channels layout remapping int16 --> int16", in,
|
||||||
|
in_caps, out, out_caps);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
Loading…
Reference in a new issue