wavparse: reflow exit, and fix some leaks
This commit is contained in:
parent
efb5d1b545
commit
0f900afe1f
@ -168,6 +168,15 @@ gst_wavparse_reset (GstWavParse * wav)
|
|||||||
if (wav->tags)
|
if (wav->tags)
|
||||||
gst_tag_list_free (wav->tags);
|
gst_tag_list_free (wav->tags);
|
||||||
wav->tags = NULL;
|
wav->tags = NULL;
|
||||||
|
if (wav->caps)
|
||||||
|
gst_caps_unref (wav->caps);
|
||||||
|
wav->caps = NULL;
|
||||||
|
if (wav->start_segment)
|
||||||
|
gst_event_unref (wav->start_segment);
|
||||||
|
wav->start_segment = NULL;
|
||||||
|
if (wav->close_segment)
|
||||||
|
gst_event_unref (wav->close_segment);
|
||||||
|
wav->close_segment = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1154,12 +1163,12 @@ gst_waveparse_ignore_chunk (GstWavParse * wav, GstBuffer * buf, guint32 tag,
|
|||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_wavparse_stream_headers (GstWavParse * wav)
|
gst_wavparse_stream_headers (GstWavParse * wav)
|
||||||
{
|
{
|
||||||
GstFlowReturn res;
|
GstFlowReturn res = GST_FLOW_OK;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
gst_riff_strf_auds *header = NULL;
|
gst_riff_strf_auds *header = NULL;
|
||||||
guint32 tag, size;
|
guint32 tag, size;
|
||||||
gboolean gotdata = FALSE;
|
gboolean gotdata = FALSE;
|
||||||
GstCaps *caps;
|
GstCaps *caps = NULL;
|
||||||
gchar *codec_name = NULL;
|
gchar *codec_name = NULL;
|
||||||
GstEvent **event_p;
|
GstEvent **event_p;
|
||||||
GstFormat bformat;
|
GstFormat bformat;
|
||||||
@ -1172,7 +1181,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
/* The header starts with a 'fmt ' tag */
|
/* The header starts with a 'fmt ' tag */
|
||||||
if (wav->streaming) {
|
if (wav->streaming) {
|
||||||
if (!gst_wavparse_peek_chunk (wav, &tag, &size))
|
if (!gst_wavparse_peek_chunk (wav, &tag, &size))
|
||||||
return GST_FLOW_OK;
|
return res;
|
||||||
|
|
||||||
gst_adapter_flush (wav->adapter, 8);
|
gst_adapter_flush (wav->adapter, 8);
|
||||||
wav->offset += 8;
|
wav->offset += 8;
|
||||||
@ -1314,7 +1323,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
while (!gotdata) {
|
while (!gotdata) {
|
||||||
if (wav->streaming) {
|
if (wav->streaming) {
|
||||||
if (!gst_wavparse_peek_chunk_info (wav, &tag, &size))
|
if (!gst_wavparse_peek_chunk_info (wav, &tag, &size))
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
if ((res =
|
if ((res =
|
||||||
gst_pad_pull_range (wav->sinkpad, wav->offset, 8,
|
gst_pad_pull_range (wav->sinkpad, wav->offset, 8,
|
||||||
@ -1365,7 +1374,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
if (size < data_size) {
|
if (size < data_size) {
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
||||||
/* need more data */
|
/* need more data */
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk",
|
GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk",
|
||||||
data_size, size);
|
data_size, size);
|
||||||
@ -1376,7 +1385,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
const guint8 *data = NULL;
|
const guint8 *data = NULL;
|
||||||
|
|
||||||
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
gst_adapter_flush (wav->adapter, 8);
|
gst_adapter_flush (wav->adapter, 8);
|
||||||
data = gst_adapter_peek (wav->adapter, data_size);
|
data = gst_adapter_peek (wav->adapter, data_size);
|
||||||
@ -1397,7 +1406,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
} else {
|
} else {
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
||||||
/* need more data */
|
/* need more data */
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1410,7 +1419,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
if (size < data_size) {
|
if (size < data_size) {
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size)) {
|
||||||
/* need more data */
|
/* need more data */
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk",
|
GST_DEBUG_OBJECT (wav, "need %d, available %d; ignoring chunk",
|
||||||
data_size, size);
|
data_size, size);
|
||||||
@ -1418,7 +1427,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
}
|
}
|
||||||
if (wav->streaming) {
|
if (wav->streaming) {
|
||||||
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
gst_adapter_flush (wav->adapter, 8);
|
gst_adapter_flush (wav->adapter, 8);
|
||||||
acid = (const gst_riff_acid *) gst_adapter_peek (wav->adapter,
|
acid = (const gst_riff_acid *) gst_adapter_peek (wav->adapter,
|
||||||
@ -1454,7 +1463,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
const guint8 *data = NULL;
|
const guint8 *data = NULL;
|
||||||
|
|
||||||
if (gst_adapter_available (wav->adapter) < 12) {
|
if (gst_adapter_available (wav->adapter) < 12) {
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
data = gst_adapter_peek (wav->adapter, 12);
|
data = gst_adapter_peek (wav->adapter, 12);
|
||||||
ltag = GST_READ_UINT32_LE (data + 8);
|
ltag = GST_READ_UINT32_LE (data + 8);
|
||||||
@ -1474,7 +1483,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
GST_INFO_OBJECT (wav, "Have LIST chunk INFO size %u", data_size);
|
GST_INFO_OBJECT (wav, "Have LIST chunk INFO size %u", data_size);
|
||||||
if (wav->streaming) {
|
if (wav->streaming) {
|
||||||
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
if (!gst_wavparse_peek_chunk (wav, &tag, &size)) {
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
}
|
}
|
||||||
gst_adapter_flush (wav->adapter, 12);
|
gst_adapter_flush (wav->adapter, 12);
|
||||||
wav->offset += 12;
|
wav->offset += 12;
|
||||||
@ -1514,7 +1523,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
GST_FOURCC_ARGS (ltag));
|
GST_FOURCC_ARGS (ltag));
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
||||||
/* need more data */
|
/* need more data */
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1522,7 +1531,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
default:
|
default:
|
||||||
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
if (!gst_waveparse_ignore_chunk (wav, buf, tag, size))
|
||||||
/* need more data */
|
/* need more data */
|
||||||
return GST_FLOW_OK;
|
goto exit;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1570,75 +1579,78 @@ gst_wavparse_stream_headers (GstWavParse * wav)
|
|||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
/* ERROR */
|
/* ERROR */
|
||||||
|
exit:
|
||||||
|
{
|
||||||
|
if (codec_name)
|
||||||
|
g_free (codec_name);
|
||||||
|
if (header)
|
||||||
|
g_free (header);
|
||||||
|
if (caps)
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
fail:
|
||||||
|
{
|
||||||
|
res = GST_FLOW_ERROR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
invalid_wav:
|
invalid_wav:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL),
|
||||||
("Invalid WAV header (no fmt at start): %"
|
("Invalid WAV header (no fmt at start): %"
|
||||||
GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)));
|
GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag)));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
parse_header_error:
|
parse_header_error:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL),
|
||||||
("Couldn't parse audio header"));
|
("Couldn't parse audio header"));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
no_channels:
|
no_channels:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
||||||
("Stream claims to contain no channels - invalid data"));
|
("Stream claims to contain no channels - invalid data"));
|
||||||
g_free (header);
|
goto fail;
|
||||||
g_free (codec_name);
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
no_rate:
|
no_rate:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
||||||
("Stream with sample_rate == 0 - invalid data"));
|
("Stream with sample_rate == 0 - invalid data"));
|
||||||
g_free (header);
|
goto fail;
|
||||||
g_free (codec_name);
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
invalid_blockalign:
|
invalid_blockalign:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
||||||
("Stream claims blockalign = %u, which is more than %u - invalid data",
|
("Stream claims blockalign = %u, which is more than %u - invalid data",
|
||||||
wav->blockalign, wav->channels * (guint) ceil (wav->depth / 8.0)));
|
wav->blockalign, wav->channels * (guint) ceil (wav->depth / 8.0)));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
invalid_bps:
|
invalid_bps:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
||||||
("Stream claims av_bsp = %u, which is more than %u - invalid data",
|
("Stream claims av_bsp = %u, which is more than %u - invalid data",
|
||||||
wav->av_bps, wav->blockalign * wav->rate));
|
wav->av_bps, wav->blockalign * wav->rate));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
no_bytes_per_sample:
|
no_bytes_per_sample:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, FAILED, (NULL),
|
||||||
("Could not caluclate bytes per sample - invalid data"));
|
("Could not caluclate bytes per sample - invalid data"));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
unknown_format:
|
unknown_format:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, TYPE_NOT_FOUND, (NULL),
|
||||||
("No caps found for format 0x%x, %d channels, %d Hz",
|
("No caps found for format 0x%x, %d channels, %d Hz",
|
||||||
wav->format, wav->channels, wav->rate));
|
wav->format, wav->channels, wav->rate));
|
||||||
g_free (header);
|
goto fail;
|
||||||
g_free (codec_name);
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
header_read_error:
|
header_read_error:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL),
|
GST_ELEMENT_ERROR (wav, STREAM, DEMUX, (NULL),
|
||||||
("Couldn't read in header %d (%s)", res, gst_flow_get_name (res)));
|
("Couldn't read in header %d (%s)", res, gst_flow_get_name (res)));
|
||||||
g_free (codec_name);
|
goto fail;
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user