asfmux: allocate byte readers on the stack

This commit is contained in:
Tim-Philipp Müller 2014-09-10 19:19:32 +01:00
parent ff444dbf6d
commit c08c99b894
2 changed files with 27 additions and 31 deletions

View file

@ -564,7 +564,7 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
guint8 mo_number_len_type;
guint8 mo_offset_type;
*/
GstByteReader *reader;
GstByteReader reader;
gboolean ret = TRUE;
guint8 first = 0;
guint8 err_length = 0; /* length of the error fields */
@ -584,10 +584,10 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
return FALSE;
}
reader = gst_byte_reader_new (data, size);
gst_byte_reader_init (&reader, data, size);
GST_LOG ("Starting packet parsing, size: %" G_GSIZE_FORMAT, size);
if (!gst_byte_reader_get_uint8 (reader, &first))
if (!gst_byte_reader_get_uint8 (&reader, &first))
goto error;
if (first & 0x80) { /* error correction present */
@ -602,11 +602,11 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
err_cor_len = (first & 0x0F);
err_length += err_cor_len;
GST_DEBUG ("Error correction data length: %d", (gint) err_cor_len);
if (!gst_byte_reader_skip (reader, err_cor_len))
if (!gst_byte_reader_skip (&reader, err_cor_len))
goto error;
/* put payload parsing info first byte in aux var */
if (!gst_byte_reader_get_uint8 (reader, &aux))
if (!gst_byte_reader_get_uint8 (&reader, &aux))
goto error;
} else {
aux = first;
@ -626,7 +626,7 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
GST_DEBUG ("Packet contains multiple payloads");
}
if (!gst_byte_reader_get_uint8 (reader, &aux))
if (!gst_byte_reader_get_uint8 (&reader, &aux))
goto error;
/*
@ -637,13 +637,13 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
/* gets the fields lengths */
GST_LOG ("Getting packet and padding length");
if (!gst_byte_reader_get_asf_var_size_field (reader,
if (!gst_byte_reader_get_asf_var_size_field (&reader,
packet_len_type, &packet_len))
goto error;
if (!gst_byte_reader_skip (reader,
if (!gst_byte_reader_skip (&reader,
gst_asf_get_var_size_field_len (seq_len_type)))
goto error;
if (!gst_byte_reader_get_asf_var_size_field (reader,
if (!gst_byte_reader_get_asf_var_size_field (&reader,
padding_len_type, &padd_len))
goto error;
@ -674,9 +674,9 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
}
GST_LOG ("Getting send time and duration");
if (!gst_byte_reader_get_uint32_le (reader, &send_time))
if (!gst_byte_reader_get_uint32_le (&reader, &send_time))
goto error;
if (!gst_byte_reader_get_uint16_le (reader, &duration))
if (!gst_byte_reader_get_uint16_le (&reader, &duration))
goto error;
has_keyframe = FALSE;
@ -685,9 +685,9 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
has_keyframe = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
} else {
if (mult_payloads) {
ret = gst_asf_parse_mult_payload (reader, &has_keyframe);
ret = gst_asf_parse_mult_payload (&reader, &has_keyframe);
} else {
ret = gst_asf_parse_single_payload (reader, &has_keyframe);
ret = gst_asf_parse_single_payload (&reader, &has_keyframe);
}
}
@ -712,14 +712,12 @@ gst_asf_parse_packet_from_data (guint8 * data, gsize size, GstBuffer * buffer,
packet->seq_field_type = seq_len_type;
packet->err_cor_len = err_length;
gst_byte_reader_free (reader);
return ret;
error:
ret = FALSE;
GST_WARNING ("Error while parsing data packet");
end:
gst_byte_reader_free (reader);
return ret;
}
@ -789,7 +787,7 @@ gst_asf_parse_headers_from_data (guint8 * data, guint size,
gboolean ret = TRUE;
guint32 header_objects = 0;
guint32 i;
GstByteReader *reader;
GstByteReader reader;
guint64 object_size;
object_size = gst_asf_match_and_peek_obj_size (data,
@ -800,32 +798,33 @@ gst_asf_parse_headers_from_data (guint8 * data, guint size,
return FALSE;
}
reader = gst_byte_reader_new (data, size);
gst_byte_reader_init (&reader, data, size);
if (!gst_byte_reader_skip (reader, ASF_GUID_OBJSIZE_SIZE))
if (!gst_byte_reader_skip (&reader, ASF_GUID_OBJSIZE_SIZE))
goto error;
if (!gst_byte_reader_get_uint32_le (reader, &header_objects))
if (!gst_byte_reader_get_uint32_le (&reader, &header_objects))
goto error;
GST_DEBUG ("ASF: Header has %" G_GUINT32_FORMAT " child"
" objects", header_objects);
/* skip reserved bytes */
if (!gst_byte_reader_skip (reader, 2))
if (!gst_byte_reader_skip (&reader, 2))
goto error;
/* iterate through childs of header object */
for (i = 0; i < header_objects; i++) {
const guint8 *guid = NULL;
guint64 obj_size = 0;
if (!gst_byte_reader_get_data (reader, ASF_GUID_SIZE, &guid))
if (!gst_byte_reader_get_data (&reader, ASF_GUID_SIZE, &guid))
goto error;
if (!gst_byte_reader_get_uint64_le (reader, &obj_size))
if (!gst_byte_reader_get_uint64_le (&reader, &obj_size))
goto error;
if (gst_asf_match_guid (guid, &guids[ASF_FILE_PROPERTIES_OBJECT_INDEX])) {
ret = gst_asf_parse_file_properties_obj (reader, file_info);
ret = gst_asf_parse_file_properties_obj (&reader, file_info);
} else {
/* we don't know/care about this object */
if (!gst_byte_reader_skip (reader, obj_size - ASF_GUID_OBJSIZE_SIZE))
if (!gst_byte_reader_skip (&reader, obj_size - ASF_GUID_OBJSIZE_SIZE))
goto error;
}
@ -838,7 +837,6 @@ error:
ret = FALSE;
GST_WARNING ("ASF: Error while parsing headers");
end:
gst_byte_reader_free (reader);
return ret;
}

View file

@ -75,17 +75,17 @@ static GstFlowReturn
gst_asf_parse_parse_data_object (GstAsfParse * asfparse, guint8 * data,
gsize size)
{
GstByteReader *reader;
GstByteReader reader;
GstFlowReturn ret = GST_FLOW_OK;
guint64 packet_count = 0;
GST_DEBUG_OBJECT (asfparse, "Parsing data object");
reader = gst_byte_reader_new (data, size);
gst_byte_reader_init (&reader, data, size);
/* skip to packet count */
if (!gst_byte_reader_skip (reader, 40))
if (!gst_byte_reader_skip (&reader, 40))
goto error;
if (!gst_byte_reader_get_uint64_le (reader, &packet_count))
if (!gst_byte_reader_get_uint64_le (&reader, &packet_count))
goto error;
if (asfparse->asfinfo->packets_count != packet_count) {
@ -97,13 +97,11 @@ gst_asf_parse_parse_data_object (GstAsfParse * asfparse, guint8 * data,
packet_count);
}
gst_byte_reader_free (reader);
return GST_FLOW_OK;
error:
ret = GST_FLOW_ERROR;
GST_ERROR_OBJECT (asfparse, "Error while parsing data object headers");
gst_byte_reader_free (reader);
return ret;
}