mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
gst/h264parse/gsth264parse.*: Improve debugging.
Original commit message from CVS: * gst/h264parse/gsth264parse.c: (gst_h264_parse_clear_queues), (gst_h264_parse_flush_decode), (gst_h264_parse_queue_buffer), (gst_h264_parse_find_start_reverse), (gst_h264_parse_chain_reverse), (gst_h264_parse_chain): * gst/h264parse/gsth264parse.h: Improve debugging. Fix buffer splitting at sync codes and leftover buffer after scanning.
This commit is contained in:
parent
63490f4b48
commit
b0e6afa82e
3 changed files with 41 additions and 12 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2008-01-17 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/h264parse/gsth264parse.c: (gst_h264_parse_clear_queues),
|
||||||
|
(gst_h264_parse_flush_decode), (gst_h264_parse_queue_buffer),
|
||||||
|
(gst_h264_parse_find_start_reverse),
|
||||||
|
(gst_h264_parse_chain_reverse), (gst_h264_parse_chain):
|
||||||
|
* gst/h264parse/gsth264parse.h:
|
||||||
|
Improve debugging.
|
||||||
|
Fix buffer splitting at sync codes and leftover buffer after
|
||||||
|
scanning.
|
||||||
|
|
||||||
2008-01-17 Edgard Lima <edgard.lima@indt.org.br>
|
2008-01-17 Edgard Lima <edgard.lima@indt.org.br>
|
||||||
|
|
||||||
* ext/metadata/TODO:
|
* ext/metadata/TODO:
|
||||||
|
|
|
@ -367,6 +367,11 @@ gst_h264_parse_clear_queues (GstH264Parse * h264parse)
|
||||||
h264parse->decode = gst_nal_list_delete_head (h264parse->decode);
|
h264parse->decode = gst_nal_list_delete_head (h264parse->decode);
|
||||||
}
|
}
|
||||||
h264parse->decode = NULL;
|
h264parse->decode = NULL;
|
||||||
|
h264parse->decode_len = 0;
|
||||||
|
if (h264parse->prev) {
|
||||||
|
gst_buffer_unref (h264parse->prev);
|
||||||
|
h264parse->prev = NULL;
|
||||||
|
}
|
||||||
gst_adapter_clear (h264parse->adapter);
|
gst_adapter_clear (h264parse->adapter);
|
||||||
h264parse->have_i_frame = FALSE;
|
h264parse->have_i_frame = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -476,6 +481,7 @@ gst_h264_parse_flush_decode (GstH264Parse * h264parse)
|
||||||
res = gst_pad_push (h264parse->srcpad, buf);
|
res = gst_pad_push (h264parse->srcpad, buf);
|
||||||
|
|
||||||
h264parse->decode = gst_nal_list_delete_head (h264parse->decode);
|
h264parse->decode = gst_nal_list_delete_head (h264parse->decode);
|
||||||
|
h264parse->decode_len--;
|
||||||
}
|
}
|
||||||
/* the i frame is gone now */
|
/* the i frame is gone now */
|
||||||
h264parse->have_i_frame = FALSE;
|
h264parse->have_i_frame = FALSE;
|
||||||
|
@ -575,8 +581,11 @@ gst_h264_parse_queue_buffer (GstH264Parse * parse, GstBuffer * buffer)
|
||||||
/* we're going to add a new I-frame in the queue */
|
/* we're going to add a new I-frame in the queue */
|
||||||
parse->have_i_frame = TRUE;
|
parse->have_i_frame = TRUE;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (parse, "copy %d bytes of NAL to decode queue", size);
|
|
||||||
parse->decode = gst_nal_list_prepend_link (parse->decode, link);
|
parse->decode = gst_nal_list_prepend_link (parse->decode, link);
|
||||||
|
parse->decode_len++;
|
||||||
|
GST_DEBUG_OBJECT (parse,
|
||||||
|
"copied %d bytes of NAL to decode queue. queue size %d", size,
|
||||||
|
parse->decode_len);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -590,7 +599,6 @@ gst_h264_parse_find_start_reverse (GstH264Parse * parse, guint8 * data,
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
/* the sync code is kept in reverse */
|
/* the sync code is kept in reverse */
|
||||||
search = (search << 8) | (data[size - 1]);
|
search = (search << 8) | (data[size - 1]);
|
||||||
GST_DEBUG_OBJECT (parse, "start code 0x%08x", search);
|
|
||||||
if (search == 0x01000000)
|
if (search == 0x01000000)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -618,7 +626,8 @@ gst_h264_parse_chain_reverse (GstH264Parse * h264parse, gboolean discont,
|
||||||
|
|
||||||
/* init start code accumulator */
|
/* init start code accumulator */
|
||||||
stop = -1;
|
stop = -1;
|
||||||
prev = NULL;
|
prev = h264parse->prev;
|
||||||
|
h264parse->prev = NULL;
|
||||||
|
|
||||||
while (h264parse->gather) {
|
while (h264parse->gather) {
|
||||||
GstBuffer *gbuf;
|
GstBuffer *gbuf;
|
||||||
|
@ -642,6 +651,7 @@ gst_h264_parse_chain_reverse (GstH264Parse * h264parse, gboolean discont,
|
||||||
if (prev) {
|
if (prev) {
|
||||||
/* if we have a previous buffer or a leftover, merge them together
|
/* if we have a previous buffer or a leftover, merge them together
|
||||||
* now */
|
* now */
|
||||||
|
GST_DEBUG_OBJECT (h264parse, "merging previous buffer");
|
||||||
gbuf = gst_buffer_join (gbuf, prev);
|
gbuf = gst_buffer_join (gbuf, prev);
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
}
|
}
|
||||||
|
@ -650,35 +660,40 @@ gst_h264_parse_chain_reverse (GstH264Parse * h264parse, gboolean discont,
|
||||||
data = GST_BUFFER_DATA (gbuf);
|
data = GST_BUFFER_DATA (gbuf);
|
||||||
|
|
||||||
while (last > 0) {
|
while (last > 0) {
|
||||||
|
GST_DEBUG_OBJECT (h264parse, "scan from %u", last);
|
||||||
/* find a start code searching backwards in this buffer */
|
/* find a start code searching backwards in this buffer */
|
||||||
start =
|
start =
|
||||||
gst_h264_parse_find_start_reverse (h264parse, data, last, &code);
|
gst_h264_parse_find_start_reverse (h264parse, data, last, &code);
|
||||||
GST_DEBUG_OBJECT (h264parse, "found start %d", start);
|
|
||||||
|
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
GstBuffer *decode;
|
GstBuffer *decode;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (h264parse, "found start code at %u", start);
|
||||||
|
|
||||||
/* we found a start code, copy everything starting from it to the
|
/* we found a start code, copy everything starting from it to the
|
||||||
* decode queue. */
|
* decode queue. */
|
||||||
if (start != 0)
|
|
||||||
decode = gst_buffer_create_sub (gbuf, start, last - start);
|
decode = gst_buffer_create_sub (gbuf, start, last - start);
|
||||||
else
|
|
||||||
decode = gbuf;
|
|
||||||
|
|
||||||
/* see what we have here */
|
/* see what we have here */
|
||||||
res = gst_h264_parse_queue_buffer (h264parse, decode);
|
res = gst_h264_parse_queue_buffer (h264parse, decode);
|
||||||
|
|
||||||
|
last = start;
|
||||||
} else {
|
} else {
|
||||||
/* no start code found, keep the buffer and merge with potential next
|
/* no start code found, keep the buffer and merge with potential next
|
||||||
* buffer. */
|
* buffer. */
|
||||||
GST_DEBUG_OBJECT (h264parse, "keeping buffer");
|
GST_DEBUG_OBJECT (h264parse, "no start code, keeping buffer to %u",
|
||||||
|
last);
|
||||||
prev = gst_buffer_create_sub (gbuf, 0, last);
|
prev = gst_buffer_create_sub (gbuf, 0, last);
|
||||||
gst_buffer_unref (gbuf);
|
gst_buffer_unref (gbuf);
|
||||||
}
|
break;
|
||||||
last = start;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (prev) {
|
||||||
|
GST_DEBUG_OBJECT (h264parse, "keeping buffer");
|
||||||
|
h264parse->prev = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
/* add buffer to gather queue */
|
/* add buffer to gather queue */
|
||||||
GST_DEBUG_OBJECT (h264parse, "gathering buffer %p, size %u", buffer,
|
GST_DEBUG_OBJECT (h264parse, "gathering buffer %p, size %u", buffer,
|
||||||
|
@ -717,7 +732,8 @@ gst_h264_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
|
|
||||||
discont = GST_BUFFER_IS_DISCONT (buffer);
|
discont = GST_BUFFER_IS_DISCONT (buffer);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (h264parse, "received buffer");
|
GST_DEBUG_OBJECT (h264parse, "received buffer of size %u",
|
||||||
|
GST_BUFFER_SIZE (buffer));
|
||||||
|
|
||||||
if (h264parse->segment.rate > 0.0)
|
if (h264parse->segment.rate > 0.0)
|
||||||
res = gst_h264_parse_chain_forward (h264parse, discont, buffer);
|
res = gst_h264_parse_chain_forward (h264parse, discont, buffer);
|
||||||
|
|
|
@ -59,7 +59,9 @@ struct _GstH264Parse
|
||||||
|
|
||||||
/* gather/decode queues for reverse playback */
|
/* gather/decode queues for reverse playback */
|
||||||
GList *gather;
|
GList *gather;
|
||||||
|
GstBuffer *prev;
|
||||||
GstNalList *decode;
|
GstNalList *decode;
|
||||||
|
gint decode_len;
|
||||||
gboolean have_sps;
|
gboolean have_sps;
|
||||||
gboolean have_pps;
|
gboolean have_pps;
|
||||||
gboolean have_i_frame;
|
gboolean have_i_frame;
|
||||||
|
|
Loading…
Reference in a new issue