4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jeongmo Yang <jm80.yang@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 /*=======================================================================================
24 =======================================================================================*/
31 #include <Elementary.h>
32 #include <sound_manager.h>
33 #include <appcore-efl.h>
35 /*-----------------------------------------------------------------------
36 | GLOBAL VARIABLE DEFINITIONS: |
37 -----------------------------------------------------------------------*/
38 #define EXPORT_API __attribute__((__visibility__("default")))
43 #define LOG_TAG "RECORDER_TESTSUITE"
48 #define PACKAGE "recorder_test"
51 static int app_create(void *data);
52 static int app_terminate(void *data);
60 typedef struct _appdata appdata;
62 struct appcore_ops ops = {
64 .terminate = app_terminate,
68 GIOChannel *stdin_channel;
76 static GTimer *timer = NULL;
77 static int g_recorder_device_changed_cb_id;
79 /*-----------------------------------------------------------------------
80 | GLOBAL CONSTANT DEFINITIONS: |
81 -----------------------------------------------------------------------*/
84 /*-----------------------------------------------------------------------
85 | IMPORTED VARIABLE DECLARATIONS: |
86 -----------------------------------------------------------------------*/
89 /*-----------------------------------------------------------------------
90 | IMPORTED FUNCTION DECLARATIONS: |
91 -----------------------------------------------------------------------*/
94 /*-----------------------------------------------------------------------
96 -----------------------------------------------------------------------*/
99 #define DISPLAY_W_320 320 /* for direct FB */
100 #define DISPLAY_H_240 240 /* for direct FB */
103 #define SRC_VIDEO_FRAME_RATE_15 15 /* video input frame rate */
104 #define SRC_VIDEO_FRAME_RATE_30 30 /* video input frame rate */
105 #define IMAGE_ENC_QUALITY 85 /* quality of jpeg */
107 #define MAX_FILE_SIZE_FOR_MMS (250 * 1024)
109 #define EXT_JPEG "jpg"
110 #define EXT_MP4 "mp4"
111 #define EXT_3GP "3gp"
112 #define EXT_AMR "amr"
113 #define EXT_MKV "mkv"
115 #define TARGET_FILENAME_PATH "/opt/usr/home/owner/media/Sounds/"
116 #define IMAGE_CAPTURE_EXIF_PATH TARGET_FILENAME_PATH"exif.raw"
117 #define TARGET_FILENAME_VIDEO TARGET_FILENAME_PATH"test_rec_video.mp4"
118 #define TARGET_FILENAME_AUDIO TARGET_FILENAME_PATH"test_rec_audio.m4a"
119 #define CAPTURE_FILENAME_LEN 256
121 #define AUDIO_SOURCE_SAMPLERATE_AAC 44100
122 #define AUDIO_SOURCE_SAMPLERATE_AMR 8000
123 #define AUDIO_SOURCE_CHANNEL_AAC 2
124 #define AUDIO_SOURCE_CHANNEL_AMR 1
125 #define VIDEO_ENCODE_BITRATE 40000000 /* bps */
127 #define CHECK_MM_ERROR(expr) \
132 g_print("[%s:%d] error code : %x \n", __func__, __LINE__, ret); \
139 #define SAFE_FREE(x) if (x) { g_free(x); x = NULL; }
149 * Enumerations for command
151 #define SENSOR_WHITEBALANCE_NUM 10
152 #define SENSOR_COLOR_TONE_NUM 31
153 #define SENSOR_FLIP_NUM 3
154 #define SENSOR_PROGRAM_MODE_NUM 15
155 #define SENSOR_FOCUS_NUM 6
156 #define SENSOR_INPUT_ROTATION 4
157 #define SENSOR_AF_SCAN_NUM 4
158 #define SENSOR_ISO_NUM 8
159 #define SENSOR_EXPOSURE_NUM 9
160 #define SENSOR_IMAGE_FORMAT 9
163 /*-----------------------------------------------------------------------
164 | LOCAL CONSTANT DEFINITIONS: |
165 -----------------------------------------------------------------------*/
167 MODE_VIDEO_CAPTURE, /* recording and image capture mode */
168 MODE_AUDIO, /* audio recording*/
179 /*-----------------------------------------------------------------------
180 | LOCAL DATA TYPE DEFINITIONS: |
181 -----------------------------------------------------------------------*/
182 typedef struct _cam_handle {
185 int mode; /*video/audio(recording) mode */
189 unsigned long long elapsed_time;
192 typedef struct _cam_xypair {
193 const char *attr_subcat_x;
194 const char *attr_subcat_y;
206 camera_attr_exposure_mode_e mode;
211 camera_attr_iso_e mode;
216 camera_rotation_e mode;
218 } camera_rotation_stack;
220 /*---------------------------------------------------------------------------
221 | LOCAL VARIABLE DEFINITIONS: |
222 ---------------------------------------------------------------------------*/
223 static cam_handle_t *hcamcorder ;
225 const char *wb[SENSOR_WHITEBALANCE_NUM] = {
238 const char *ct[SENSOR_COLOR_TONE_NUM] = {
264 "SELECTVE_COLOR_RED",
265 "SELECTVE_COLOR_GREEN",
266 "SELECTVE_COLOR_BLUE",
267 "SELECTVE_COLOR_YELLOW",
268 "SELECTVE_COLOR_RED_YELLOW",
272 const char *flip[SENSOR_FLIP_NUM] = {
278 const char *program_mode[SENSOR_PROGRAM_MODE_NUM] = {
296 const char *focus_mode[SENSOR_FOCUS_NUM] = {
305 const char *camera_rotation[SENSOR_INPUT_ROTATION] = {
312 const char *af_scan[SENSOR_AF_SCAN_NUM] = {
319 const char *iso_mode[SENSOR_ISO_NUM] = {
330 const char *exposure_mode[SENSOR_EXPOSURE_NUM] = {
342 const char *image_fmt[SENSOR_IMAGE_FORMAT] = {
354 const char *face_zoom_mode[] = {
359 const char *display_mode[] = {
361 "Primary Video ON and Secondary Video Full Screen",
362 "Primary Video OFF and Secondary Video Full Screen",
365 const char *output_mode[] = {
367 "Original Size mode",
369 "Cropped Full Screen mode",
373 const char *capture_sound[] = {
379 const char *rotate_mode[] = {
386 const char* strobe_mode[] = {
390 "Strobe RedEyeReduction",
392 "Strobe FrontCurtain",
393 "Strobe RearCurtain",
397 const char *detection_mode[2] = {
398 "Face Detection OFF",
402 const char *wdr_mode[] = {
408 const char *hdr_mode[] = {
411 "HDR ON and Original",
414 const char *ahs_mode[] = {
415 "Anti-handshake OFF",
417 "Anti-handshake AUTO",
418 "Anti-handshake MOVIE",
421 const char *vs_mode[] = {
422 "Video-stabilization OFF",
423 "Video-stabilization ON",
426 const char *visible_mode[] = {
432 /*---------------------------------------------------------------------------
433 | LOCAL FUNCTION PROTOTYPES: |
434 ---------------------------------------------------------------------------*/
435 static void print_menu();
436 static gboolean cmd_input(GIOChannel *channel);
437 static gboolean init(int type);
438 static gboolean mode_change(gchar buf);
441 static bool preview_resolution_cb(int width, int height, void *user_data)
443 resolution_stack *data = (resolution_stack*)user_data;
446 g_print("NULL data\n");
450 data->width[data->count] = width;
451 data->height[data->count] = height;
453 g_print("%d. %dx%d\n", data->count, width, height);
460 static bool af_mode_foreach_cb(camera_attr_iso_e mode , void *user_data)
462 g_print("%d.%s\n", mode, af_scan[mode]);
466 static bool exposure_mode_cb(camera_attr_af_mode_e mode , void *user_data)
468 exposure_stack *data = (exposure_stack*)user_data;
471 g_print("NULL data\n");
478 g_print("%d.%s\n", mode, exposure_mode[mode]);
482 static bool iso_mode_cb(camera_attr_iso_e mode , void *user_data)
484 g_print("%d.%s\n", mode, iso_mode[mode]);
488 static bool camera_rotation_cb(camera_rotation_e mode , void *user_data)
490 camera_rotation_stack *data = (camera_rotation_stack*)user_data;
493 g_print("NULL data\n");
500 g_print("%d.%s\n", mode, camera_rotation[mode]);
504 static bool white_balance_cb(camera_attr_whitebalance_e mode , void *user_data)
506 g_print("%d.%s\n", mode, wb[mode]);
510 static bool colortone_cb(camera_attr_effect_mode_e mode , void *user_data)
512 g_print("%d.%s\n", mode, ct[mode]);
516 static bool program_mode_cb(camera_attr_scene_mode_e mode , void *user_data)
518 g_print("%d.%s\n", mode, program_mode[mode]);
522 static bool strobe_mode_cb(camera_attr_flash_mode_e mode , void *user_data)
524 g_print("%d.%s\n", mode, strobe_mode[mode]);
528 static void _face_detected(camera_detected_face_s *faces, int count, void *user_data)
532 g_print("face detected!!\n");
534 for (i = 0 ; i < count ; i++)
535 g_print("%d) - %dx%d\n", faces[i].id, faces[i].x, faces[i].y);
540 static void _state_changed_cb(recorder_state_e previous_state, recorder_state_e current_state, bool by_policy, void *user_data)
542 g_print("\n\tstate changed[by_policy:%d] : %d -> %d\n\n", by_policy, previous_state, current_state);
546 static void _recorder_device_state_changed_cb(recorder_type_e type, recorder_device_state_e state, void *user_data)
548 g_print("\nrecorder device[%d] state changed to %d\n", type, state);
552 static void _recording_status_cb(unsigned long long elapsed_time, unsigned long long file_size, void *user_data)
554 static unsigned long long elapsed = -1;
556 if (elapsed != elapsed_time / 1000) {
557 unsigned long temp_time;
558 unsigned long long hour, minute, second;
559 elapsed = elapsed_time / 1000;
561 hour = temp_time / 3600;
562 temp_time = elapsed % 3600;
563 minute = temp_time / 60;
564 second = temp_time % 60;
565 g_print("\n\tCurrent Time - %lld:%lld:%lld, filesize %lld KB\n\n",
566 hour, minute, second, file_size);
572 static void _recording_limit_reached_cb(recorder_recording_limit_type_e type, void *user_data)
574 g_print("\n\tRECORDING LIMIT REACHED [type: %d]\n\n", type);
579 static inline void flush_stdin()
582 while ((ch = getchar()) != EOF && ch != '\n');
586 static bool _release_idle_event_callback(void *data)
588 g_print("destroy recorder handle\n\n");
590 recorder_destroy(hcamcorder->recorder);
591 hcamcorder->recorder = NULL;
592 hcamcorder->menu_state = MENU_STATE_INIT;
598 static void _recorder_error_cb(int error, recorder_state_e current_state, void *user_data)
600 g_print("\n\n\tERROR [0x%x], current state %d\n", error, current_state);
603 case RECORDER_ERROR_RESOURCE_CONFLICT:
604 g_print("\t\t[RECORDER_ERROR_RESOURCE_CONFLICT]\n\n");
606 case RECORDER_ERROR_SECURITY_RESTRICTED:
607 g_print("\t\t[RECORDER_ERROR_SECURITY_RESTRICTED]\n\n");
609 case RECORDER_ERROR_SERVICE_DISCONNECTED:
610 g_print("\t\t[RECORDER_ERROR_SERVICE_DISCONNECTED]\n\n");
611 g_idle_add_full(G_PRIORITY_DEFAULT,
612 (GSourceFunc)_release_idle_event_callback,
623 static void print_menu()
625 switch (hcamcorder->menu_state) {
626 case MENU_STATE_INIT:
627 g_print("\n\t=======================================\n");
628 g_print("\t RECORDER_TESTSUIT\n");
629 g_print("\t=======================================\n");
630 g_print("\t '1' Video Capture - Rear Camera\n");
631 g_print("\t '2' Audio Recording - MIC\n");
632 g_print("\t '3' Audio Recording - MODEM\n");
633 g_print("\t '4' Add recorder device changed callback\n");
634 g_print("\t '5' Remove recorder device changed callback\n");
635 g_print("\t '6' Get recorder device state\n");
636 g_print("\t 'q' Exit\n");
637 g_print("\t=======================================\n");
638 g_print("\t Choose the menu :\n\t");
640 case MENU_STATE_MAIN:
641 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
642 g_print("\n\t=======================================\n");
643 if (recorder_state <= RECORDER_STATE_NONE) {
644 g_print("\t '1' Start Recording\n");
645 g_print("\t '2' Setting\n");
646 g_print("\t 'b' back\n");
647 } else if (recorder_state == RECORDER_STATE_RECORDING) {
648 g_print("\t 'p' Pause Recording\n");
649 g_print("\t 'c' Cancel\n");
650 g_print("\t 's' Save\n");
651 } else if (recorder_state == RECORDER_STATE_PAUSED) {
652 g_print("\t 'r' Resume Recording\n");
653 g_print("\t 'c' Cancel\n");
654 g_print("\t 's' Save\n");
656 g_print("\t=======================================\n");
657 } else if (hcamcorder->mode == MODE_AUDIO) {
658 g_print("\n\t=======================================\n");
659 g_print("\t Audio Recording\n");
660 g_print("\t=======================================\n");
661 if (recorder_state <= RECORDER_STATE_NONE) {
662 g_print("\t '1' Start Recording\n");
663 g_print("\t 'b' back\n");
664 } else if (recorder_state == RECORDER_STATE_RECORDING) {
665 g_print("\t 'p' Pause Recording\n");
666 g_print("\t 'c' Cancel\n");
667 g_print("\t 's' Save\n");
668 } else if (recorder_state == RECORDER_STATE_PAUSED) {
669 g_print("\t 'r' Resume Recording\n");
670 g_print("\t 'c' Cancel\n");
671 g_print("\t 's' Save\n");
673 g_print("\t=======================================\n");
677 case MENU_STATE_SETTING:
678 g_print("\n\t=======================================\n");
679 g_print("\t Video Capture > Setting\n");
680 g_print("\t=======================================\n");
681 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera] \n");
682 g_print("\t '0' Preview resolution \n");
683 g_print("\t '2' Digital zoom level \n");
684 g_print("\t '3' Optical zoom level \n");
685 g_print("\t '4' AF mode \n");
686 g_print("\t '5' AF scan range \n");
687 g_print("\t '6' Exposure mode \n");
688 g_print("\t '7' Exposure value \n");
689 g_print("\t '8' F number \n");
690 g_print("\t '9' Shutter speed \n");
691 g_print("\t 'i' ISO \n");
692 g_print("\t 'r' Rotate camera input \n");
693 g_print("\t 'f' Flip camera input \n");
694 g_print("\t >>>>>>>>>>>>>>>>>>>> [Display/Filter]\n");
695 g_print("\t 'v' Visible \n");
696 g_print("\t 'n' Display mode \n");
697 g_print("\t 'o' Output mode \n");
698 g_print("\t 'y' Rotate display \n");
699 g_print("\t 'Y' Flip display \n");
700 g_print("\t 'g' Brightness \n");
701 g_print("\t 'c' Contrast \n");
702 g_print("\t 's' Saturation \n");
703 g_print("\t 'h' Hue \n");
704 g_print("\t 'a' Sharpness \n");
705 g_print("\t 'w' White balance \n");
706 g_print("\t 't' Color tone \n");
707 g_print("\t 'd' WDR \n");
708 g_print("\t 'e' EV program mode \n");
709 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
710 g_print("\t 'z' Strobe (Flash) \n");
711 g_print("\t 'l' Face detection \n");
712 g_print("\t 'k' Anti-handshake \n");
713 g_print("\t 'K' Video-stabilization \n");
714 g_print("\t 'u' Touch AF area \n");;
715 g_print("\t 'M' Camcorder Motion Rate setting \n");
716 g_print("\t 'b' back\n");
717 g_print("\t=======================================\n");
721 g_print("unknow menu state !!\n");
728 static void main_menu(gchar buf)
732 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
733 if (recorder_state == RECORDER_STATE_NONE) {
735 case '1': /* Start Recording */
736 g_print("*Recording start!\n");
737 hcamcorder->elapsed_time = 0;
739 g_timer_reset(timer);
740 err = recorder_start(hcamcorder->recorder);
743 g_print("Rec start camcorder_record 0x%x\n", err);
745 recorder_state = RECORDER_STATE_RECORDING;
748 case '2': /* Setting */
749 hcamcorder->menu_state = MENU_STATE_SETTING;
753 hcamcorder->menu_state = MENU_STATE_INIT;
758 g_print("\t Invalid input \n");
761 } else if (recorder_state == RECORDER_STATE_RECORDING || recorder_state == RECORDER_STATE_PAUSED) {
763 case 'p': /* Pause Recording */
764 g_print("*Pause!\n");
765 err = recorder_pause(hcamcorder->recorder);
768 g_print("Rec pause camcorder_pause = %x\n", err);
770 recorder_state = RECORDER_STATE_PAUSED;
773 case 'r': /* Resume Recording */
774 g_print("*Resume!\n");
775 err = recorder_start(hcamcorder->recorder);
777 g_print("Rec start camcorder_record = %x\n", err);
779 recorder_state = RECORDER_STATE_RECORDING;
782 case 'c': /* Cancel */
783 g_print("*Cancel Recording !\n");
785 err = recorder_cancel(hcamcorder->recorder);
788 g_print("Cancel recording camcorder_cancel = %x\n", err);
790 recorder_state = RECORDER_STATE_NONE;
794 g_print("*Save Recording!\n");
795 g_timer_reset(timer);
797 err = recorder_commit(hcamcorder->recorder);
800 g_print("Save recording recorder_commit = %x\n", err);
802 recorder_state = RECORDER_STATE_NONE;
806 g_print("\t Invalid input \n");
810 g_print("Wrong camcorder state, check status!!\n");
812 } else if (hcamcorder->mode == MODE_AUDIO) {
813 if (recorder_state == RECORDER_STATE_NONE) {
815 case '1': /* Start Recording */
816 g_print("*Recording start!\n");
817 hcamcorder->elapsed_time = 0;
818 g_timer_reset(timer);
819 err = recorder_start(hcamcorder->recorder);
822 g_print("Rec start camcorder_record = %x\n", err);
824 recorder_state = RECORDER_STATE_RECORDING;
828 hcamcorder->menu_state = MENU_STATE_INIT;
833 g_print("\t Invalid input \n");
836 } else if (recorder_state == RECORDER_STATE_RECORDING || recorder_state == RECORDER_STATE_PAUSED) {
838 case 'p': /* Pause Recording */
839 g_print("*Pause!\n");
840 err = recorder_pause(hcamcorder->recorder);
843 g_print("Rec pause camcorder_pause = %x\n", err);
845 recorder_state = RECORDER_STATE_PAUSED;
848 case 'r': /* Resume Recording */
849 g_print("*Resume!\n");
850 err = recorder_start(hcamcorder->recorder);
852 g_print("Rec start camcorder_record = %x\n", err);
854 recorder_state = RECORDER_STATE_RECORDING;
857 case 'c': /* Cancel */
858 g_print("*Cancel Recording !\n");
859 err = recorder_cancel(hcamcorder->recorder);
862 g_print("Cancel recording camcorder_cancel = %x\n", err);
864 recorder_state = RECORDER_STATE_NONE;
868 g_print("*Save Recording!\n");
869 g_timer_reset(timer);
870 err = recorder_commit(hcamcorder->recorder);
873 g_print("Save recording recorder_commit = %x\n", err);
875 recorder_state = RECORDER_STATE_NONE;
879 g_print("\t Invalid input \n");
883 g_print("Wrong camcorder state, check status!!\n");
886 g_print("\t Invalid mode, back to upper menu \n");
887 hcamcorder->menu_state = MENU_STATE_INIT;
893 static void setting_menu(gchar buf)
895 gboolean bret = FALSE;
901 int x = 0, y = 0, width = 0, height = 0;
903 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
906 case '0': /* Setting > Preview Resolution setting */
907 g_print("*Select the preview resolution!\n");
908 resolution_stack resolution_list;
909 resolution_list.count = 0;
911 recorder_foreach_supported_video_resolution(hcamcorder->recorder,
912 preview_resolution_cb, &resolution_list);
915 err = scanf("%d", &idx);
917 if (resolution_list.count > idx && idx >= 0) {
918 g_print("-----------------PREVIEW RESOLUTION (%dx%d)---------------------\n",
919 resolution_list.width[idx], resolution_list.height[idx]);
921 result = recorder_set_video_resolution(hcamcorder->recorder,
922 resolution_list.width[idx], resolution_list.height[idx]);
924 g_print("invalid input %d\n", idx);
928 resolution_list.count = 0;
936 case '2': /* Setting > Digital zoom level */
937 g_print("*Digital zoom level !\n");
939 camera_attr_get_zoom_range(hcamcorder->camera, &min, &max);
941 g_print("Not supported !! \n");
944 g_print("\n Select Digital zoom level min %d - max %d\n", min, max);
945 err = scanf("%d", &idx);
946 bret = camera_attr_set_zoom(hcamcorder->camera, idx);
951 case '3': /* Setting > AF mode */
953 g_print("*AF mode !\n");
954 g_print("\t1. AF Start !\n");
955 g_print("\t2. AF Stop !\n\n");
958 err = scanf("%d", &idx);
961 camera_start_focusing(hcamcorder->camera, 0);
964 camera_cancel_focusing(hcamcorder->camera);
967 g_print("Wrong Input[%d] !! \n", idx);
973 case '4': /* Setting > AF scan range */
974 g_print("*AF scan range !\n");
976 camera_attr_foreach_supported_af_mode(hcamcorder->camera,
977 (camera_attr_supported_af_mode_cb)af_mode_foreach_cb, NULL);
980 err = scanf("%d", &idx);
981 bret = camera_attr_set_af_mode(hcamcorder->camera, idx);
984 case '5': /* Setting > Exposure mode */
985 g_print("* Exposure mode!\n");
987 camera_attr_foreach_supported_exposure_mode(hcamcorder->camera,
988 (camera_attr_supported_exposure_mode_cb)exposure_mode_cb, NULL);
992 g_print("\n Select Exposure mode \n");
993 err = scanf("%d", &idx);
994 bret = camera_attr_set_exposure_mode(hcamcorder->camera, idx);
998 case '6': /* Setting > Exposure value */
999 camera_attr_get_exposure_range(hcamcorder->camera, &min, &max);
1001 g_print("Not supported !! \n");
1005 g_print("\n Select Exposure mode min%d -max %d\n", min, max);
1006 err = scanf("%d", &idx);
1007 bret = camera_attr_set_exposure(hcamcorder->camera, idx);
1011 case '7': /* Setting > F number */
1012 g_print("Not supported !! \n");
1015 case 'i': /* Setting > ISO */
1016 g_print("*ISO !\n");
1017 camera_attr_foreach_supported_iso(hcamcorder->camera, iso_mode_cb, NULL);
1021 err = scanf("%d", &idx);
1022 bret = camera_attr_set_iso(hcamcorder->camera, idx);
1025 case 'r': /* Setting > Rotate camera input when recording */
1026 g_print("*Rotate camera input\n");
1027 camera_attr_foreach_supported_stream_rotation(hcamcorder->camera, camera_rotation_cb, NULL);
1030 err = scanf("%d", &idx);
1031 CHECK_MM_ERROR(camera_stop_preview(hcamcorder->camera));
1032 bret = camera_attr_set_stream_rotation(hcamcorder->camera, idx);
1033 CHECK_MM_ERROR(camera_start_preview(hcamcorder->camera));
1036 case 'f': /* Setting > Flip camera input */
1038 g_print("*Flip camera input\n");
1039 g_print(" 0. Flip NONE\n");
1040 g_print(" 1. Flip HORIZONTAL\n");
1041 g_print(" 2. Flip VERTICAL\n");
1042 g_print(" 3. Flip BOTH\n");
1044 err = scanf("%d", &idx);
1046 CHECK_MM_ERROR(camera_stop_preview(hcamcorder->camera));
1047 camera_attr_set_stream_flip(hcamcorder->camera, idx);
1048 CHECK_MM_ERROR(camera_start_preview(hcamcorder->camera));
1051 /* Display / Filter setting */
1052 case 'v': /* Display visible */
1053 g_print("* Display visible setting !\n");
1055 g_print("\n Select Display visible \n");
1058 for (i = 0; i < 2; i++)
1059 g_print("\t %d. %s\n", i+1, visible_mode[i]);
1061 err = scanf("%d", &value);
1062 bret = camera_set_display_visible(hcamcorder->camera, idx-1);
1067 case 'o': /* Setting > Display MODe */
1068 g_print("* Display mode!\n");
1071 for (i = 1 ; i <= 2 ; i++)
1072 g_print("%d. %s\n", i, display_mode[i]);
1074 err = scanf("%d", &idx);
1075 bret = camera_set_display_mode(hcamcorder->camera, idx-1);
1078 case 'y': /* Setting > Rotate Display */
1081 g_print("\n Select Rotate mode\n");
1082 g_print("\t0. 0\n\t1. 90\n\t2. 180\n\t3. 270\n\n");
1083 err = scanf("%d", &idx);
1084 CHECK_MM_ERROR(camera_stop_preview(hcamcorder->camera));
1085 bret = camera_set_display_rotation(hcamcorder->camera, idx);
1086 CHECK_MM_ERROR(camera_start_preview(hcamcorder->camera));
1089 case 'Y': /* Setting > Flip Display */
1091 g_print("\n Select Rotate mode\n");
1092 g_print("\t0. NONE\n\t1. HORIZONTAL\n\t2. VERTICAL\n\t3. BOTH\n\n");
1093 err = scanf("%d", &idx);
1094 bret = camera_set_display_flip(hcamcorder->camera, idx);
1097 case 'g': /* Setting > Brightness */
1098 g_print("*Brightness !\n");
1099 camera_attr_get_brightness_range(hcamcorder->camera, &min, &max);
1102 g_print("\n Select brightness min (%d) -max(%d)\n", min, max);
1103 err = scanf("%d", &idx);
1104 bret = camera_attr_set_brightness(hcamcorder->camera, idx);
1107 case 'c': /* Setting > Contrast */
1108 g_print("*Contrast !\n");
1109 camera_attr_get_contrast_range(hcamcorder->camera, &min, &max);
1112 g_print("\n Select Contrast min(%d)-max(%d)\n", min, max);
1113 err = scanf("%d", &idx);
1114 bret = camera_attr_set_contrast(hcamcorder->camera, idx);
1119 case 'w': /* Setting > White balance */
1120 g_print("*White balance !\n");
1123 g_print("\n Select White balance \n");
1124 camera_attr_foreach_supported_whitebalance(hcamcorder->camera, white_balance_cb, NULL);
1125 err = scanf("%d", &idx);
1126 bret = camera_attr_set_whitebalance(hcamcorder->camera, idx);
1129 case 't': /* Setting > Color tone */
1130 g_print("*Color tone !\n");
1131 camera_attr_foreach_supported_effect(hcamcorder->camera, colortone_cb, NULL);
1133 g_print("\n Select Color tone \n");
1135 err = scanf("%d", &idx);
1136 bret = camera_attr_set_effect(hcamcorder->camera, idx);
1140 case 'd': /* Setting > WDR */
1141 g_print("*WDR !\n");
1143 g_print("\n Select WDR Mode \n");
1145 for (i = 0; i < 2; i++)
1146 g_print("\t %d. %s\n", i+1, wdr_mode[i]);
1148 err = scanf("%d", &idx);
1150 bret = camera_attr_enable_auto_contrast(hcamcorder->camera, 0);
1152 bret = camera_attr_enable_auto_contrast(hcamcorder->camera, 1);
1156 case 'e': /* Setting > EV program mode */
1157 g_print("* EV program mode!\n");
1158 camera_attr_foreach_supported_scene_mode(hcamcorder->camera, program_mode_cb, NULL);
1160 g_print("\n Select EV program mode \n");
1162 err = scanf("%d", &idx);
1163 bret = camera_attr_set_scene_mode(hcamcorder->camera, idx);
1168 case 'z': /* Setting > Strobe setting */
1169 g_print("*Strobe Mode\n");
1170 camera_attr_foreach_supported_flash_mode(hcamcorder->camera, strobe_mode_cb, NULL);
1171 g_print("\n Select Strobe Mode \n");
1173 err = scanf("%d", &idx);
1174 bret = camera_attr_set_flash_mode(hcamcorder->camera, idx);
1178 case 'l': /* Setting > Face detection setting */
1179 /* hcamcorder->menu_state = MENU_STATE_SETTING_DETECTION; */
1180 g_print("* Face detect mode !\n");
1184 for (i = 0; i < 2; i++)
1185 g_print("\t %d. %s \n", i+1, detection_mode[i]);
1187 err = scanf("%d", &idx);
1188 if (camera_is_supported_face_detection(hcamcorder->camera)) {
1189 if (idx >= 0 && idx < 2)
1190 bret = camera_start_face_detection(hcamcorder->camera, _face_detected, NULL);
1192 g_print("face detection_not supported\n");
1197 case 'k': /* Setting > Anti-handshake */
1198 g_print("*Anti-handshake !\n");
1200 g_print("\n Select Anti-handshake mode \n");
1202 for (i = 0; i < 2; i++)
1203 g_print("\t %d. %s\n", i+1, ahs_mode[i]);
1205 err = scanf("%d", &idx);
1206 bret = camera_attr_enable_anti_shake(hcamcorder->camera, idx-1);
1210 case 'K': /* Setting > Video-stabilization */
1211 g_print("*Video-stabilization !\n");
1213 g_print("\n Select Video-stabilization mode \n");
1215 for (i = 0; i < 2; i++)
1216 g_print("\t %d. %s\n", i+1, vs_mode[i]);
1218 err = scanf("%d", &idx);
1221 g_print("\n Restart preview with NV12 and 720p resolution\n");
1223 err = camera_stop_preview(hcamcorder->camera);
1225 camera_set_preview_resolution(hcamcorder->camera, 1280, 720);
1226 camera_set_preview_format(hcamcorder->camera, CAMERA_PIXEL_FORMAT_NV12);
1227 camera_attr_enable_video_stabilization(hcamcorder->camera, idx-1);
1230 err = camera_start_preview(hcamcorder->camera);
1233 g_print("\n Restart FAILED! %x\n", err);
1238 case 'u': /* Touch AF area */
1239 g_print("* Touch AF area !\n");
1242 g_print("\n Input x,y,width,height \n");
1243 err = scanf("%d,%d,%d,%d", &x, &y, &width, &height);
1244 err = camera_attr_set_af_area(hcamcorder->camera, width, height);
1247 g_print("Failed to set touch AF area.(%x)\n", err);
1249 g_print("Succeed to set touch AF area.\n");
1256 float motion_rate = 0.0;
1260 g_print("*Camcorder Motion Rate setting! (should be bigger than zero)\n");
1262 err = scanf("%f", &motion_rate);
1263 err = recorder_attr_set_recording_motion_rate(hcamcorder->recorder, motion_rate);
1265 g_print("Failed to set Camcorder Motion Rate %f [err:0x%x]\n", motion_rate, err);
1267 g_print("Succeed to set Motion Rate %f\n", motion_rate);
1271 case 'b': /* back */
1272 hcamcorder->menu_state = MENU_STATE_MAIN;
1276 g_print("\t Invalid input \n");
1280 g_print("\t Invalid mode, back to upper menu \n");
1281 hcamcorder->menu_state = MENU_STATE_MAIN;
1284 g_print("\t bret : 0x%x \n", bret);
1289 * This function is to execute command.
1291 * @param channel [in] 1st parameter
1293 * @return This function returns TRUE/FALSE
1297 static gboolean cmd_input(GIOChannel *channel)
1301 GError *g_error = NULL;
1303 g_print("\n\tENTER\n");
1305 g_io_channel_read_line(channel, &buf, &read_size, NULL, &g_error);
1307 g_print("\n\tg_io_channel_read_chars error\n");
1308 g_error_free(g_error);
1315 g_print("\n\tMenu Status : %d\n", hcamcorder->menu_state);
1316 switch (hcamcorder->menu_state) {
1317 case MENU_STATE_INIT:
1318 mode_change(buf[0]);
1320 case MENU_STATE_MAIN:
1323 case MENU_STATE_SETTING:
1324 setting_menu(buf[0]);
1335 g_print("\n\tNo read input\n");
1341 static gboolean init(int type)
1348 if (!hcamcorder->recorder)
1351 /*================================================================================
1353 *=================================================================================*/
1354 if (type == MODE_VIDEO_CAPTURE) {
1355 err = recorder_set_file_format(hcamcorder->recorder, RECORDER_FILE_FORMAT_MP4);
1357 g_print("Init fail. (%x)\n", err);
1360 err = recorder_attr_set_audio_device(hcamcorder->recorder, RECORDER_AUDIO_DEVICE_MIC);
1362 g_print("Init fail. (%x)\n", err);
1365 err = recorder_set_audio_encoder(hcamcorder->recorder, RECORDER_AUDIO_CODEC_AAC);
1367 g_print("Init fail. (%x)\n", err);
1370 err = recorder_set_video_encoder(hcamcorder->recorder, RECORDER_VIDEO_CODEC_MPEG4);
1372 g_print("Init fail. (%x)\n", err);
1375 err = recorder_attr_set_video_encoder_bitrate(hcamcorder->recorder, VIDEO_ENCODE_BITRATE);
1377 g_print("Init fail. (%x)\n", err);
1380 err = recorder_attr_set_audio_samplerate(hcamcorder->recorder, AUDIO_SOURCE_SAMPLERATE_AAC);
1382 g_print("Init fail. (%x)\n", err);
1385 err = recorder_attr_set_audio_channel(hcamcorder->recorder, AUDIO_SOURCE_CHANNEL_AAC);
1387 g_print("Init fail. (%x)\n", err);
1390 err = recorder_set_filename(hcamcorder->recorder, TARGET_FILENAME_VIDEO);
1392 g_print("Init fail. (%x)\n", err);
1395 } else if (type == MODE_AUDIO) {
1396 /*================================================================================
1398 *=================================================================================*/
1399 err = recorder_set_file_format(hcamcorder->recorder, RECORDER_FILE_FORMAT_MP4);
1401 g_print("Init fail. (%x)\n", err);
1404 err = recorder_attr_set_audio_device(hcamcorder->recorder, RECORDER_AUDIO_DEVICE_MIC);
1406 g_print("Init fail. (%x)\n", err);
1409 err = recorder_set_audio_encoder(hcamcorder->recorder, RECORDER_AUDIO_CODEC_AAC);
1411 g_print("Init fail. (%x)\n", err);
1414 err = recorder_attr_set_audio_samplerate(hcamcorder->recorder, AUDIO_SOURCE_SAMPLERATE_AAC);
1416 g_print("Init fail. (%x)\n", err);
1419 err = recorder_attr_set_audio_channel(hcamcorder->recorder, AUDIO_SOURCE_CHANNEL_AAC);
1421 g_print("Init fail. (%x)\n", err);
1424 err = recorder_set_filename(hcamcorder->recorder, TARGET_FILENAME_AUDIO);
1426 g_print("Init fail. (%x)\n", err);
1429 err = recorder_attr_set_time_limit(hcamcorder->recorder, 360000);
1431 g_print("Init fail. (%x)\n", err);
1434 err = recorder_attr_set_audio_encoder_bitrate(hcamcorder->recorder, 128000);
1436 g_print("Init fail. (%x)\n", err);
1441 recorder_set_error_cb(hcamcorder->recorder, _recorder_error_cb, NULL);
1442 recorder_set_state_changed_cb(hcamcorder->recorder, _state_changed_cb, NULL);
1443 recorder_set_recording_status_cb(hcamcorder->recorder, _recording_status_cb, NULL);
1444 recorder_set_recording_limit_reached_cb(hcamcorder->recorder, _recording_limit_reached_cb, NULL);
1446 g_print("Init DONE.\n");
1451 g_print("init failed.\n");
1455 static gboolean init_handle()
1457 hcamcorder->mode = MODE_VIDEO_CAPTURE; /* image(capture)/video(recording) mode */
1458 hcamcorder->menu_state = MENU_STATE_INIT;
1459 hcamcorder->isMute = FALSE;
1460 hcamcorder->elapsed_time = 0;
1461 hcamcorder->fps = SRC_VIDEO_FRAME_RATE_15; /*SRC_VIDEO_FRAME_RATE_30;*/
1467 static void _sound_stream_focus_state_changed_cb(sound_stream_info_h stream_info, sound_stream_focus_change_reason_e reason_for_change, const char *additional_info, void *user_data)
1469 g_print("focus changed : reason %d\n", reason_for_change);
1474 * This function is to change camcorder mode.
1476 * @param buf [in] user input
1478 * @return This function returns TRUE/FALSE
1480 * @see other functions
1482 static gboolean mode_change(gchar buf)
1484 int err = RECORDER_ERROR_NONE;
1485 int state = RECORDER_STATE_NONE;
1486 char media_type = '\0';
1488 recorder_device_state_e device_state = RECORDER_DEVICE_STATE_IDLE;
1490 g_get_current_time(&previous);
1491 g_timer_reset(timer);
1493 if (hcamcorder->recorder) {
1494 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1495 if (state != RECORDER_STATE_NONE) {
1496 if (state == RECORDER_STATE_RECORDING ||
1497 state == RECORDER_STATE_PAUSED) {
1498 g_print("recorder_cancel\n");
1499 err = recorder_cancel(hcamcorder->recorder);
1500 if (err != RECORDER_ERROR_NONE) {
1501 g_print("exit recorder_cancel failed 0x%x\n", err);
1506 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1507 if (state == RECORDER_STATE_READY) {
1508 g_print("recorder_unprepare\n");
1509 recorder_unprepare(hcamcorder->recorder);
1512 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1513 if (state == RECORDER_STATE_CREATED) {
1514 g_print("recorder_destroy\n");
1515 err = recorder_destroy(hcamcorder->recorder);
1516 if (err == RECORDER_ERROR_NONE) {
1517 g_print("recorder_destroy done\n");
1518 hcamcorder->recorder = NULL;
1528 hcamcorder->mode = MODE_VIDEO_CAPTURE;
1530 g_print("camera_create\n");
1532 err = camera_create(CAMERA_DEVICE_CAMERA0, &hcamcorder->camera);
1533 if (err != CAMERA_ERROR_NONE) {
1534 g_print("camera create failed 0x%d\n", err);
1538 err = camera_set_display(hcamcorder->camera, CAMERA_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(ad.win));
1539 if (err != CAMERA_ERROR_NONE) {
1540 g_print("set display failed 0x%d\n", err);
1541 camera_destroy(hcamcorder->camera);
1542 hcamcorder->camera = NULL;
1546 err = camera_start_preview(hcamcorder->camera);
1547 if (err != CAMERA_ERROR_NONE) {
1548 g_print("start preview failed 0x%d\n", err);
1549 camera_destroy(hcamcorder->camera);
1550 hcamcorder->camera = NULL;
1554 err = recorder_create_videorecorder(hcamcorder->camera, &hcamcorder->recorder);
1555 if (err != RECORDER_ERROR_NONE) {
1556 g_print("video recorder create failed 0x%d\n", err);
1557 camera_stop_preview(hcamcorder->camera);
1558 camera_destroy(hcamcorder->camera);
1559 hcamcorder->camera = NULL;
1566 hcamcorder->mode = MODE_AUDIO;
1567 err = recorder_create_audiorecorder(&hcamcorder->recorder);
1568 if (err != RECORDER_ERROR_NONE) {
1569 g_print("audio recorder create failed 0x%x\n", err);
1574 sound_stream_info_h stream_info = NULL;
1576 sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _sound_stream_focus_state_changed_cb, hcamcorder, &stream_info);
1578 recorder_set_sound_stream_info(hcamcorder->recorder, stream_info);
1579 sound_manager_destroy_stream_information(stream_info);
1583 err = recorder_attr_set_audio_device(hcamcorder->recorder, RECORDER_AUDIO_DEVICE_MIC);
1584 if (err != RECORDER_ERROR_NONE) {
1585 g_print("set audio device failed 0x%x\n", err);
1586 recorder_destroy(hcamcorder->recorder);
1587 hcamcorder->recorder = NULL;
1594 hcamcorder->mode = MODE_AUDIO;
1595 err = recorder_create_audiorecorder(&hcamcorder->recorder);
1596 if (err != RECORDER_ERROR_NONE) {
1597 g_print("audio recorder create failed 0x%d\n", err);
1601 err = recorder_attr_set_audio_device(hcamcorder->recorder, RECORDER_AUDIO_DEVICE_MODEM);
1602 if (err != RECORDER_ERROR_NONE) {
1603 g_print("set audio device failed 0x%d\n", err);
1604 recorder_destroy(hcamcorder->recorder);
1605 hcamcorder->recorder = NULL;
1612 err = recorder_add_device_state_changed_cb(_recorder_device_state_changed_cb,
1613 NULL, &g_recorder_device_changed_cb_id);
1614 g_print("add result 0x%x - cb id %d\n", err, g_recorder_device_changed_cb_id);
1617 if (g_recorder_device_changed_cb_id > 0) {
1618 err = recorder_remove_device_state_changed_cb(g_recorder_device_changed_cb_id);
1619 g_recorder_device_changed_cb_id = 0;
1620 g_print("remove result 0x%x\n", err);
1622 g_print("invalid callback id %d\n", g_recorder_device_changed_cb_id);
1626 err = recorder_get_device_state(RECORDER_TYPE_AUDIO, &device_state);
1627 g_print("get result 0x%x - audio state %d\n", err, device_state);
1628 err = recorder_get_device_state(RECORDER_TYPE_VIDEO, &device_state);
1629 g_print("get result 0x%x - video state %d\n", err, device_state);
1632 g_print("\t Quit Camcorder Testsuite!!\n");
1633 hcamcorder->mode = -1;
1637 g_print("\t Invalid media type(%c)\n", media_type);
1641 if (!init(hcamcorder->mode)) {
1642 g_print("testsuite init() failed.\n");
1646 err = recorder_prepare(hcamcorder->recorder);
1648 g_print("recorder_prepare() : %12.6lfs\n", g_timer_elapsed(timer, NULL));
1650 if (err != RECORDER_ERROR_NONE) {
1651 g_print("recorder_prepare = %x\n", err);
1655 g_get_current_time(¤t);
1656 timersub(¤t, &previous, &res);
1658 g_print("Recorder Preparing Time : %ld.%lds\n", res.tv_sec, res.tv_usec);
1660 hcamcorder->menu_state = MENU_STATE_MAIN;
1666 static int app_create(void *data)
1668 appdata *app_data = data;
1671 Evas_Object *win = NULL;
1672 Evas_Object *eo = NULL;
1673 Evas_Object *bg = NULL;
1674 Evas_Object *rect = NULL;
1676 if (app_data == NULL) {
1677 g_print("\t\nappdata is NULL\n");
1681 /* use gl backend */
1682 elm_config_accel_preference_set("opengl");
1684 win = elm_win_add(NULL, "camera_test", ELM_WIN_BASIC);
1686 elm_win_title_set(win, "camera_test");
1687 elm_win_borderless_set(win, EINA_TRUE);
1688 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
1689 g_print("\n\tscreen size %dx%d\n\n", w, h);
1690 evas_object_resize(win, w, h);
1691 elm_win_autodel_set(win, EINA_TRUE);
1692 elm_win_alpha_set(win, EINA_TRUE);
1694 g_print("\n\tfailed to get window\n\n");
1698 bg = elm_bg_add(win);
1700 elm_win_resize_object_add(win, bg);
1701 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1702 evas_object_show(bg);
1704 g_print("\n\tfailed to get elm bg\n\n");
1708 rect = evas_object_rectangle_add(evas_object_evas_get(win));
1710 evas_object_color_set(rect, 0, 0, 0, 0);
1711 evas_object_render_op_set(rect, EVAS_RENDER_COPY);
1713 g_print("\n\tfailed to get rectangle\n\n");
1717 elm_win_resize_object_add(win, rect);
1718 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1719 evas_object_show(rect);
1721 /* Create evas image object for EVAS surface */
1722 eo = evas_object_image_add(evas_object_evas_get(win));
1723 evas_object_image_size_set(eo, w, h);
1724 evas_object_image_fill_set(eo, 0, 0, w, h);
1725 evas_object_resize(eo, w, h);
1726 evas_object_show(eo);
1728 elm_win_activate(win);
1729 evas_object_show(win);
1731 app_data->win = win;
1734 timer = g_timer_new();
1735 g_timer_reset(timer);
1744 static int app_terminate(void *data)
1746 appdata *app_data = data;
1748 if (app_data == NULL) {
1749 g_print("\n\tappdata is NULL\n");
1754 g_timer_stop(timer);
1755 g_timer_destroy(timer);
1764 * This function is the example main function for mmcamcorder API.
1768 * @return This function returns 0.
1770 * @see other functions
1772 int main(int argc, char **argv)
1776 hcamcorder = (cam_handle_t *)g_malloc0(sizeof(cam_handle_t));
1777 recorder_state = RECORDER_STATE_NONE;
1779 stdin_channel = g_io_channel_unix_new(fileno(stdin));/* read from stdin */
1780 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)cmd_input, NULL);
1782 memset(&ad, 0x0, sizeof(appdata));
1785 bret = appcore_efl_main(PACKAGE, &argc, &argv, &ops);
1787 g_print("\n\treturn appcore_efl : %d\n\n", bret);
1790 g_io_channel_unref(stdin_channel);