waylandsink: release all the buffers when the surface is gone
I am not sure whether I analyze this issue right
In the previous commit, I fix the wayland frame callback accessing the freed object. But actually there would be a buffer in that surface, unless surface call buffer.release() it should not be released. It is ok to handle that work to reference count, but for MSDK plugins, neither msdk session nor VA-API context would be referenced by the buffer, when this buffer would be released its associated VA-API context is gone.
I wonder if I change a GstBin state to STATE_NULL, it happens from the last sink or just the order which is added to that GstBin.
Then we can see this backstack P.S. the new msdk plugin use the fd allocator wrongly, so change it back in my test
#0 0x00007fffe402f7a5 in vaReleaseBufferHandle (dpy=dpy@entry=0x555556bb6420, buf_id=21) at ../../git/va/va.c:1532
#1 0x00007fffe4073435 in gst_msdk_frame_free (resp=0x7fffa4e613c0, pthis=<optimized out>) at ../git/sys/msdk/gstmsdkallocator_libva.c:276
#2 gst_msdk_frame_free (pthis=<optimized out>, resp=0x7fffa4e613c0) at ../git/sys/msdk/gstmsdkallocator_libva.c:245
#3 0x00007fffe406b407 in gst_msdk_dmabuf_allocator_finalize (object=0x7fffa4e61250) at ../git/sys/msdk/gstmsdkvideomemory.c:535
#4 0x00007ffff740ee12 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3346
#5 g_object_unref (_object=0x7fffa4e61250) at ../glib-2.58.3/gobject/gobject.c:3238
#6 0x00007ffff748ba9e in gst_object_unref (object=<optimized out>) at ../git/gst/gstobject.c:267
#7 0x00007ffff749de59 in gst_buffer_pool_finalize (object=0x7fff546409c0) at ../git/gst/gstbufferpool.c:200
#8 0x00007ffff740ee12 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3346
#9 g_object_unref (_object=0x7fff546409c0) at ../glib-2.58.3/gobject/gobject.c:3238
#10 0x00007ffff748ba9e in gst_object_unref (object=<optimized out>) at ../git/gst/gstobject.c:267
#11 0x00007ffff749ee4a in gst_buffer_pool_release_buffer (pool=<optimized out>, buffer=<optimized out>) at ../git/gst/gstbufferpool.c:1382
#12 0x00007ffff7497a13 in _gst_buffer_dispose (buffer=0x7fff5c46dc60) at ../git/gst/gstbuffer.c:761
#13 0x00007ffff74ce837 in gst_mini_object_unref (mini_object=0x7fff5c46dc60) at ../git/gst/gstminiobject.c:656
#14 0x00007fffdc02efeb in gst_buffer_unref (buf=<optimized out>) at /usr/include/gstreamer-1.0/gst/gstbuffer.h:446
#15 gst_wl_buffer_force_release_and_unref (buf=<optimized out>, self=0x7fff4c323080) at ../git/ext/wayland/wlbuffer.c:206
#16 0x00007ffff7316b80 in g_hash_table_foreach (hash_table=0x7fff980055e0, func=0x7fffdc02ef80 <gst_wl_buffer_force_release_and_unref>, user_data=user_data@entry=0x0) at ../glib-2.58.3/glib/ghash.c:1687
#17 0x00007fffdc02f2b6 in gst_wl_display_finalize (gobject=0x7fff8c318490) at ../git/ext/wayland/wldisplay.c:77
#18 0x00007ffff740ee12 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3346
#19 g_object_unref (_object=0x7fff8c318490) at ../glib-2.58.3/gobject/gobject.c:3238
#20 0x00007fffdc030039 in gst_wl_window_finalize (gobject=0x555555b94da0) at ../git/ext/wayland/wlwindow.c:187
#21 0x00007ffff740ee12 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3346
#22 g_object_unref (_object=0x555555b94da0) at ../glib-2.58.3/gobject/gobject.c:3238
#23 0x00007fffdc02dabb in gst_wayland_sink_finalize (object=0x555555b33140) at ../git/ext/wayland/gstwaylandsink.c:339
#24 0x00007ffff740ee12 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3346
#25 g_object_unref (_object=0x555555b33140) at ../glib-2.58.3/gobject/gobject.c:3238
#26 0x00007ffff748ba9e in gst_object_unref (object=<optimized out>) at ../git/gst/gstobject.c:267
#27 0x00007ffff7494b57 in gst_bin_remove_func (bin=0x555555a8cd20, element=<optimized out>) at ../git/gst/gstbin.c:1823
#28 0x00007ffff7493e43 in gst_bin_dispose (object=0x555555a8cd20) at ../git/gst/gstbin.c:524
#29 0x00007ffff740eda3 in g_object_unref (_object=<optimized out>) at ../glib-2.58.3/gobject/gobject.c:3309
#30 g_object_unref (_object=0x555555a8cd20) at ../glib-2.58.3/gobject/gobject.c:3238
#31 0x00007ffff748ba9e in gst_object_unref (object=<optimized out>) at ../git/gst/gstobject.c:267
#32 0x00007ffff74c8b1a in _gst_message_free (message=0x555559225990) at ../git/gst/gstmessage.c:213
#33 0x00007ffff7323e8d in g_list_foreach (list=<optimized out>, list@entry=0x7fffd41cc240, func=0x7ffff749f1f0 <gst_message_unref>, user_data=user_data@entry=0x0) at ../glib-2.58.3/glib/glist.c:1013
#34 0x00007ffff7323ebb in g_list_free_full (list=0x7fffd41cc240, free_func=<optimized out>) at ../glib-2.58.3/glib/glist.c:223
#35 0x00007ffff74a045f in gst_bus_set_flushing (bus=<optimized out>, flushing=<optimized out>) at ../git/gst/gstbus.c:504
#36 0x00007ffff74e059d in gst_pipeline_change_state (element=0x555555a6a610, transition=<optimized out>) at ../git/gst/gstpipeline.c:572
#37 0x00007ffff74b8362 in gst_element_change_state (element=element@entry=0x555555a6a610, transition=<optimized out>) at ../git/gst/gstelement.c:3046
#38 0x00007ffff74b8bde in gst_element_continue_state (element=element@entry=0x555555a6a610, ret=ret@entry=GST_STATE_CHANGE_SUCCESS) at ../git/gst/gstelement.c:2754
#39 0x00007ffff74b859d in gst_element_change_state (element=element@entry=0x555555a6a610, transition=<optimized out>) at ../git/gst/gstelement.c:3085
#40 0x00007ffff74b8bde in gst_element_continue_state (element=element@entry=0x555555a6a610, ret=ret@entry=GST_STATE_CHANGE_SUCCESS) at ../git/gst/gstelement.c:2754
#41 0x00007ffff74b859d in gst_element_change_state (element=element@entry=0x555555a6a610, transition=transition@entry=GST_STATE_CHANGE_PLAYING_TO_PAUSED) at ../git/gst/gstelement.c:3085
#42 0x00007ffff74b88fe in gst_element_set_state_func (element=0x555555a6a610, state=GST_STATE_NULL) at ../git/gst/gstelement.c:3000
I asked jadahl something about this, it looks like we can fix this issue with drain query for the subsurface case but not for the case that this plugin created a top window surface, committing a null buffer would make the top window surface unmap and disconnect