mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 21:51:09 +00:00
vaapipostproc: handle navigation downstream event
When navigation events contains coordiantes those have to be mapped to the new size and/or orientation.
This commit is contained in:
parent
a6aba119b4
commit
6cb3e741fd
1 changed files with 86 additions and 0 deletions
|
@ -1571,6 +1571,91 @@ gst_vaapipostproc_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
||||||
query);
|
query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_vaapipostproc_src_event (GstBaseTransform * trans, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstVaapiPostproc *const postproc = GST_VAAPIPOSTPROC (trans);
|
||||||
|
gdouble new_x = 0, new_y = 0, x = 0, y = 0;
|
||||||
|
GstStructure *structure;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (postproc, "handling %s event", GST_EVENT_TYPE_NAME (event));
|
||||||
|
|
||||||
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
case GST_EVENT_NAVIGATION:
|
||||||
|
event =
|
||||||
|
GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event)));
|
||||||
|
|
||||||
|
structure = (GstStructure *) gst_event_get_structure (event);
|
||||||
|
if (gst_structure_get_double (structure, "pointer_x", &x) &&
|
||||||
|
gst_structure_get_double (structure, "pointer_y", &y)) {
|
||||||
|
GST_DEBUG_OBJECT (postproc, "converting %fx%f", x, y);
|
||||||
|
|
||||||
|
if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_SIZE) {
|
||||||
|
if ((GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info)
|
||||||
|
!= GST_VIDEO_INFO_WIDTH (&postproc->sinkpad_info))
|
||||||
|
&& (GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info)
|
||||||
|
!= GST_VIDEO_INFO_HEIGHT (&postproc->sinkpad_info))) {
|
||||||
|
new_x =
|
||||||
|
x * GST_VIDEO_INFO_WIDTH (&postproc->sinkpad_info) /
|
||||||
|
GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info);
|
||||||
|
new_y =
|
||||||
|
y * GST_VIDEO_INFO_HEIGHT (&postproc->sinkpad_info) /
|
||||||
|
GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info);
|
||||||
|
}
|
||||||
|
} else if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_VIDEO_DIRECTION) {
|
||||||
|
switch (gst_vaapi_filter_get_video_direction (postproc->filter)) {
|
||||||
|
case GST_VIDEO_ORIENTATION_90R:
|
||||||
|
new_x = y;
|
||||||
|
new_y = GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info) - x;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_90L:
|
||||||
|
new_x = GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info) - y;
|
||||||
|
new_y = x;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_UR_LL:
|
||||||
|
new_x = GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info) - y;
|
||||||
|
new_y = GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info) - x;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_UL_LR:
|
||||||
|
new_x = y;
|
||||||
|
new_y = x;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_180:
|
||||||
|
new_x = GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info) - x;
|
||||||
|
new_y = GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info) - y;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_HORIZ:
|
||||||
|
new_x = GST_VIDEO_INFO_WIDTH (&postproc->srcpad_info) - x;
|
||||||
|
new_y = y;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_ORIENTATION_VERT:
|
||||||
|
new_x = x;
|
||||||
|
new_y = GST_VIDEO_INFO_HEIGHT (&postproc->srcpad_info) - y;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
new_x = x;
|
||||||
|
new_y = y;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (postproc, "to %fx%f", new_x, new_y);
|
||||||
|
gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, new_x,
|
||||||
|
"pointer_y", G_TYPE_DOUBLE, new_y, NULL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret =
|
||||||
|
GST_BASE_TRANSFORM_CLASS (gst_vaapipostproc_parent_class)->src_event
|
||||||
|
(trans, event);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapipostproc_sink_event (GstBaseTransform * trans, GstEvent * event)
|
gst_vaapipostproc_sink_event (GstBaseTransform * trans, GstEvent * event)
|
||||||
{
|
{
|
||||||
|
@ -1807,6 +1892,7 @@ gst_vaapipostproc_class_init (GstVaapiPostprocClass * klass)
|
||||||
trans_class->query = gst_vaapipostproc_query;
|
trans_class->query = gst_vaapipostproc_query;
|
||||||
trans_class->propose_allocation = gst_vaapipostproc_propose_allocation;
|
trans_class->propose_allocation = gst_vaapipostproc_propose_allocation;
|
||||||
trans_class->decide_allocation = gst_vaapipostproc_decide_allocation;
|
trans_class->decide_allocation = gst_vaapipostproc_decide_allocation;
|
||||||
|
trans_class->src_event = gst_vaapipostproc_src_event;
|
||||||
trans_class->sink_event = gst_vaapipostproc_sink_event;
|
trans_class->sink_event = gst_vaapipostproc_sink_event;
|
||||||
|
|
||||||
trans_class->prepare_output_buffer = gst_vaapipostproc_prepare_output_buffer;
|
trans_class->prepare_output_buffer = gst_vaapipostproc_prepare_output_buffer;
|
||||||
|
|
Loading…
Reference in a new issue