mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
d3d11compositor: Fix caps update handling
New caps is applied only when previous buffer is consumed if any. So, the lastest given caps might not be corresponding to the current buffer to be handled. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2284>
This commit is contained in:
parent
9514340d2d
commit
da33921f8d
1 changed files with 7 additions and 25 deletions
|
@ -407,7 +407,6 @@ struct _GstD3D11CompositorPad
|
||||||
gboolean alpha_updated;
|
gboolean alpha_updated;
|
||||||
gboolean blend_desc_updated;
|
gboolean blend_desc_updated;
|
||||||
ID3D11BlendState *blend;
|
ID3D11BlendState *blend;
|
||||||
gboolean caps_updated;
|
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
gint xpos;
|
gint xpos;
|
||||||
|
@ -431,6 +430,8 @@ struct _GstD3D11Compositor
|
||||||
GstD3D11Quad *checker_background;
|
GstD3D11Quad *checker_background;
|
||||||
D3D11_VIEWPORT viewport;
|
D3D11_VIEWPORT viewport;
|
||||||
|
|
||||||
|
gboolean reconfigured;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
gint adapter;
|
gint adapter;
|
||||||
GstD3D11CompositorBackground background;
|
GstD3D11CompositorBackground background;
|
||||||
|
@ -1198,14 +1199,13 @@ gst_d3d11_compositor_pad_setup_converter (GstVideoAggregatorPad * pad,
|
||||||
guint zorder = 0;
|
guint zorder = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!cpad->convert || cpad->alpha_updated || cpad->caps_updated) {
|
if (!cpad->convert || cpad->alpha_updated || self->reconfigured) {
|
||||||
if (cpad->convert)
|
if (cpad->convert)
|
||||||
gst_d3d11_converter_free (cpad->convert);
|
gst_d3d11_converter_free (cpad->convert);
|
||||||
cpad->convert =
|
cpad->convert =
|
||||||
gst_d3d11_converter_new_with_alpha (self->device,
|
gst_d3d11_converter_new_with_alpha (self->device,
|
||||||
&pad->info, &vagg->info, cpad->alpha);
|
&pad->info, &vagg->info, cpad->alpha);
|
||||||
cpad->alpha_updated = FALSE;
|
cpad->alpha_updated = FALSE;
|
||||||
cpad->caps_updated = FALSE;
|
|
||||||
if (!cpad->convert) {
|
if (!cpad->convert) {
|
||||||
GST_ERROR_OBJECT (pad, "Couldn't create converter");
|
GST_ERROR_OBJECT (pad, "Couldn't create converter");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1310,8 +1310,6 @@ static gboolean gst_d3d11_compositor_propose_allocation (GstAggregator *
|
||||||
GstQuery * query);
|
GstQuery * query);
|
||||||
static gboolean gst_d3d11_compositor_decide_allocation (GstAggregator *
|
static gboolean gst_d3d11_compositor_decide_allocation (GstAggregator *
|
||||||
aggregator, GstQuery * query);
|
aggregator, GstQuery * query);
|
||||||
static gboolean gst_d3d11_compositor_sink_event (GstAggregator * agg,
|
|
||||||
GstAggregatorPad * pad, GstEvent * event);
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_d3d11_compositor_aggregate_frames (GstVideoAggregator * vagg,
|
gst_d3d11_compositor_aggregate_frames (GstVideoAggregator * vagg,
|
||||||
GstBuffer * outbuf);
|
GstBuffer * outbuf);
|
||||||
|
@ -1369,8 +1367,6 @@ gst_d3d11_compositor_class_init (GstD3D11CompositorClass * klass)
|
||||||
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_propose_allocation);
|
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_propose_allocation);
|
||||||
aggregator_class->decide_allocation =
|
aggregator_class->decide_allocation =
|
||||||
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_decide_allocation);
|
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_decide_allocation);
|
||||||
aggregator_class->sink_event =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_sink_event);
|
|
||||||
|
|
||||||
vagg_class->aggregate_frames =
|
vagg_class->aggregate_frames =
|
||||||
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_aggregate_frames);
|
GST_DEBUG_FUNCPTR (gst_d3d11_compositor_aggregate_frames);
|
||||||
|
@ -1903,27 +1899,11 @@ gst_d3d11_compositor_decide_allocation (GstAggregator * aggregator,
|
||||||
gst_query_add_allocation_pool (query, pool, size, min, max);
|
gst_query_add_allocation_pool (query, pool, size, min, max);
|
||||||
gst_object_unref (pool);
|
gst_object_unref (pool);
|
||||||
|
|
||||||
|
self->reconfigured = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_d3d11_compositor_sink_event (GstAggregator * agg, GstAggregatorPad * pad,
|
|
||||||
GstEvent * event)
|
|
||||||
{
|
|
||||||
GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad);
|
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
|
||||||
case GST_EVENT_CAPS:
|
|
||||||
GST_DEBUG_OBJECT (pad, "Got new caps event %" GST_PTR_FORMAT, event);
|
|
||||||
cpad->caps_updated = TRUE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GST_AGGREGATOR_CLASS (parent_class)->sink_event (agg, pad, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
|
@ -2251,6 +2231,8 @@ gst_d3d11_compositor_aggregate_frames (GstVideoAggregator * vagg,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->reconfigured = FALSE;
|
||||||
GST_OBJECT_UNLOCK (self);
|
GST_OBJECT_UNLOCK (self);
|
||||||
gst_d3d11_device_unlock (self->device);
|
gst_d3d11_device_unlock (self->device);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue