Browse Source

Merge branch 'CR_2490_linux5.15_gst_play_exits_too_fast_Windsome.Zeng' into 'jh7110-devel'

CR_2490_linux5.15_gst_play_exits_too_fast_Windsome.Zeng

See merge request sdk/freelight-u-sdk!227
andy.hu 1 year ago
parent
commit
849c5daeeb

+ 1 - 1
wave511/code/WaveDecode-ffmpeg.mak

@@ -100,7 +100,7 @@ endif #USE_FFMPEG
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 BUILDLIST=DECTEST
 MAKEFILE=WaveDecode.mak

+ 1 - 1
wave511/code/WaveDecode.mak

@@ -88,7 +88,7 @@ LDFLAGS  = $(PLATFORM_FLAGS)
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 BUILDLIST=DECTEST
 MAKEFILE=WaveDecode.mak

+ 1 - 1
wave511/code/WaveDecodeMult.mak

@@ -134,7 +134,7 @@ endif #USE_FFMPEG
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 TARGET=multi_instance_dec_test
 MAKEFILE=WaveDecodeMult.mak

+ 1 - 1
wave511/code/WaveDecode_buildroot.mak

@@ -88,7 +88,7 @@ LDFLAGS  = $(PLATFORM_FLAGS)
 ifeq ($(USE_PTHREAD), yes)
 LDLIBS  += -lpthread
 endif
-LDLIBS  += -lm
+LDLIBS  += -lm -lrt
 
 BUILDLIST=DECTEST
 MAKEFILE=WaveDecode.mak

+ 4 - 0
wave511/code/config.h

@@ -63,6 +63,10 @@
 #define SUPPORT_MULTI_INST_INTR
 //#endif
 
+#ifndef PTHREAD_MUTEX_ROBUST_NP
+#define PTHREAD_MUTEX_ROBUST_NP     1
+#endif
+
 
 // do not define BIT_CODE_FILE_PATH in case of multiple product support. because wave410 and coda980 has different firmware binary format.
 #define CORE_0_BIT_CODE_FILE_PATH   "coda960.out"     // for coda960

+ 5 - 0
wave511/code/vdi/linux/driver/vdec.c

@@ -496,8 +496,11 @@ static int vpu_free_instances(struct file *filp)
     vpudrv_instance_pool_t *vip;
     void *vip_base;
     int instance_pool_size_per_core;
+
+#if !defined(PTHREAD_MUTEX_ROBUST_NP)
     void *vdi_mutexes_base;
     const int PTHREAD_MUTEX_T_DESTROY_VALUE = 0xdead10cc;
+#endif
 
     DPRINTK("[VPUDRV] vpu_free_instances\n");
 
@@ -511,6 +514,7 @@ static int vpu_free_instances(struct file *filp)
             vip = (vpudrv_instance_pool_t *)vip_base;
             if (vip) {
                 memset(&vip->codecInstPool[vil->inst_idx], 0x00, 4);    /* only first 4 byte is key point(inUse of CodecInst in vpuapi) to free the corresponding instance. */
+#if !defined(PTHREAD_MUTEX_ROBUST_NP)
 #define PTHREAD_MUTEX_T_HANDLE_SIZE 4
                 vdi_mutexes_base = (vip_base + (instance_pool_size_per_core - PTHREAD_MUTEX_T_HANDLE_SIZE*4));
                 DPRINTK("[VPUDRV] vpu_free_instances : force to destroy vdi_mutexes_base=%p in userspace \n", vdi_mutexes_base);
@@ -521,6 +525,7 @@ static int vpu_free_instances(struct file *filp)
                         vdi_mutexes_base += PTHREAD_MUTEX_T_HANDLE_SIZE;
                     }
                 }
+#endif
             }
             s_vpu_open_ref_count--;
             list_del(&vil->list);

+ 90 - 27
wave511/code/vdi/linux/vdi.c

@@ -51,6 +51,9 @@
 
 #define VPU_DEVICE_NAME "/dev/vdec"
 
+#define VPU_MUTEX_NAME "/vpumutex"
+static int mutex_fd = -1;
+
 typedef pthread_mutex_t	MUTEX_HANDLE;
 
 
@@ -119,6 +122,7 @@ void vdi_flush_ddr(unsigned long core_idx,unsigned long start,unsigned long size
     ioctl(vdi->vpu_fd, VDI_IOCTL_FLUSH_DCACHE, &cache_info);
 }
 
