guint out_start;
gboolean filled;
guint blocksize;
+ guint in_offset;
+ gboolean pad_changed = FALSE;
blocksize = gst_util_uint64_scale (aagg->priv->output_buffer_duration,
GST_AUDIO_INFO_RATE (&aagg->info), GST_SECOND);
return FALSE;
}
+ gst_buffer_ref (inbuf);
+ in_offset = pad->priv->position;
+ GST_OBJECT_UNLOCK (pad);
+ GST_OBJECT_UNLOCK (aagg);
+
filled = GST_AUDIO_AGGREGATOR_GET_CLASS (aagg)->aggregate_one_buffer (aagg,
- pad, inbuf, pad->priv->position, outbuf, out_start, overlap);
+ pad, inbuf, in_offset, outbuf, out_start, overlap);
+
+ GST_OBJECT_LOCK (aagg);
+ GST_OBJECT_LOCK (pad);
+
+ pad_changed = (inbuf != pad->priv->buffer);
+ gst_buffer_unref (inbuf);
if (filled)
GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_GAP);
+ if (pad_changed)
+ return FALSE;
+
pad->priv->position += overlap;
pad->priv->output_offset += overlap;
gint out_width, in_bpf, out_bpf, out_channels, channel;
guint8 *outdata;
+ GST_OBJECT_LOCK (aagg);
+ GST_OBJECT_LOCK (aaggpad);
+
out_width = GST_AUDIO_INFO_WIDTH (&aagg->info) / 8;
in_bpf = GST_AUDIO_INFO_BPF (&aaggpad->info);
out_bpf = GST_AUDIO_INFO_BPF (&aagg->info);
gst_buffer_unmap (inbuf, &inmap);
gst_buffer_unmap (outbuf, &outmap);
+ GST_OBJECT_UNLOCK (aaggpad);
+ GST_OBJECT_UNLOCK (aagg);
+
return TRUE;
}
}
-/* Called with object lock and pad object lock held */
static gboolean
gst_audiomixer_aggregate_one_buffer (GstAudioAggregator * aagg,
GstAudioAggregatorPad * aaggpad, GstBuffer * inbuf, guint in_offset,
GstMapInfo outmap;
gint bpf;
+ GST_OBJECT_LOCK (aagg);
+ GST_OBJECT_LOCK (aaggpad);
+
if (pad->mute || pad->volume < G_MINDOUBLE) {
GST_DEBUG_OBJECT (pad, "Skipping muted pad");
+ GST_OBJECT_UNLOCK (aaggpad);
+ GST_OBJECT_UNLOCK (aagg);
return FALSE;
}
gst_buffer_unmap (inbuf, &inmap);
gst_buffer_unmap (outbuf, &outmap);
+ GST_OBJECT_UNLOCK (aaggpad);
+ GST_OBJECT_UNLOCK (aagg);
+
return TRUE;
}