[WebRTC][Camera] Fix race condition during camera preview start 33/320333/2 submit/tizen/20241113.160013
authorMichal Jurkiewicz <m.jurkiewicz@samsung.com>
Tue, 12 Nov 2024 15:53:40 +0000 (16:53 +0100)
committerBot Blink <blinkbot@samsung.com>
Wed, 13 Nov 2024 11:05:49 +0000 (11:05 +0000)
[Problem]
First frame (keyframe) from remote camera is dropped,
making stream restart indefinitely due to no keyframe from camera.

[Cause]
Race condition during camera preview start - it is possible that
preview callback will be called before `preview_enabled_` variable is set.

[Solution]
Add synchronization for `preview_enabled_` variable setup.

Bug: https://jira-eu.sec.samsung.net/browse/VDWASM-1921
Change-Id: I5962382f84dabc85574984bdc916b6ff06ffbd88
Signed-off-by: Michal Jurkiewicz <m.jurkiewicz@samsung.com>
media/capture/video/tizen/camera.cc
media/capture/video/tizen/camera.h

index 3a0a2a0a96be6514451961c98885a1367e0cc789..dc709725146b7f1a90a805f3566fd15ac91a916b 100644 (file)
@@ -5,6 +5,7 @@
 #include "media/capture/video/tizen/camera.h"
 
 #include "absl/types/optional.h"
+#include "base/synchronization/lock.h"
 #include "media/base/tizen/logger/media_logger.h"
 #include "media/base/video_transformation.h"
 #include "media/camera.h"
@@ -148,6 +149,8 @@ bool Camera::SetPreviewFramerate(float framerate) {
 }
 
 bool Camera::StartPreview() {
+  base::AutoLock lock(preview_lock_);
+
   if (preview_enabled_) {
     return true;
   }
@@ -164,6 +167,8 @@ bool Camera::StartPreview() {
 }
 
 bool Camera::StopPreview() {
+  base::AutoLock lock(preview_lock_);
+
   if (!std::exchange(preview_enabled_, false)) {
     return true;
   }
@@ -191,6 +196,8 @@ bool Camera::SetPreviewCb(Camera::PreviewCB cb) {
 void Camera::OnPreview(camera_preview_data_s* frame, void* user_data) {
   Camera* thiz = reinterpret_cast<Camera*>(user_data);
 
+  base::AutoLock lock(thiz->preview_lock_);
+
   if (thiz->preview_enabled_ && thiz->preview_cb_) {
     thiz->preview_cb_.Run(frame, thiz->GetRotationOnPreviewThread().value_or(
                                      VideoRotation::VIDEO_ROTATION_0));
index 249c23928644ea983d15c43b34275d33dc8ba58c..301a09d36de934cba34db60ba28e6835ba1db22e 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "absl/types/optional.h"
 #include "base/functional/callback.h"
+#include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
 #include "media/base/video_transformation.h"
 #include "media/base/video_types.h"
 #include "media/capture/video_capture_types.h"
@@ -71,7 +73,8 @@ class Camera {
 
   absl::optional<CameraSupportedFormats> supported_formats_ = absl::nullopt;
 
-  bool preview_enabled_ = false;
+  base::Lock preview_lock_;
+  bool preview_enabled_ GUARDED_BY(preview_lock_) = false;
 };
 
 }  // namespace media