mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
codecutils: improve input validation in opus header parsing
Invalid input files do not warrant assertions. Instead output error messages and let the error bubble up.
This commit is contained in:
parent
91179622eb
commit
c493c564ba
1 changed files with 48 additions and 12 deletions
|
@ -1276,7 +1276,8 @@ gst_codec_utils_opus_parse_caps (GstCaps * caps,
|
||||||
*
|
*
|
||||||
* Creates Opus caps from the given parameters.
|
* Creates Opus caps from the given parameters.
|
||||||
*
|
*
|
||||||
* Returns: The #GstCaps.
|
* Returns: The #GstCaps, or %NULL if the parameters would lead to
|
||||||
|
* invalid Opus caps.
|
||||||
*
|
*
|
||||||
* Since: 1.8
|
* Since: 1.8
|
||||||
*/
|
*/
|
||||||
|
@ -1286,7 +1287,7 @@ gst_codec_utils_opus_create_caps (guint32 rate,
|
||||||
guint8 channel_mapping_family,
|
guint8 channel_mapping_family,
|
||||||
guint8 stream_count, guint8 coupled_count, const guint8 * channel_mapping)
|
guint8 stream_count, guint8 coupled_count, const guint8 * channel_mapping)
|
||||||
{
|
{
|
||||||
GstCaps *caps;
|
GstCaps *caps = NULL;
|
||||||
GValue va = G_VALUE_INIT;
|
GValue va = G_VALUE_INIT;
|
||||||
GValue v = G_VALUE_INIT;
|
GValue v = G_VALUE_INIT;
|
||||||
gint i;
|
gint i;
|
||||||
|
@ -1295,15 +1296,30 @@ gst_codec_utils_opus_create_caps (guint32 rate,
|
||||||
rate = 48000;
|
rate = 48000;
|
||||||
|
|
||||||
if (channel_mapping_family == 0) {
|
if (channel_mapping_family == 0) {
|
||||||
g_return_val_if_fail (channels <= 2, NULL);
|
if (channels > 2) {
|
||||||
|
GST_ERROR ("Invalid channels count for channel_mapping_family 0: %d",
|
||||||
|
channels);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream_count > 1) {
|
||||||
|
GST_ERROR ("Invalid stream count for channel_mapping_family 0: %d",
|
||||||
|
stream_count);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (coupled_count > 1) {
|
||||||
|
GST_ERROR ("Invalid coupled count for channel_mapping_family 0: %d",
|
||||||
|
coupled_count);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (channels == 0)
|
if (channels == 0)
|
||||||
channels = 2;
|
channels = 2;
|
||||||
|
|
||||||
g_return_val_if_fail (stream_count == 0 || stream_count == 1, NULL);
|
|
||||||
if (stream_count == 0)
|
if (stream_count == 0)
|
||||||
stream_count = 1;
|
stream_count = 1;
|
||||||
|
|
||||||
g_return_val_if_fail (coupled_count == 0 || coupled_count == 1, NULL);
|
|
||||||
if (coupled_count == 0)
|
if (coupled_count == 0)
|
||||||
coupled_count = channels == 2 ? 1 : 0;
|
coupled_count = channels == 2 ? 1 : 0;
|
||||||
|
|
||||||
|
@ -1315,10 +1331,27 @@ gst_codec_utils_opus_create_caps (guint32 rate,
|
||||||
"coupled-count", G_TYPE_INT, coupled_count, NULL);
|
"coupled-count", G_TYPE_INT, coupled_count, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_val_if_fail (channels > 0, NULL);
|
if (channels == 0) {
|
||||||
g_return_val_if_fail (stream_count > 0, NULL);
|
GST_ERROR ("Invalid channels count: %d", channels);
|
||||||
g_return_val_if_fail (coupled_count <= stream_count, NULL);
|
goto done;
|
||||||
g_return_val_if_fail (channel_mapping != NULL, NULL);
|
}
|
||||||
|
|
||||||
|
if (stream_count == 0) {
|
||||||
|
GST_ERROR ("Invalid stream count: %d", stream_count);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (coupled_count > stream_count) {
|
||||||
|
GST_ERROR ("Coupled count %d > stream count: %d", coupled_count,
|
||||||
|
stream_count);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel_mapping == NULL) {
|
||||||
|
GST_ERROR
|
||||||
|
("A non NULL channel-mapping is needed for channel_mapping_family != 0");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
caps = gst_caps_new_simple ("audio/x-opus",
|
caps = gst_caps_new_simple ("audio/x-opus",
|
||||||
"rate", G_TYPE_INT, rate,
|
"rate", G_TYPE_INT, rate,
|
||||||
|
@ -1338,6 +1371,7 @@ gst_codec_utils_opus_create_caps (guint32 rate,
|
||||||
g_value_unset (&va);
|
g_value_unset (&va);
|
||||||
g_value_unset (&v);
|
g_value_unset (&v);
|
||||||
|
|
||||||
|
done:
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1433,9 +1467,11 @@ gst_codec_utils_opus_create_caps_from_header (GstBuffer * header,
|
||||||
channel_mapping, NULL, NULL))
|
channel_mapping, NULL, NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
caps =
|
if (!(caps =
|
||||||
gst_codec_utils_opus_create_caps (rate, channels, channel_mapping_family,
|
gst_codec_utils_opus_create_caps (rate, channels,
|
||||||
stream_count, coupled_count, channel_mapping);
|
channel_mapping_family, stream_count, coupled_count,
|
||||||
|
channel_mapping)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (!comments) {
|
if (!comments) {
|
||||||
GstTagList *tags = gst_tag_list_new_empty ();
|
GstTagList *tags = gst_tag_list_new_empty ();
|
||||||
|
|
Loading…
Reference in a new issue