From: Sejun Park Date: Tue, 23 Aug 2016 04:54:18 +0000 (+0900) Subject: Added test suite for camera preview X-Git-Tag: accepted/tizen/common/20160831.162043~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d9445c9a05caa3fa67493b4147e739d34dd9a749;p=platform%2Fcore%2Fapi%2Fmediacodec.git Added test suite for camera preview Change-Id: Ic60e48e994bf7b1f79c14934572319eb7007d093 --- diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index b4a17e3..94a969c 100755 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -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) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d6a1257..d3e0022 100755 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -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) diff --git a/test/media_codec_test.c b/test/media_codec_test.c index 37bb551..2da9c6f 100755 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -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"); }