1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
--- libs/gst/base/gstbasetransform.c 2008/10/20 13:29:06 1.126
+++ libs/gst/base/gstbasetransform.c 2008/10/21 16:30:41 1.127
@@ -251,7 +251,7 @@
/* upstream caps and size suggestions */
GstCaps *sink_suggest;
guint size_suggest;
- gint suggest_pending;
+ gboolean suggest_pending;
gboolean reconfigure;
};
@@ -1224,7 +1224,7 @@
gst_caps_unref (priv->sink_suggest);
priv->sink_suggest = gst_caps_ref (othercaps);
priv->size_suggest = size_suggest;
- g_atomic_int_set (&trans->priv->suggest_pending, 1);
+ trans->priv->suggest_pending = TRUE;
GST_OBJECT_UNLOCK (trans->sinkpad);
}
gst_caps_unref (othercaps);
@@ -1366,7 +1366,7 @@
GstBaseTransform *trans;
GstBaseTransformPrivate *priv;
GstFlowReturn res;
- gboolean proxy, suggest;
+ gboolean proxy, suggest, same_caps;
GstCaps *sink_suggest;
guint size_suggest;
@@ -1384,8 +1384,12 @@
/* we remember our previous alloc request to quickly see if we can proxy or
* not. We skip this check if we have a pending suggestion. */
- if (g_atomic_int_get (&priv->suggest_pending) == 0 && caps &&
- gst_caps_is_equal (priv->sink_alloc, caps)) {
+ GST_OBJECT_LOCK (pad);
+ same_caps = !priv->suggest_pending && caps &&
+ gst_caps_is_equal (priv->sink_alloc, caps);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (same_caps) {
/* we have seen this before, see below if we need to proxy */
GST_DEBUG_OBJECT (trans, "have old caps");
sink_suggest = caps;
@@ -1414,7 +1418,7 @@
size_suggest = size;
suggest = FALSE;
}
- g_atomic_int_set (&priv->suggest_pending, 0);
+ priv->suggest_pending = FALSE;
GST_OBJECT_UNLOCK (pad);
/* check if we actually handle this format on the sinkpad */
@@ -1462,7 +1466,10 @@
}
}
/* remember the new caps */
+ GST_OBJECT_LOCK (pad);
gst_caps_replace (&priv->sink_alloc, sink_suggest);
+ GST_OBJECT_UNLOCK (pad);
+
proxy = priv->proxy_alloc;
GST_DEBUG_OBJECT (trans, "doing default alloc, proxy %d", proxy);
@@ -1487,11 +1494,13 @@
if (!gst_caps_is_equal (newcaps, caps)) {
GST_DEBUG_OBJECT (trans, "caps are new");
/* we have new caps, see if we can proxy downstream */
- if (gst_pad_peer_accept_caps (trans->sinkpad, newcaps)) {
+ if (gst_pad_peer_accept_caps (pad, newcaps)) {
/* peer accepts the caps, return a buffer in this format */
GST_DEBUG_OBJECT (trans, "peer accepted new caps");
/* remember the format */
+ GST_OBJECT_LOCK (pad);
gst_caps_replace (&priv->sink_alloc, newcaps);
+ GST_OBJECT_UNLOCK (pad);
} else {
GST_DEBUG_OBJECT (trans, "peer did not accept new caps");
/* peer does not accept the caps, free the buffer we received and
@@ -2306,7 +2315,7 @@
caps = gst_caps_copy (caps);
trans->priv->sink_suggest = caps;
trans->priv->size_suggest = size;
- g_atomic_int_set (&trans->priv->suggest_pending, 1);
+ trans->priv->suggest_pending = TRUE;
GST_DEBUG_OBJECT (trans, "new suggest %" GST_PTR_FORMAT, caps);
GST_OBJECT_UNLOCK (trans->sinkpad);
}
|