mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-28 03:00:35 +00:00
video{en,de}coder: Reset the codec after calling the stop() vfunc
The stop() vfunc might mess with some of our fields we have just reset, which could cause memory leaks or invalid state taken over to later. Also the stop() vfunc, or anything called until it from another thread, might want to be able to use the fields that were just resetted and become confused because of that. In the decoder we already had a workaround for things like this happening, this workaround is not needed anymore.
This commit is contained in:
parent
ceb9de6e55
commit
098b42f36b
2 changed files with 12 additions and 14 deletions
|
@ -2292,22 +2292,13 @@ gst_video_decoder_change_state (GstElement * element, GstStateChange transition)
|
|||
case GST_STATE_CHANGE_PAUSED_TO_READY:{
|
||||
gboolean stopped = TRUE;
|
||||
|
||||
if (decoder_class->stop)
|
||||
stopped = decoder_class->stop (decoder);
|
||||
|
||||
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
|
||||
gst_video_decoder_reset (decoder, TRUE, TRUE);
|
||||
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
|
||||
|
||||
if (decoder_class->stop) {
|
||||
stopped = decoder_class->stop (decoder);
|
||||
|
||||
/* the subclass might have released frames and events from freed frames
|
||||
* are stored in the pending_events list */
|
||||
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
|
||||
g_list_free_full (decoder->priv->pending_events, (GDestroyNotify)
|
||||
gst_event_unref);
|
||||
decoder->priv->pending_events = NULL;
|
||||
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
|
||||
}
|
||||
|
||||
if (!stopped)
|
||||
goto stop_failed;
|
||||
|
||||
|
|
|
@ -1425,13 +1425,20 @@ gst_video_encoder_change_state (GstElement * element, GstStateChange transition)
|
|||
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||
|
||||
switch (transition) {
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:{
|
||||
gboolean stopped = TRUE;
|
||||
|
||||
if (encoder_class->stop)
|
||||
stopped = encoder_class->stop (encoder);
|
||||
|
||||
GST_VIDEO_ENCODER_STREAM_LOCK (encoder);
|
||||
gst_video_encoder_reset (encoder, TRUE);
|
||||
GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder);
|
||||
if (encoder_class->stop && !encoder_class->stop (encoder))
|
||||
|
||||
if (!stopped)
|
||||
goto stop_failed;
|
||||
break;
|
||||
}
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
/* close device/library if needed */
|
||||
if (encoder_class->close && !encoder_class->close (encoder))
|
||||
|
|
Loading…
Reference in a new issue