mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-08 23:42:28 +00:00
glupload: try to use the last method after reconfigure
Reconfigure will trigger a set_caps which clears the upload method. Remember the method in this case and start with it. Wrap around once to try all methods if necessary. https://bugzilla.gnome.org/show_bug.cgi?id=783521
This commit is contained in:
parent
3b1ae6262b
commit
c1053e17d5
1 changed files with 27 additions and 5 deletions
|
@ -103,6 +103,9 @@ struct _GstGLUploadPrivate
|
||||||
const UploadMethod *method;
|
const UploadMethod *method;
|
||||||
gpointer method_impl;
|
gpointer method_impl;
|
||||||
int method_i;
|
int method_i;
|
||||||
|
|
||||||
|
/* saved method for reconfigure */
|
||||||
|
int saved_method_i;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEBUG_INIT \
|
#define DEBUG_INIT \
|
||||||
|
@ -1895,14 +1898,29 @@ gst_gl_upload_get_caps (GstGLUpload * upload, GstCaps ** in_caps,
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_upload_find_method (GstGLUpload * upload)
|
_upload_find_method (GstGLUpload * upload, gpointer last_impl)
|
||||||
{
|
{
|
||||||
gint method_i;
|
gint method_i;
|
||||||
|
|
||||||
if (upload->priv->method_i >= G_N_ELEMENTS (upload_methods))
|
/* start with the last used method after explicitly reconfiguring to
|
||||||
return FALSE;
|
* negotiate caps for this method */
|
||||||
|
if (upload->priv->method_i == 0) {
|
||||||
|
upload->priv->method_i = upload->priv->saved_method_i;
|
||||||
|
upload->priv->saved_method_i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (upload->priv->method_i >= G_N_ELEMENTS (upload_methods)) {
|
||||||
|
if (last_impl)
|
||||||
|
upload->priv->method_i = 0;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
method_i = upload->priv->method_i;
|
method_i = upload->priv->method_i;
|
||||||
|
|
||||||
|
if (last_impl == upload->priv->upload_impl[method_i])
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
upload->priv->method = upload_methods[method_i];
|
upload->priv->method = upload_methods[method_i];
|
||||||
upload->priv->method_impl = upload->priv->upload_impl[method_i];
|
upload->priv->method_impl = upload->priv->upload_impl[method_i];
|
||||||
|
|
||||||
|
@ -1931,6 +1949,7 @@ gst_gl_upload_perform_with_buffer (GstGLUpload * upload, GstBuffer * buffer,
|
||||||
{
|
{
|
||||||
GstGLUploadReturn ret = GST_GL_UPLOAD_ERROR;
|
GstGLUploadReturn ret = GST_GL_UPLOAD_ERROR;
|
||||||
GstBuffer *outbuf;
|
GstBuffer *outbuf;
|
||||||
|
gpointer last_impl = upload->priv->method_impl;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_GL_UPLOAD (upload), FALSE);
|
g_return_val_if_fail (GST_IS_GL_UPLOAD (upload), FALSE);
|
||||||
g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
|
g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
|
||||||
|
@ -1940,7 +1959,7 @@ gst_gl_upload_perform_with_buffer (GstGLUpload * upload, GstBuffer * buffer,
|
||||||
|
|
||||||
#define NEXT_METHOD \
|
#define NEXT_METHOD \
|
||||||
do { \
|
do { \
|
||||||
if (!_upload_find_method (upload)) { \
|
if (!_upload_find_method (upload, last_impl)) { \
|
||||||
GST_OBJECT_UNLOCK (upload); \
|
GST_OBJECT_UNLOCK (upload); \
|
||||||
return FALSE; \
|
return FALSE; \
|
||||||
} \
|
} \
|
||||||
|
@ -1948,7 +1967,7 @@ do { \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
if (!upload->priv->method_impl)
|
if (!upload->priv->method_impl)
|
||||||
_upload_find_method (upload);
|
_upload_find_method (upload, last_impl);
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
if (!upload->priv->method->accept (upload->priv->method_impl, buffer,
|
if (!upload->priv->method->accept (upload->priv->method_impl, buffer,
|
||||||
|
@ -1992,6 +2011,9 @@ restart:
|
||||||
GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
|
GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
|
||||||
*outbuf_ptr = outbuf;
|
*outbuf_ptr = outbuf;
|
||||||
|
|
||||||
|
if (ret == GST_GL_UPLOAD_RECONFIGURE)
|
||||||
|
upload->priv->saved_method_i = upload->priv->method_i - 1;
|
||||||
|
|
||||||
GST_OBJECT_UNLOCK (upload);
|
GST_OBJECT_UNLOCK (upload);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue