summaryrefslogtreecommitdiffstats
path: root/ext/metadata/gstmetadataparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/metadata/gstmetadataparse.c')
-rw-r--r--ext/metadata/gstmetadataparse.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/ext/metadata/gstmetadataparse.c b/ext/metadata/gstmetadataparse.c
index a8ded250..d95a9399 100644
--- a/ext/metadata/gstmetadataparse.c
+++ b/ext/metadata/gstmetadataparse.c
@@ -932,10 +932,11 @@ gst_metadata_parse_calculate_offsets (GstMetadataParse * filter)
}
/*
+ * Do parsing step-by-step and reconfigure caps if need
* return:
- * -1 -> error
- * 0 -> succeded
- * 1 -> need more data
+ * META_PARSING_ERROR
+ * META_PARSING_DONE
+ * META_PARSING_NEED_MORE_DATA
*/
static int
@@ -943,7 +944,7 @@ gst_metadata_parse_parse (GstMetadataParse * filter, const guint8 * buf,
guint32 size)
{
- int ret = -1;
+ int ret = META_PARSING_ERROR;
filter->next_offset = 0;
filter->next_size = 0;
@@ -951,14 +952,14 @@ gst_metadata_parse_parse (GstMetadataParse * filter, const guint8 * buf,
ret = metadata_parse (&filter->parse_data, buf, size,
&filter->next_offset, &filter->next_size);
- if (ret < 0) {
+ if (ret == META_PARSING_ERROR) {
if (META_DATA_IMG_TYPE (filter->parse_data) == IMG_NONE) {
/* image type not recognized */
GST_ELEMENT_ERROR (filter, STREAM, TYPE_NOT_FOUND, (NULL),
("Only jpeg and png are supported"));
goto done;
}
- } else if (ret > 0) {
+ } else if (ret == META_PARSING_NEED_MORE_DATA) {
filter->need_more_data = TRUE;
} else {
gst_metadata_parse_calculate_offsets (filter);
@@ -968,13 +969,14 @@ gst_metadata_parse_parse (GstMetadataParse * filter, const guint8 * buf,
filter->need_send_tag = TRUE;
}
+ /* reconfigure caps if it is different from type detected by 'metadata_parse' function */
if (filter->img_type != META_DATA_IMG_TYPE (filter->parse_data)) {
filter->img_type = META_DATA_IMG_TYPE (filter->parse_data);
if (!gst_metadata_parse_configure_caps (filter)) {
GST_ELEMENT_ERROR (filter, STREAM, FORMAT, (NULL),
("Couldn't reconfigure caps for %s",
gst_metadata_parse_get_type_name (filter->img_type)));
- ret = -1;
+ ret = META_PARSING_ERROR;
goto done;
}
}
@@ -1047,8 +1049,11 @@ gst_metadata_parse_chain (GstPad * pad, GstBuffer * buf)
const guint8 *new_buf =
gst_adapter_peek (filter->adapter_parsing, adpt_size);
- if (gst_metadata_parse_parse (filter, new_buf, adpt_size) < 0)
+ if (gst_metadata_parse_parse (filter, new_buf,
+ adpt_size) == META_PARSING_ERROR) {
+ ret = GST_FLOW_ERROR;
goto done;
+ }
}
}
@@ -1151,8 +1156,13 @@ gst_metadata_parse_pull_range_parse (GstMetadataParse * filter)
offset += filter->next_offset;
+ /* 'filter->next_size' only says the minimum required number of bytes.
+ We try provided more bytes (4096) just to avoid a lot of calls to 'metadata_parse'
+ returning META_PARSING_NEED_MORE_DATA */
if (filter->next_size < 4096) {
if (duration - offset < 4096) {
+ /* In case there is no 4096 bytes available upstream.
+ It should be done upstream but we do here for safety */
filter->next_size = duration - offset;
} else {
filter->next_size = 4096;
@@ -1169,14 +1179,14 @@ gst_metadata_parse_pull_range_parse (GstMetadataParse * filter)
res =
gst_metadata_parse_parse (filter, GST_BUFFER_DATA (buf),
GST_BUFFER_SIZE (buf));
- if (res < 0) {
+ if (res == META_PARSING_ERROR) {
ret = FALSE;
goto done;
}
gst_buffer_unref (buf);
- } while (res > 0);
+ } while (res == META_PARSING_NEED_MORE_DATA);
done: