fix up! good:v4l2bufferpool: Fix crash when v4l2h264dec is stopped 21/271521/2 accepted/tizen/unified/20220223.132507 submit/tizen/20220222.233730
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 22 Feb 2022 09:49:55 +0000 (18:49 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 22 Feb 2022 11:35:30 +0000 (20:35 +0900)
- Add new parameter to check whether it's locked or not.

[Version] 1.20.0-5
[Issue Type] Bug fix

Change-Id: I5fabc83d3100b7ae3b46f48743a212311895f5b4
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/gstreamer.spec
subprojects/gst-plugins-good/sys/v4l2/gstv4l2bufferpool.c

index d774736f4b9ea5d7795cbafea6711d7226615a9e..e8619a6ab622134d6e2b8ae5b77440072886f058 100644 (file)
@@ -59,7 +59,7 @@
 
 Name:           %{_name}
 Version:        1.20.0
-Release:        4
+Release:        5
 Summary:        Streaming-Media Framework Runtime
 License:        LGPL-2.0+
 Group:          Multimedia/Framework
index 2423dbc78e3a8298da88b69c07e01404a4d59667..7c3b9ebed9e162598f6ed287a6c750e7a14a9f26 100644 (file)
@@ -787,7 +787,11 @@ streamon_failed:
 
 /* Call with streamlock held, or when streaming threads are down */
 static void
+#ifdef TIZEN_FEATURE_V4L2_TBM_SUPPORT
+gst_v4l2_buffer_pool_streamoff (GstV4l2BufferPool * pool, gboolean is_locked)
+#else
 gst_v4l2_buffer_pool_streamoff (GstV4l2BufferPool * pool)
+#endif
 {
   GstBufferPoolClass *pclass = GST_BUFFER_POOL_CLASS (parent_class);
   GstV4l2Object *obj = pool->obj;
@@ -803,12 +807,14 @@ gst_v4l2_buffer_pool_streamoff (GstV4l2BufferPool * pool)
   if (obj->tbm_output && !V4L2_TYPE_IS_OUTPUT(pool->obj->type)) {
     g_mutex_lock (&pool->buffer_lock);
 
-    GST_INFO_OBJECT (pool, "live buffer[%d]", pool->live_buffer_count);
+    GST_INFO_OBJECT (pool, "live buffer[%d], is_locked[%d]",
+      pool->live_buffer_count, is_locked);
 
     if (pool->live_buffer_count > 0) {
       end_time = g_get_monotonic_time () + G_TIME_SPAN_SECOND;
 
-      GST_OBJECT_UNLOCK (pool);
+      if (is_locked)
+        GST_OBJECT_UNLOCK (pool);
 
       do {
         GST_WARNING_OBJECT (pool, "wait for live buffer[%d]", pool->live_buffer_count);
@@ -822,7 +828,8 @@ gst_v4l2_buffer_pool_streamoff (GstV4l2BufferPool * pool)
             pool->live_buffer_count);
       } while (pool->live_buffer_count > 0);
 
-      GST_OBJECT_LOCK (pool);
+      if (is_locked)
+        GST_OBJECT_LOCK (pool);
     }
 
     g_mutex_unlock (&pool->buffer_lock);
@@ -1115,7 +1122,11 @@ gst_v4l2_buffer_pool_stop (GstBufferPool * bpool)
   }
 
   if (!pool->orphaned)
+#ifdef TIZEN_FEATURE_V4L2_TBM_SUPPORT
+    gst_v4l2_buffer_pool_streamoff (pool, FALSE);
+#else
     gst_v4l2_buffer_pool_streamoff (pool);
+#endif
 
   ret = GST_BUFFER_POOL_CLASS (parent_class)->stop (bpool);
 
@@ -1146,7 +1157,11 @@ gst_v4l2_buffer_pool_orphan (GstBufferPool ** bpool)
    * workaround of not being able to use the pool hidden activation lock. */
   GST_OBJECT_LOCK (pool);
 
+#ifdef TIZEN_FEATURE_V4L2_TBM_SUPPORT
+  gst_v4l2_buffer_pool_streamoff (pool, TRUE);
+#else
   gst_v4l2_buffer_pool_streamoff (pool);
+#endif
   ret = gst_v4l2_allocator_orphan (pool->vallocator);
   if (ret)
     pool->orphaned = TRUE;
@@ -2442,7 +2457,11 @@ gst_v4l2_buffer_pool_flush (GstBufferPool * bpool)
   GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (bpool);
   gboolean ret = TRUE;
 
+#ifdef TIZEN_FEATURE_V4L2_TBM_SUPPORT
+  gst_v4l2_buffer_pool_streamoff (pool, FALSE);
+#else
   gst_v4l2_buffer_pool_streamoff (pool);
+#endif
 
   if (!V4L2_TYPE_IS_OUTPUT (pool->obj->type))
     ret = gst_v4l2_buffer_pool_streamon (pool);