From 517f96388ad93ca68d284ff6c8f342a7143dd57e Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Thu, 13 Jun 2024 14:33:48 +0900 Subject: [PATCH] webrtc_display: Destroy tbm bo list when bo size has been changed It is related to dynamic resolution change in case of EVAS rendering. It has fixed the crash due to the invalid bo size when facing this case. [Version] 1.1.2 [Issue Type] Bug fix Change-Id: Idd0ef5467acf39ca667c5a6b41505858e12f06d2 Signed-off-by: Sangchul Lee --- include/webrtc_private.h | 2 ++ packaging/capi-media-webrtc.spec | 2 +- src/webrtc_display.c | 4 ++++ src/webrtc_tbm.c | 9 ++++++--- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/webrtc_private.h b/include/webrtc_private.h index bbafd1ac..0dc8f253 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -435,6 +435,7 @@ typedef struct _webrtc_tbm_s { GCond cond; GMutex mutex; GList *bo_list; /* for decoded video data by sw codec */ + int bo_size; } webrtc_tbm_s; typedef struct _webrtc_display { @@ -912,6 +913,7 @@ int _release_all_resources(webrtc_s *webrtc); webrtc_tbm_s *_alloc_tbm(void); void _release_tbm(webrtc_tbm_s *tbm); void _create_tbm_bo_list(webrtc_tbm_s *tbm, int bo_size, int list_length); +void _destroy_tbm_bo_list(webrtc_tbm_s *tbm); void *_get_unused_tbm_bo(webrtc_tbm_s *tbm, unsigned int timeout_sec); void _release_tbm_bo(webrtc_tbm_s *tbm, void *bo); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 1ee63c1a..60df3f52 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 1.1.1 +Version: 1.1.2 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_display.c b/src/webrtc_display.c index aa2e2925..57bed314 100644 --- a/src/webrtc_display.c +++ b/src/webrtc_display.c @@ -369,6 +369,10 @@ static bool __swcodec_set_bo(webrtc_display_s *display, video_decoded_data_info_ goto ERROR; } + if (display->tbm->bo_list && + display->tbm->bo_size != info->bo_size) + _destroy_tbm_bo_list(display->tbm); + if (display->tbm->bo_list == NULL) { LOG_DEBUG("MMPixelFormatType[%d]", info->format); _create_tbm_bo_list(display->tbm, info->bo_size, 10); /* FIXME: use ini file to get list length */ diff --git a/src/webrtc_tbm.c b/src/webrtc_tbm.c index 9f441307..c076fcef 100644 --- a/src/webrtc_tbm.c +++ b/src/webrtc_tbm.c @@ -37,7 +37,7 @@ static void __tbm_bo_destroy_cb(webrtc_tbm_bo_s *tbm_bo) g_free(tbm_bo); } -static void __destroy_tbm_bo_list(webrtc_tbm_s *tbm) +void _destroy_tbm_bo_list(webrtc_tbm_s *tbm) { g_autoptr(GMutexLocker) locker = NULL; @@ -76,7 +76,10 @@ void _create_tbm_bo_list(webrtc_tbm_s *tbm, int bo_size, int list_length) LOG_DEBUG("bo[%p] is created", tbm_bo->bo); tbm->bo_list = g_list_append(tbm->bo_list, tbm_bo); } - LOG_DEBUG("tbm->bo_list[%p, length:%d] is created", tbm->bo_list, g_list_length(tbm->bo_list)); + tbm->bo_size = bo_size; + + LOG_INFO("tbm[bo_list[%p, length:%d], bo_size:%d] is created", + tbm->bo_list, g_list_length(tbm->bo_list), tbm->bo_size); } void *_get_unused_tbm_bo(webrtc_tbm_s *tbm, unsigned int timeout_sec) @@ -159,7 +162,7 @@ void _release_tbm(webrtc_tbm_s *tbm) { RET_IF(tbm == NULL, "tbm is NULL"); - __destroy_tbm_bo_list(tbm); + _destroy_tbm_bo_list(tbm); g_mutex_lock(&tbm->mutex); -- 2.34.1