From: Sangchul Lee Date: Thu, 13 Jun 2024 05:33:48 +0000 (+0900) Subject: webrtc_display: Destroy tbm bo list when bo size has been changed X-Git-Tag: accepted/tizen/8.0/unified/20240702.162503~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8fa4b69e702c9a44aabd86b80bc145980eaa8f02;p=platform%2Fcore%2Fapi%2Fwebrtc.git 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] 0.4.56 [Issue Type] Bug fix Change-Id: Idd0ef5467acf39ca667c5a6b41505858e12f06d2 Signed-off-by: Sangchul Lee --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 232844ae..c66cb4b7 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 e991a9d4..95994e49 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: 0.4.55 +Version: 0.4.56 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);