mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
eglglessink: start()/stop() is called in READY<->NULL in basesink
But this should be called in PAUSED<->READY.
This commit is contained in:
parent
d2dcecfc8a
commit
1f0bf75075
1 changed files with 52 additions and 25 deletions
|
@ -383,8 +383,6 @@ static GstStateChangeReturn gst_eglglessink_change_state (GstElement * element,
|
||||||
static GstFlowReturn gst_eglglessink_show_frame (GstVideoSink * vsink,
|
static GstFlowReturn gst_eglglessink_show_frame (GstVideoSink * vsink,
|
||||||
GstBuffer * buf);
|
GstBuffer * buf);
|
||||||
static gboolean gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps);
|
static gboolean gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps);
|
||||||
static gboolean gst_eglglessink_start (GstBaseSink * sink);
|
|
||||||
static gboolean gst_eglglessink_stop (GstBaseSink * sink);
|
|
||||||
static GstFlowReturn gst_eglglessink_buffer_alloc (GstBaseSink * sink,
|
static GstFlowReturn gst_eglglessink_buffer_alloc (GstBaseSink * sink,
|
||||||
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
|
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
|
||||||
static GstCaps *gst_eglglessink_getcaps (GstBaseSink * bsink);
|
static GstCaps *gst_eglglessink_getcaps (GstBaseSink * bsink);
|
||||||
|
@ -1068,11 +1066,9 @@ HANDLE_ERROR:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
static gboolean
|
||||||
gst_eglglessink_start (GstBaseSink * sink)
|
gst_eglglessink_start (GstEglGlesSink * eglglessink)
|
||||||
{
|
{
|
||||||
GstEglGlesSink *eglglessink = GST_EGLGLESSINK (sink);
|
|
||||||
|
|
||||||
if (!eglglessink->egl_started) {
|
if (!eglglessink->egl_started) {
|
||||||
GST_ERROR_OBJECT (eglglessink, "EGL uninitialized. Bailing out");
|
GST_ERROR_OBJECT (eglglessink, "EGL uninitialized. Bailing out");
|
||||||
goto HANDLE_ERROR;
|
goto HANDLE_ERROR;
|
||||||
|
@ -1095,11 +1091,9 @@ HANDLE_ERROR:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
static gboolean
|
||||||
gst_eglglessink_stop (GstBaseSink * sink)
|
gst_eglglessink_stop (GstEglGlesSink * eglglessink)
|
||||||
{
|
{
|
||||||
GstEglGlesSink *eglglessink = GST_EGLGLESSINK (sink);
|
|
||||||
|
|
||||||
/* EGL/GLES2 cleanup */
|
/* EGL/GLES2 cleanup */
|
||||||
if (!gst_eglglessink_context_make_current (eglglessink, TRUE, FALSE))
|
if (!gst_eglglessink_context_make_current (eglglessink, TRUE, FALSE))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -2488,6 +2482,36 @@ gst_eglglessink_wipe_fmt (gpointer data)
|
||||||
g_free (format);
|
g_free (format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_eglglessink_open (GstEglGlesSink * eglglessink)
|
||||||
|
{
|
||||||
|
if (!egl_init (eglglessink)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_eglglessink_close (GstEglGlesSink * eglglessink)
|
||||||
|
{
|
||||||
|
g_mutex_lock (eglglessink->flow_lock);
|
||||||
|
if (eglglessink->eglglesctx->display) {
|
||||||
|
eglTerminate (eglglessink->eglglesctx->display);
|
||||||
|
eglglessink->eglglesctx->display = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
eglglessink->selected_fmt = NULL;
|
||||||
|
g_list_free_full (eglglessink->supported_fmts, gst_eglglessink_wipe_fmt);
|
||||||
|
eglglessink->supported_fmts = NULL;
|
||||||
|
gst_caps_unref (eglglessink->sinkcaps);
|
||||||
|
eglglessink->sinkcaps = NULL;
|
||||||
|
eglglessink->egl_started = FALSE;
|
||||||
|
g_mutex_unlock (eglglessink->flow_lock);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
|
gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
|
@ -2496,9 +2520,17 @@ gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
|
||||||
|
|
||||||
eglglessink = GST_EGLGLESSINK (element);
|
eglglessink = GST_EGLGLESSINK (element);
|
||||||
|
|
||||||
|
GST_ERROR_OBJECT (eglglessink, "Changing state %d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition));
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
if (!egl_init (eglglessink)) {
|
if (!gst_eglglessink_open (eglglessink)) {
|
||||||
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
|
if (!gst_eglglessink_start (eglglessink)) {
|
||||||
ret = GST_STATE_CHANGE_FAILURE;
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -2513,19 +2545,16 @@ gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
g_mutex_lock (eglglessink->flow_lock);
|
if (!gst_eglglessink_close (eglglessink)) {
|
||||||
if (eglglessink->eglglesctx->display) {
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
eglTerminate (eglglessink->eglglesctx->display);
|
goto done;
|
||||||
eglglessink->eglglesctx->display = NULL;
|
}
|
||||||
|
break;
|
||||||
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
|
if (!gst_eglglessink_stop (eglglessink)) {
|
||||||
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
eglglessink->selected_fmt = NULL;
|
|
||||||
g_list_free_full (eglglessink->supported_fmts, gst_eglglessink_wipe_fmt);
|
|
||||||
eglglessink->supported_fmts = NULL;
|
|
||||||
gst_caps_unref (eglglessink->sinkcaps);
|
|
||||||
eglglessink->sinkcaps = NULL;
|
|
||||||
eglglessink->egl_started = FALSE;
|
|
||||||
g_mutex_unlock (eglglessink->flow_lock);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2640,8 +2669,6 @@ gst_eglglessink_class_init (GstEglGlesSinkClass * klass)
|
||||||
|
|
||||||
gstelement_class->change_state = gst_eglglessink_change_state;
|
gstelement_class->change_state = gst_eglglessink_change_state;
|
||||||
|
|
||||||
gstbasesink_class->start = gst_eglglessink_start;
|
|
||||||
gstbasesink_class->stop = gst_eglglessink_stop;
|
|
||||||
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_setcaps);
|
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_setcaps);
|
||||||
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_getcaps);
|
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_getcaps);
|
||||||
gstbasesink_class->buffer_alloc = GST_DEBUG_FUNCPTR
|
gstbasesink_class->buffer_alloc = GST_DEBUG_FUNCPTR
|
||||||
|
|
Loading…
Reference in a new issue