mpegtsdemux: Fix handling of explicit Opus channel mapping
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4180>
This commit is contained in:
parent
9d2ac6e90b
commit
84e08a377b
@ -52,8 +52,6 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#define _gst_log2(x) (log(x)/log(2))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tsdemux
|
* tsdemux
|
||||||
*
|
*
|
||||||
@ -1514,7 +1512,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
gst_byte_reader_init (&br, desc->data + 3, desc->length - 1);
|
gst_byte_reader_init (&br, desc->data + 3, desc->length - 1);
|
||||||
channel_config_code = gst_byte_reader_get_uint8_unchecked (&br);
|
channel_config_code = gst_byte_reader_get_uint8_unchecked (&br);
|
||||||
|
|
||||||
if ((channel_config_code & 0x8f) <= 8) {
|
if (channel_config_code < 0x89) {
|
||||||
static const guint8 coupled_stream_counts[9] = {
|
static const guint8 coupled_stream_counts[9] = {
|
||||||
1, 0, 1, 1, 2, 2, 2, 3, 3
|
1, 0, 1, 1, 2, 2, 2, 3, 3
|
||||||
};
|
};
|
||||||
@ -1540,7 +1538,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
};
|
};
|
||||||
|
|
||||||
gint channels = -1, stream_count, coupled_count, mapping_family;
|
gint channels = -1, stream_count, coupled_count, mapping_family;
|
||||||
guint8 *channel_mapping = NULL;
|
guint8 channel_mapping[255] = { 0, };
|
||||||
|
|
||||||
channels = channel_config_code ? (channel_config_code & 0x0f) : 2;
|
channels = channel_config_code ? (channel_config_code & 0x0f) : 2;
|
||||||
if (channel_config_code == 0 || channel_config_code == 0x80) {
|
if (channel_config_code == 0 || channel_config_code == 0x80) {
|
||||||
@ -1553,7 +1551,6 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
stream_count = 2;
|
stream_count = 2;
|
||||||
coupled_count = 0;
|
coupled_count = 0;
|
||||||
}
|
}
|
||||||
channel_mapping = g_new0 (guint8, channels);
|
|
||||||
memcpy (channel_mapping, &channel_map_a[1], channels);
|
memcpy (channel_mapping, &channel_map_a[1], channels);
|
||||||
} else if (channel_config_code <= 8) {
|
} else if (channel_config_code <= 8) {
|
||||||
mapping_family = (channels > 2) ? 1 : 0;
|
mapping_family = (channels > 2) ? 1 : 0;
|
||||||
@ -1562,7 +1559,6 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
coupled_stream_counts[channel_config_code];
|
coupled_stream_counts[channel_config_code];
|
||||||
coupled_count = coupled_stream_counts[channel_config_code];
|
coupled_count = coupled_stream_counts[channel_config_code];
|
||||||
if (mapping_family != 0) {
|
if (mapping_family != 0) {
|
||||||
channel_mapping = g_new0 (guint8, channels);
|
|
||||||
memcpy (channel_mapping, &channel_map_a[channels - 1],
|
memcpy (channel_mapping, &channel_map_a[channels - 1],
|
||||||
channels);
|
channels);
|
||||||
}
|
}
|
||||||
@ -1571,7 +1567,6 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
mapping_family = 1;
|
mapping_family = 1;
|
||||||
stream_count = channels;
|
stream_count = channels;
|
||||||
coupled_count = 0;
|
coupled_count = 0;
|
||||||
channel_mapping = g_new0 (guint8, channels);
|
|
||||||
memcpy (channel_mapping, &channel_map_b[channels - 1],
|
memcpy (channel_mapping, &channel_map_b[channels - 1],
|
||||||
channels);
|
channels);
|
||||||
} else if (channel_config_code == 0x81) {
|
} else if (channel_config_code == 0x81) {
|
||||||
@ -1608,7 +1603,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
gst_byte_reader_get_data_unchecked
|
gst_byte_reader_get_data_unchecked
|
||||||
(&br, remaining_bytes), remaining_bytes);
|
(&br, remaining_bytes), remaining_bytes);
|
||||||
|
|
||||||
stream_count_minus_one_len = ceil (_gst_log2 (channels));
|
stream_count_minus_one_len = g_bit_storage (channels);
|
||||||
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
||||||
&stream_count_minus_one,
|
&stream_count_minus_one,
|
||||||
stream_count_minus_one_len)) {
|
stream_count_minus_one_len)) {
|
||||||
@ -1619,8 +1614,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stream_count = stream_count_minus_one + 1;
|
stream_count = stream_count_minus_one + 1;
|
||||||
coupled_stream_count_len =
|
coupled_stream_count_len = g_bit_storage (stream_count + 1);
|
||||||
ceil (_gst_log2 (stream_count_minus_one + 2));
|
|
||||||
|
|
||||||
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
||||||
&coupled_stream_count, coupled_stream_count_len)) {
|
&coupled_stream_count, coupled_stream_count_len)) {
|
||||||
@ -1633,9 +1627,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
coupled_count = coupled_stream_count;
|
coupled_count = coupled_stream_count;
|
||||||
|
|
||||||
channel_mapping_len =
|
channel_mapping_len =
|
||||||
ceil (_gst_log2 (stream_count_minus_one + 1 +
|
g_bit_storage (stream_count + coupled_stream_count + 1);
|
||||||
coupled_stream_count + 1));
|
|
||||||
channel_mapping = g_new0 (guint8, channels);
|
|
||||||
for (i = 0; i < channels; i++) {
|
for (i = 0; i < channels; i++) {
|
||||||
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
if (!gst_bit_reader_get_bits_uint8 (&breader,
|
||||||
&channel_mapping[i], channel_mapping_len)) {
|
&channel_mapping[i], channel_mapping_len)) {
|
||||||
@ -1648,8 +1640,6 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
/* error above */
|
/* error above */
|
||||||
if (i != channels) {
|
if (i != channels) {
|
||||||
channels = -1;
|
channels = -1;
|
||||||
g_free (channel_mapping);
|
|
||||||
channel_mapping = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1663,8 +1653,6 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
|
|||||||
gst_codec_utils_opus_create_caps (48000, channels,
|
gst_codec_utils_opus_create_caps (48000, channels,
|
||||||
mapping_family, stream_count, coupled_count,
|
mapping_family, stream_count, coupled_count,
|
||||||
channel_mapping);
|
channel_mapping);
|
||||||
|
|
||||||
g_free (channel_mapping);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_WARNING_OBJECT (demux,
|
GST_WARNING_OBJECT (demux,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user