2 * mm_camcorder_testsuite
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 /* ===========================================================================================
23 EDIT HISTORY FOR MODULE
24 This section contains comments describing changes made to the module.
25 Notice that changes are listed in reverse chronological order.
26 when who what, where, why
27 --------- -------------------- ----------------------------------------------------------
28 10/08/07 soyeon.kang@samsung.com Created
29 10/10/07 wh01.cho@samsung.com Created
30 12/30/08 jh1979.park@samsung.com Modified
31 08/31/11 sc11.lee@samsung.com Modified (Reorganized for easy look)
32 10/23/14 p.gamov@samsung.com Upgraded to Gstreamer 1.0
36 /*=======================================================================================
38 =======================================================================================*/
44 #include "../src/include/mm_camcorder.h"
45 #include "../src/include/mm_camcorder_internal.h"
46 #include "../src/include/mm_camcorder_util.h"
47 #include <gst/video/colorbalance.h>
49 /*-----------------------------------------------------------------------
50 | GLOBAL VARIABLE DEFINITIONS: |
51 -----------------------------------------------------------------------*/
52 #define EXPORT_API __attribute__((__visibility__("default")))
54 #define PACKAGE "mm_camcorder_testsuite"
57 GIOChannel *stdin_channel;
64 int mmcamcorder_state;
65 int mmcamcorder_print_state;
67 static int audio_stream_cb_cnt;
68 static int video_stream_cb_cnt;
69 static GTimer *timer = NULL;
71 /*-----------------------------------------------------------------------
72 | GLOBAL CONSTANT DEFINITIONS: |
73 -----------------------------------------------------------------------*/
76 /*-----------------------------------------------------------------------
77 | IMPORTED VARIABLE DECLARATIONS: |
78 -----------------------------------------------------------------------*/
81 /*-----------------------------------------------------------------------
82 | IMPORTED FUNCTION DECLARATIONS: |
83 -----------------------------------------------------------------------*/
86 /*-----------------------------------------------------------------------
88 -----------------------------------------------------------------------*/
89 #define test_ffmux_mp4
92 #define SRC_W_1920 1920
93 #define SRC_H_1080 1080
97 #define SRC_W_1600 1600
98 #define SRC_H_1200 1200
101 #define SRC_W_640 640
102 #define SRC_H_480 480
105 #define SRC_W_320 320 // video input width
106 #define SRC_H_240 240 // video input height
109 #define SRC_W_176 176 // video input width
110 #define SRC_H_144 144 // video input height
113 #define SRC_W_160 160 // video input width
114 #define SRC_H_120 120 // video input heith
117 #define SRC_W_400 400 // video input width
118 #define SRC_H_300 300 // video input height
120 #define SRC_W_192 192 // video input width
121 #define SRC_H_256 256 // video input height
123 #define SRC_W_144 144 // video input width
124 #define SRC_H_176 176 // video input height
126 #define SRC_W_300 300
127 #define SRC_W_400 400
130 #define DISPLAY_X_0 0 //for direct FB
131 #define DISPLAY_Y_0 0 //for direct FB
133 #define DISPLAY_W_320 320 //for direct FB
134 #define DISPLAY_H_240 240 //for direct FB
137 #define SRC_VIDEO_FRAME_RATE_15 15 // video input frame rate
138 #define SRC_VIDEO_FRAME_RATE_30 30 // video input frame rate
139 #define IMAGE_ENC_QUALITY 85 // quality of jpeg
140 #define IMAGE_CAPTURE_COUNT_STILL 1 // the number of still-shot
141 #define IMAGE_CAPTURE_COUNT_MULTI 3 // default the number of multi-shot
142 #define IMAGE_CAPTURE_COUNT_INTERVAL 100 // mili seconds
144 #define MAX_FILE_SIZE_FOR_MMS (250 * 1024)
146 #define EXT_JPEG "jpg"
147 #define EXT_MP4 "mp4"
148 #define EXT_3GP "3gp"
149 #define EXT_AMR "amr"
150 #define EXT_MKV "mkv"
152 #define TARGET_FILENAME_PATH "/opt/usr/media/"
153 #define STILL_CAPTURE_FILE_PATH_NAME TARGET_FILENAME_PATH"StillshotCapture"
154 #define MULTI_CAPTURE_FILE_PATH_NAME TARGET_FILENAME_PATH"MultishotCapture"
155 #define IMAGE_CAPTURE_THUMBNAIL_PATH TARGET_FILENAME_PATH"thumbnail.jpg"
156 #define IMAGE_CAPTURE_SCREENNAIL_PATH TARGET_FILENAME_PATH"screennail.yuv"
157 #define IMAGE_CAPTURE_EXIF_PATH TARGET_FILENAME_PATH"exif.raw"
158 #define TARGET_FILENAME_VIDEO TARGET_FILENAME_PATH"test_rec_video.mp4"
159 #define TARGET_FILENAME_AUDIO TARGET_FILENAME_PATH"test_rec_audio.m4a"
160 #define CAPTURE_FILENAME_LEN 256
162 #define AUDIO_SOURCE_SAMPLERATE_AAC 44100
163 #define AUDIO_SOURCE_SAMPLERATE_AMR 8000
164 #define AUDIO_SOURCE_FORMAT MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE
165 #define AUDIO_SOURCE_CHANNEL_AAC 2
166 #define AUDIO_SOURCE_CHANNEL_AMR 1
167 #define VIDEO_ENCODE_BITRATE 40000000 /* bps */
169 #define DEFAULT_CAM_DEVICE MM_VIDEO_DEVICE_CAMERA1
172 * D E B U G M E S S A G E
174 #define MMF_DEBUG "** (mmcamcorder testsuite) DEBUG: "
175 #define MMF_ERR "** (mmcamcorder testsuite) ERROR: "
176 #define MMF_INFO "** (mmcamcorder testsuite) INFO: "
177 #define MMF_WARN "** (mmcamcorder testsuite) WARNING: "
178 #define MMF_TIME "** (mmcamcorder testsuite) TIME: "
180 #define CHECK_MM_ERROR(expr) \
184 if (ret != MM_ERROR_NONE) {\
185 printf("[%s:%d] error code : %x \n", __func__, __LINE__, ret); \
190 #define time_msg_t(fmt,arg...) \
192 fprintf(stderr,"\x1b[44m\x1b[37m"MMF_TIME"[%s:%05d] " fmt ,__func__, __LINE__, ##arg); \
193 fprintf(stderr,"\x1b[0m\n"); \
196 #define debug_msg_t(fmt,arg...)\
198 fprintf(stderr, MMF_DEBUG"[%s:%05d] " fmt "\n",__func__, __LINE__, ##arg); \
201 #define err_msg_t(fmt,arg...) \
203 fprintf(stderr, MMF_ERR"[%s:%05d] " fmt "\n",__func__, __LINE__, ##arg); \
206 #define info_msg_t(fmt,arg...) \
208 fprintf(stderr, MMF_INFO"[%s:%05d] " fmt "\n",__func__, __LINE__, ##arg); \
211 #define warn_msg_t(fmt,arg...) \
213 fprintf(stderr, MMF_WARN"[%s:%05d] " fmt "\n",__func__, __LINE__, ##arg); \
217 #define SAFE_FREE(x) if(x) {g_free(x); x = NULL;}
227 * Enumerations for command
229 #define SENSOR_WHITEBALANCE_NUM 10
230 #define SENSOR_COLOR_TONE_NUM 31
231 #define SENSOR_FLIP_NUM 3
232 #define SENSOR_PROGRAM_MODE_NUM 15
233 #define SENSOR_FOCUS_NUM 6
234 #define SENSOR_INPUT_ROTATION 4
235 #define SENSOR_AF_SCAN_NUM 4
236 #define SENSOR_ISO_NUM 8
237 #define SENSOR_EXPOSURE_NUM 9
238 #define SENSOR_IMAGE_FORMAT 9
241 /*-----------------------------------------------------------------------
242 | LOCAL CONSTANT DEFINITIONS: |
243 -----------------------------------------------------------------------*/
246 MODE_VIDEO_CAPTURE, /* recording and image capture mode */
247 MODE_AUDIO, /* audio recording*/
258 /*-----------------------------------------------------------------------
259 | LOCAL DATA TYPE DEFINITIONS: |
260 -----------------------------------------------------------------------*/
261 typedef struct _cam_handle
263 MMHandleType camcorder;
264 int mode; /* image(capture)/video(recording) mode */
265 bool isMultishot; /* flag for multishot mode */
266 int stillshot_count; /* total stillshot count */
267 int multishot_count; /* total multishot count */
268 const char *stillshot_filename; /* stored filename of stillshot */
269 const char *multishot_filename; /* stored filename of multishot */
273 unsigned long long elapsed_time;
276 typedef struct _cam_xypair
278 const char *attr_subcat_x;
279 const char *attr_subcat_y;
284 /*---------------------------------------------------------------------------
285 | LOCAL VARIABLE DEFINITIONS: |
286 ---------------------------------------------------------------------------*/
287 static cam_handle_t *hcamcorder ;
289 const char *wb[SENSOR_WHITEBALANCE_NUM]={
302 const char *ct[SENSOR_COLOR_TONE_NUM] = {
328 "SELECTVE_COLOR_RED",
329 "SELECTVE_COLOR_GREEN",
330 "SELECTVE_COLOR_BLUE",
331 "SELECTVE_COLOR_YELLOW",
332 "SELECTVE_COLOR_RED_YELLOW",
336 const char *flip[SENSOR_FLIP_NUM] = {
342 const char *program_mode[SENSOR_PROGRAM_MODE_NUM] = {
360 const char *focus_mode[SENSOR_FOCUS_NUM] = {
369 const char *camera_rotation[SENSOR_INPUT_ROTATION] = {
376 const char *af_scan[SENSOR_AF_SCAN_NUM] = {
383 const char *iso_name[SENSOR_ISO_NUM] = {
394 const char *exposure_mode[SENSOR_EXPOSURE_NUM] = {
406 const char *image_fmt[SENSOR_IMAGE_FORMAT] = {
418 const char *face_zoom_mode[] = {
423 const char *display_mode[] = {
425 "Primary Video ON and Secondary Video Full Screen",
426 "Primary Video OFF and Secondary Video Full Screen",
429 const char *output_mode[] = {
431 "Original Size mode",
433 "Cropped Full Screen mode",
437 const char *capture_sound[] = {
443 const char *rotate_mode[] = {
450 const char* strobe_mode[] = {
454 "Strobe RedEyeReduction",
456 "Strobe FrontCurtain",
457 "Strobe RearCurtain",
461 const char *detection_mode[2] = {
462 "Face Detection OFF",
466 const char *wdr_mode[] = {
472 const char *hdr_mode[] = {
475 "HDR ON and Original",
478 const char *ahs_mode[] = {
479 "Anti-handshake OFF",
481 "Anti-handshake AUTO",
482 "Anti-handshake MOVIE",
485 const char *vs_mode[] = {
486 "Video-stabilization OFF",
487 "Video-stabilization ON",
490 const char *visible_mode[] = {
496 /*---------------------------------------------------------------------------
497 | LOCAL FUNCTION PROTOTYPES: |
498 ---------------------------------------------------------------------------*/
499 static void print_menu();
501 static gboolean cmd_input(GIOChannel *channel);
502 //static bool filename_callback (int format, char *filename, void *user_param);
503 static gboolean msg_callback(int message, void *msg_param, void *user_param);
504 static gboolean init(int type);
505 static gboolean mode_change();
506 int camcordertest_set_attr_int(const char* attr_subcategory, int value);
509 static inline void flush_stdin()
512 while((ch=getchar()) != EOF && ch != '\n');
516 cam_utils_convert_YUYV_to_UYVY(unsigned char* dst, unsigned char* src, gint length)
521 memset(dst, 0x00, length);
522 memcpy(dst, src + 1, length-1);
524 for ( i = 0 ; i < length; i ++)
533 #ifdef USE_AUDIO_STREAM_CB
534 static int camcordertest_audio_stream_cb(MMCamcorderAudioStreamDataType *stream, void *user_param)
536 audio_stream_cb_cnt++;
537 printf("audio_stream cb is called (stream:%p, data:%p, format:%d, channel:%d, volume_dB:%f, length:%d, timestamp:%d)\n",
538 stream, stream->data, stream->format, stream->channel, stream->volume_dB, stream->length, stream->timestamp);
542 #endif /* USE_AUDIO_STREAM_CB */
544 static int camcordertest_video_stream_cb(MMCamcorderVideoStreamDataType *stream, void *user_param)
546 video_stream_cb_cnt++;
548 printf("VIDEO STREAM CALLBACK total length :%u, size %dx%d\n", stream->length_total, stream->width, stream->height);
553 static void _file_write(char *path, void *data, int size)
557 if (!path || !data || size <= 0) {
558 printf("ERROR %p %p %d\n", path, data, size);
562 fp = fopen(path, "w");
564 printf("open error! [%s], errno %d\n", path, errno);
567 printf("open success [%s]\n", path);
568 if (fwrite(data, size, 1, fp) != 1) {
569 printf("write error! errno %d\n", errno);
571 printf("write success [%s]\n", path);
579 static void _file_write2(const char *path, void *data, int size)
583 if (!path || !data || size <= 0) {
584 printf("ERROR %p %p %d\n", path, data, size);
588 fp = fopen(path, "w");
590 printf("open error! [%s], errno %d\n", path, errno);
593 printf("open success [%s]\n", path);
594 if (fwrite(data, size, 1, fp) != 1) {
595 printf("write error! errno %d\n", errno);
597 printf("write success [%s]\n", path);
607 camcordertest_video_capture_cb(MMCamcorderCaptureDataType *main, MMCamcorderCaptureDataType *thumb, void *data)
612 char m_filename[CAPTURE_FILENAME_LEN];
613 MMCamcorderCaptureDataType *scrnl = NULL;
614 unsigned char *exif_data = NULL;
617 warn_msg_t("Capture callback : Main image buffer is NULL!!!");
621 if (hcamcorder->isMultishot) {
622 snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg", hcamcorder->multishot_filename, hcamcorder->multishot_count++);
624 snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg", hcamcorder->stillshot_filename, hcamcorder->stillshot_count++);
627 debug_msg_t("hcamcorder->isMultishot=%d =>1: MULTI, 0: STILL, filename : %s",
628 hcamcorder->isMultishot, m_filename);
630 if (main->format != MM_PIXEL_FORMAT_ENCODED) {
631 unsigned int dst_size = 0;
634 nret = _mmcamcorder_encode_jpeg(main->data, main->width, main->height, main->format,
635 main->length, 90, &dst, &dst_size);
637 _file_write(m_filename, dst, dst_size);
639 printf("Failed to encode YUV(%d) -> JPEG. \n", main->format);
644 } else if (!hcamcorder->isMultishot) {
646 printf("MM_PIXEL_FORMAT_ENCODED main->data=%p main->length=%d, main->width=%d, main->heigtht=%d \n",
647 main->data, main->length, main->width, main->height);
650 _file_write(m_filename, main->data, main->length);
654 _file_write2(IMAGE_CAPTURE_THUMBNAIL_PATH, thumb->data, thumb->length);
658 mm_camcorder_get_attributes(hcamcorder->camcorder, NULL,
659 "captured-screennail", &scrnl, &scrnl_size,
662 _file_write2(IMAGE_CAPTURE_SCREENNAIL_PATH, scrnl->data, scrnl->length);
664 printf( "Screennail buffer is NULL.\n" );
668 mm_camcorder_get_attributes(hcamcorder->camcorder, NULL,
669 "captured-exif-raw-data", &exif_data, &exif_size,
672 _file_write2(IMAGE_CAPTURE_EXIF_PATH, exif_data, exif_size);
679 static gboolean test_idle_capture_start()
683 camcordertest_set_attr_int(MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED);
684 camcordertest_set_attr_int(MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG);
686 g_timer_reset(timer);
687 err = mm_camcorder_capture_start(hcamcorder->camcorder);
690 warn_msg_t("Multishot mm_camcorder_capture_start = %x", err);
696 int camcordertest_set_attr_int(const char * attr_subcategory, int value)
698 char * err_attr_name = NULL;
702 if (hcamcorder->camcorder) {
703 debug_msg_t("camcordertest_set_attr_int(%s, %d)", attr_subcategory, value);
705 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
706 attr_subcategory, value,
708 if (err != MM_ERROR_NONE) {
709 err_msg_t("camcordertest_set_attr_int : Error(%s:%x)!!!!!!!", err_attr_name, err);
710 SAFE_FREE(err_attr_name);
718 debug_msg_t("camcordertest_set_attr_int(!hcamcorder->camcorde)");
721 debug_msg_t("camcordertest_set_attr_int(!hcamcorder)");
726 int camcordertest_set_attr_xypair(cam_xypair_t pair)
728 char * err_attr_name = NULL;
732 if (hcamcorder->camcorder) {
733 debug_msg_t("camcordertest_set_attr_xypair((%s, %s), (%d, %d))", pair.attr_subcat_x, pair.attr_subcat_y, pair.x, pair.y);
735 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
736 pair.attr_subcat_x, pair.x,
737 pair.attr_subcat_y, pair.y,
740 err_msg_t("camcordertest_set_attr_xypair : Error(%s:%x)!!", err_attr_name, err);
741 SAFE_FREE (err_attr_name);
749 debug_msg_t("camcordertest_set_attr_xypair(!hcamcorder->camcorde)");
752 debug_msg_t("camcordertest_set_attr_xypair(!hcamcorder)");
756 int camcordertest_get_attr_valid_intarray(const char * attr_name, int ** array, int *count)
763 if (hcamcorder->camcorder)
765 debug_msg_t("camcordertest_get_attr_valid_intarray(%s)", attr_name);
767 err = mm_camcorder_get_attribute_info(hcamcorder->camcorder, attr_name, &info);
768 if (err != MM_ERROR_NONE) {
769 err_msg_t("camcordertest_get_attr_valid_intarray : Error(%x)!!", err);
772 if (info.type == MM_CAM_ATTRS_TYPE_INT) {
773 if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY) {
774 *array = info.int_array.array;
775 *count = info.int_array.count;
776 debug_msg_t("INT ARRAY - default value : %d", info.int_array.def);
781 err_msg_t("camcordertest_get_attr_valid_intarray : Type mismatched!!");
787 debug_msg_t("camcordertest_get_attr_valid_intarray(!hcamcorder->camcorde)");
790 debug_msg_t("camcordertest_get_attr_valid_intarray(!hcamcorder)");
794 int camcordertest_get_attr_valid_intrange(const char * attr_name, int *min, int *max)
801 if (hcamcorder->camcorder)
803 debug_msg_t("camcordertest_get_attr_valid_intrange(%s)", attr_name);
805 err = mm_camcorder_get_attribute_info(hcamcorder->camcorder, attr_name, &info);
806 if (err != MM_ERROR_NONE) {
807 err_msg_t("camcordertest_get_attr_valid_intrange : Error(%x)!!", err);
810 if (info.type == MM_CAM_ATTRS_TYPE_INT) {
811 if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_RANGE) {
812 *min = info.int_range.min;
813 *max = info.int_range.max;
814 debug_msg_t("INT RANGE - default : %d", info.int_range.def);
819 err_msg_t("camcordertest_get_attr_valid_intrange : Type mismatched!!");
826 debug_msg_t("camcordertest_get_attr_valid_intrange(!hcamcorder->camcorde)");
829 debug_msg_t("camcordertest_get_attr_valid_intrange(!hcamcorder)");
836 mm_camcorder_capture_stop(hcamcorder->camcorder);
839 static void print_menu()
841 switch(hcamcorder->menu_state)
843 case MENU_STATE_MAIN:
844 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
845 g_print("\n\t=======================================\n");
846 if ( cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA1 )
847 g_print("\t Video Capture (Front camera)\n");
848 else if( cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA0 )
849 g_print("\t Video Capture (Rear camera)\n");
850 g_print("\t=======================================\n");
852 if(mmcamcorder_print_state <= MM_CAMCORDER_STATE_PREPARE) {
853 g_print("\t '1' Take a photo\n");
854 g_print("\t '2' Start Recording\n");
855 g_print("\t '3' Setting\n");
856 g_print("\t '4' Print FPS\n");
857 g_print("\t 'b' back\n");
858 } else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_RECORDING) {
859 g_print("\t 'p' Pause Recording\n");
860 g_print("\t 'c' Cancel\n");
861 g_print("\t 's' Save\n");
862 g_print("\t 'n' Capture video snapshot\n");
863 } else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_PAUSED) {
864 g_print("\t 'r' Resume Recording\n");
865 g_print("\t 'c' Cancel\n");
866 g_print("\t 's' Save\n");
867 g_print("\t 'n' Capture video snapshot\n");
869 g_print("\t=======================================\n");
870 } else if (hcamcorder->mode == MODE_AUDIO) {
871 g_print("\n\t=======================================\n");
872 g_print("\t Audio Recording\n");
873 g_print("\t=======================================\n");
874 if(mmcamcorder_print_state <= MM_CAMCORDER_STATE_PREPARE) {
875 g_print("\t '1' Start Recording\n");
876 g_print("\t 'b' back\n");
878 else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_RECORDING) {
879 g_print("\t 'p' Pause Recording\n");
880 g_print("\t 'c' Cancel\n");
881 g_print("\t 's' Save\n");
883 else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_PAUSED) {
884 g_print("\t 'r' Resume Recording\n");
885 g_print("\t 'c' Cancel\n");
886 g_print("\t 's' Save\n");
888 g_print("\t=======================================\n");
892 case MENU_STATE_SETTING:
893 g_print("\n\t=======================================\n");
894 g_print("\t Video Capture > Setting\n");
895 g_print("\t=======================================\n");
896 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera] \n");
897 g_print("\t '0' Preview resolution \n");
898 g_print("\t '1' Capture resolution \n");
899 g_print("\t '2' Digital zoom level \n");
900 g_print("\t '3' Optical zoom level \n");
901 g_print("\t '4' AF mode \n");
902 g_print("\t '5' AF scan range \n");
903 g_print("\t '6' Exposure mode \n");
904 g_print("\t '7' Exposure value \n");
905 g_print("\t '8' F number \n");
906 g_print("\t '9' Shutter speed \n");
907 g_print("\t 'i' ISO \n");
908 g_print("\t 'r' Rotate camera input \n");
909 g_print("\t 'f' Flip camera input \n");
910 g_print("\t 'j' Jpeg quality \n");
911 g_print("\t 'p' Picture format \n");
912 g_print("\t 'E' EXIF orientation \n");
913 g_print("\t >>>>>>>>>>>>>>>>>>>> [Display/Filter]\n");
914 g_print("\t 'v' Visible \n");
915 g_print("\t 'n' Display mode \n");
916 g_print("\t 'o' Output mode \n");
917 g_print("\t 'y' Rotate display \n");
918 g_print("\t 'Y' Flip display \n");
919 g_print("\t 'g' Brightness \n");
920 g_print("\t 'c' Contrast \n");
921 g_print("\t 's' Saturation \n");
922 g_print("\t 'h' Hue \n");
923 g_print("\t 'a' Sharpness \n");
924 g_print("\t 'w' White balance \n");
925 g_print("\t 't' Color tone \n");
926 g_print("\t 'd' WDR \n");
927 g_print("\t 'e' EV program mode \n");
928 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
929 g_print("\t 'z' Strobe (Flash) \n");
930 g_print("\t 'x' Capture mode (Still/Multishot/HDR)\n");
931 g_print("\t 'l' Face detection \n");
932 g_print("\t 'k' Anti-handshake \n");
933 g_print("\t 'K' Video-stabilization \n");
934 g_print("\t 'u' Touch AF area \n");
935 g_print("\t 'm' Stream callback function \n");
936 g_print("\t 'M' Camcorder Motion Rate setting \n");
937 g_print("\t 'B' Encoded preview bitrate \n");
938 g_print("\t 'I' Encoded preview I-frame interval \n");
939 g_print("\t 'b' back\n");
940 g_print("\t=======================================\n");
944 warn_msg_t("unknow menu state !!\n");
951 static void main_menu(gchar buf)
956 char *err_attr_name = NULL;
958 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
959 if (mmcamcorder_state == MM_CAMCORDER_STATE_PREPARE) {
962 if(hcamcorder->isMultishot) {
965 printf("\ninput interval(ms) \n");
966 err = scanf("%d", &interval);
968 printf("\nscanf error : errno %d\n", errno);
971 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
972 MMCAM_CAPTURE_INTERVAL, interval,
974 if (err != MM_ERROR_NONE) {
975 err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
976 SAFE_FREE (err_attr_name);
979 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
980 MMCAM_CAPTURE_COUNT, IMAGE_CAPTURE_COUNT_STILL,
982 if (err != MM_ERROR_NONE) {
983 err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
984 SAFE_FREE (err_attr_name);
988 g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, (GSourceFunc)test_idle_capture_start, NULL, NULL);
991 case '2' : // Start Recording
992 g_print("*Recording start!\n");
993 video_stream_cb_cnt = 0;
994 audio_stream_cb_cnt = 0;
995 hcamcorder->elapsed_time = 0;
997 g_timer_reset(timer);
998 err = mm_camcorder_record(hcamcorder->camcorder);
1000 if (err != MM_ERROR_NONE) {
1001 warn_msg_t("Rec start mm_camcorder_record 0x%x", err);
1004 mmcamcorder_print_state = MM_CAMCORDER_STATE_RECORDING;
1007 case '3' : // Setting
1008 hcamcorder->menu_state = MENU_STATE_SETTING;
1011 case '4' : // Print frame rate
1012 current_fps = _mmcamcorder_video_current_framerate(hcamcorder->camcorder);
1013 average_fps = _mmcamcorder_video_average_framerate(hcamcorder->camcorder);
1014 g_print("\tVideo Frame Rate[Current : %d.0 fps, Average : %d.0 fps]\n", current_fps, average_fps);
1018 hcamcorder->menu_state = MENU_STATE_MAIN;
1023 g_print("\t Invalid input \n");
1026 } else if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING || mmcamcorder_state == MM_CAMCORDER_STATE_PAUSED) {
1028 if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING) {
1029 case 'p' : // Pause Recording
1030 g_print("*Pause!\n");
1031 err = mm_camcorder_pause(hcamcorder->camcorder);
1034 warn_msg_t("Rec pause mm_camcorder_pause = %x", err);
1036 mmcamcorder_print_state = MM_CAMCORDER_STATE_PAUSED;
1040 case 'r' : // Resume Recording
1041 g_print("*Resume!\n");
1042 err = mm_camcorder_record(hcamcorder->camcorder);
1044 warn_msg_t("Rec start mm_camcorder_record = %x", err);
1046 mmcamcorder_print_state = MM_CAMCORDER_STATE_RECORDING;
1050 case 'c' : // Cancel
1051 g_print("*Cancel Recording !\n");
1053 err = mm_camcorder_cancel(hcamcorder->camcorder);
1056 warn_msg_t("Cancel recording mm_camcorder_cancel = %x", err);
1058 mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
1062 g_print("*Save Recording!\n");
1063 g_timer_reset(timer);
1065 err = mm_camcorder_commit(hcamcorder->camcorder);
1068 warn_msg_t("Save recording mm_camcorder_commit = %x", err);
1070 mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
1073 case 'n' : /* Capture video snapshot */
1074 err = mm_camcorder_capture_start(hcamcorder->camcorder);
1078 g_print("\t Invalid input \n");
1082 err_msg_t("Wrong camcorder state, check status!!");
1084 } else if (hcamcorder->mode == MODE_AUDIO) {
1085 if (mmcamcorder_state == MM_CAMCORDER_STATE_PREPARE) {
1087 case '1' : // Start Recording
1088 g_print("*Recording start!\n");
1089 hcamcorder->elapsed_time = 0;
1090 g_timer_reset(timer);
1091 err = mm_camcorder_record(hcamcorder->camcorder);
1094 warn_msg_t("Rec start mm_camcorder_record = %x", err);
1096 mmcamcorder_print_state = MM_CAMCORDER_STATE_RECORDING;
1100 hcamcorder->menu_state = MENU_STATE_MAIN;
1105 g_print("\t Invalid input \n");
1108 } else if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING || mmcamcorder_state == MM_CAMCORDER_STATE_PAUSED) {
1110 if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING) {
1111 case 'p' : // Pause Recording
1112 g_print("*Pause!\n");
1113 err = mm_camcorder_pause(hcamcorder->camcorder);
1116 warn_msg_t("Rec pause mm_camcorder_pause = %x", err);
1118 mmcamcorder_print_state = MM_CAMCORDER_STATE_PAUSED;
1121 case 'r' : // Resume Recording
1122 g_print("*Resume!\n");
1123 err = mm_camcorder_record(hcamcorder->camcorder);
1125 warn_msg_t("Rec start mm_camcorder_record = %x", err);
1127 mmcamcorder_print_state = MM_CAMCORDER_STATE_RECORDING;
1131 case 'c' : // Cancel
1132 g_print("*Cancel Recording !\n");
1133 err = mm_camcorder_cancel(hcamcorder->camcorder);
1136 warn_msg_t("Cancel recording mm_camcorder_cancel = %x", err);
1138 mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
1142 g_print("*Save Recording!\n");
1143 g_timer_reset(timer);
1144 err = mm_camcorder_commit(hcamcorder->camcorder);
1147 warn_msg_t("Save recording mm_camcorder_commit = %x", err);
1149 mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
1153 g_print("\t Invalid input \n");
1157 err_msg_t("Wrong camcorder state, check status!!");
1161 g_print("\t Invalid mode, back to upper menu \n");
1162 hcamcorder->menu_state = MENU_STATE_MAIN;
1168 static void setting_menu(gchar buf)
1170 gboolean bret = FALSE;
1174 int width_count = 0;
1175 int height_count = 0;
1180 int *width_array = NULL;
1181 int *height_array = NULL;
1182 char *err_attr_name = NULL;
1183 cam_xypair_t input_pair;
1184 int err = MM_ERROR_NONE;
1185 int x = 0, y = 0, width = 0, height = 0;
1188 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
1190 /* Camera setting */
1191 case '0': // Setting > Preview Resolution setting
1192 g_print("*Select the preview resolution!\n");
1193 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_WIDTH, &width_array, &width_count);
1194 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_HEIGHT, &height_array, &height_count);
1196 if(width_count != height_count) {
1197 err_msg_t("System has wrong information!!\n");
1198 } else if (width_count == 0) {
1199 g_print("Not supported!!\n");
1203 for ( i = 0; i < width_count; i++) {
1204 g_print("\t %d. %d*%d\n", i+1, width_array[i], height_array[i]);
1206 err = scanf("%d",&idx);
1208 printf("\nscanf error : errno %d\n", errno);
1210 if( idx > 0 && idx <= width_count ) {
1211 //Set capture size first
1212 input_pair.attr_subcat_x = MMCAM_CAMERA_WIDTH;
1213 input_pair.attr_subcat_y = MMCAM_CAMERA_HEIGHT;
1214 input_pair.x = width_array[idx-1];
1215 input_pair.y = height_array[idx-1];
1216 bret = camcordertest_set_attr_xypair(input_pair);
1221 case '1' : // Setting > Capture Resolution setting
1222 /* check recommend preview resolution */
1223 camcordertest_get_attr_valid_intarray(MMCAM_RECOMMEND_CAMERA_WIDTH, &width_array, &width_count);
1224 camcordertest_get_attr_valid_intarray(MMCAM_RECOMMEND_CAMERA_HEIGHT, &height_array, &height_count);
1225 if(width_count != height_count) {
1226 err_msg_t("System has wrong information!!\n");
1227 } else if (width_count == 0) {
1228 g_print("MMCAM_RECOMMEND_CAMERA_WIDTH/HEIGHT Not supported!!\n");
1230 g_print("\n - MMCAM_RECOMMEND_CAMERA_WIDTH and HEIGHT (count %d) -\n", width_count);
1231 if (width_count > 0) {
1232 g_print("\t NORMAL ratio : %dx%d\n", width_array[MM_CAMCORDER_PREVIEW_TYPE_NORMAL], height_array[MM_CAMCORDER_PREVIEW_TYPE_NORMAL]);
1234 if (width_count > 1) {
1235 g_print("\t WIDE ratio : %dx%d\n", width_array[MM_CAMCORDER_PREVIEW_TYPE_WIDE], height_array[MM_CAMCORDER_PREVIEW_TYPE_WIDE]);
1237 if (width_count > 2) {
1238 g_print("\t SQUARE ratio : %dx%d\n", width_array[MM_CAMCORDER_PREVIEW_TYPE_SQUARE], height_array[MM_CAMCORDER_PREVIEW_TYPE_SQUARE]);
1242 g_print("*Select the resolution!\n");
1243 camcordertest_get_attr_valid_intarray("capture-width", &width_array, &width_count);
1244 camcordertest_get_attr_valid_intarray("capture-height", &height_array, &height_count);
1246 if(width_count != height_count) {
1247 err_msg_t("System has wrong information!!\n");
1248 } else if (width_count == 0) {
1249 g_print("Not supported!!\n");
1251 g_print("\n Select resolution \n");
1254 for ( i = 0; i < width_count; i++) {
1255 g_print("\t %d. %d*%d\n", i+1, width_array[i], height_array[i]);
1257 err = scanf("%d",&idx);
1259 printf("\nscanf error : errno %d\n", errno);
1261 if( idx > 0 && idx <= width_count ) {
1262 //Set capture size first
1263 input_pair.attr_subcat_x = "capture-width";
1264 input_pair.attr_subcat_y = "capture-height";
1265 input_pair.x = width_array[idx-1];
1266 input_pair.y = height_array[idx-1];
1267 bret = camcordertest_set_attr_xypair(input_pair);
1273 case '2' : // Setting > Digital zoom level
1274 g_print("*Digital zoom level !\n");
1275 camcordertest_get_attr_valid_intrange("camera-digital-zoom", &min, &max);
1278 g_print("Not supported !! \n");
1281 g_print("\n Select Digital zoom level (%d ~ %d)\n", min, max);
1282 err = scanf("%d",&idx);
1283 bret = camcordertest_set_attr_int("camera-digital-zoom", idx);
1287 case '3' : // Setting > Optical zoom level
1288 g_print("*Optical zoom level !\n");
1289 camcordertest_get_attr_valid_intrange("camera-optical-zoom", &min, &max);
1292 g_print("Not supported !! \n");
1295 g_print("\n Select Optical zoom level (%d ~ %d)\n", min, max);
1296 err = scanf("%d",&idx);
1297 bret = camcordertest_set_attr_int("camera-optical-zoom", idx);
1301 case '4' : // Setting > AF mode
1302 g_print("\t0. AF Mode setting !\n");
1303 g_print("\t1. AF Start !\n");
1304 g_print("\t2. AF Stop !\n\n");
1307 err = scanf("%d", &idx);
1312 g_print("*Focus mode !\n");
1313 camcordertest_get_attr_valid_intarray("camera-focus-mode", &array, &count);
1316 g_print("Not supported !! \n");
1318 g_print("\n Select Focus mode \n");
1320 for (i = 0 ; i < count ; i++) {
1321 g_print("\t %d. %s\n", array[i], focus_mode[array[i]]);
1323 err = scanf("%d",&idx);
1324 bret = camcordertest_set_attr_int("camera-focus-mode", idx);
1329 mm_camcorder_start_focusing(hcamcorder->camcorder);
1332 mm_camcorder_stop_focusing(hcamcorder->camcorder);
1335 g_print("Wrong Input[%d] !! \n", idx);
1340 case '5' : // Setting > AF scan range
1341 g_print("*AF scan range !\n");
1342 camcordertest_get_attr_valid_intarray("camera-af-scan-range", &array, &count);
1345 g_print("Not supported !! \n");
1347 g_print("\n Select AF scan range \n");
1349 for ( i = 0; i < count; i++) {
1350 g_print("\t %d. %s\n", array[i], af_scan[array[i]]);
1352 err = scanf("%d",&idx);
1353 camcordertest_set_attr_int("camera-af-scan-range", idx);
1357 case '6' : // Setting > Exposure mode
1358 g_print("* Exposure mode!\n");
1359 camcordertest_get_attr_valid_intarray("camera-exposure-mode", &array, &count);
1362 g_print("Not supported !! \n");
1364 g_print("\n Select Exposure mode \n");
1366 for ( i = 0; i < count; i++) {
1367 g_print("\t %d. %s\n", array[i], exposure_mode[array[i]]);
1369 err = scanf("%d",&idx);
1370 bret = camcordertest_set_attr_int("camera-exposure-mode", idx);
1374 case '7' : // Setting > Exposure value
1375 g_print("*Exposure value !\n");
1376 camcordertest_get_attr_valid_intrange("camera-exposure-value", &min, &max);
1379 g_print("Not supported !! \n");
1382 g_print("\n Select Exposure value(%d ~ %d)\n", min, max);
1383 err = scanf("%d",&idx);
1384 bret = camcordertest_set_attr_int("camera-exposure-value", idx);
1388 case '8' : // Setting > F number
1389 g_print("Not supported !! \n");
1392 case '9' : // Setting > Shutter speed
1393 g_print("*Shutter speed !\n");
1394 camcordertest_get_attr_valid_intarray("camera-shutter-speed", &array, &count);
1397 g_print("Not supported !! \n");
1399 g_print("\n Select Shutter speed \n");
1401 for ( i = 0; i < count; i++) {
1402 g_print("\t %d. %d \n", i+1, array[i]);
1404 err = scanf("%d",&idx);
1406 if( idx > 0 && idx <= count ) {
1407 bret = camcordertest_set_attr_int("camera-shutter-speed", array[idx-1]);
1412 case 'i' : // Setting > ISO
1413 g_print("*ISO !\n");
1414 camcordertest_get_attr_valid_intarray("camera-iso", &array, &count);
1417 g_print("Not supported !! \n");
1419 g_print("\n Select ISO \n");
1421 for ( i = 0; i < count; i++) {
1422 g_print("\t %d. %s\n", array[i], iso_name[array[i]]);
1424 err = scanf("%d",&idx);
1425 bret = camcordertest_set_attr_int("camera-iso", idx);
1429 case 'r' : // Setting > Rotate camera input when recording
1430 g_print("*Rotate camera input\n");
1431 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_ROTATION, &array, &count);
1434 g_print("Not supported !! \n");
1437 for ( i = 0; i < count; i++) {
1438 g_print("\t %d. %s\n", array[i], camera_rotation[array[i]]);
1440 err = scanf("%d",&idx);
1441 CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
1442 bret = camcordertest_set_attr_int(MMCAM_CAMERA_ROTATION, idx);
1443 CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
1447 case 'f' : // Setting > Flip camera input
1449 g_print("*Flip camera input\n");
1450 g_print(" 0. Flip NONE\n");
1451 g_print(" 1. Flip HORIZONTAL\n");
1452 g_print(" 2. Flip VERTICAL\n");
1453 g_print(" 3. Flip BOTH\n");
1455 err = scanf("%d", &idx);
1457 CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
1458 CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
1460 camcordertest_set_attr_int(MMCAM_CAMERA_FLIP, idx);
1462 CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
1463 CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
1466 case 'j' : // Setting > Jpeg quality
1467 g_print("*Jpeg quality !\n");
1468 camcordertest_get_attr_valid_intrange("image-encoder-quality", &min, &max);
1471 g_print("Not supported !! \n");
1474 g_print("\n Select Jpeg quality (%d ~ %d)\n", min, max);
1475 err = scanf("%d",&idx);
1476 bret = camcordertest_set_attr_int("image-encoder-quality", idx);
1480 case 'p' : // Setting > Picture format
1481 g_print("* Picture format!\n");
1482 camcordertest_get_attr_valid_intarray("camera-format", &array, &count);
1485 g_print("Not supported !! \n");
1487 g_print("\n Select Picture format \n");
1489 for ( i = 0; i < count; i++) {
1490 g_print("\t %d. %s\n", array[i], image_fmt[array[i]]);
1492 err = scanf("%d",&idx);
1493 bret = camcordertest_set_attr_int("camera-format", idx);
1494 CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
1495 CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
1496 CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
1497 CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
1501 case 'E' : // Setting > EXIF orientation
1502 g_print("* EXIF Orientation\n");
1504 g_print("\t 1. TOP_LEFT\n");
1505 g_print("\t 2. TOP_RIGHT(flipped)\n");
1506 g_print("\t 3. BOTTOM_RIGHT\n");
1507 g_print("\t 4. BOTTOM_LEFT(flipped)\n");
1508 g_print("\t 5. LEFT_TOP(flipped)\n");
1509 g_print("\t 6. RIGHT_TOP\n");
1510 g_print("\t 7. RIGHT_BOTTOM(flipped)\n");
1511 g_print("\t 8. LEFT_BOTTOM\n");
1514 err = scanf("%d", &idx);
1516 if (idx < 1 || idx > 8) {
1517 g_print("Wrong INPUT[%d]!! \n", idx);
1519 camcordertest_set_attr_int(MMCAM_TAG_ORIENTATION, idx);
1524 /* Display / Filter setting */
1525 case 'v' : // Display visible
1526 g_print("* Display visible setting !\n");
1527 camcordertest_get_attr_valid_intarray( "display-visible", &array, &count );
1530 g_print("Not supported !! \n");
1532 g_print("\n Select Display visible \n");
1534 for ( i = 0; i < count; i++) {
1535 g_print("\t %d. %s\n", array[i], visible_mode[array[i]]);
1537 err = scanf("%d",&value);
1538 bret = camcordertest_set_attr_int( "display-visible", value );
1542 case 'n' : // Setting > Display mode
1543 g_print("* Display mode!\n");
1544 camcordertest_get_attr_valid_intarray(MMCAM_DISPLAY_MODE, &array, &count);
1546 if (count <= 0 || count > 255) {
1547 g_print("Not supported !! \n");
1550 g_print("\n Select Display mode\n");
1551 for (i = 0 ; i < count ; i++) {
1552 g_print("\t %d. %s\n", array[i], display_mode[array[i]]);
1554 err = scanf("%d",&idx);
1555 bret = camcordertest_set_attr_int(MMCAM_DISPLAY_MODE, idx);
1559 case 'o' : // Setting > Output mode
1560 g_print("* Output mode!\n");
1561 camcordertest_get_attr_valid_intrange("display-geometry-method", &min, &max);
1564 g_print("Not supported !! \n");
1567 g_print("\n Select Output mode(%d ~ %d)\n", min, max);
1568 for( i = min ; i <= max ; i++ ) {
1569 g_print( "%d. %s\n", i, output_mode[i] );
1571 err = scanf("%d",&idx);
1572 bret = camcordertest_set_attr_int("display-geometry-method", idx);
1576 case 'y' : // Setting > Rotate Display
1577 camcordertest_get_attr_valid_intrange(MMCAM_DISPLAY_ROTATION, &min, &max);
1580 g_print("Not supported !! \n");
1583 g_print("\n Select Rotate mode(%d ~ %d)\n", min, max);
1584 g_print("\t0. 0\n\t1. 90\n\t2. 180\n\t3. 270\n\n");
1585 err = scanf("%d",&idx);
1586 bret = camcordertest_set_attr_int(MMCAM_DISPLAY_ROTATION, idx);
1590 case 'Y' : // Setting > Flip Display
1592 g_print("\n Select Rotate mode(%d ~ %d)\n", min, max);
1593 g_print("\t0. NONE\n\t1. HORIZONTAL\n\t2. VERTICAL\n\t3. BOTH\n\n");
1594 err = scanf("%d",&idx);
1595 camcordertest_set_attr_int(MMCAM_DISPLAY_FLIP, idx);
1598 case 'g' : // Setting > Brightness
1599 g_print("*Brightness !\n");
1600 camcordertest_get_attr_valid_intrange("filter-brightness", &min, &max);
1603 g_print("Not supported !! \n");
1606 g_print("\n Select brightness (%d ~ %d)\n", min, max);
1607 err = scanf("%d",&idx);
1608 bret = camcordertest_set_attr_int("filter-brightness", idx);
1612 case 'c' : // Setting > Contrast
1613 g_print("*Contrast !\n");
1614 camcordertest_get_attr_valid_intrange("filter-contrast", &min, &max);
1617 g_print("Not supported !! \n");
1620 g_print("\n Select Contrast (%d ~ %d)\n", min, max);
1621 err = scanf("%d",&idx);
1622 bret = camcordertest_set_attr_int("filter-contrast", idx);
1626 case 's' : // Setting > Saturation
1627 g_print("*Saturation !\n");
1628 camcordertest_get_attr_valid_intrange("filter-saturation", &min, &max);
1631 g_print("Not supported !! \n");
1634 g_print("\n Select Saturation (%d ~ %d)\n", min, max);
1635 err = scanf("%d",&idx);
1636 bret = camcordertest_set_attr_int("filter-saturation", idx);
1640 case 'h' : // Setting > Hue
1641 g_print("*Hue !\n");
1642 camcordertest_get_attr_valid_intrange("filter-hue", &min, &max);
1645 g_print("Not supported !! \n");
1648 g_print("\n Select Hue (%d ~ %d)\n", min, max);
1649 err = scanf("%d",&idx);
1650 bret = camcordertest_set_attr_int("filter-hue", idx);
1654 case 'a' : // Setting > Sharpness
1655 g_print("*Sharpness !\n");
1656 camcordertest_get_attr_valid_intrange("filter-sharpness", &min, &max);
1659 g_print("Not supported !! \n");
1662 g_print("\n Select Sharpness (%d ~ %d)\n", min, max);
1663 err = scanf("%d",&idx);
1664 bret = camcordertest_set_attr_int("filter-sharpness", idx);
1668 case 'w' : // Setting > White balance
1669 g_print("*White balance !\n");
1670 camcordertest_get_attr_valid_intarray("filter-wb", &array, &count);
1673 g_print("Not supported !! \n");
1676 g_print("\n Select White balance \n");
1677 for ( i = 0; i < count; i++) {
1678 g_print("\t %d. %s\n", array[i], wb[array[i]]);
1680 err = scanf("%d",&idx);
1681 bret = camcordertest_set_attr_int("filter-wb", idx);
1685 case 't' : // Setting > Color tone
1686 g_print("*Color tone !\n");
1687 camcordertest_get_attr_valid_intarray("filter-color-tone", &array, &count);
1690 g_print("Not supported !! \n");
1692 g_print("\n Select Color tone \n");
1694 for ( i = 0; i < count; i++) {
1695 g_print("\t %d. %s\n", array[i], ct[array[i]]);
1697 err = scanf("%d",&idx);
1698 bret = camcordertest_set_attr_int("filter-color-tone", idx);
1702 case 'd' : // Setting > WDR
1703 g_print("*WDR !\n");
1704 camcordertest_get_attr_valid_intarray("camera-wdr", &array, &count);
1707 g_print("Not supported !! \n");
1710 g_print("\n Select WDR Mode \n");
1712 for ( i = 0; i < count; i++) {
1713 g_print("\t %d. %s\n", array[i], wdr_mode[array[i]]);
1715 err = scanf("%d",&idx);
1716 bret = camcordertest_set_attr_int("camera-wdr", idx);
1720 case 'e' : // Setting > EV program mode
1721 g_print("* EV program mode!\n");
1722 camcordertest_get_attr_valid_intarray("filter-scene-mode", &array, &count);
1725 g_print("Not supported !! \n");
1727 g_print("\n Select EV program mode \n");
1729 for ( i = 0; i < count; i++) {
1730 g_print("\t %d. %s\n", array[i], program_mode[array[i]]);
1732 err = scanf("%d",&idx);
1733 bret = camcordertest_set_attr_int("filter-scene-mode", idx);
1738 case 'z' : // Setting > Strobe setting
1739 g_print("*Strobe Mode\n");
1740 camcordertest_get_attr_valid_intarray("strobe-mode", &array, &count);
1742 g_print("Not supported !! \n");
1744 g_print("\n Select Strobe Mode \n");
1746 for ( i = 0; i < count; i++) {
1747 g_print("\t %d. %s\n", array[i], strobe_mode[array[i]]);
1749 err = scanf("%d",&idx);
1750 bret = camcordertest_set_attr_int("strobe-mode", idx);
1754 case 'x' : // Setting > Capture mode ,Muitishot?
1755 g_print("*Select Capture mode!\n");
1757 g_print(" \n\t1. Stillshot mode\n\t2. Multishot mode\n\t3. HDR capture\n");
1758 err = scanf("%d",&idx);
1762 g_print("stillshot mode selected and capture callback is set!!!!\n");
1763 hcamcorder->isMultishot = FALSE;
1764 camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, 0);
1767 g_print("Multilshot mode selected!!\n");
1769 camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, 0);
1775 camcordertest_get_attr_valid_intrange("capture-count", &min, &max);
1777 g_print("Not supported !! \n");
1780 //g_print("\n Check Point!!! [Change resolution to 800x480]\n");
1781 g_print("Select mulitshot number (%d ~ %d)\n", min, max);
1782 err = scanf("%d",&idx);
1783 if( idx >= min && idx <= max ) {
1784 multishot_num = idx;
1785 mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
1786 MMCAM_CAPTURE_COUNT, multishot_num,
1788 hcamcorder->isMultishot = TRUE;
1790 g_print("Wrong input value, Multishot setting failed!!\n");
1795 g_print("HDR Capture mode selected\n");
1796 hcamcorder->isMultishot = FALSE;
1798 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_HDR_CAPTURE, &array, &count);
1800 g_print("Not supported !! \n");
1802 g_print("\nSelect HDR capture mode\n");
1804 for ( i = 0; i < count; i++) {
1805 g_print("\t %d. %s\n", array[i], hdr_mode[array[i]]);
1807 err = scanf("%d",&idx);
1808 bret = camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, idx);
1812 g_print("Wrong input, select again!!\n");
1817 case 'l' : // Setting > Face detection setting
1818 //hcamcorder->menu_state = MENU_STATE_SETTING_DETECTION;
1819 g_print("* Face detect mode !\n");
1821 camcordertest_get_attr_valid_intarray("detect-mode", &array, &count);
1822 if(count <= 0 || count > 256) {
1823 g_print("Not supported !! \n");
1825 g_print("\n Face detect mode \n");
1827 for ( i = 0; i < count; i++) {
1828 g_print("\t %d. %s \n", array[i], detection_mode[array[i]]);
1830 err = scanf("%d",&idx);
1832 if( idx >= 0 && idx < count ) {
1833 bret = camcordertest_set_attr_int("detect-mode", array[idx]);
1835 g_print("Wrong input value. Try again!!\n");
1841 case 'k' : // Setting > Anti-handshake
1842 g_print("*Anti-handshake !\n");
1843 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_ANTI_HANDSHAKE, &array, &count);
1846 g_print("Not supported !! \n");
1848 g_print("\n Select Anti-handshake mode \n");
1850 for ( i = 0; i < count; i++) {
1851 g_print("\t %d. %s\n", array[i], ahs_mode[array[i]]);
1853 err = scanf("%d",&idx);
1854 bret = camcordertest_set_attr_int(MMCAM_CAMERA_ANTI_HANDSHAKE, idx);
1858 case 'K' : // Setting > Video-stabilization
1859 g_print("*Video-stabilization !\n");
1860 camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_VIDEO_STABILIZATION, &array, &count);
1863 g_print("Not supported !! \n");
1865 g_print("\n Select Video-stabilization mode \n");
1867 for ( i = 0; i < count; i++) {
1868 g_print("\t %d. %s\n", array[i], vs_mode[array[i]]);
1870 err = scanf("%d",&idx);
1872 if (idx == MM_CAMCORDER_VIDEO_STABILIZATION_ON) {
1873 g_print("\n Restart preview with NV12 and 720p resolution\n");
1875 err = mm_camcorder_stop(hcamcorder->camcorder);
1876 if (err == MM_ERROR_NONE) {
1877 err = mm_camcorder_unrealize(hcamcorder->camcorder);
1880 input_pair.attr_subcat_x = MMCAM_CAMERA_WIDTH;
1881 input_pair.attr_subcat_y = MMCAM_CAMERA_HEIGHT;
1882 input_pair.x = 1280;
1884 camcordertest_set_attr_xypair(input_pair);
1885 camcordertest_set_attr_int(MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12);
1886 camcordertest_set_attr_int(MMCAM_CAMERA_VIDEO_STABILIZATION, idx);
1888 if (err == MM_ERROR_NONE) {
1889 err = mm_camcorder_realize(hcamcorder->camcorder);
1890 if (err == MM_ERROR_NONE) {
1891 err = mm_camcorder_start(hcamcorder->camcorder);
1895 if (err != MM_ERROR_NONE) {
1896 g_print("\n Restart FAILED! %x\n", err);
1899 camcordertest_set_attr_int(MMCAM_CAMERA_VIDEO_STABILIZATION, idx);
1904 case 'u': // Touch AF area
1905 g_print("* Touch AF area !\n");
1906 camcordertest_get_attr_valid_intrange("camera-af-touch-x", &min, &max);
1908 g_print( "Not Supported camera-af-touch-x !!\n" );
1911 camcordertest_get_attr_valid_intrange("camera-af-touch-y", &min, &max);
1913 g_print( "Not Supported camera-af-touch-y !!\n" );
1916 camcordertest_get_attr_valid_intrange("camera-af-touch-width", &min, &max);
1918 g_print( "Not Supported camera-af-touch-width !!\n" );
1921 camcordertest_get_attr_valid_intrange("camera-af-touch-height", &min, &max);
1923 g_print( "Not Supported camera-af-touch-height!!\n" );
1928 g_print( "\n Input x,y,width,height \n" );
1929 err = scanf( "%d,%d,%d,%d", &x, &y, &width, &height );
1930 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
1931 MMCAM_CAMERA_AF_TOUCH_X, x,
1932 MMCAM_CAMERA_AF_TOUCH_Y, y,
1933 MMCAM_CAMERA_AF_TOUCH_WIDTH, width,
1934 MMCAM_CAMERA_AF_TOUCH_HEIGHT, height,
1937 if( err != MM_ERROR_NONE ) {
1938 g_print( "Failed to set touch AF area.(%x)(%s)\n", err, err_attr_name );
1939 free( err_attr_name );
1940 err_attr_name = NULL;
1942 g_print( "Succeed to set touch AF area.\n" );
1946 case 'm' : // Setting > Stream callback function
1947 g_print("\n Select Stream Callback Function\n");
1948 g_print("\t 1. Set Video Stream Callback \n");
1949 g_print("\t 2. Unset Video Stream Callback \n");
1951 err = scanf("%d", &idx);
1953 video_stream_cb_cnt = 0;
1954 error_num = mm_camcorder_set_video_stream_callback(hcamcorder->camcorder, (mm_camcorder_video_stream_callback)camcordertest_video_stream_cb, (void*)hcamcorder->camcorder);
1955 if( error_num == MM_ERROR_NONE ) {
1956 g_print("\n Setting Success\n");
1958 g_print("\n Setting Failure\n");
1960 } else if(idx == 2) {
1961 mm_camcorder_set_video_stream_callback(hcamcorder->camcorder, NULL, (void*)hcamcorder->camcorder);
1962 video_stream_cb_cnt = 0;
1963 audio_stream_cb_cnt = 0;
1964 g_print("\n Unset stream callback success\n");
1966 g_print("\t Invalid input \n");
1972 float motion_rate = 0.0;
1976 g_print("*Camcorder Motion Rate setting! (should be bigger than zero)\n");
1978 err = scanf("%f", &motion_rate);
1979 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
1980 MMCAM_CAMERA_RECORDING_MOTION_RATE, motion_rate,
1982 if (err != MM_ERROR_NONE) {
1983 g_print("Failed to set Camcorder Motion Rate %f [err:0x%x]\n", motion_rate, err);
1984 free( err_attr_name );
1985 err_attr_name = NULL;
1987 g_print("Succeed to set Motion Rate %f\n", motion_rate);
1998 g_print("*Encoded preview Bitrate (bps, should be bigger than zero)\n");
2000 err = scanf("%d", &bitrate);
2002 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
2003 MMCAM_ENCODED_PREVIEW_BITRATE, bitrate,
2005 if (err != MM_ERROR_NONE) {
2006 g_print("Failed to set Encoded preview Bitrate %d [err:0x%x]\n", bitrate, err);
2007 free( err_attr_name );
2008 err_attr_name = NULL;
2010 g_print("Succeed to set Encoded preview Bitrate %d\n", bitrate);
2021 g_print("*Encoded preview I-frame interval (ms, should be bigger than zero)\n");
2023 err = scanf("%d", &interval);
2025 err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
2026 MMCAM_ENCODED_PREVIEW_IFRAME_INTERVAL, interval,
2028 if (err != MM_ERROR_NONE) {
2029 g_print("Failed to set Encoded preview I-frame interval %d [err:0x%x]\n", interval, err);
2030 free( err_attr_name );
2031 err_attr_name = NULL;
2033 g_print("Succeed to set Encoded preview I-frame interval %d\n", interval);
2039 hcamcorder->menu_state = MENU_STATE_MAIN;
2043 g_print("\t Invalid input \n");
2047 g_print("\t Invalid mode, back to upper menu \n");
2048 hcamcorder->menu_state = MENU_STATE_MAIN;
2052 free( err_attr_name );
2053 err_attr_name = NULL;
2056 g_print("\t bret : 0x%x \n", bret);
2061 * This function is to execute command.
2063 * @param channel [in] 1st parameter
2065 * @return This function returns TRUE/FALSE
2069 static gboolean cmd_input(GIOChannel *channel)
2073 GError *g_error = NULL;
2075 debug_msg_t("ENTER");
2077 g_io_channel_read_line(channel, &buf, &read_size, NULL, &g_error);
2079 debug_msg_t("g_io_channel_read_chars error");
2080 g_error_free(g_error);
2087 debug_msg_t("Menu Status : %d", hcamcorder->menu_state);
2088 switch(hcamcorder->menu_state)
2090 case MENU_STATE_MAIN:
2093 case MENU_STATE_SETTING:
2094 setting_menu(buf[0]);
2105 debug_msg_t("No read input");
2111 void validity_print(MMCamAttrsInfo *info)
2113 printf("info(%d,%d, %d))\n", info->type, info->flag, info->validity_type);
2114 if (info->validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY)
2116 printf("int array(%p, %d)\n", info->int_array.array, info->int_array.count);
2118 else if (info->validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_RANGE)
2120 printf("int range(%d, %d)\n", info->int_range.min, info->int_range.max);
2122 else if (info->validity_type == MM_CAM_ATTRS_VALID_TYPE_DOUBLE_ARRAY)
2124 printf("double array(%p, %d)\n", info->double_array.array, info->double_array.count);
2126 else if(info->validity_type == MM_CAM_ATTRS_VALID_TYPE_DOUBLE_RANGE)
2128 printf("double range(%f, %f)\n", info->double_range.min, info->double_range.max);
2132 printf("validity none\n");
2139 * This function is to initiate camcorder attributes .
2141 * @param type [in] image(capture)/video(recording) mode
2143 * @return This function returns TRUE/FALSE
2145 * @see other functions
2147 static gboolean init(int type)
2151 int preview_format = MM_PIXEL_FORMAT_NV12;
2152 int support_zero_copy_format = 0;
2153 int support_media_packet_preview_cb = 0;
2154 int recommend_display_rotation = 0;
2155 MMHandleType cam_handle = 0;
2157 char *err_attr_name = NULL;
2162 if(!hcamcorder->camcorder)
2165 cam_handle = (MMHandleType)(hcamcorder->camcorder);
2167 /*================================================================================
2169 *=================================================================================*/
2170 if (type == MODE_VIDEO_CAPTURE) {
2171 mm_camcorder_get_attributes((MMHandleType)cam_handle, NULL,
2172 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, &preview_format,
2173 MMCAM_SUPPORT_ZERO_COPY_FORMAT, &support_zero_copy_format,
2174 MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB, &support_media_packet_preview_cb,
2175 MMCAM_RECOMMEND_DISPLAY_ROTATION, &recommend_display_rotation,
2178 warn_msg_t("MMCAM_SUPPORT_ZERO_COPY_FORMAT %d", support_zero_copy_format);
2179 warn_msg_t("MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB %d", support_media_packet_preview_cb);
2180 warn_msg_t("MMCAM_RECOMMEND_DISPLAY_ROTATION %d", recommend_display_rotation);
2182 /* camcorder attribute setting */
2183 err = mm_camcorder_set_attributes( (MMHandleType)cam_handle, &err_attr_name,
2184 MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO_CAPTURE,
2185 MMCAM_CAMERA_FORMAT, preview_format,
2186 //MMCAM_VIDEO_WIDTH, 1280,
2187 //MMCAM_VIDEO_HEIGHT, 720,
2188 "camera-delay-attr-setting", TRUE,
2189 MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
2190 MMCAM_IMAGE_ENCODER_QUALITY, IMAGE_ENC_QUALITY,
2191 MMCAM_TAG_ENABLE, 1,
2192 MMCAM_TAG_LATITUDE, 35.3036944,
2193 MMCAM_TAG_LONGITUDE, 176.67837,
2194 MMCAM_TAG_ALTITUDE, 190.3455,
2195 MMCAM_DISPLAY_DEVICE, MM_DISPLAY_DEVICE_MAINLCD,
2196 MMCAM_DISPLAY_SURFACE, MM_DISPLAY_SURFACE_X,
2197 MMCAM_DISPLAY_RECT_X, DISPLAY_X_0,
2198 MMCAM_DISPLAY_RECT_Y, DISPLAY_Y_0,
2199 MMCAM_DISPLAY_RECT_WIDTH, 480,
2200 MMCAM_DISPLAY_RECT_HEIGHT, 640,
2201 MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2202 //MMCAM_DISPLAY_FLIP, MM_FLIP_HORIZONTAL,
2203 MMCAM_DISPLAY_GEOMETRY_METHOD, MM_DISPLAY_METHOD_LETTER_BOX,
2204 MMCAM_CAPTURE_COUNT, IMAGE_CAPTURE_COUNT_STILL,
2205 MMCAM_TAG_GPS_ENABLE, TRUE,
2206 "tag-gps-time-stamp", 72815.5436243543,
2207 "tag-gps-date-stamp", "2010:09:20", 10,
2208 "tag-gps-processing-method", "GPS NETWORK HYBRID ARE ALL FINE.", 32,
2209 MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2210 MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2211 MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
2212 MMCAM_VIDEO_ENCODER_BITRATE, VIDEO_ENCODE_BITRATE,
2213 MMCAM_FILE_FORMAT, MM_FILE_FORMAT_MP4,
2214 //MMCAM_CAMERA_FPS, SRC_VIDEO_FRAME_RATE_30,
2215 MMCAM_CAMERA_FPS_AUTO, 0,
2216 MMCAM_CAMERA_ROTATION, MM_VIDEO_INPUT_ROTATION_NONE,
2217 MMCAM_AUDIO_SAMPLERATE, AUDIO_SOURCE_SAMPLERATE_AAC,
2218 MMCAM_AUDIO_FORMAT, AUDIO_SOURCE_FORMAT,
2219 MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AAC,
2220 //MMCAM_AUDIO_DISABLE, TRUE,
2221 MMCAM_TARGET_FILENAME, TARGET_FILENAME_VIDEO, strlen(TARGET_FILENAME_VIDEO),
2222 //MMCAM_TARGET_TIME_LIMIT, 360000,
2223 //MMCAM_TARGET_MAX_SIZE, 102400,
2224 MMCAM_RECORDER_TAG_ENABLE, 1,
2225 MMCAM_TAG_VIDEO_ORIENTATION, 1,
2226 MMCAM_DISPLAY_ROTATION, recommend_display_rotation,
2229 if (err != MM_ERROR_NONE) {
2230 warn_msg_t("Init fail. (%s:%x)", err_attr_name, err);
2231 SAFE_FREE (err_attr_name);
2235 mm_camcorder_set_video_capture_callback(hcamcorder->camcorder, (mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, hcamcorder);
2237 /*================================================================================
2239 *=================================================================================*/
2240 else if (type == MODE_AUDIO)
2242 size = strlen(TARGET_FILENAME_AUDIO)+1;
2244 /* camcorder attribute setting */
2245 err = mm_camcorder_set_attributes( hcamcorder->camcorder, &err_attr_name,
2246 MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
2247 MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2248 MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2249 MMCAM_FILE_FORMAT, MM_FILE_FORMAT_MP4,
2250 MMCAM_AUDIO_SAMPLERATE, AUDIO_SOURCE_SAMPLERATE_AAC,
2251 MMCAM_AUDIO_FORMAT, AUDIO_SOURCE_FORMAT,
2252 MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AAC,
2253 MMCAM_TARGET_FILENAME, TARGET_FILENAME_AUDIO, size,
2254 MMCAM_TARGET_TIME_LIMIT, 360000,
2255 MMCAM_AUDIO_ENCODER_BITRATE, 128000,
2256 MMCAM_TARGET_MAX_SIZE, 300,
2260 warn_msg_t("Init fail. (%s:%x)", err_attr_name, err);
2261 SAFE_FREE (err_attr_name);
2265 #ifdef USE_AUDIO_STREAM_CB
2266 mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcamcorder->camcorder);
2267 #endif /* USE_AUDIO_STREAM_CB */
2270 debug_msg_t("Init DONE.");
2275 err_msg_t("init failed.");
2280 * This function is to represent messagecallback
2282 * @param message [in] Specifies the message
2283 * @param param [in] Specifies the message type
2284 * @param user_param [in] Specifies the user poiner for passing to callback function
2285 * @return This function returns TRUE/FALSE
2287 * @see other functions
2289 static gboolean msg_callback(int message, void *msg_param, void *user_param)
2292 MMMessageParamType *param = (MMMessageParamType *) msg_param;
2295 case MM_MESSAGE_CAMCORDER_ERROR:
2296 g_print("MM_MESSAGE_ERROR : code = %x", param->code);
2298 case MM_MESSAGE_CAMCORDER_STATE_CHANGED:
2299 g_current_state = param->state.current;
2300 switch(g_current_state)
2302 case MM_CAMCORDER_STATE_NULL :
2303 mmcamcorder_state = MM_CAMCORDER_STATE_NULL;
2304 debug_msg_t("Camcorder State is [NULL]");
2306 case MM_CAMCORDER_STATE_READY :
2307 mmcamcorder_state = MM_CAMCORDER_STATE_READY;
2308 debug_msg_t("Camcorder State is [READY]");
2310 case MM_CAMCORDER_STATE_PREPARE :
2311 mmcamcorder_state = MM_CAMCORDER_STATE_PREPARE;
2312 debug_msg_t("Camcorder State is [PREPARE]");
2314 case MM_CAMCORDER_STATE_CAPTURING :
2315 mmcamcorder_state = MM_CAMCORDER_STATE_CAPTURING;
2316 debug_msg_t("Camcorder State is [CAPTURING]");
2318 case MM_CAMCORDER_STATE_RECORDING :
2319 mmcamcorder_state = MM_CAMCORDER_STATE_RECORDING;
2320 time_msg_t("Recording start time : %12.6lf s", g_timer_elapsed(timer, NULL));
2321 debug_msg_t("Camcorder State is [RECORDING]");
2323 case MM_CAMCORDER_STATE_PAUSED :
2324 mmcamcorder_state = MM_CAMCORDER_STATE_PAUSED;
2325 debug_msg_t("Camcorder State is [PAUSED]");
2328 debug_msg_t("Unknown State [%d]", g_current_state);
2333 case MM_MESSAGE_CAMCORDER_CAPTURED:
2334 time_msg_t("Stillshot capture : %12.6lf s", g_timer_elapsed(timer, NULL));
2335 if (hcamcorder->isMultishot) {
2336 //g_print("[CamcorderApp] Camcorder Captured(Capture Count=%d)\n", param->code);
2337 if (param->code >= multishot_num) {
2339 // g_timeout_add (100, (GSourceFunc)get_me_out, NULL);
2340 // hcamcorder->isMultishot = FALSE;
2344 // g_timeout_add (1000, (GSourceFunc)get_me_out, NULL);
2347 case MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED:
2348 case MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED:
2350 MMCamRecordingReport* report ;
2352 time_msg_t("Recording commit time : %12.6lf s", g_timer_elapsed(timer, NULL));
2355 report = (MMCamRecordingReport*)(param->data);
2360 if (report != NULL) {
2361 g_print("*******************************************************\n");
2362 g_print("[Camcorder Testsuite] Camcorder Captured(filename=%s)\n", report->recording_filename);
2363 g_print("*******************************************************\n");
2365 g_print( "[Camcorder Testsuite] report is NULL.\n" );
2369 case MM_MESSAGE_CAMCORDER_TIME_LIMIT:
2371 debug_msg_t("Got TIME LIMIT MESSAGE");
2374 case MM_MESSAGE_CAMCORDER_RECORDING_STATUS:
2376 unsigned long long elapsed;
2377 elapsed = param->recording_status.elapsed / 1000;
2378 if (hcamcorder->elapsed_time != elapsed) {
2379 unsigned long temp_time;
2380 unsigned long long hour, minute, second;
2381 hcamcorder->elapsed_time = elapsed;
2382 temp_time = elapsed;
2383 hour = temp_time / 3600;
2384 temp_time = elapsed % 3600;
2385 minute = temp_time / 60;
2386 second = temp_time % 60;
2387 debug_msg_t("Current Time - %lld:%lld:%lld, remained %lld ms, filesize %lld KB",
2388 hour, minute, second, param->recording_status.remained_time, param->recording_status.filesize);
2392 case MM_MESSAGE_CAMCORDER_MAX_SIZE:
2395 g_print("*Save Recording because receives message : MM_MESSAGE_CAMCORDER_MAX_SIZE\n");
2396 g_timer_reset(timer);
2397 err = mm_camcorder_commit(hcamcorder->camcorder);
2401 warn_msg_t("Save recording mm_camcorder_commit = %x", err);
2406 case MM_MESSAGE_CAMCORDER_CURRENT_VOLUME:
2408 case MM_MESSAGE_CAMCORDER_NO_FREE_SPACE:
2411 g_print("*Save Recording because receives message : MM_MESSAGE_CAMCORDER_NO_FREE_SPACE\n");
2412 g_timer_reset(timer);
2413 err = mm_camcorder_commit(hcamcorder->camcorder);
2417 warn_msg_t("Save recording mm_camcorder_commit = %x", err);
2422 case MM_MESSAGE_CAMCORDER_FOCUS_CHANGED:
2424 g_print( "Focus State changed. State:[%d]\n", param->code );
2427 case MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO:
2429 MMCamFaceDetectInfo *cam_fd_info = NULL;
2431 cam_fd_info = (MMCamFaceDetectInfo *)(param->data);
2436 g_print("\tface detect num %d, pointer %p\n", cam_fd_info->num_of_faces, cam_fd_info);
2438 for (i = 0 ; i < cam_fd_info->num_of_faces ; i++) {
2439 g_print("\t\t[%2d][score %d] position %d,%d %dx%d\n",
2440 cam_fd_info->face_info[i].id,
2441 cam_fd_info->face_info[i].score,
2442 cam_fd_info->face_info[i].rect.x,
2443 cam_fd_info->face_info[i].rect.y,
2444 cam_fd_info->face_info[i].rect.width,
2445 cam_fd_info->face_info[i].rect.height);
2451 g_print("Message %x received\n", message);
2458 static gboolean init_handle()
2460 hcamcorder->mode = MODE_VIDEO_CAPTURE; /* image(capture)/video(recording) mode */
2461 hcamcorder->isMultishot = FALSE;
2462 hcamcorder->stillshot_count = 0; /* total stillshot count */
2463 hcamcorder->multishot_count = 0; /* total multishot count */
2464 hcamcorder->stillshot_filename = STILL_CAPTURE_FILE_PATH_NAME; /* stored filename of stillshot */
2465 hcamcorder->multishot_filename = MULTI_CAPTURE_FILE_PATH_NAME; /* stored filename of multishot */
2466 hcamcorder->menu_state = MENU_STATE_MAIN;
2467 hcamcorder->isMute = FALSE;
2468 hcamcorder->elapsed_time = 0;
2469 hcamcorder->fps = SRC_VIDEO_FRAME_RATE_15; /*SRC_VIDEO_FRAME_RATE_30;*/
2470 multishot_num = IMAGE_CAPTURE_COUNT_MULTI;
2475 * This function is to change camcorder mode.
2477 * @param type [in] image(capture)/video(recording) mode
2479 * @return This function returns TRUE/FALSE
2481 * @see other functions
2483 static gboolean mode_change()
2485 int err = MM_ERROR_NONE;
2486 int state = MM_CAMCORDER_STATE_NONE;
2488 int device_count = 0;
2489 int facing_direction = 0;
2490 char media_type = '\0';
2491 char *evassink_name = NULL;
2494 debug_msg_t("MMCamcorder State : %d", mmcamcorder_state);
2496 err = mm_camcorder_get_state(hcamcorder->camcorder, (MMCamcorderStateType *)&state);
2497 if(state != MM_CAMCORDER_STATE_NONE)
2499 if ((state == MM_CAMCORDER_STATE_RECORDING)
2500 || (state == MM_CAMCORDER_STATE_PAUSED))
2502 debug_msg_t("mm_camcorder_cancel");
2503 err = mm_camcorder_cancel(hcamcorder->camcorder);
2507 warn_msg_t("exit mm_camcorder_cancel = %x", err);
2511 else if (state == MM_CAMCORDER_STATE_CAPTURING)
2513 debug_msg_t("mm_camcorder_capture_stop");
2514 err = mm_camcorder_capture_stop(hcamcorder->camcorder);
2518 warn_msg_t("exit mmcamcorder_capture_stop = %x", err);
2523 err = mm_camcorder_get_state(hcamcorder->camcorder, (MMCamcorderStateType *)&state);
2524 if(state == MM_CAMCORDER_STATE_PREPARE)
2526 debug_msg_t("mm_camcorder_stop");
2527 mm_camcorder_stop(hcamcorder->camcorder);
2530 err = mm_camcorder_get_state(hcamcorder->camcorder, (MMCamcorderStateType *)&state);
2531 if(state == MM_CAMCORDER_STATE_READY)
2533 debug_msg_t("mm_camcorder_unrealize");
2534 mm_camcorder_unrealize(hcamcorder->camcorder);
2537 err = mm_camcorder_get_state(hcamcorder->camcorder, (MMCamcorderStateType *)&state);
2538 if(state == MM_CAMCORDER_STATE_NULL)
2540 debug_msg_t("mm_camcorder_destroy");
2541 mm_camcorder_destroy(hcamcorder->camcorder);
2543 mmcamcorder_state = MM_CAMCORDER_STATE_NONE;
2548 mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
2550 g_print("\n\t=======================================\n");
2551 g_print("\t MM_CAMCORDER_TESTSUIT\n");
2552 g_print("\t=======================================\n");
2553 g_print("\t '1' Video Capture - Front Camera\n");
2554 g_print("\t '2' Video Capture - Rear Camera\n");
2555 g_print("\t '3' Audio Recording - MIC\n");
2556 g_print("\t '4' Audio Recording - RADIO\n");
2557 g_print("\t 'q' Exit\n");
2558 g_print("\t=======================================\n");
2560 g_print("\t Enter the media type:\n\t");
2562 err = scanf("%c", &media_type);
2564 g_print("\t!!!read input error!!!\n");
2568 switch (media_type) {
2570 hcamcorder->mode= MODE_VIDEO_CAPTURE;
2571 cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA1;
2575 hcamcorder->mode= MODE_VIDEO_CAPTURE;
2576 cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2580 hcamcorder->mode= MODE_AUDIO;
2581 cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2585 hcamcorder->mode= MODE_AUDIO;
2586 cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2590 g_print("\t Quit Camcorder Testsuite!!\n");
2591 hcamcorder->mode = -1;
2592 if(g_main_loop_is_running(g_loop)) {
2593 g_main_loop_quit(g_loop);
2597 g_print("\t Invalid media type(%d)\n", media_type);
2602 debug_msg_t("mm_camcorder_create");
2603 g_get_current_time(&previous);
2604 g_timer_reset(timer);
2606 err = mm_camcorder_create(&hcamcorder->camcorder, &cam_info);
2607 time_msg_t("mm_camcorder_create() : %12.6lfs", g_timer_elapsed(timer, NULL));
2609 if (err != MM_ERROR_NONE) {
2610 err_msg_t("mmcamcorder_create = %x", err);
2613 mmcamcorder_state = MM_CAMCORDER_STATE_NULL;
2616 /* get evassink name */
2617 mm_camcorder_get_attributes(hcamcorder->camcorder, NULL,
2618 MMCAM_DISPLAY_EVAS_SURFACE_SINK, &evassink_name, &name_size,
2619 MMCAM_CAMERA_DEVICE_COUNT, &device_count,
2620 MMCAM_CAMERA_FACING_DIRECTION, &facing_direction,
2622 debug_msg_t("evassink name[%s], device count[%d], facing direction[%d]",
2623 evassink_name, device_count, facing_direction);
2625 mm_camcorder_set_message_callback(hcamcorder->camcorder, (MMMessageCallback)msg_callback, hcamcorder);
2627 if (media_type == '3') {
2628 mm_camcorder_set_attributes(hcamcorder->camcorder, NULL,
2629 MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2631 } else if (media_type == '4') {
2632 mm_camcorder_set_attributes(hcamcorder->camcorder, NULL,
2633 MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_RADIO,
2637 if (!init(hcamcorder->mode)) {
2638 err_msg_t("testsuite init() failed.");
2642 debug_msg_t("mm_camcorder_realize");
2644 g_timer_reset(timer);
2646 err = mm_camcorder_realize(hcamcorder->camcorder);
2647 time_msg_t("mm_camcorder_realize() : %12.6lfs", g_timer_elapsed(timer, NULL));
2648 if (err != MM_ERROR_NONE) {
2649 err_msg_t("mm_camcorder_realize = %x", err);
2653 /* start camcorder */
2654 debug_msg_t("mm_camcorder_start");
2656 g_timer_reset(timer);
2658 err = mm_camcorder_start(hcamcorder->camcorder);
2659 time_msg_t("mm_camcorder_start() : %12.6lfs", g_timer_elapsed(timer, NULL));
2661 if (err != MM_ERROR_NONE) {
2662 err_msg_t("mm_camcorder_start = %x", err);
2666 g_get_current_time(¤t);
2667 timersub(¤t, &previous, &result);
2668 time_msg_t("Camera Starting Time : %ld.%lds", result.tv_sec, result.tv_usec);
2675 * This function is the example main function for mmcamcorder API.
2679 * @return This function returns 0.
2681 * @see other functions
2683 int main(int argc, char **argv)
2687 #if !GLIB_CHECK_VERSION(2,35,0)
2688 if (!g_thread_supported())
2689 g_thread_init (NULL);
2692 timer = g_timer_new();
2694 gst_init(&argc, &argv);
2696 time_msg_t("gst_init() : %12.6lfs", g_timer_elapsed(timer, NULL));
2698 hcamcorder = (cam_handle_t *) g_malloc0(sizeof(cam_handle_t));
2699 mmcamcorder_state = MM_CAMCORDER_STATE_NONE;
2701 g_timer_reset(timer);
2703 bret = mode_change();
2710 g_loop = g_main_loop_new(NULL, FALSE);
2712 stdin_channel = g_io_channel_unix_new(fileno(stdin));/* read from stdin */
2713 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)cmd_input, NULL);
2715 debug_msg_t("RUN main loop");
2717 g_main_loop_run(g_loop);
2719 debug_msg_t("STOP main loop");
2722 g_timer_stop(timer);
2723 g_timer_destroy(timer);
2726 //g_print("\t Exit from the application.\n");
2728 g_main_loop_unref(g_loop);
2729 g_io_channel_unref(stdin_channel);