+#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
 static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
 {
     int mutex_value;
@@ -138,20 +142,22 @@ static void restore_mutex_in_dead(MUTEX_HANDLE *mutex)
         pthread_mutex_init(mutex, &mutexattr);
     }
 }
+#endif  //defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
 
 static void vmem_lock(vdi_info_t* vdi)
 {
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
-#else
-    const int MUTEX_TIMEOUT = 0x7fffffff;
-#endif
-
 #if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
     restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vmem_mutex);
     pthread_mutex_lock((MUTEX_HANDLE*)vdi->vmem_mutex);
 #else
-    if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vmem_mutex) != 0) {
-        VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
+    int ret = -1;
+    ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vmem_mutex);
+    if (ret != 0) {
+        if (ret == EOWNERDEAD)
+            ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vmem_mutex);
+
+        if (ret != 0)
+            VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
     }
 #endif
     return; //lint !e454
@@ -234,7 +240,7 @@ int vdi_init(unsigned long core_idx)
         * pthread_mutexattr_setrobust_np(attr, PTHREAD_MUTEX_ROBUST_NP) makes
         * next onwer call pthread_mutex_lock() without deadlock.
         */
-        pthread_mutexattr_setrobust_np(&mutexattr, PTHREAD_MUTEX_ROBUST_NP);
+        pthread_mutexattr_setrobust(&mutexattr, PTHREAD_MUTEX_ROBUST);
 #endif
         pthread_mutex_init((MUTEX_HANDLE *)vdi->vpu_mutex, &mutexattr);
         pthread_mutex_init((MUTEX_HANDLE *)vdi->vpu_disp_mutex, &mutexattr);
@@ -246,6 +252,8 @@ int vdi_init(unsigned long core_idx)
             pCodecInst[0] = 0;	// indicate inUse of CodecInst
         }
         vdi->pvip->instance_pool_inited = TRUE;
+
+        pthread_mutexattr_destroy(&mutexattr);
     }
 #ifdef USE_VMALLOC_FOR_INSTANCE_POOL_MEMORY
     if (ioctl(vdi->vpu_fd, VDI_IOCTL_GET_REGISTER_INFO, &vdi->vdb_register) < 0)
@@ -414,6 +422,17 @@ int vdi_release(unsigned long core_idx)
     }
     realese_cpu_freq_fixed();
 
+    if (vdi->vpu_mutex)
+    {
+        munmap(vdi->vpu_mutex, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES);
+        close(mutex_fd);
+
+        vdi->vpu_mutex = NULL;
+        vdi->vpu_disp_mutex = NULL;
+        vdi->vmem_mutex = NULL;
+        mutex_fd = -1;
+    }
+
     memset(vdi, 0x00, sizeof(vdi_info_t));
 
     return 0;
@@ -513,7 +532,9 @@ vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx)
     osal_memset(&vdb, 0x00, sizeof(vpudrv_buffer_t));
     if (!vdi->pvip)
     {
-        vdb.size = sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE)*VDI_NUM_LOCK_HANDLES;
+        void *mutex_addr = NULL;
+
+        vdb.size = sizeof(vpu_instance_pool_t);
 #ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER
         vdb.size  *= MAX_NUM_VPU_CORE;
 #endif
@@ -536,13 +557,44 @@ vpu_instance_pool_t *vdi_get_instance_pool(unsigned long core_idx)
         }
 
 #ifdef SUPPORT_MULTI_CORE_IN_ONE_DRIVER
-        vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr + (core_idx*(sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE)*VDI_NUM_LOCK_HANDLES)));
+        vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr + (core_idx*sizeof(vpu_instance_pool_t)));
 #else
         vdi->pvip = (vpu_instance_pool_t *)(vdb.virt_addr);
 #endif
