From 945d0e78fbf164a55d416393ff17bbe06149d2dd Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Thu, 1 Sep 2022 14:42:09 +0900 Subject: [PATCH] webrtc_test_espp: Revise logic to submit audio/video packets properly 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 --- packaging/capi-media-webrtc.spec | 2 +- test/webrtc_test.c | 8 ++--- test/webrtc_test_espp.c | 54 ++++++++++++++------------------ test/webrtc_test_priv.h | 10 +++--- 4 files changed, 33 insertions(+), 41 deletions(-) diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 68729978..282e60c8 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.3.226 +Version: 0.3.227 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/test/webrtc_test.c b/test/webrtc_test.c index 12235428..1c78293d 100644 --- a/test/webrtc_test.c +++ b/test/webrtc_test.c @@ -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); diff --git a/test/webrtc_test_espp.c b/test/webrtc_test_espp.c index 3290f4ab..2a886e94 100644 --- a/test/webrtc_test_espp.c +++ b/test/webrtc_test_espp.c @@ -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; } diff --git a/test/webrtc_test_priv.h b/test/webrtc_test_priv.h index 813d07fa..2fb31e4c 100644 --- a/test/webrtc_test_priv.h +++ b/test/webrtc_test_priv.h @@ -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); -- 2.34.1