webrtc_test_espp: Revise logic to submit audio/video packets properly 98/280598/3 submit/tizen/20220902.031026
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 1 Sep 2022 05:42:09 +0000 (14:42 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 1 Sep 2022 06:24:21 +0000 (15:24 +0900)
Following steps below are required for espp.
1. activate both stream types
2. invoke prepare async
3. after receiving ready to prepare callback for each stream type
4. submit packets for each stream type
5. finally, start espp handle when prepare async done callback is invoked

[Version] 0.3.227
[Issue Type] Bug fix

Change-Id: I3a72b9ab9088e5a0241b4da49b6dfe3ecb1319c1
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/capi-media-webrtc.spec
test/webrtc_test.c
test/webrtc_test_espp.c
test/webrtc_test_priv.h

index 687299784cf22a896082cbfeede865c283bb278e..282e60c81b270eae19630f780951387d0b6ba5f5 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.226
+Version:    0.3.227
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 122354285d7d9e7b5e60dd421b89c67cf41228ff..1c78293d68a579f6329667f74763c1307758773f 100644 (file)
@@ -2026,19 +2026,19 @@ static void __encoded_frame_cb(webrtc_h webrtc, webrtc_media_type_e type, unsign
                webrtc, type, track_id, packet, data_ptr, user_data);
 #ifdef TIZEN_FEATURE_ESPP
        if (type == WEBRTC_MEDIA_TYPE_AUDIO && conn->encoded_audio_frame_cb_is_set) {
-               if (_espp_prepare_and_start(conn, packet, type))
+               if (_espp_activate_and_prepare_async(conn, packet, type))
                        goto out;
 
-               if (conn->render.espp.video_track_preparing) /* not ready for video track, skip submit packet */
+               if (!conn->render.espp.audio_ready_to_prepare)
                        goto out;
 
                _espp_submit_packet(conn, packet, type);
 
        } else if (type == WEBRTC_MEDIA_TYPE_VIDEO && conn->encoded_video_frame_cb_is_set) {
-               if (_espp_prepare_and_start(conn, packet, type))
+               if (_espp_activate_and_prepare_async(conn, packet, type))
                        goto out;
 
-               if (conn->render.espp.audio_track_preparing) /* not ready for audio track, skip submit packet */
+               if (!conn->render.espp.video_ready_to_prepare)
                        goto out;
 
                _espp_submit_packet(conn, packet, type);
index 3290f4ab94db43f9173db3f8d3c92264d1419316..2a886e94bc6f3cd7c76a200cc7f56ce24d8c5228 100644 (file)
@@ -22,16 +22,20 @@ static void __espp_prepare_async_done_cb(bool result, void *user_data)
 
        g_print("__espp_prepare_async_done_cb() is called, result[%u] conn[%p]\n", result, conn);
 
-       g_cond_signal(&conn->render.espp.cond);
+       g_print("espp start\n");
+       esplusplayer_start(conn->render.espp.handle);
 }
 
 static void __espp_ready_to_prepare_cb(esplusplayer_stream_type type, void *user_data)
 {
        connection_s *conn = (connection_s *)user_data;
 
-       g_print("__espp_ready_to_prepare_cb() is called, type[%u], conn[%p]\n", type, conn);
+       g_print("__espp_ready_to_prepare_cb() is called, stream_type[%u], conn[%p]\n", type, conn);
 
-       g_cond_signal(&conn->render.espp.cond);
+       if (type == ESPLUSPLAYER_STREAM_TYPE_AUDIO)
+               conn->render.espp.audio_ready_to_prepare = true;
+       else
+               conn->render.espp.video_ready_to_prepare = true;
 }
 
 void _espp_init(int index)
@@ -43,10 +47,10 @@ void _espp_init(int index)
                !get_appdata()->conns[index].encoded_video_frame_cb_is_set)
                return;
 
-       g_mutex_init(&get_appdata()->conns[index].render.espp.mutex);
-       g_cond_init(&get_appdata()->conns[index].render.espp.cond);
-       get_appdata()->conns[index].render.espp.audio_track_preparing = true;
-       get_appdata()->conns[index].render.espp.video_track_preparing = true;
+       get_appdata()->conns[index].render.espp.audio_track_activated = false;
+       get_appdata()->conns[index].render.espp.video_track_activated = false;
+       get_appdata()->conns[index].render.espp.audio_ready_to_prepare = false;
+       get_appdata()->conns[index].render.espp.video_ready_to_prepare = false;
 
        g_print("espp create & open\n");
        get_appdata()->conns[index].render.espp.handle = esplusplayer_create();
@@ -66,10 +70,10 @@ void _espp_deinit(int index)
        esplusplayer_destroy(get_appdata()->conns[index].render.espp.handle);
 
        get_appdata()->conns[index].render.espp.handle = NULL;
