webrtc_internal: Add webrtc_set_display_qos() 18/301718/2 accepted/tizen/7.0/unified/20231124.024933
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 20 Nov 2023 08:48:38 +0000 (17:48 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 22 Nov 2023 05:08:59 +0000 (14:08 +0900)
[Version] 0.3.294
[Issue Type] Internal API

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

index f747cca49d6a4abc2d300bc9d1e70b08817fc64f..b19bb12ccce13cc949c170f8346edc6ab231a64a 100644 (file)
@@ -169,6 +169,28 @@ int webrtc_set_ecore_wl_display(webrtc_h webrtc, unsigned int track_id, void *ec
  */
 int webrtc_set_display_surface_id(webrtc_h webrtc, unsigned int track_id, int surface_id, int x, int y, int width, int height);
 
+/**
+ * @brief Sets a display QoS.
+ * @since_tizen 7.0
+ * @remarks Call this function within webrtc_track_added_cb(), otherwise #WEBRTC_ERROR_INVALID_OPERATION will be returned.\n
+ *          If webrtc_set_encoded_video_frame_cb() has been called, it will return #WEBRTC_ERROR_INVALID_OPERATION.\n
+ *          It'll set qos property of video sink that generates Quality-of-Service events upstream in some cases.\n
+ *          The default value is @c true.
+ * @param[in] webrtc      WebRTC handle
+ * @param[in] track_id    The track id
+ * @param[in] enable      Enable or not (@c true = enable, @c false = disable)
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #WEBRTC_ERROR_NONE    Successful
+ * @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
+ * @pre webrtc_track_added_cb() must be set by calling webrtc_set_track_added_cb().
+ * @pre webrtc_set_display() or webrtc_set_display_surface_id() must be called before calling this function.
+ * @see webrtc_set_track_added_cb()
+ * @see webrtc_unset_track_added_cb()
+ */
+int webrtc_set_display_qos(webrtc_h webrtc, unsigned int track_id, bool enable);
+
 /**
  * @internal
  * @brief Sets mute to the audio track.
index 37b2361bb1afc05f62b7607cf092d71fbeba0085..4781271d34a2930c461dc54d73fd2b7ad025651e 100644 (file)
@@ -433,6 +433,7 @@ typedef struct _webrtc_display {
        mm_display_interface_h mm_display;
        webrtc_display_mode_e mode;
        bool visible;
+       bool qos;
        webrtc_tbm_s *tbm;
        GstElement *sink_element;
 } webrtc_display_s;
@@ -793,6 +794,7 @@ int _set_display_mode_to_sink(webrtc_s *webrtc, unsigned int track_id, webrtc_di
 int _get_display_mode_from_sink(webrtc_s *webrtc, unsigned int track_id, webrtc_display_mode_e *mode);
 int _set_display_visible_to_sink(webrtc_s *webrtc, unsigned int track_id, bool visible);
 int _get_display_visible_from_sink(webrtc_s *webrtc, unsigned int track_id, bool *visible);
+int _set_display_qos_to_sink(webrtc_s *webrtc, unsigned int track_id, bool enable);
 int _set_audio_mute_to_sink(webrtc_s *webrtc, unsigned int track_id, bool mute);
 int _get_audio_mute_from_sink(webrtc_s *webrtc, unsigned int track_id, bool *muted);
 int _get_video_resolution_from_sink(webrtc_s *webrtc, unsigned int track_id, int *width, int *height);
index 5fad8ae6802cc6ce9b8ba4e67eeeb0a1485fca75..45c51fe89a6c249e2ba20c5670c8f6bdfe2f0255 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.293
+Version:    0.3.294
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 5ebfdfa7ae1dd4554d007c8fdf6ac752d9999e9a..67d9a2e330eecaa405db0ec1c665ca2e4be26bf4 100644 (file)
@@ -782,9 +782,10 @@ webrtc_display_s *_alloc_display(bool use_mm_display)
        g_mutex_init(&display->mutex);
        display->mode = WEBRTC_DISPLAY_MODE_LETTER_BOX;
        display->visible = true;
+       display->qos = true;
 
-       LOG_DEBUG("use_mm_display[%d], display[%p, mm_display:%p, mode:%u, visible:%u]",
-               use_mm_display, display, display->mm_display, display->mode, display->visible);
+       LOG_DEBUG("use_mm_display[%d], display[%p, mm_display:%p, mode:%u, visible:%u, qos:%u]",
+               use_mm_display, display, display->mm_display, display->mode, display->visible, display->qos);
 
        return display;
 }
@@ -970,4 +971,4 @@ int _get_display_visible(webrtc_display_s *display, bool *visible)
        LOG_INFO("visible[%d]", *visible);
 
        return WEBRTC_ERROR_NONE;
-}
\ No newline at end of file
+}
index d9ebbb5edd09fc7755297d789ebaa2d1ad3af178..a3a408bd7c22ee98367ce5179b0948dc5536f416 100644 (file)
@@ -59,6 +59,24 @@ int webrtc_set_display_surface_id(webrtc_h webrtc, unsigned int track_id, int su
        return _set_display_surface_id_to_sink(webrtc, track_id, surface_id, x, y, width, height);
 }
 
+int webrtc_set_display_qos(webrtc_h webrtc, unsigned int track_id, bool enable)
+{
+       g_autoptr(GMutexLocker) locker = NULL;
+       webrtc_s *_webrtc = (webrtc_s *)webrtc;
+
+       RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+       RET_VAL_IF(track_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "track id is 0");
+
+       locker = g_mutex_locker_new(&_webrtc->mutex);
+
+       RET_VAL_IF(_webrtc->track_added_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "track added callback was not set");
+       RET_VAL_IF(_webrtc->encoded_video_frame_cb.callback, WEBRTC_ERROR_INVALID_OPERATION, "encoded video frame callback was set");
+       RET_VAL_IF(!_is_owner_of_track_build_context(_webrtc, track_id), WEBRTC_ERROR_INVALID_OPERATION,
+               "this function should be called within the track added callback");
+
+       return _set_display_qos_to_sink(webrtc, track_id, enable);
+}
+
 int webrtc_set_audio_mute(webrtc_h webrtc, unsigned int track_id, bool mute)
 {
        g_autoptr(GMutexLocker) locker = NULL;
@@ -246,4 +264,4 @@ int webrtc_get_rtp_packet_drop_probability(webrtc_h webrtc, bool sender, float *
 
        return _get_packet_drop_probability(webrtc, sender, probability);
 }
-//LCOV_EXCL_STOP
\ No newline at end of file
+//LCOV_EXCL_STOP
index 167f481bb3174f03f5a44fb13b3f92ab3d1ab708..d82a86733dca41d4fc58de6692c80b8240dfeb1c 100644 (file)
@@ -199,6 +199,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                                "use-tbm", sink->av[AV_IDX_VIDEO].render.hw_decoder_used,
                                "display-geometry-method", (gint)sink->display->mode, /* 0: letter box, 1: origin size, 2: full screen */
                                "visible", (gboolean)sink->display->visible,
+                               "qos", (gboolean)sink->display->qos,
                                NULL);
 
                        /* FIXME: The order of setting property and display is important when 'use-tbm' is true. The reverse does not work */
@@ -223,7 +224,7 @@ static int __build_videosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
                        GstCaps *caps;
                        g_object_set(G_OBJECT(videosink),
                                "sync", TRUE,
-                               "qos", TRUE,
+                               "qos", (gboolean)sink->display->qos,
                                "signal-handoffs", TRUE,
                                NULL);
                        _connect_and_append_signal(&sink->signals, (GObject *)videosink, "handoff", G_CALLBACK(_video_stream_decoded_cb), sink->display);
@@ -1274,6 +1275,27 @@ int _get_display_visible_from_sink(webrtc_s *webrtc, unsigned int track_id, bool
        return WEBRTC_ERROR_NONE;
 }
 
+int _set_display_qos_to_sink(webrtc_s *webrtc, unsigned int track_id, bool enable)
+{
+       webrtc_gst_slot_s *sink;
+
+       RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+       RET_VAL_IF(track_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "track id is 0");
+
+       sink = __find_sink_slot_by_id(webrtc, track_id);
+       RET_VAL_IF(sink == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "sink is NULL");
+       RET_VAL_IF(sink->bin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "bin is NULL");
+       RET_VAL_IF(sink->encoded_frame_cb != NULL, WEBRTC_ERROR_INVALID_OPERATION, "it may be a forwarding sink for encoded frame callback");
+       RET_VAL_IF((sink->media_types & MEDIA_TYPE_VIDEO) == 0x0, WEBRTC_ERROR_INVALID_OPERATION, "it's not a video track");
+       RET_VAL_IF(sink->display == NULL, WEBRTC_ERROR_INVALID_OPERATION, "display is NULL");
+
+       LOG_INFO("webrtc[%p] track_id[%u] qos[%d]", webrtc, track_id, enable);
+
+       sink->display->qos = enable;
+
+       return WEBRTC_ERROR_NONE;
+}
+
 int _set_audio_mute_to_sink(webrtc_s *webrtc, unsigned int track_id, bool mute)
 {
        webrtc_gst_slot_s *sink;