-        vdi->vpu_mutex      = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t));	//change the pointer of vpu_mutex to at end pointer of vpu_instance_pool_t to assign at allocated position.
-        vdi->vpu_disp_mutex = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t) + sizeof(MUTEX_HANDLE));
-        vdi->vmem_mutex     = (void *)((unsigned long)vdi->pvip + sizeof(vpu_instance_pool_t) + 2*sizeof(MUTEX_HANDLE));
+
+        if (vdi->pvip && (vdi->pvip->instance_pool_inited == FALSE)) {
+            mutex_fd = shm_open(VPU_MUTEX_NAME, O_CREAT | O_RDWR | O_TRUNC, S_IRWXU | S_IRWXG);
+            if (mutex_fd < 0)
+            {
+                VLOG(ERR, "[VDI] shm_open failed with %s\n", VPU_MUTEX_NAME);
+                return NULL;
+            }
+
+            if (ftruncate(mutex_fd, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES) == -1)
+            {
+                shm_unlink(VPU_MUTEX_NAME);
+                VLOG(ERR, "[VDI] ftruncate failed with %s\n" VPU_MUTEX_NAME);
+                return NULL;
+            }
+        } else {
+            mutex_fd = shm_open(VPU_MUTEX_NAME, O_RDWR, S_IRWXU | S_IRWXG);
+            if (mutex_fd < 0)
+            {
+                VLOG(ERR, "[VDI] shm_open exist mutex failed with %s\n", VPU_MUTEX_NAME);
+                return NULL;
+            }
+        }
+
+        mutex_addr = mmap(NULL, sizeof(MUTEX_HANDLE) * VDI_NUM_LOCK_HANDLES, PROT_READ | PROT_WRITE, MAP_SHARED, mutex_fd, 0);
+        if (mutex_addr == MAP_FAILED)
+        {
+            VLOG(ERR, "[VDI] mmap failed with %s\n", VPU_MUTEX_NAME);
+            return NULL;
+        }
+
+        vdi->vpu_mutex      = mutex_addr;
+        vdi->vpu_disp_mutex = mutex_addr + sizeof(MUTEX_HANDLE);
+        vdi->vmem_mutex     = mutex_addr + 2 * sizeof(MUTEX_HANDLE);
 
         VLOG(INFO, "[VDI] instance pool physaddr=0x%lx, virtaddr=0x%lx, base=0x%lx, size=%ld\n", (int)vdb.phys_addr, (int)vdb.virt_addr, (int)vdb.base, (int)vdb.size);
     }
@@ -634,10 +686,6 @@ int vdi_hw_reset(unsigned long core_idx) // DEVICE_ADDR_SW_RESET
 int vdi_lock(unsigned long core_idx)
 {
     vdi_info_t *vdi;
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
-#else
-    const int MUTEX_TIMEOUT = 0x7fffffff;
-#endif
 
     if (core_idx >= MAX_NUM_VPU_CORE)
         return -1;
@@ -650,9 +698,18 @@ int vdi_lock(unsigned long core_idx)
     restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vpu_mutex);
     pthread_mutex_lock((MUTEX_HANDLE*)vdi->vpu_mutex);
 #else
-    if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_mutex) != 0) {
-        VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
-        return -1;
+    int ret = -1;
+    ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_mutex);
+    if (ret != 0)
+    {
+        if (ret == EOWNERDEAD)
+            ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vpu_mutex);
+
+        if (ret != 0)
+        {
+            VLOG(ERR, "%s:%d failed to pthread_mutex_locK\n", __FUNCTION__, __LINE__);
+            return -1;
+        }
     }
 #endif
 
@@ -677,10 +734,6 @@ void vdi_unlock(unsigned long core_idx)
 int vdi_disp_lock(unsigned long core_idx)
 {
     vdi_info_t *vdi;
-#if defined(ANDROID) || !defined(PTHREAD_MUTEX_ROBUST_NP)
-#else
-    const int MUTEX_TIMEOUT = 5000;  // ms
-#endif
 
     if (core_idx >= MAX_NUM_VPU_CORE)
         return -1;
@@ -693,9 +746,18 @@ int vdi_disp_lock(unsigned long core_idx)
     restore_mutex_in_dead((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
     pthread_mutex_lock((MUTEX_HANDLE*)vdi->vpu_disp_mutex);
 #else
-    if (pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_disp_mutex) != 0)
-        VLOG(ERR, "%s:%d failed to pthread_mutex_lock\n", __FUNCTION__, __LINE__);
-        return -1;
+    int ret = -1;
+    ret = pthread_mutex_lock((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
+    if (ret != 0)
+    {
+        if (ret == EOWNERDEAD)
+            ret = pthread_mutex_consistent((MUTEX_HANDLE *)vdi->vpu_disp_mutex);
+
+        if (ret != 0)
+        {
+            VLOG(ERR, "%s:%d failed to pthread_mutex_lock\n", __FUNCTION__, __LINE__);
+            return -1;
+        }
     }
 
 #endif /* ANDROID */
@@ -1276,6 +1338,7 @@ void vdi_free_dma_memory(unsigned long core_idx, vpu_buffer_t *vb, int memTypes,
     {
         VLOG(ERR, "[VDI] fail to vdi_free_dma_memory virtial address = 0x%lx\n", (int)vdb.virt_addr);
     }
+
     osal_memset(vb, 0, sizeof(vpu_buffer_t));
 }