mirror of
https://github.com/Rafostar/clapper.git
synced 2025-08-31 00:11:59 +02:00
plugin: Fix possible buffer and v_info mismatch
This commit is contained in:
20
lib/gst/plugin/gstclapperimporter.c
vendored
20
lib/gst/plugin/gstclapperimporter.c
vendored
@@ -119,6 +119,8 @@ gst_clapper_importer_finalize (GObject *object)
|
|||||||
|
|
||||||
GST_TRACE ("Finalize");
|
GST_TRACE ("Finalize");
|
||||||
|
|
||||||
|
gst_clear_caps (&self->pending_caps);
|
||||||
|
|
||||||
gst_clear_buffer (&self->pending_buffer);
|
gst_clear_buffer (&self->pending_buffer);
|
||||||
gst_clear_buffer (&self->buffer);
|
gst_clear_buffer (&self->buffer);
|
||||||
|
|
||||||
@@ -320,7 +322,7 @@ gst_clapper_importer_set_caps (GstClapperImporter *self, GstCaps *caps)
|
|||||||
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
|
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
|
||||||
|
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, caps);
|
gst_caps_replace (&self->pending_caps, caps);
|
||||||
GST_OBJECT_UNLOCK (self);
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
if (importer_class->set_caps)
|
if (importer_class->set_caps)
|
||||||
@@ -330,10 +332,14 @@ gst_clapper_importer_set_caps (GstClapperImporter *self, GstCaps *caps)
|
|||||||
void
|
void
|
||||||
gst_clapper_importer_set_buffer (GstClapperImporter *self, GstBuffer *buffer)
|
gst_clapper_importer_set_buffer (GstClapperImporter *self, GstBuffer *buffer)
|
||||||
{
|
{
|
||||||
/* Both overlays and pending buffer must be
|
|
||||||
* set within a single importer locking */
|
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
|
|
||||||
|
/* Pending v_info, buffer and overlays must be
|
||||||
|
* set within a single importer locking */
|
||||||
|
if (self->pending_caps) {
|
||||||
|
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, self->pending_caps);
|
||||||
|
gst_clear_caps (&self->pending_caps);
|
||||||
|
}
|
||||||
gst_buffer_replace (&self->pending_buffer, buffer);
|
gst_buffer_replace (&self->pending_buffer, buffer);
|
||||||
gst_clapper_importer_prepare_overlays_locked (self);
|
gst_clapper_importer_prepare_overlays_locked (self);
|
||||||
|
|
||||||
@@ -380,15 +386,13 @@ gst_clapper_importer_snapshot (GstClapperImporter *self, GdkSnapshot *snapshot,
|
|||||||
* lock ourselves to make sure everything matches */
|
* lock ourselves to make sure everything matches */
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
|
|
||||||
buffer_changed = gst_buffer_replace (&self->buffer, self->pending_buffer);
|
if (self->has_pending_v_info) {
|
||||||
|
|
||||||
/* Only replace v_info when buffer changed, this way
|
|
||||||
* we still use old (correct) v_info when resizing */
|
|
||||||
if (buffer_changed && self->has_pending_v_info) {
|
|
||||||
self->v_info = self->pending_v_info;
|
self->v_info = self->pending_v_info;
|
||||||
self->has_pending_v_info = FALSE;
|
self->has_pending_v_info = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer_changed = gst_buffer_replace (&self->buffer, self->pending_buffer);
|
||||||
|
|
||||||
/* Ref overlays associated with current buffer */
|
/* Ref overlays associated with current buffer */
|
||||||
for (i = 0; i < self->pending_overlays->len; i++) {
|
for (i = 0; i < self->pending_overlays->len; i++) {
|
||||||
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
|
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
|
||||||
|
1
lib/gst/plugin/gstclapperimporter.h
vendored
1
lib/gst/plugin/gstclapperimporter.h
vendored
@@ -49,6 +49,7 @@ struct _GstClapperImporter
|
|||||||
{
|
{
|
||||||
GstObject parent;
|
GstObject parent;
|
||||||
|
|
||||||
|
GstCaps *pending_caps;
|
||||||
GstBuffer *pending_buffer, *buffer;
|
GstBuffer *pending_buffer, *buffer;
|
||||||
GPtrArray *pending_overlays, *overlays;
|
GPtrArray *pending_overlays, *overlays;
|
||||||
GstVideoInfo pending_v_info, v_info;
|
GstVideoInfo pending_v_info, v_info;
|
||||||
|
Reference in New Issue
Block a user