mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
h264parse: Make proper use of the h264parser lib in parse_chain
Minor debugging logs fixes
This commit is contained in:
parent
9c221f492d
commit
f94236078c
1 changed files with 38 additions and 57 deletions
|
@ -339,8 +339,7 @@ gst_h264_parse_wrap_nal (GstH264Parse * h264parse, guint format, guint8 * data,
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
const guint nl = h264parse->nal_length_size;
|
const guint nl = h264parse->nal_length_size;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (h264parse, "nal length %d %d", size,
|
GST_DEBUG_OBJECT (h264parse, "nal length %d", size);
|
||||||
h264parse->nal_length_size);
|
|
||||||
|
|
||||||
buf = gst_buffer_new_and_alloc (size + nl + 4);
|
buf = gst_buffer_new_and_alloc (size + nl + 4);
|
||||||
if (format == GST_H264_PARSE_FORMAT_AVC) {
|
if (format == GST_H264_PARSE_FORMAT_AVC) {
|
||||||
|
@ -1243,7 +1242,8 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps)
|
||||||
/* this is the number of bytes in front of the NAL units to mark their
|
/* this is the number of bytes in front of the NAL units to mark their
|
||||||
* length */
|
* length */
|
||||||
h264parse->nal_length_size = (data[4] & 0x03) + 1;
|
h264parse->nal_length_size = (data[4] & 0x03) + 1;
|
||||||
GST_DEBUG_OBJECT (h264parse, "nal length %u", h264parse->nal_length_size);
|
GST_DEBUG_OBJECT (h264parse, "nal length size %u",
|
||||||
|
h264parse->nal_length_size);
|
||||||
|
|
||||||
num_sps = data[5] & 0x1f;
|
num_sps = data[5] & 0x1f;
|
||||||
off = 6;
|
off = 6;
|
||||||
|
@ -1340,50 +1340,36 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
GstH264Parse *h264parse = GST_H264_PARSE (GST_PAD_PARENT (pad));
|
GstH264Parse *h264parse = GST_H264_PARSE (GST_PAD_PARENT (pad));
|
||||||
|
|
||||||
if (h264parse->packetized && buffer) {
|
if (h264parse->packetized && buffer) {
|
||||||
GstByteReader br;
|
|
||||||
GstBuffer *sub;
|
GstBuffer *sub;
|
||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
guint32 len;
|
GstH264ParserResult parse_res;
|
||||||
GstH264NalUnit nalu;
|
GstH264NalUnit nalu;
|
||||||
const guint nl = h264parse->nal_length_size;
|
const guint nl = h264parse->nal_length_size;
|
||||||
|
|
||||||
|
if (nl < 1 || nl > 4) {
|
||||||
|
GST_DEBUG_OBJECT (h264parse, "insufficient data to split input");
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
|
||||||
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
|
}
|
||||||
|
|
||||||
GST_LOG_OBJECT (h264parse, "processing packet buffer of size %d",
|
GST_LOG_OBJECT (h264parse, "processing packet buffer of size %d",
|
||||||
GST_BUFFER_SIZE (buffer));
|
GST_BUFFER_SIZE (buffer));
|
||||||
|
|
||||||
gst_byte_reader_init_from_buffer (&br, buffer);
|
parse_res = gst_h264_parser_identify_nalu_avc (h264parse->nalparser,
|
||||||
while (ret == GST_FLOW_OK && gst_byte_reader_get_remaining (&br)) {
|
GST_BUFFER_DATA (buffer), 0, GST_BUFFER_SIZE (buffer), nl, &nalu);
|
||||||
|
|
||||||
|
while (parse_res == GST_H264_PARSER_OK) {
|
||||||
GST_DEBUG_OBJECT (h264parse, "AVC nal offset %d",
|
GST_DEBUG_OBJECT (h264parse, "AVC nal offset %d",
|
||||||
gst_byte_reader_get_pos (&br));
|
nalu.offset + nalu.size);
|
||||||
if (gst_byte_reader_get_remaining (&br) < nl)
|
|
||||||
goto parse_failed;
|
|
||||||
switch (nl) {
|
|
||||||
case 4:
|
|
||||||
len = gst_byte_reader_get_uint32_be_unchecked (&br);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
len = gst_byte_reader_get_uint24_be_unchecked (&br);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
len = gst_byte_reader_get_uint16_be_unchecked (&br);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
len = gst_byte_reader_get_uint8_unchecked (&br);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto not_negotiated;
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (h264parse, "AVC nal size %d", len);
|
|
||||||
|
|
||||||
if (gst_byte_reader_get_remaining (&br) < len)
|
|
||||||
goto parse_failed;
|
|
||||||
if (h264parse->split_packetized) {
|
if (h264parse->split_packetized) {
|
||||||
/* convert to NAL aligned byte stream input */
|
/* convert to NAL aligned byte stream input */
|
||||||
sub = gst_h264_parse_wrap_nal (h264parse, GST_H264_PARSE_FORMAT_BYTE,
|
sub = gst_h264_parse_wrap_nal (h264parse, GST_H264_PARSE_FORMAT_BYTE,
|
||||||
(guint8 *) gst_byte_reader_get_data_unchecked (&br, len), len);
|
nalu.data + nalu.offset, nalu.size);
|
||||||
/* at least this should make sense */
|
/* at least this should make sense */
|
||||||
GST_BUFFER_TIMESTAMP (sub) = GST_BUFFER_TIMESTAMP (buffer);
|
GST_BUFFER_TIMESTAMP (sub) = GST_BUFFER_TIMESTAMP (buffer);
|
||||||
GST_LOG_OBJECT (h264parse, "pushing NAL of size %d", len);
|
GST_LOG_OBJECT (h264parse, "pushing NAL of size %d", nalu.size);
|
||||||
ret = h264parse->parse_chain (pad, sub);
|
ret = h264parse->parse_chain (pad, sub);
|
||||||
} else {
|
} else {
|
||||||
/* pass-through: no looking for frames (and nal processing),
|
/* pass-through: no looking for frames (and nal processing),
|
||||||
|
@ -1391,13 +1377,15 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
/* NOTE: so if it is really configured to do so,
|
/* NOTE: so if it is really configured to do so,
|
||||||
* pre_push can/will still insert codec-data at intervals,
|
* pre_push can/will still insert codec-data at intervals,
|
||||||
* which is not really pure pass-through, but anyway ... */
|
* which is not really pure pass-through, but anyway ... */
|
||||||
gst_h264_parser_identify_nalu (h264parse->nalparser,
|
|
||||||
GST_BUFFER_DATA (buffer), gst_byte_reader_get_pos (&br) - nl,
|
|
||||||
GST_BUFFER_SIZE (buffer), &nalu);
|
|
||||||
gst_h264_parse_process_nal (h264parse, &nalu);
|
gst_h264_parse_process_nal (h264parse, &nalu);
|
||||||
gst_byte_reader_skip_unchecked (&br, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parse_res = gst_h264_parser_identify_nalu_avc (h264parse->nalparser,
|
||||||
|
GST_BUFFER_DATA (buffer), nalu.offset + nalu.size,
|
||||||
|
GST_BUFFER_SIZE (buffer), nl, &nalu);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (h264parse->split_packetized) {
|
if (h264parse->split_packetized) {
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1406,31 +1394,24 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
* ensure nothing happens with this later on */
|
* ensure nothing happens with this later on */
|
||||||
gst_adapter_clear (h264parse->frame_out);
|
gst_adapter_clear (h264parse->frame_out);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
if (parse_res == GST_H264_PARSER_NO_NAL_END ||
|
||||||
return h264parse->parse_chain (pad, buffer);
|
parse_res == GST_H264_PARSER_BROKEN_DATA) {
|
||||||
|
|
||||||
/* ERRORS */
|
if (h264parse->split_packetized) {
|
||||||
not_negotiated:
|
GST_ELEMENT_ERROR (h264parse, STREAM, FAILED, (NULL),
|
||||||
{
|
("invalid AVC input data"));
|
||||||
GST_DEBUG_OBJECT (h264parse, "insufficient data to split input");
|
gst_buffer_unref (buffer);
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
return GST_FLOW_ERROR;
|
||||||
}
|
} else {
|
||||||
parse_failed:
|
/* do not meddle to much in this case */
|
||||||
{
|
GST_DEBUG_OBJECT (h264parse, "parsing packet failed");
|
||||||
if (h264parse->split_packetized) {
|
}
|
||||||
GST_ELEMENT_ERROR (h264parse, STREAM, FAILED, (NULL),
|
|
||||||
("invalid AVC input data"));
|
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
return GST_FLOW_ERROR;
|
|
||||||
} else {
|
|
||||||
/* do not meddle to much in this case */
|
|
||||||
GST_DEBUG_OBJECT (h264parse, "parsing packet failed");
|
|
||||||
goto exit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return h264parse->parse_chain (pad, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue