Bladeren bron

Z991239-1812 #comment other 优化抓拍计数加锁逻辑

陈礼鹏80274480 4 jaren geleden
bovenliggende
commit
71c6697f44

+ 8 - 12
Module/mod_mediacontroller/capture.cpp

@@ -602,10 +602,9 @@ static void env_cap_on_frame(void *user_data, video_frame *frame)
 			InterlockedDecrement(cap->config.ref_env_capture_count);
 #else
 			//__sync_fetch_and_sub(cap->config.ref_env_capture_count, 1);
-			pthread_mutex_t sub_clock = PTHREAD_MUTEX_INITIALIZER;
-			pthread_mutex_lock(&sub_clock);
+			pthread_mutex_lock(&cap->config.env_mutex);
 			*(cap->config.ref_env_capture_count) -= 1;
-			pthread_mutex_unlock(&sub_clock);
+			pthread_mutex_unlock(&cap->config.env_mutex);
 #endif
 			LogEvent(Severity_Middle, MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_ENV, "agent capture env ok, and capture env finished!");
 		} 
@@ -616,11 +615,10 @@ static void env_cap_on_frame(void *user_data, video_frame *frame)
 			_InterlockedAnd(cap->config.ref_envopt_capture_count, 0xfffffffD);
 #else
 			//__sync_fetch_and_add(cap->config.ref_env_capture_count, 0xfffffffD);
-			pthread_mutex_t add_clock = PTHREAD_MUTEX_INITIALIZER;
-			pthread_mutex_lock(&add_clock);
+			pthread_mutex_lock(&cap->config.envopt_mutex);
 			LONG lcount = *(cap->config.ref_envopt_capture_count);
 			*(cap->config.ref_envopt_capture_count) = (lcount & 0xfffffffD);
-			pthread_mutex_unlock(&add_clock);
+			pthread_mutex_unlock(&cap->config.envopt_mutex);
 #endif // RVC_OS_WIN
 
 			if (*cap->config.ref_envopt_capture_count == 0) 
@@ -781,10 +779,9 @@ static void opt_cap_on_frame(void *user_data, video_frame *frame)
 			InterlockedDecrement(cap->config.ref_opt_capture_count);
 #else
 			//__sync_fetch_and_sub(cap->config.ref_opt_capture_count, 1);
-			pthread_mutex_t add_clock = PTHREAD_MUTEX_INITIALIZER;
-			pthread_mutex_lock(&add_clock);;
+			pthread_mutex_lock(&cap->config.opt_mutex);
 			*(cap->config.ref_opt_capture_count) -= 1;
-			pthread_mutex_unlock(&add_clock);
+			pthread_mutex_unlock(&cap->config.opt_mutex);
 #endif
 			LogEvent(Severity_Middle, MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_OPT, "agent capture opt ok, and capture opt finished!");
 		} 
@@ -795,10 +792,9 @@ static void opt_cap_on_frame(void *user_data, video_frame *frame)
 			if (InterlockedDecrement(cap->config.ref_envopt_capture_count) == 0) 
 #else
 			//__sync_fetch_and_sub(cap->config.ref_envopt_capture_count,1);
-			pthread_mutex_t sub_clock = PTHREAD_MUTEX_INITIALIZER;
-			pthread_mutex_lock(&sub_clock);
+			pthread_mutex_lock(&cap->config.envopt_mutex);
 			*(cap->config.ref_envopt_capture_count) -= 1;
-			pthread_mutex_unlock(&sub_clock);
+			pthread_mutex_unlock(&cap->config.envopt_mutex);
 			if (0 == cap->config.ref_envopt_capture_count)
 #endif
 			{

+ 6 - 0
Module/mod_mediacontroller/capture.h

@@ -49,6 +49,12 @@ namespace MediaController {
 		volatile LONG *ref_env_capture_count;
 		volatile LONG *ref_opt_capture_count;
 		volatile LONG *ref_envopt_capture_count;
+#ifdef RVC_OS_WIN
+#else
+		pthread_mutex_t env_mutex;
+		pthread_mutex_t opt_mutex;
+		pthread_mutex_t envopt_mutex;
+#endif
 	}capture_config_t;
 
 

+ 7 - 0
Module/mod_mediacontroller/mod_mediacontroller.cpp

@@ -1787,6 +1787,13 @@ private:
 			conf.ref_env_capture_count = &m_lCaptureEnvCount;
 			conf.ref_opt_capture_count = &m_lCaptureOptCount;
 			conf.ref_envopt_capture_count = &m_lCaptureEnvOptCount;
+#ifdef RVC_OS_WIN
+#else
+			conf.env_mutex = PTHREAD_MUTEX_INITIALIZER;
+			conf.opt_mutex = PTHREAD_MUTEX_INITIALIZER;
+			conf.envopt_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
 
 			Error = (ErrorCodeEnum)capture_create(&conf, &m_capture);
 			if (Error == Error_Succeed)