videobox: Fix autocropping for odd width/height differences

This commit is contained in:
Sebastian Dröge 2010-03-08 20:17:58 +00:00
parent 1819fcb4a5
commit 42ff597f41

View file

@ -328,11 +328,10 @@ gst_video_box_set_property (GObject * object, guint prop_id,
static void static void
gst_video_box_autocrop (GstVideoBox * video_box) gst_video_box_autocrop (GstVideoBox * video_box)
{ {
gint crop_w = (video_box->in_width - video_box->out_width) / 2; gint crop_w = video_box->in_width - video_box->out_width;
gint crop_h = (video_box->in_height - video_box->out_height) / 2; gint crop_h = video_box->in_height - video_box->out_height;
g_mutex_lock (video_box->mutex); video_box->box_left = crop_w / 2;
video_box->box_left = crop_w;
if (video_box->box_left < 0) { if (video_box->box_left < 0) {
video_box->border_left = -video_box->box_left; video_box->border_left = -video_box->box_left;
video_box->crop_left = 0; video_box->crop_left = 0;
@ -341,7 +340,13 @@ gst_video_box_autocrop (GstVideoBox * video_box)
video_box->crop_left = video_box->box_left; video_box->crop_left = video_box->box_left;
} }
video_box->box_right = crop_w; /* Round down/up for odd width differences */
if (crop_w < 0)
crop_w -= 1;
else
crop_w += 1;
video_box->box_right = crop_w / 2;
if (video_box->box_right < 0) { if (video_box->box_right < 0) {
video_box->border_right = -video_box->box_right; video_box->border_right = -video_box->box_right;
video_box->crop_right = 0; video_box->crop_right = 0;
@ -350,7 +355,7 @@ gst_video_box_autocrop (GstVideoBox * video_box)
video_box->crop_right = video_box->box_right; video_box->crop_right = video_box->box_right;
} }
video_box->box_top = crop_h; video_box->box_top = crop_h / 2;
if (video_box->box_top < 0) { if (video_box->box_top < 0) {
video_box->border_top = -video_box->box_top; video_box->border_top = -video_box->box_top;
video_box->crop_top = 0; video_box->crop_top = 0;
@ -359,7 +364,13 @@ gst_video_box_autocrop (GstVideoBox * video_box)
video_box->crop_top = video_box->box_top; video_box->crop_top = video_box->box_top;
} }
video_box->box_bottom = crop_h; /* Round down/up for odd height differences */
if (crop_h < 0)
crop_h -= 1;
else
crop_h += 1;
video_box->box_bottom = crop_h / 2;
if (video_box->box_bottom < 0) { if (video_box->box_bottom < 0) {
video_box->border_bottom = -video_box->box_bottom; video_box->border_bottom = -video_box->box_bottom;
video_box->crop_bottom = 0; video_box->crop_bottom = 0;
@ -367,8 +378,6 @@ gst_video_box_autocrop (GstVideoBox * video_box)
video_box->border_bottom = 0; video_box->border_bottom = 0;
video_box->crop_bottom = video_box->box_bottom; video_box->crop_bottom = video_box->box_bottom;
} }
g_mutex_unlock (video_box->mutex);
} }
static void static void
@ -504,6 +513,8 @@ gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
GstVideoBox *video_box = GST_VIDEO_BOX (trans); GstVideoBox *video_box = GST_VIDEO_BOX (trans);
gboolean ret; gboolean ret;
g_mutex_lock (video_box->mutex);
ret = ret =
gst_video_format_parse_caps (in, &video_box->in_format, gst_video_format_parse_caps (in, &video_box->in_format,
&video_box->in_width, &video_box->in_height); &video_box->in_width, &video_box->in_height);
@ -526,6 +537,8 @@ gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
/* recalc the transformation strategy */ /* recalc the transformation strategy */
ret = video_box_recalc_transform (video_box); ret = video_box_recalc_transform (video_box);
g_mutex_unlock (video_box->mutex);
return ret; return ret;
/* ERRORS */ /* ERRORS */
@ -533,6 +546,7 @@ no_caps:
{ {
GST_DEBUG_OBJECT (video_box, GST_DEBUG_OBJECT (video_box,
"Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, in, out); "Invalid caps: %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, in, out);
g_mutex_unlock (video_box->mutex);
return FALSE; return FALSE;
} }
} }