gboolean force;
/* input_segment are output_segment identical */
gboolean in_out_segment_sync;
+ /* TRUE if we have an active set of instant rate flags */
+ gboolean decode_flags_override;
+ GstSegmentFlags decode_flags;
+
/* expecting the buffer with DISCONT flag */
gboolean expecting_discont_buf;
gst_object_unref (dec->priv->ctx.allocator);
GST_OBJECT_LOCK (dec);
+ dec->priv->decode_flags_override = FALSE;
gst_caps_replace (&dec->priv->ctx.input_caps, NULL);
gst_caps_replace (&dec->priv->ctx.caps, NULL);
gst_caps_replace (&dec->priv->ctx.allocation_caps, NULL);
dec->priv->samples = 0;
}
+ /* Update the decode flags in the segment if we have an instant-rate
+ * override active */
+ GST_OBJECT_LOCK (dec);
+ if (dec->priv->decode_flags_override) {
+ seg.flags &= ~GST_SEGMENT_INSTANT_FLAGS;
+ seg.flags |= dec->priv->decode_flags & GST_SEGMENT_INSTANT_FLAGS;
+ }
+
/* and follow along with segment */
dec->priv->in_out_segment_sync = FALSE;
dec->input_segment = seg;
+ GST_OBJECT_UNLOCK (dec);
+
dec->priv->pending_events =
g_list_append (dec->priv->pending_events, event);
GST_AUDIO_DECODER_STREAM_UNLOCK (dec);
ret = TRUE;
break;
}
+ case GST_EVENT_INSTANT_RATE_CHANGE:
+ {
+ GstSegmentFlags flags;
+ GstSegment *seg;
+
+ gst_event_parse_instant_rate_change (event, NULL, &flags);
+
+ GST_OBJECT_LOCK (dec);
+ dec->priv->decode_flags_override = TRUE;
+ dec->priv->decode_flags = flags;
+
+ /* Update the input segment flags */
+ seg = &dec->input_segment;
+ seg->flags &= ~GST_SEGMENT_INSTANT_FLAGS;
+ seg->flags |= dec->priv->decode_flags & GST_SEGMENT_INSTANT_FLAGS;
+ GST_OBJECT_UNLOCK (dec);
+
+ /* Forward downstream */
+ ret = gst_pad_event_default (dec->sinkpad, GST_OBJECT_CAST (dec), event);
+ break;
+ }
case GST_EVENT_GAP:
ret = gst_audio_decoder_handle_gap (dec, event);
break;