-       get_appdata()->conns[index].render.espp.audio_track_preparing = true;
-       get_appdata()->conns[index].render.espp.video_track_preparing = true;
-       g_mutex_clear(&get_appdata()->conns[index].render.espp.mutex);
-       g_cond_clear(&get_appdata()->conns[index].render.espp.cond);
+       get_appdata()->conns[index].render.espp.audio_track_activated = false;
+       get_appdata()->conns[index].render.espp.video_track_activated = false;
+       get_appdata()->conns[index].render.espp.audio_ready_to_prepare = false;
+       get_appdata()->conns[index].render.espp.video_ready_to_prepare = false;
 }
 
 static int __convert_media_format_mime_to_espp_mime(media_format_mimetype_e type)
@@ -190,11 +194,11 @@ espp_info_s espp_infos[] = {
        { __espp_update_video_info, ESPLUSPLAYER_STREAM_TYPE_VIDEO, (void *)esplusplayer_set_video_stream_info }
 };
 
-bool _espp_prepare_and_start(connection_s *conn, media_packet_h packet, webrtc_media_type_e type)
+bool _espp_activate_and_prepare_async(connection_s *conn, media_packet_h packet, webrtc_media_type_e type)
 {
        bool is_audio = (type == WEBRTC_MEDIA_TYPE_AUDIO) ? true : false;
-       bool *espp_track_preparing = is_audio ? &conn->render.espp.audio_track_preparing : &conn->render.espp.video_track_preparing;
-       bool *espp_track_preparing_oppsite = is_audio ? &conn->render.espp.video_track_preparing : &conn->render.espp.audio_track_preparing;
+       bool *track_activated = is_audio ? &conn->render.espp.audio_track_activated : &conn->render.espp.video_track_activated;
+       bool *opposite_track_activated = is_audio ? &conn->render.espp.video_track_activated : &conn->render.espp.audio_track_activated;
        bool *opposite_type_exist = is_audio ? &conn->encoded_video_frame_cb_is_set : &conn->encoded_audio_frame_cb_is_set;
 
        if (!conn)
@@ -205,7 +209,7 @@ bool _espp_prepare_and_start(connection_s *conn, media_packet_h packet, webrtc_m
                g_printerr("render.espp.handle is NULL\n");
                return false;
        }
-       if (!(*espp_track_preparing))
+       if (*track_activated)
                return false;
 
        /* Get format and set espp audiostream & prepare async */
@@ -213,27 +217,15 @@ bool _espp_prepare_and_start(connection_s *conn, media_packet_h packet, webrtc_m
        espp_infos[type].set_stream_info_func(conn->render.espp.handle, is_audio ?
                (void *)&conn->render.espp.audio_info :
                (void *)&conn->render.espp.video_info);
+
+       g_print("espp activate stream_type[%u]\n", espp_infos[type].stream_type);
        esplusplayer_activate(conn->render.espp.handle, espp_infos[type].stream_type);
+       *track_activated = true;
 
-       if (!*opposite_type_exist || !(*espp_track_preparing_oppsite)) {
+       if (!*opposite_type_exist || *opposite_track_activated) {
                g_print("espp prepare async\n");
                esplusplayer_prepare_async(conn->render.espp.handle);
-
-               g_mutex_lock(&conn->render.espp.mutex);
-               g_cond_wait(&conn->render.espp.cond, &conn->render.espp.mutex); /* wait for ready to prepare cb */
-               g_mutex_unlock(&conn->render.espp.mutex);
-
-               _espp_submit_packet(conn, packet, type);
-
-               g_mutex_lock(&conn->render.espp.mutex);
-               g_cond_wait(&conn->render.espp.cond, &conn->render.espp.mutex); /* wait for prepare async done cb */
-               g_mutex_unlock(&conn->render.espp.mutex);
-
-               g_print("espp start\n");
-               esplusplayer_start(conn->render.espp.handle);
        }
 
-       *espp_track_preparing = false;
-
        return true;
 }
index 813d07fa6e9742166abf0ceb9623336bdd9d3845..2fb31e4cefe3505695295389ae9da41b72fb95b2 100644 (file)
@@ -234,10 +234,10 @@ typedef struct _connection_s {
                        esplusplayer_handle handle;
                        esplusplayer_audio_stream_info audio_info;
                        esplusplayer_video_stream_info video_info;
-                       bool audio_track_preparing;
-                       bool video_track_preparing;
-                       GCond cond;
-                       GMutex mutex;
+                       bool audio_track_activated;
+                       bool video_track_activated;
+                       bool audio_ready_to_prepare;
+                       bool video_ready_to_prepare;
                } espp;
 #endif
        } render;
@@ -341,7 +341,7 @@ void _push_buffer_to_validate_encoded_frame_callback_data(connection_s *conn, me
 void _espp_init(int index);
 void _espp_deinit(int index);
 void _espp_submit_packet(connection_s *conn, media_packet_h packet, webrtc_media_type_e type);
-bool _espp_prepare_and_start(connection_s *conn, media_packet_h packet, webrtc_media_type_e type);
+bool _espp_activate_and_prepare_async(connection_s *conn, media_packet_h packet, webrtc_media_type_e type);
 #endif
 void _render_text_message(void **eo, int i, const char *text);
 void _app_start(int *argc, char **argv);