webrtc_display: Add support for NV12 format 02/277702/4
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 11 Jul 2022 23:40:43 +0000 (08:40 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 13 Jul 2022 03:16:25 +0000 (12:16 +0900)
[Version] 0.3.152
[Issue Type] Improvement

Change-Id: Iae1eda6a8d702fb4000ee0f1f101d42923d8ac4e
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
src/webrtc_display.c
src/webrtc_sink.c

index 602c64261bb57e500a48e1f081533cc5ced8c9a4..e4cbd7b0df3fa183647c5fbc6b5a9f5f1ed523e3 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.151
+Version:    0.3.152
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 953e352d184fabc319d1f249062ab213201b0bf6..1cce5b5821f12bc9b0e3029d47c8b144dacec54d 100644 (file)
@@ -307,14 +307,18 @@ static bool __swcodec_set_stride_elevation(video_decoded_data_info_s *info)
        RET_VAL_IF(info == NULL, false, "info is NULL");
 
        switch (info->format) {
+       case MM_PIXEL_FORMAT_NV12:
        case MM_PIXEL_FORMAT_I420:
        case MM_PIXEL_FORMAT_YV12: {
                int ret = TBM_SURFACE_ERROR_NONE;
+               uint32_t tbm_format;
                tbm_surface_h ts;
                tbm_surface_info_s ts_info;
                unsigned int i;
 
-               ts = tbm_surface_create(info->width, info->height, info->format == MM_PIXEL_FORMAT_I420 ? TBM_FORMAT_YUV420 : TBM_FORMAT_YVU420);
+               RET_VAL_IF(__get_tbm_surface_format(info->format, &tbm_format) != WEBRTC_ERROR_NONE, NULL, "could not get tbm format");
+
+               ts = tbm_surface_create(info->width, info->height, tbm_format);
                RET_VAL_IF(ts == NULL, false, "failed to tbm_surface_create()");
                ret = tbm_surface_get_info(ts, &ts_info);
                tbm_surface_destroy(ts);
@@ -383,6 +387,27 @@ static bool __swcodec_set_bo(webrtc_display_s *display, video_decoded_data_info_
        }
 
        switch (info->format) {
+       case MM_PIXEL_FORMAT_NV12: {
+               src_stride[0] = src_stride[1] = GST_ROUND_UP_4(info->width);
+               src_offset[1] = src_stride[0] * GST_ROUND_UP_2(info->height);
+               dest_offset[0] = 0;
+               dest_offset[1] = info->stride[0] * info->elevation[0];
+
+               for (i = 0; i < info->plane_num; i++) {
+                       src = mapinfo.data + src_offset[i];
+                       dest = thandle.ptr + dest_offset[i];
+
+                       if (i > 0)
+                               k = 1;
+
+                       for (j = 0; j < info->height >> k; j++) {
+                               memcpy(dest, src, info->width);
+                               src += src_stride[i];
+                               dest += info->stride[i];
+                       }
+               }
+               break;
+       }
        case MM_PIXEL_FORMAT_I420:
        case MM_PIXEL_FORMAT_YV12: {
                int u_plane_idx = info->format == MM_PIXEL_FORMAT_I420 ? 1 : 2;
index 7e5a6496769f67271c0d0424064ec3674b4842fd..c1829bd7465b643a5a3b4a65c84ed01e9670411b 100644 (file)
@@ -133,7 +133,6 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
        const char *videosink_factory_name;
        GList *element_list = NULL;
        bool display_is_set;
-       int ret = WEBRTC_ERROR_NONE;
        g_autoptr(GMutexLocker) locker = NULL;
 
        RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
@@ -159,7 +158,8 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                locker = g_mutex_locker_new(&sink->display->mutex);
 #ifndef TIZEN_TV
                if (sink->display->type == WEBRTC_DISPLAY_TYPE_OVERLAY && webrtc->ini.resource_acquisition.video_overlay) {
-                       if ((ret = _acquire_resource_for_type(webrtc, MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY)))
+                       int ret = _acquire_resource_for_type(webrtc, MM_RESOURCE_MANAGER_RES_TYPE_VIDEO_OVERLAY);
+                       if (ret != WEBRTC_ERROR_NONE)
                                return ret;
                }
 #endif