mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
deinterlace: Improve debugging and clean up some code
This commit is contained in:
parent
101123a75d
commit
cd33adbd96
1 changed files with 64 additions and 34 deletions
|
@ -143,7 +143,7 @@ gst_deinterlace_simple_method_deinterlace_frame (GstDeinterlaceMethod * self,
|
|||
|
||||
field0 = GST_BUFFER_DATA (parent->field_history[cur_field_idx].buf);
|
||||
|
||||
g_assert (dm_class->fields_required <= 4);
|
||||
g_return_if_fail (dm_class->fields_required <= 4);
|
||||
|
||||
if (dm_class->fields_required >= 2)
|
||||
field1 = GST_BUFFER_DATA (parent->field_history[cur_field_idx + 1].buf);
|
||||
|
@ -418,6 +418,7 @@ GST_BOILERPLATE_FULL (GstDeinterlace, gst_deinterlace, GstElement,
|
|||
static void
|
||||
gst_deinterlace_set_method (GstDeinterlace * self, GstDeinterlaceMethods method)
|
||||
{
|
||||
GST_DEBUG_OBJECT (self, "Setting new method %d", method);
|
||||
|
||||
if (self->method) {
|
||||
gst_child_proxy_child_removed (GST_OBJECT (self),
|
||||
|
@ -476,6 +477,13 @@ gst_deinterlace_clip_buffer (GstDeinterlace * self, GstBuffer * buffer)
|
|||
GstClockTime start, stop;
|
||||
gint64 cstart, cstop;
|
||||
|
||||
GST_DEBUG_OBJECT (self,
|
||||
"Clipping buffer to the current segment: %" GST_TIME_FORMAT " -- %"
|
||||
GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
|
||||
GST_DEBUG_OBJECT (self, "Current segment: %" GST_SEGMENT_FORMAT,
|
||||
&self->segment);
|
||||
|
||||
if (G_UNLIKELY (self->segment.format != GST_FORMAT_TIME))
|
||||
goto beach;
|
||||
if (G_UNLIKELY (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer)))
|
||||
|
@ -493,6 +501,14 @@ gst_deinterlace_clip_buffer (GstDeinterlace * self, GstBuffer * buffer)
|
|||
GST_BUFFER_DURATION (buffer) = cstop - cstart;
|
||||
|
||||
beach:
|
||||
if (ret)
|
||||
GST_DEBUG_OBJECT (self,
|
||||
"Clipped buffer to the current segment: %" GST_TIME_FORMAT " -- %"
|
||||
GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
|
||||
else
|
||||
GST_DEBUG_OBJECT (self, "Buffer outside the current segment -- dropping");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -511,7 +527,7 @@ gst_deinterlace_base_init (gpointer klass)
|
|||
"Filter/Video",
|
||||
"Deinterlace Methods ported from DScaler/TvTime",
|
||||
"Martin Eikermann <meiker@upb.de>, "
|
||||
"Sebastian Dröge <slomo@circular-chaos.org>");
|
||||
"Sebastian Dröge <sebastian.droege@collabora.co.uk>");
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -669,7 +685,9 @@ gst_deinterlace_child_proxy_get_child_by_index (GstChildProxy * child_proxy,
|
|||
static guint
|
||||
gst_deinterlace_child_proxy_get_children_count (GstChildProxy * child_proxy)
|
||||
{
|
||||
return 1;
|
||||
GstDeinterlace *self = GST_DEINTERLACE (child_proxy);
|
||||
|
||||
return ((self->method) ? 1 : 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -728,6 +746,8 @@ gst_deinterlace_reset_history (GstDeinterlace * self)
|
|||
{
|
||||
gint i;
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Resetting history");
|
||||
|
||||
for (i = 0; i < self->history_count; i++) {
|
||||
if (self->field_history[i].buf) {
|
||||
gst_buffer_unref (self->field_history[i].buf);
|
||||
|
@ -745,6 +765,8 @@ gst_deinterlace_reset_history (GstDeinterlace * self)
|
|||
static void
|
||||
gst_deinterlace_reset (GstDeinterlace * self)
|
||||
{
|
||||
GST_DEBUG_OBJECT (self, "Resetting internal state");
|
||||
|
||||
self->row_stride = 0;
|
||||
self->frame_width = 0;
|
||||
self->frame_height = 0;
|
||||
|
@ -849,31 +871,25 @@ gst_deinterlace_finalize (GObject * object)
|
|||
static GstBuffer *
|
||||
gst_deinterlace_pop_history (GstDeinterlace * self)
|
||||
{
|
||||
GstBuffer *buffer = NULL;
|
||||
GstBuffer *buffer;
|
||||
|
||||
g_assert (self->history_count > 0);
|
||||
g_return_val_if_fail (self->history_count > 0, NULL);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Pop last history buffer -- current history size %d",
|
||||
self->history_count);
|
||||
|
||||
buffer = self->field_history[self->history_count - 1].buf;
|
||||
|
||||
self->history_count--;
|
||||
GST_DEBUG_OBJECT (self, "pop, size(history): %d", self->history_count);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Returning buffer: %" GST_TIME_FORMAT
|
||||
" with duration %" GST_TIME_FORMAT " and size %u",
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static GstBuffer *
|
||||
gst_deinterlace_head_history (GstDeinterlace * self)
|
||||
{
|
||||
return self->field_history[self->history_count - 1].buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* invariant: field with smallest timestamp is self->field_history[self->history_count-1]
|
||||
|
||||
*/
|
||||
|
||||
static void
|
||||
gst_deinterlace_push_history (GstDeinterlace * self, GstBuffer * buffer)
|
||||
{
|
||||
|
@ -888,7 +904,12 @@ gst_deinterlace_push_history (GstDeinterlace * self, GstBuffer * buffer)
|
|||
guint fields_to_push = (onefield) ? 1 : (!repeated) ? 2 : 3;
|
||||
gint field1_flags, field2_flags;
|
||||
|
||||
g_assert (self->history_count < MAX_FIELD_HISTORY - fields_to_push);
|
||||
g_return_if_fail (self->history_count < MAX_FIELD_HISTORY - fields_to_push);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Pushing new buffer to the history: %" GST_TIME_FORMAT
|
||||
" with duration %" GST_TIME_FORMAT " and size %u",
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
|
||||
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)), GST_BUFFER_SIZE (buffer));
|
||||
|
||||
for (i = MAX_FIELD_HISTORY - 1; i >= fields_to_push; i--) {
|
||||
self->field_history[i].buf = self->field_history[i - fields_to_push].buf;
|
||||
|
@ -952,7 +973,9 @@ gst_deinterlace_push_history (GstDeinterlace * self, GstBuffer * buffer)
|
|||
}
|
||||
|
||||
self->history_count += fields_to_push;
|
||||
GST_DEBUG_OBJECT (self, "push, size(history): %d", self->history_count);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Pushed buffer -- current history size %d",
|
||||
self->history_count);
|
||||
|
||||
if (self->last_buffer)
|
||||
gst_buffer_unref (self->last_buffer);
|
||||
|
@ -963,6 +986,11 @@ static void
|
|||
gst_deinterlace_update_qos (GstDeinterlace * self, gdouble proportion,
|
||||
GstClockTimeDiff diff, GstClockTime timestamp)
|
||||
{
|
||||
GST_DEBUG_OBJECT (self,
|
||||
"Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %"
|
||||
GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "",
|
||||
GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp));
|
||||
|
||||
GST_OBJECT_LOCK (self);
|
||||
self->proportion = proportion;
|
||||
if (G_LIKELY (timestamp != GST_CLOCK_TIME_NONE)) {
|
||||
|
@ -1064,17 +1092,17 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
|
|||
|
||||
/* Not enough fields in the history */
|
||||
if (self->history_count < fields_required + 1) {
|
||||
/* TODO: do bob or just forward frame */
|
||||
GST_DEBUG_OBJECT (self, "HistoryCount=%d", self->history_count);
|
||||
GST_DEBUG_OBJECT (self, "Need more fields (have %d, need %d)",
|
||||
self->history_count, fields_required + 1);
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
||||
while (self->history_count >= fields_required) {
|
||||
if (self->fields == GST_DEINTERLACE_ALL)
|
||||
GST_DEBUG_OBJECT (self, "All fields");
|
||||
if (self->fields == GST_DEINTERLACE_TF)
|
||||
else if (self->fields == GST_DEINTERLACE_TF)
|
||||
GST_DEBUG_OBJECT (self, "Top fields");
|
||||
if (self->fields == GST_DEINTERLACE_BF)
|
||||
else if (self->fields == GST_DEINTERLACE_BF)
|
||||
GST_DEBUG_OBJECT (self, "Bottom fields");
|
||||
|
||||
cur_field_idx = self->history_count - fields_required;
|
||||
|
@ -1091,8 +1119,10 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
|
|||
if (ret != GST_FLOW_OK)
|
||||
return ret;
|
||||
|
||||
g_assert (self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method) >= 0);
|
||||
g_return_val_if_fail (self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method) >= 0,
|
||||
GST_FLOW_ERROR);
|
||||
|
||||
buf =
|
||||
self->field_history[self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method)].buf;
|
||||
|
@ -1152,8 +1182,10 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
|
|||
if (ret != GST_FLOW_OK)
|
||||
return ret;
|
||||
|
||||
g_assert (self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method) >= 0);
|
||||
g_return_val_if_fail (self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method) >= 0,
|
||||
GST_FLOW_ERROR);
|
||||
|
||||
buf =
|
||||
self->field_history[self->history_count - 1 -
|
||||
gst_deinterlace_method_get_latency (self->method)].buf;
|
||||
|
@ -1197,8 +1229,6 @@ gst_deinterlace_chain (GstPad * pad, GstBuffer * buf)
|
|||
}
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (self, "----chain end ----\n\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1464,7 +1494,7 @@ gst_deinterlace_setcaps (GstPad * pad, GstCaps * caps)
|
|||
gst_util_uint64_scale (GST_SECOND, self->frame_rate_d,
|
||||
2 * self->frame_rate_n);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Set caps: %" GST_PTR_FORMAT, caps);
|
||||
GST_DEBUG_OBJECT (pad, "Set caps: %" GST_PTR_FORMAT, caps);
|
||||
|
||||
done:
|
||||
|
||||
|
@ -1581,7 +1611,7 @@ gst_deinterlace_sink_query (GstPad * pad, GstQuery * query)
|
|||
GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad));
|
||||
gboolean res = FALSE;
|
||||
|
||||
GST_LOG_OBJECT (self, "%s query", GST_QUERY_TYPE_NAME (query));
|
||||
GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query));
|
||||
|
||||
switch (GST_QUERY_TYPE (query)) {
|
||||
default:{
|
||||
|
@ -1671,7 +1701,7 @@ gst_deinterlace_src_query (GstPad * pad, GstQuery * query)
|
|||
GstDeinterlace *self = GST_DEINTERLACE (gst_pad_get_parent (pad));
|
||||
gboolean res = FALSE;
|
||||
|
||||
GST_LOG_OBJECT (self, "%s query", GST_QUERY_TYPE_NAME (query));
|
||||
GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query));
|
||||
|
||||
switch (GST_QUERY_TYPE (query)) {
|
||||
case GST_QUERY_LATENCY:
|
||||
|
|
Loading…
Reference in a new issue