Added test suite for camera preview 65/84965/1
authorSejun Park <sejun79.park@samsung.com>
Tue, 23 Aug 2016 04:54:18 +0000 (13:54 +0900)
committerSejun Park <sejun79.park@samsung.com>
Tue, 23 Aug 2016 04:54:18 +0000 (13:54 +0900)
Change-Id: Ic60e48e994bf7b1f79c14934572319eb7007d093

packaging/capi-media-codec.spec
test/CMakeLists.txt
test/media_codec_test.c

index b4a17e3..94a969c 100755 (executable)
@@ -12,6 +12,7 @@ BuildRequires:  pkgconfig(mm-common)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(appcore-efl)
 BuildRequires:  pkgconfig(capi-media-tool)
+BuildRequires:  pkgconfig(capi-media-camera)
 BuildRequires:  pkgconfig(libtbm)
 BuildRequires:  pkgconfig(gstreamer-1.0)
 BuildRequires:  pkgconfig(gstreamer-plugins-base-1.0)
index d6a1257..d3e0022 100755 (executable)
@@ -6,7 +6,7 @@ INCLUDE_DIRECTORIES(../include/headers)
 link_directories(${CMAKE_SOURCE_DIR}/../)
 
 INCLUDE(FindPkgConfig)
-pkg_check_modules(${fw_test} REQUIRED appcore-efl elementary)
+pkg_check_modules(${fw_test} REQUIRED appcore-efl elementary capi-media-camera)
 FOREACH(flag ${${fw_test}_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
index 37bb551..2da9c6f 100755 (executable)
@@ -21,6 +21,7 @@
 #include <appcore-efl.h>
 #include <gst/gst.h>
 
+#include <camera.h>
 #include <media_codec.h>
 #include <media_packet.h>
 #include <media_packet_pool.h>
@@ -135,6 +136,7 @@ struct _App {
        bool enable_dump;
        int frame;
        type_e type;
+       camera_h camera_handle;
        /* video */
        mediacodec_h mc_handle[MAX_HANDLE];
        guint width;
@@ -844,7 +846,7 @@ int  _mediacodec_set_codec(App *app, int codecid, int flag, bool *hardware)
                break;
        case MEDIACODEC_H263:
                if (encoder) {
-                       extractor = h263_extractor;
+                       extractor = yuv_extractor;
                        mime = *hardware ? MEDIA_FORMAT_NV12 : MEDIA_FORMAT_I420;
                } else {
                        extractor = h263_extractor;
@@ -1261,6 +1263,108 @@ static void _mediacodec_prepare(App *app, bool frame_all)
        return;
 }
 
+static void _mediacodec_enc_input_buffer_used_cb(media_packet_h pkt, void *user_data)
+{
+       /* release input raw packet */
+       media_packet_destroy(pkt);
+}
+
+/* this callback is called when the input buffer for codec has done to use */
+static void _mediacodec_dec_input_buffer_used_cb(media_packet_h pkt, void *user_data)
+{
+       /* release input encoded packet */
+       media_packet_destroy(pkt);
+}
+
+static void _mediacodec_enc_output_buffer_available_cb(media_packet_h pkt, void *user_data)
+{
+       App *app = (App*)user_data;
+
+       mediacodec_h media_codec_handle = app->mc_handle[1];
+       media_packet_h output_buf = NULL;
+       mediacodec_get_output(media_codec_handle, &output_buf, 0);
+       /* decode encoded camera preview */
+       mediacodec_process_input(app->mc_handle[0], output_buf, 0);
+}
+
+static void _mediacodec_dec_output_buffer_available_cb(media_packet_h pkt, void *user_data)
+{
+       App *app = (App*)user_data;
+
+       mediacodec_h media_codec_handle = app->mc_handle[0];
+       media_packet_h output_buf = NULL;
+
+       mediacodec_get_output(media_codec_handle, &output_buf, 0);
+
+       if (app->enable_dump)
+               decoder_output_dump(app, output_buf);
+
+       media_packet_destroy(output_buf);
+}
+
+static void _media_packet_preview_cb(media_packet_h packet, void *user_data)
+{
+       App *app = user_data;
+       g_mutex_lock(&app->lock);
+       mediacodec_process_input(app->mc_handle[1], packet, 0);
+       g_mutex_unlock(&app->lock);
+
+       return;
+}
+
+static void _mediacodec_camera_start(App *app)
+{
+       int default_format = CAMERA_PIXEL_FORMAT_NV12;
+       app->width = 640;
+       app->height = 480;
+       app->hardware = TRUE;
+
+       /*create decoder instance and setup */
+       mediacodec_create(&app->mc_handle[0]);
+       mediacodec_set_codec(app->mc_handle[0], MEDIACODEC_H264, MEDIACODEC_DECODER | MEDIACODEC_SUPPORT_TYPE_HW);
+       mediacodec_set_vdec_info(app->mc_handle[0], app->width, app->height);
+       /* set callback */
+       mediacodec_set_input_buffer_used_cb(app->mc_handle[0], _mediacodec_dec_input_buffer_used_cb, NULL);
+       mediacodec_set_output_buffer_available_cb(app->mc_handle[0], _mediacodec_dec_output_buffer_available_cb, app);
+       mediacodec_prepare(app->mc_handle[0]);
+
+       /*create encoder instance and setup */
+       mediacodec_create(&app->mc_handle[1]);
+       mediacodec_set_codec(app->mc_handle[1], MEDIACODEC_H264, MEDIACODEC_ENCODER | MEDIACODEC_SUPPORT_TYPE_HW);
+       mediacodec_set_venc_info(app->mc_handle[1], app->width, app->height, 30, 1000);
+       /* set callback */
+       mediacodec_set_input_buffer_used_cb(app->mc_handle[1], _mediacodec_enc_input_buffer_used_cb, NULL);
+       mediacodec_set_output_buffer_available_cb(app->mc_handle[1], _mediacodec_enc_output_buffer_available_cb, app);
+       mediacodec_prepare(app->mc_handle[1]);
+
+       /* create camera instance and setup and then start preview */
+       camera_create(CAMERA_DEVICE_CAMERA0, &app->camera_handle);
+       camera_set_media_packet_preview_cb(app->camera_handle, _media_packet_preview_cb, app);
+       camera_get_preview_format(app->camera_handle, &default_format);
+       camera_set_preview_format(app->camera_handle, default_format);
+       camera_set_preview_resolution(app->camera_handle, app->width, app->height);
+       camera_set_display(app->camera_handle, CAMERA_DISPLAY_TYPE_NONE, NULL);
+       camera_start_preview(app->camera_handle);
+
+       return;
+}
+
+
+static void _mediacodec_camera_stop(App *app)
+{
+       camera_state_e camera_state = CAMERA_STATE_NONE;
+
+       camera_get_state(app->camera_handle, &camera_state);
+       camera_stop_preview(app->camera_handle);
+       camera_destroy(app->camera_handle);
+
+       mediacodec_unprepare(app->mc_handle[0]);
+       mediacodec_unprepare(app->mc_handle[1]);
+       mediacodec_destroy(app->mc_handle[0]);
+       mediacodec_destroy(app->mc_handle[1]);
+       return;
+}
+
 static void _mediacodec_unprepare(App *app)
 {
        mediacodec_unprepare(app->mc_handle[0]);
@@ -1355,6 +1459,10 @@ void _interpret_main_menu(char *cmd, App *app)
                        _mediacodec_unprepare(app);
                else if (strncmp(cmd, "dt", 2) == 0)
                        _mediacodec_destroy(app);
+               else if (strncmp(cmd, "cr", 2) == 0)
+                       _mediacodec_camera_start(app);
+               else if (strncmp(cmd, "ct", 2) == 0)
+                       _mediacodec_camera_stop(app);
                else if (strncmp(cmd, "dp", 2) == 0) {
                        if (!app->enable_dump) {
                                app->enable_dump = TRUE;
@@ -1613,8 +1721,11 @@ static void display_sub_basic()
        g_print("rb. Reset output buffer \n");
        g_print("un. Unprepare \t\t");
        g_print("dt. Destroy \t\t");
-       g_print("q. quite test suite \n");
+       g_print("q. quit test suite \n");
        g_print("dp. enable dump \n");
+       g_print("-----------------------------------------------------------------------------------------\n");
+       g_print("cr. camera preview -> encoder -> decoder\n");
+       g_print("ct. quit camera test\n");
        g_print("\n");
        g_print("=========================================================================================\n");
 }