webrtc_test: Add menu to take snapshot 35/285635/1
authorSangchul Lee <sc11.lee@samsung.com>
Mon, 12 Dec 2022 03:01:35 +0000 (12:01 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 16 Dec 2022 01:00:14 +0000 (01:00 +0000)
[Version] 0.3.273
[Issue Type] Add

Change-Id: I2d869ff6e7db5dd3e367b4a24fd31321a2dc51d5
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
(cherry picked from commit dd6a0fcb0483d6c380c16aab597d5b88d6d8a9f0)

packaging/capi-media-webrtc.spec
test/webrtc_test.c
test/webrtc_test_menu.c
test/webrtc_test_priv.h

index 54803174a52be453b83ad293637ab24cd0502658..bfcdfe1c4c5fbe10ecd27844e34b94b4b6c05560 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.272
+Version:    0.3.273
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 0e7d9381afc7435d1f5f3ec14b6b57904ffceb05..754a69085b1d5aaba1fb97958872b01de26682c3 100644 (file)
@@ -77,6 +77,7 @@ static const char *g_webrtc_stats_type_str[] = {
 static appdata_s g_ad;
 
 static void _stop_pushing_packet(int index, int source_id);
+static void __file_dump(const gchar *file_name, void *src_buffer, int size);
 
 appdata_s *get_appdata(void)
 {
@@ -889,6 +890,50 @@ static void _webrtc_get_video_resolution(int index, unsigned int track_id)
        g_print("webrtc_get_video_resolution() success, track_id[%u], width[%d], height[%d]\n", track_id, width, height);
 }
 
+static void __snapshot_cb(webrtc_h webrtc, unsigned int track_id, webrtc_snapshot_format_e format, const char *data, int width, int height,
+       unsigned int size, void *user_data)
+{
+       RET_IF(user_data == NULL, "user_data is NULL");
+
+       g_print("__snapshot_cb() is invoked, track_id[%u], format[0x%x], data[%p], %dx%d, size[%u], file_path[%s]\n",
+               track_id, format, data, width, height, size, (const char *)user_data);
+
+       __file_dump((const gchar *)user_data, (void *)data, (int)size);
+
+       free(user_data);
+}
+
+static void _webrtc_take_snapshot(int index, unsigned int track_id, unsigned int value, void *file_name)
+{
+       int ret;
+       webrtc_snapshot_format_e format;
+       int option;
+
+       switch (value) {
+       case 1:
+               format = WEBRTC_SNAPSHOT_FORMAT_RAW_RGB24;
+               option = WEBRTC_SNAPSHOT_OPTION_NONE;
+               break;
+       case 2:
+               format = WEBRTC_SNAPSHOT_FORMAT_JPEG;
+               option = 80; /* quality level 80 (1 ~ 100) */
+               break;
+       case 3:
+               format = WEBRTC_SNAPSHOT_FORMAT_PNG;
+               option = 5; /* compression level 5 (0 ~ 9) */
+               break;
+       default:
+               g_printerr("invalid value[%u]\n", value);
+               return;
+       }
+
+       ret = webrtc_take_snapshot(g_ad.conns[index].webrtc, track_id, format, option, __snapshot_cb, strdup(file_name));
+       RET_IF(ret != WEBRTC_ERROR_NONE, "ret[0x%x]", ret);
+
+       g_print("webrtc_take_snapshot() success, track_id[%u], format[0x%x], option[%d], file_name[%s]\n",
+               track_id, format, option, (const char *)file_name);
+}
+
 static void _webrtc_media_source_set_audio_loopback(int index, unsigned int source_id)
 {
        int ret = WEBRTC_ERROR_NONE;
@@ -3617,6 +3662,27 @@ static void test_webrtc_media_render(char *cmd)
                value = atoi(cmd);
                _webrtc_get_video_resolution(0, value);
                break;
+       case CURRENT_STATUS_TAKE_SNAPSHOT: {
+               static unsigned int id;
+               static unsigned int format;
+
+               switch (g_ad.input_count) {
+               case 0:
+                       id = atoi(cmd);
+                       g_ad.input_count++;
+                       return;
+               case 1:
+                       format = atoi(cmd);
+                       g_ad.input_count++;
+                       return;
+               case 2:
+                       _webrtc_take_snapshot(0, id, format, cmd);
+                       id = format = 0;
+                       g_ad.input_count = 0;
+                       break;
+               }
+               break;
+       }
        case CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB:
                _webrtc_set_encoded_audio_frame_cb(0);
                break;
index 61aea257f1cf8ee311c18848a95c3f6568bb975a..2585f2ce5b3c853abbdac8200422e36e82caae1d 100644 (file)
@@ -87,6 +87,7 @@ menu_info_s g_menu_infos[] = {
        { "sam", CURRENT_STATUS_SET_AUDIO_MUTE, true },
        { "gam", CURRENT_STATUS_GET_AUDIO_MUTE, true },
        { "gvr", CURRENT_STATUS_GET_VIDEO_RESOLUTION, true },
+       { "tsn", CURRENT_STATUS_TAKE_SNAPSHOT, true },
        { "sa", CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB, false },
        { "ua", CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB, false },
        { "sv", CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB, false },
@@ -256,6 +257,7 @@ void display_menu_main(void)
        g_print("*sam. Set audio mute\t");
        g_print("*gam. Get audio mute\n");
        g_print("*gvr. Get video resolution\n");
+       g_print("*tsn. Take snapshot\n");
        g_print("al. Set audio loopback\t");
        g_print("ual. Unset audio loopback\n");
        g_print("vl. Set video loopback\t");
@@ -548,6 +550,14 @@ void display_menu_webrtc_media_render(void)
        case CURRENT_STATUS_GET_VIDEO_RESOLUTION:
                g_print("*** input track id.\n");
                break;
+       case CURRENT_STATUS_TAKE_SNAPSHOT:
+               if (get_appdata()->input_count == 0)
+                       g_print("*** input track id.\n");
+               else if (get_appdata()->input_count == 1)
+                       g_print("*** input format.(1.rgb24 2:jpg 3:png)\n");
+               else if (get_appdata()->input_count == 2)
+                       g_print("*** input file name.(e.g. snapshot_01.jpg)\n");
+               break;
        case CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK:
                g_print("*** input source id.\n");
                break;
index 89e715d45c16622628d3047057f1dc011b5be576..b608d4b5aae317883f55611a9668da947a39029a 100644 (file)
@@ -126,14 +126,15 @@ enum {
        CURRENT_STATUS_SET_AUDIO_MUTE = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x06,
        CURRENT_STATUS_GET_AUDIO_MUTE = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x07,
        CURRENT_STATUS_GET_VIDEO_RESOLUTION = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x08,
-       CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x09,
-       CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0A,
-       CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0B,
-       CURRENT_STATUS_UNSET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0C,
-       CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0D,
-       CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0E,
-       CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0F,
-       CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x10,
+       CURRENT_STATUS_TAKE_SNAPSHOT = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x09,
+       CURRENT_STATUS_SET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0A,
+       CURRENT_STATUS_UNSET_ENCODED_AUDIO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0B,
+       CURRENT_STATUS_SET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0C,
+       CURRENT_STATUS_UNSET_ENCODED_VIDEO_FRAME_CB = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0D,
+       CURRENT_STATUS_MEDIA_SOURCE_SET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0E,
+       CURRENT_STATUS_MEDIA_SOURCE_UNSET_AUDIO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x0F,
+       CURRENT_STATUS_MEDIA_SOURCE_SET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x10,
+       CURRENT_STATUS_MEDIA_SOURCE_UNSET_VIDEO_LOOPBACK = TEST_MENU_WEBRTC_MEDIA_RENDER | 0x11,
        /* webrtc data channel */
        CURRENT_STATUS_DATA_CHANNEL_CREATE = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x01,
        CURRENT_STATUS_DATA_CHANNEL_DESTROY = TEST_MENU_WEBRTC_DATA_CHANNEL | 0x02,