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")))
41 static int app_create(void *data);
42 static int app_terminate(void *data);
50 typedef struct _appdata appdata;
52 static struct appcore_ops ops = {
54 .terminate = app_terminate,
58 static GIOChannel *stdin_channel;
59 static int recorder_state;
60 static GTimer *timer = NULL;
61 static int g_recorder_device_changed_cb_id;
62 static int ve_frame_count = 0;
64 /*-----------------------------------------------------------------------
65 | GLOBAL CONSTANT DEFINITIONS: |
66 -----------------------------------------------------------------------*/
69 /*-----------------------------------------------------------------------
70 | IMPORTED VARIABLE DECLARATIONS: |
71 -----------------------------------------------------------------------*/
74 /*-----------------------------------------------------------------------
75 | IMPORTED FUNCTION DECLARATIONS: |
76 -----------------------------------------------------------------------*/
79 /*-----------------------------------------------------------------------
81 -----------------------------------------------------------------------*/
82 #define SRC_VIDEO_FRAME_RATE_15 15 /* video input frame rate */
83 #define SRC_VIDEO_FRAME_RATE_30 30 /* video input frame rate */
85 #define TARGET_FILENAME_PATH "/opt/usr/home/owner/media/"
86 #define TARGET_FILENAME_VIDEO TARGET_FILENAME_PATH"test_rec_video.mp4"
87 #define TARGET_FILENAME_AUDIO TARGET_FILENAME_PATH"test_rec_audio.m4a"
88 #define TARGET_FILENAME_MUXED_CB TARGET_FILENAME_PATH"muxed_stream_cb.mp4"
89 #define TARGET_FILENAME_VE_DECISION_CB TARGET_FILENAME_PATH"ve_decision_cb.data"
91 #define AUDIO_SOURCE_SAMPLERATE_AAC 44100
92 #define AUDIO_SOURCE_SAMPLERATE_AMR 8000
93 #define AUDIO_SOURCE_CHANNEL_AAC 2
94 #define AUDIO_SOURCE_CHANNEL_AMR 1
95 #define VIDEO_ENCODE_BITRATE 40000000 /* bps */
97 #define CHECK_MM_ERROR(expr) \
102 g_print("[%s:%d] error code : %x \n", __func__, __LINE__, ret); \
108 #define SAFE_FREE(x) if (x) { g_free(x); x = NULL; }
112 static struct timeval previous;
113 static struct timeval current;
114 static struct timeval res;
117 /*-----------------------------------------------------------------------
118 | LOCAL CONSTANT DEFINITIONS: |
119 -----------------------------------------------------------------------*/
121 MODE_VIDEO_CAPTURE, /* recording and image capture mode */
122 MODE_AUDIO, /* audio recording*/
133 /*-----------------------------------------------------------------------
134 | LOCAL DATA TYPE DEFINITIONS: |
135 -----------------------------------------------------------------------*/
136 typedef struct _cam_handle {
139 int mode; /*video/audio(recording) mode */
143 unsigned long long elapsed_time;
153 /*---------------------------------------------------------------------------
154 | LOCAL VARIABLE DEFINITIONS: |
155 ---------------------------------------------------------------------------*/
156 static cam_handle_t *hcamcorder;
158 const char *video_codec[4] = {
165 const char *audio_codec[5] = {
173 const char *file_format[7] = {
183 const char *display_mode[6] = {
185 "Original Size mode",
187 "Cropped Full Screen mode",
188 "Original size or Letter Box mode",
192 const char* strobe_mode[] = {
203 const char *vs_mode[] = {
208 /*---------------------------------------------------------------------------
209 | LOCAL FUNCTION PROTOTYPES: |
210 ---------------------------------------------------------------------------*/
211 static void print_menu();
212 static gboolean cmd_input(GIOChannel *channel, GIOCondition condition, gpointer data);
213 static gboolean init(int type);
214 static gboolean mode_change(gchar buf);
217 static bool resolution_cb(int width, int height, void *user_data)
219 resolution_stack *data = (resolution_stack*)user_data;
222 g_print("NULL data\n");
226 data->width[data->count] = width;
227 data->height[data->count] = height;
229 g_print("%d. %dx%d\n", data->count, width, height);
236 static bool video_codec_cb(recorder_video_codec_e codec, void *user_data)
238 g_print("%d. %s\n", codec, video_codec[codec]);
242 static bool audio_codec_cb(recorder_audio_codec_e codec, void *user_data)
244 g_print("%d. %s\n", codec, audio_codec[codec]);
248 static bool file_format_cb(recorder_file_format_e format, void *user_data)
250 g_print("%d. %s\n", format, file_format[format]);
254 static bool strobe_mode_cb(camera_attr_flash_mode_e mode , void *user_data)
256 g_print("%d.%s\n", mode, strobe_mode[mode]);
260 static void _state_changed_cb(recorder_state_e previous_state, recorder_state_e current_state, bool by_policy, void *user_data)
262 g_print("\n\tstate changed[by_policy:%d] : %d -> %d\n\n", by_policy, previous_state, current_state);
266 static void _interrupted_cb(recorder_policy_e policy, recorder_state_e previous_state, recorder_state_e current_state, void *user_data)
268 g_print("\nrecorder interrupted callback called [state %d -> %d, policy %d]\n",
269 previous_state, current_state, policy);
273 static void _recorder_device_state_changed_cb(recorder_type_e type, recorder_device_state_e state, void *user_data)
275 g_print("\nrecorder device[%d] state changed to %d\n", type, state);
279 static void _recording_status_cb(unsigned long long elapsed_time, unsigned long long file_size, void *user_data)
281 static unsigned long long elapsed = -1;
283 if (elapsed != elapsed_time / 1000) {
284 unsigned long temp_time;
285 unsigned long long hour, minute, second;
286 elapsed = elapsed_time / 1000;
288 hour = temp_time / 3600;
289 temp_time = elapsed % 3600;
290 minute = temp_time / 60;
291 second = temp_time % 60;
292 g_print("\n\tCurrent Time - %lld:%lld:%lld, filesize %lld KB\n\n",
293 hour, minute, second, file_size);
299 static void _recording_limit_reached_cb(recorder_recording_limit_type_e type, void *user_data)
301 g_print("\n\tRECORDING LIMIT REACHED [type: %d]\n\n", type);
305 static void _recording_muxed_stream_cb(void *stream, int size, unsigned long long offset, void *user_data)
307 static unsigned long long current_offset = 0;
311 g_print("\tRECORDING MUXED STREAM CB - %p, size %d, offset %llu\n", stream, size, offset);
313 if (stream && size > 0) {
315 fp = fopen(TARGET_FILENAME_MUXED_CB, "w");
317 fp = fopen(TARGET_FILENAME_MUXED_CB, "rb+");
320 if (current_offset > offset) {
321 g_print("\tback to %llu\n", offset);
324 if (fseeko(fp, (off_t)offset, SEEK_SET) == 0)
325 fwrite(stream, 1, size, fp);
327 g_print("\nSeek Error : offset %llu\n", offset);
332 g_print("\n\n\t File open failed [%s], errno %d", TARGET_FILENAME_MUXED_CB, errno);
335 current_offset = offset;
342 static void _dump_video_frame(recorder_video_data_s *frame)
347 g_print("\n==== NULL video frame ====\n");
351 fp = fopen(TARGET_FILENAME_VE_DECISION_CB, "a");
353 g_print("\n==== file[%s] open failed ====\n", TARGET_FILENAME_VE_DECISION_CB);
357 if (frame->format == CAMERA_PIXEL_FORMAT_RGBA ||
358 frame->format == CAMERA_PIXEL_FORMAT_ARGB) {
359 fwrite(frame->data.rgb_plane.data, 1, frame->data.rgb_plane.size, fp);
360 } else if (frame->format == CAMERA_PIXEL_FORMAT_INVZ) {
361 fwrite(frame->data.depth_plane.data, 1, frame->data.depth_plane.size, fp);
362 } else if (frame->format == CAMERA_PIXEL_FORMAT_MJPEG) {
363 fwrite(frame->data.encoded_plane.data, 1, frame->data.encoded_plane.size, fp);
365 switch (frame->num_of_planes) {
367 fwrite(frame->data.single_plane.yuv, 1, frame->data.single_plane.size, fp);
370 fwrite(frame->data.double_plane.y, 1, frame->data.double_plane.y_size, fp);
371 fwrite(frame->data.double_plane.uv, 1, frame->data.double_plane.uv_size, fp);
374 fwrite(frame->data.triple_plane.y, 1, frame->data.triple_plane.y_size, fp);
375 fwrite(frame->data.triple_plane.u, 1, frame->data.triple_plane.u_size, fp);
376 fwrite(frame->data.triple_plane.v, 1, frame->data.triple_plane.v_size, fp);
388 static bool _recording_video_encode_decision_cb(recorder_video_data_s *frame, void *user_data)
390 if (ve_frame_count == 0) {
391 g_print("==== VE decision cb : file[%s][fmt %d, %dx%d, plane %d] ====\n",
392 TARGET_FILENAME_VE_DECISION_CB,
393 frame->format, frame->width, frame->height, frame->num_of_planes);
395 _dump_video_frame(frame);
398 if ((ve_frame_count++ % 10) >= 5) {
399 g_print("-------- VE decision cb : [ret:false]\n");
402 g_print("-------- VE decision cb : [ret:true ]\n");
408 static inline void flush_stdin()
411 while ((ch = getchar()) != EOF && ch != '\n');
415 static gboolean _release_idle_event_callback(void *data)
417 g_print("destroy recorder handle\n\n");
419 recorder_destroy(hcamcorder->recorder);
420 hcamcorder->recorder = NULL;
421 hcamcorder->menu_state = MENU_STATE_INIT;
427 static void _recorder_error_cb(int error, recorder_state_e current_state, void *user_data)
429 g_print("\n\n\tERROR [0x%x], current state %d\n", error, current_state);
432 case RECORDER_ERROR_RESOURCE_CONFLICT:
433 g_print("\t\t[RECORDER_ERROR_RESOURCE_CONFLICT]\n\n");
435 case RECORDER_ERROR_SECURITY_RESTRICTED:
436 g_print("\t\t[RECORDER_ERROR_SECURITY_RESTRICTED]\n\n");
438 case RECORDER_ERROR_SERVICE_DISCONNECTED:
439 g_print("\t\t[RECORDER_ERROR_SERVICE_DISCONNECTED]\n\n");
440 g_idle_add_full(G_PRIORITY_DEFAULT,
441 (GSourceFunc)_release_idle_event_callback,
452 static int _recorder_set_muxed_stream_cb(void)
457 g_print("* Muxed stream callback\n");
461 g_print("[set(1)/unset(2)] : ");
463 err = scanf("%d", &idx);
467 return recorder_set_muxed_stream_cb(hcamcorder->recorder, _recording_muxed_stream_cb, NULL);
469 return recorder_unset_muxed_stream_cb(hcamcorder->recorder);
471 return RECORDER_ERROR_INVALID_PARAMETER;
476 static int _recorder_set_audio_encoder(void)
481 g_print("* Audio codec\n");
485 g_print("-1. DISABLE\n");
486 recorder_foreach_supported_audio_encoder(hcamcorder->recorder, audio_codec_cb, (void *)hcamcorder);
488 err = scanf("%d", &encoder);
490 return recorder_set_audio_encoder(hcamcorder->recorder, encoder);
494 static int _recorder_set_file_format(void)
499 g_print("* File format\n");
503 recorder_foreach_supported_file_format(hcamcorder->recorder, file_format_cb, (void *)hcamcorder);
505 err = scanf("%d", &format);
507 return recorder_set_file_format(hcamcorder->recorder, format);
511 static int _recorder_set_size_limit(void)
516 g_print("* Size limit\n");
520 g_print("[KByte] : ");
522 err = scanf("%d", &limit);
524 return recorder_attr_set_size_limit(hcamcorder->recorder, limit);
528 static int _recorder_set_time_limit(void)
533 g_print("* Time limit\n");
537 g_print("[Second] : ");
539 err = scanf("%d", &limit);
541 return recorder_attr_set_time_limit(hcamcorder->recorder, limit);
545 static int _recorder_set_audio_samplerate(void)
550 g_print("* Samplerate\n");
556 err = scanf("%d", &samplerate);
558 return recorder_attr_set_audio_samplerate(hcamcorder->recorder, samplerate);
562 static int _recorder_set_audio_channel(void)
567 g_print("* Channel\n");
571 g_print("[1 or 2] : ");
573 err = scanf("%d", &channel);
575 return recorder_attr_set_audio_channel(hcamcorder->recorder, channel);
579 static int _recorder_set_encoder_bitrate(void)
585 g_print("* Bitrate\n");
589 g_print("[type(1:Audio,2:Video) bps] : ");
591 err = scanf("%d %d", &type, &bitrate);
595 return recorder_attr_set_audio_encoder_bitrate(hcamcorder->recorder, bitrate);
597 return recorder_attr_set_video_encoder_bitrate(hcamcorder->recorder, bitrate);
599 g_print("invalid type [%d]", type);
605 static void print_menu()
607 switch (hcamcorder->menu_state) {
608 case MENU_STATE_INIT:
609 g_print("\n\t=======================================\n");
610 g_print("\t RECORDER_TESTSUIT\n");
611 g_print("\t=======================================\n");
612 g_print("\t '1' Video Recording - Rear Camera\n");
613 g_print("\t '2' Audio Recording\n");
614 g_print("\t '3' Audio Recording with stream info\n");
615 g_print("\t '4' Add recorder device changed callback\n");
616 g_print("\t '5' Remove recorder device changed callback\n");
617 g_print("\t '6' Get recorder device state\n");
618 g_print("\t 'q' Exit\n");
619 g_print("\t=======================================\n");
620 g_print("\t Choose the menu :\n\t");
622 case MENU_STATE_MAIN:
623 g_print("\n\t=======================================\n");
624 if (hcamcorder->mode == MODE_VIDEO_CAPTURE)
625 g_print("\t Video + Audio Recording\n");
627 g_print("\t Audio Recording\n");
628 g_print("\t=======================================\n");
629 if (recorder_state <= RECORDER_STATE_NONE) {
630 g_print("\t '1' Start Recording\n");
631 g_print("\t '2' Setting\n");
632 g_print("\t 'b' back\n");
633 } else if (recorder_state == RECORDER_STATE_RECORDING) {
634 g_print("\t 'p' Pause Recording\n");
635 g_print("\t 'c' Cancel\n");
636 g_print("\t 's' Save\n");
637 } else if (recorder_state == RECORDER_STATE_PAUSED) {
638 g_print("\t 'r' Resume Recording\n");
639 g_print("\t 'c' Cancel\n");
640 g_print("\t 's' Save\n");
642 g_print("\t=======================================\n");
645 case MENU_STATE_SETTING:
646 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
647 g_print("\n\t=======================================\n");
648 g_print("\t Video + Audio recording > Setting\n");
649 g_print("\t=======================================\n");
650 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera/Recorder] \n");
651 g_print("\t '0' Preview resolution \n");
652 g_print("\t '1' Video resolution \n");
653 g_print("\t '2' Video codec \n");
654 g_print("\t '3' Audio codec \n");
655 g_print("\t '4' File format \n");
656 g_print("\t '5' Size limit \n");
657 g_print("\t '6' Time limit \n");
658 g_print("\t '7' Samplerate \n");
659 g_print("\t '8' Channel \n");
660 g_print("\t '9' Encoder bitrate \n");
661 g_print("\t >>>>>>>>>>>>>>>>>>>> [Display]\n");
662 g_print("\t 'v' Display visible \n");
663 g_print("\t 'd' Display mode \n");
664 g_print("\t 'r' Display rotation \n");
665 g_print("\t 'f' Display flip\n");
666 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc]\n");
667 g_print("\t 's' Strobe (Flash) \n");
668 g_print("\t 'z' Video-stabilization \n");
669 g_print("\t 'm' Camcorder Motion Rate setting \n");
670 g_print("\t 'M' Set/Unset muxed stream callback \n");
671 g_print("\t 'E' Set/Unset video encode decision callback \n");
672 g_print("\t 'F' Set file name - %s\n", TARGET_FILENAME_VIDEO);
673 g_print("\t 'b' back\n");
674 g_print("\t=======================================\n");
676 g_print("\n\t=======================================\n");
677 g_print("\t Audio recording > Setting\n");
678 g_print("\t=======================================\n");
679 g_print("\t '1' Audio codec \n");
680 g_print("\t '2' File format \n");
681 g_print("\t '3' Size limit \n");
682 g_print("\t '4' Time limit \n");
683 g_print("\t '5' Samplerate \n");
684 g_print("\t '6' Channel \n");
685 g_print("\t '7' Encoder bitrate \n");
686 g_print("\t 'M' Set/Unset muxed stream callback \n");
687 g_print("\t 'F' Set file name - %s\n", TARGET_FILENAME_AUDIO);
688 g_print("\t 'b' back\n");
689 g_print("\t=======================================\n");
694 g_print("unknow menu state !!\n");
701 static void main_menu(gchar buf)
705 if (hcamcorder->mode != MODE_VIDEO_CAPTURE && hcamcorder->mode != MODE_AUDIO) {
706 g_print("\t Invalid mode, back to upper menu \n");
707 hcamcorder->menu_state = MENU_STATE_INIT;
711 if (recorder_state == RECORDER_STATE_NONE) {
713 case '1': /* Start Recording */
714 g_print("*Recording start!\n");
715 hcamcorder->elapsed_time = 0;
718 g_timer_reset(timer);
719 err = recorder_start(hcamcorder->recorder);
722 g_print("Rec start camcorder_record 0x%x\n", err);
724 recorder_state = RECORDER_STATE_RECORDING;
727 case '2': /* Setting */
728 hcamcorder->menu_state = MENU_STATE_SETTING;
732 recorder_unprepare(hcamcorder->recorder);
733 recorder_destroy(hcamcorder->recorder);
734 hcamcorder->recorder = NULL;
736 if (hcamcorder->camera) {
737 camera_destroy(hcamcorder->camera);
738 hcamcorder->camera = NULL;
741 hcamcorder->menu_state = MENU_STATE_INIT;
745 g_print("\t Invalid input \n");
748 } else if (recorder_state == RECORDER_STATE_RECORDING || recorder_state == RECORDER_STATE_PAUSED) {
750 case 'p': /* Pause Recording */
751 g_print("*Pause!\n");
752 err = recorder_pause(hcamcorder->recorder);
755 g_print("Rec pause camcorder_pause = %x\n", err);
757 recorder_state = RECORDER_STATE_PAUSED;
760 case 'r': /* Resume Recording */
761 g_print("*Resume!\n");
762 err = recorder_start(hcamcorder->recorder);
764 g_print("Rec start camcorder_record = %x\n", err);
766 recorder_state = RECORDER_STATE_RECORDING;
769 case 'c': /* Cancel */
770 g_print("*Cancel Recording !\n");
772 err = recorder_cancel(hcamcorder->recorder);
775 g_print("Cancel recording camcorder_cancel = %x\n", err);
777 recorder_state = RECORDER_STATE_NONE;
781 g_print("*Save Recording!\n");
782 g_timer_reset(timer);
784 err = recorder_commit(hcamcorder->recorder);
787 g_print("Save recording recorder_commit = %x\n", err);
789 recorder_state = RECORDER_STATE_NONE;
793 g_print("\t Invalid input \n");
797 g_print("Wrong camcorder state, check status!!\n");
804 static void setting_menu(gchar buf)
811 if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
816 float motion_rate = 0.0;
817 resolution_stack resolution_list;
820 /* Camera/Recorder setting */
821 case '0': /* Setting > Preview Resolution setting */
822 g_print("* Preview resolution\n");
823 resolution_list.count = 0;
827 camera_foreach_supported_preview_resolution(hcamcorder->camera,
828 resolution_cb, &resolution_list);
830 err = scanf("%d", &idx);
831 if (resolution_list.count > idx && idx >= 0) {
832 g_print("----------------- SET %dx%d ---------------------\n",
833 resolution_list.width[idx], resolution_list.height[idx]);
835 result = camera_set_preview_resolution(hcamcorder->camera,
836 resolution_list.width[idx], resolution_list.height[idx]);
838 g_print("invalid input %d\n", idx);
842 resolution_list.count = 0;
845 case '1': /* Setting > Video Resolution setting */
846 g_print("* Video resolution\n");
847 resolution_list.count = 0;
851 recorder_foreach_supported_video_resolution(hcamcorder->recorder,
852 resolution_cb, &resolution_list);
854 err = scanf("%d", &idx);
855 if (resolution_list.count > idx && idx >= 0) {
856 g_print("----------------- SET %dx%d ---------------------\n",
857 resolution_list.width[idx], resolution_list.height[idx]);
859 result = recorder_set_video_resolution(hcamcorder->recorder,
860 resolution_list.width[idx], resolution_list.height[idx]);
862 g_print("invalid input %d\n", idx);
866 resolution_list.count = 0;
869 case '2': /* Setting > Video codec */
870 g_print("* Video codec\n");
874 recorder_foreach_supported_video_encoder(hcamcorder->recorder, video_codec_cb, (void *)hcamcorder);
876 err = scanf("%d", &idx);
878 result = recorder_set_video_encoder(hcamcorder->recorder, idx);
881 case '3': /* Setting > Audio codec */
882 result = _recorder_set_audio_encoder();
885 case '4': /* Setting > File format */
886 result = _recorder_set_file_format();
889 case '5': /* Setting > Size limit */
890 result = _recorder_set_size_limit();
893 case '6': /* Setting > Time limit */
894 result = _recorder_set_time_limit();
897 case '7': /* Setting > Samplerate */
898 result = _recorder_set_audio_samplerate();
901 case '8': /* Setting > Channel */
902 result = _recorder_set_audio_channel();
905 case '9': /* Setting > Bitrate */
906 result = _recorder_set_encoder_bitrate();
909 /* Display setting */
910 case 'v': /* Display visible */
911 g_print("* Display visible\n");
915 g_print("\t 0. OFF\n");
916 g_print("\t 1. ON\n");
918 err = scanf("%d", &idx);
920 result = camera_set_display_visible(hcamcorder->camera, idx);
923 case 'd': /* Setting > Display mode */
924 g_print("* Display mode\n");
927 for (idx = 0 ; idx < 6 ; idx++)
928 g_print("%d. %s\n", idx, display_mode[idx]);
930 err = scanf("%d", &idx);
932 if (idx == CAMERA_DISPLAY_MODE_CUSTOM_ROI) {
933 g_print("ROI area [x y width height] : ");
934 err = scanf("%d %d %d %d", &x, &y, &width, &height);
937 result = camera_set_display_mode(hcamcorder->camera, idx - 1);
939 if (idx == CAMERA_DISPLAY_MODE_CUSTOM_ROI)
940 result |= camera_attr_set_display_roi_area(hcamcorder->camera, x, y, width, height);
943 case 'r': /* Setting > Display Rotate */
944 g_print("* Display rotation\n");
948 g_print("\t0. 0\n\t1. 90\n\t2. 180\n\t3. 270\n\n");
950 err = scanf("%d", &idx);
952 result = camera_set_display_rotation(hcamcorder->camera, idx);
955 case 'f': /* Setting > Display Flip */
956 g_print("* Display flip\n");
960 g_print("\t0. NONE\n\t1. HORIZONTAL\n\t2. VERTICAL\n\t3. BOTH\n\n");
962 err = scanf("%d", &idx);
964 result = camera_set_display_flip(hcamcorder->camera, idx);
968 case 's': /* Setting > Strobe setting */
969 g_print("* Strobe Mode\n");
973 camera_attr_foreach_supported_flash_mode(hcamcorder->camera, strobe_mode_cb, NULL);
975 err = scanf("%d", &idx);
977 result = camera_attr_set_flash_mode(hcamcorder->camera, idx);
980 case 'z': /* Setting > Video-stabilization */
981 g_print("* Video stabilization\n");
985 for (idx = 0 ; idx < 2 ; idx++)
986 g_print("\t %d. %s\n", idx + 1, vs_mode[idx]);
988 err = scanf("%d", &idx);
991 g_print("\n Restart preview with NV12 and 720p resolution\n");
993 result = camera_stop_preview(hcamcorder->camera);
994 result |= camera_set_preview_resolution(hcamcorder->camera, 1280, 720);
995 result |= camera_set_preview_format(hcamcorder->camera, CAMERA_PIXEL_FORMAT_NV12);
997 result |= camera_attr_enable_video_stabilization(hcamcorder->camera, idx-1);
1000 result |= camera_start_preview(hcamcorder->camera);
1005 g_print("*Camcorder Motion Rate setting! (should be bigger than zero)\n");
1009 err = scanf("%f", &motion_rate);
1011 result = recorder_attr_set_recording_motion_rate(hcamcorder->recorder, motion_rate);
1014 case 'M': /* Setting > muxed stream callback */
1015 result = _recorder_set_muxed_stream_cb();
1018 case 'E': /* Setting > video encode decision callback */
1019 g_print("* Video encode decision callback\n");
1023 g_print("[set(1)/unset(2)] : ");
1025 err = scanf("%d", &idx);
1028 result = recorder_set_video_encode_decision_cb(hcamcorder->recorder, _recording_video_encode_decision_cb, NULL);
1030 result = recorder_unset_video_encode_decision_cb(hcamcorder->recorder);
1032 result = RECORDER_ERROR_INVALID_PARAMETER;
1036 case 'F': /* Set file name */
1037 result = recorder_set_filename(hcamcorder->recorder, TARGET_FILENAME_VIDEO);
1040 case 'b': /* back */
1041 hcamcorder->menu_state = MENU_STATE_MAIN;
1045 g_print("\t Invalid input \n");
1050 case '1': /* Setting > Audio codec */
1051 result = _recorder_set_audio_encoder();
1054 case '2': /* Setting > File format */
1055 result = _recorder_set_file_format();
1058 case '3': /* Setting > Size limit */
1059 result = _recorder_set_size_limit();
1062 case '4': /* Setting > Time limit */
1063 result = _recorder_set_time_limit();
1066 case '5': /* Setting > Samplerate */
1067 result = _recorder_set_audio_samplerate();
1070 case '6': /* Setting > Channel */
1071 result = _recorder_set_audio_channel();
1074 case '7': /* Setting > Bitrate */
1075 g_print("* Bitrate\n");
1079 g_print("[bps] : ");
1081 err = scanf("%d", &bitrate);
1083 result = recorder_attr_set_audio_encoder_bitrate(hcamcorder->recorder, bitrate);
1086 case 'M': /* Setting > muxed stream callback */
1087 result = _recorder_set_muxed_stream_cb();
1090 case 'F': /* Set file name */
1091 result = recorder_set_filename(hcamcorder->recorder, TARGET_FILENAME_AUDIO);
1094 case 'b': /* back */
1095 hcamcorder->menu_state = MENU_STATE_MAIN;
1099 g_print("\t Invalid input \n");
1105 if (result == 0) /* CAMERA_ERROR_NONE or RECORDER_ERROR_NONE */
1106 g_print("\n===== SET OK =====\n");
1108 g_print("\n===== SET FAIL 0x%x =====\n", result);
1116 * This function is to execute command.
1118 * @param channel [in] 1st parameter
1120 * @return This function returns TRUE/FALSE
1124 static gboolean cmd_input(GIOChannel *channel, GIOCondition condition, gpointer data)
1128 GError *g_error = NULL;
1130 g_print("\n\tENTER\n");
1132 g_io_channel_read_line(channel, &buf, &read_size, NULL, &g_error);
1134 g_print("\n\tg_io_channel_read_chars error\n");
1135 g_error_free(g_error);
1142 g_print("\n\tMenu Status : %d\n", hcamcorder->menu_state);
1143 switch (hcamcorder->menu_state) {
1144 case MENU_STATE_INIT:
1145 mode_change(buf[0]);
1147 case MENU_STATE_MAIN:
1150 case MENU_STATE_SETTING:
1151 setting_menu(buf[0]);
1162 g_print("\n\tNo read input\n");
1168 static gboolean init(int type)
1172 if (!hcamcorder || !hcamcorder->recorder) {
1173 g_print("NULL handle[%p]\n", hcamcorder);
1177 ret = recorder_set_file_format(hcamcorder->recorder, RECORDER_FILE_FORMAT_MP4);
1178 if (ret != RECORDER_ERROR_NONE) {
1179 g_print("recorder_set_file_format failed[0x%x]\n", ret);
1183 ret = recorder_attr_set_audio_device(hcamcorder->recorder, RECORDER_AUDIO_DEVICE_MIC);
1184 if (ret != RECORDER_ERROR_NONE) {
1185 g_print("recorder_attr_set_audio_device failed[0x%x]\n", ret);
1189 ret = recorder_set_audio_encoder(hcamcorder->recorder, RECORDER_AUDIO_CODEC_AAC);
1190 if (ret != RECORDER_ERROR_NONE) {
1191 g_print("recorder_set_audio_encoder failed[0x%x]\n", ret);
1195 ret = recorder_attr_set_audio_samplerate(hcamcorder->recorder, AUDIO_SOURCE_SAMPLERATE_AAC);
1196 if (ret != RECORDER_ERROR_NONE) {
1197 g_print("recorder_attr_set_audio_samplerate failed[0x%x]\n", ret);
1201 ret = recorder_attr_set_audio_channel(hcamcorder->recorder, AUDIO_SOURCE_CHANNEL_AAC);
1202 if (ret != RECORDER_ERROR_NONE) {
1203 g_print("recorder_attr_set_audio_channel failed[0x%x]\n", ret);
1207 if (type == MODE_VIDEO_CAPTURE) {
1208 /*================================================================================
1210 *=================================================================================*/
1211 ret = recorder_set_video_encoder(hcamcorder->recorder, RECORDER_VIDEO_CODEC_MPEG4);
1212 if (ret != RECORDER_ERROR_NONE) {
1213 g_print("recorder_set_video_encoder failed[0x%x]\n", ret);
1217 ret = recorder_attr_set_video_encoder_bitrate(hcamcorder->recorder, VIDEO_ENCODE_BITRATE);
1218 if (ret != RECORDER_ERROR_NONE) {
1219 g_print("recorder_attr_set_video_encoder_bitrate failed[0x%x]\n", ret);
1222 } else if (type == MODE_AUDIO) {
1223 /*================================================================================
1225 *=================================================================================*/
1226 ret = recorder_attr_set_time_limit(hcamcorder->recorder, 360000);
1227 if (ret != RECORDER_ERROR_NONE) {
1228 g_print("recorder_attr_set_time_limit failed[0x%x]\n", ret);
1232 ret = recorder_attr_set_audio_encoder_bitrate(hcamcorder->recorder, 128000);
1233 if (ret != RECORDER_ERROR_NONE) {
1234 g_print("recorder_attr_set_audio_encoder_bitrate failed[0x%x]\n", ret);
1239 recorder_set_error_cb(hcamcorder->recorder, _recorder_error_cb, NULL);
1240 recorder_set_state_changed_cb(hcamcorder->recorder, _state_changed_cb, NULL);
1241 recorder_set_interrupted_cb(hcamcorder->recorder, _interrupted_cb, NULL);
1242 recorder_set_recording_status_cb(hcamcorder->recorder, _recording_status_cb, NULL);
1243 recorder_set_recording_limit_reached_cb(hcamcorder->recorder, _recording_limit_reached_cb, NULL);
1245 g_print("Init DONE.\n");
1250 static gboolean init_handle()
1252 hcamcorder->mode = MODE_VIDEO_CAPTURE; /* image(capture)/video(recording) mode */
1253 hcamcorder->menu_state = MENU_STATE_INIT;
1254 hcamcorder->isMute = FALSE;
1255 hcamcorder->elapsed_time = 0;
1256 hcamcorder->fps = SRC_VIDEO_FRAME_RATE_15; /*SRC_VIDEO_FRAME_RATE_30;*/
1261 static void _sound_stream_focus_state_changed_cb(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state,
1262 sound_stream_focus_change_reason_e reason_for_change, int sound_behavior, const char *additional_info, void *user_data)
1264 g_print("focus changed : reason %d\n", reason_for_change);
1270 * This function is to change camcorder mode.
1272 * @param buf [in] user input
1274 * @return This function returns TRUE/FALSE
1276 * @see other functions
1278 static gboolean mode_change(gchar buf)
1280 int err = RECORDER_ERROR_NONE;
1281 int state = RECORDER_STATE_NONE;
1282 char media_type = '\0';
1284 recorder_device_state_e device_state = RECORDER_DEVICE_STATE_IDLE;
1285 sound_stream_info_h stream_info = NULL;
1287 gettimeofday(&previous, NULL);
1288 g_timer_reset(timer);
1290 if (hcamcorder->recorder) {
1291 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1292 if (state != RECORDER_STATE_NONE) {
1293 if (state == RECORDER_STATE_RECORDING ||
1294 state == RECORDER_STATE_PAUSED) {
1295 g_print("recorder_cancel\n");
1296 err = recorder_cancel(hcamcorder->recorder);
1297 if (err != RECORDER_ERROR_NONE) {
1298 g_print("exit recorder_cancel failed 0x%x\n", err);
1303 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1304 if (state == RECORDER_STATE_READY) {
1305 g_print("recorder_unprepare\n");
1306 recorder_unprepare(hcamcorder->recorder);
1309 err = recorder_get_state(hcamcorder->recorder, (recorder_state_e*)&state);
1310 if (state == RECORDER_STATE_CREATED) {
1311 g_print("recorder_destroy\n");
1312 err = recorder_destroy(hcamcorder->recorder);
1313 if (err == RECORDER_ERROR_NONE) {
1314 g_print("recorder_destroy done\n");
1315 hcamcorder->recorder = NULL;
1325 hcamcorder->mode = MODE_VIDEO_CAPTURE;
1327 g_print("camera_create\n");
1329 err = camera_create(CAMERA_DEVICE_CAMERA0, &hcamcorder->camera);
1330 if (err != CAMERA_ERROR_NONE) {
1331 g_print("camera create failed 0x%d\n", err);
1335 err = camera_set_display(hcamcorder->camera, CAMERA_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(ad.win));
1336 if (err != CAMERA_ERROR_NONE) {
1337 g_print("set display failed 0x%d\n", err);
1338 camera_destroy(hcamcorder->camera);
1339 hcamcorder->camera = NULL;
1343 err = recorder_create_videorecorder(hcamcorder->camera, &hcamcorder->recorder);
1344 if (err != RECORDER_ERROR_NONE) {
1345 g_print("video recorder create failed 0x%d\n", err);
1346 camera_stop_preview(hcamcorder->camera);
1347 camera_destroy(hcamcorder->camera);
1348 hcamcorder->camera = NULL;
1355 hcamcorder->mode = MODE_AUDIO;
1356 err = recorder_create_audiorecorder(&hcamcorder->recorder);
1357 if (err != RECORDER_ERROR_NONE) {
1358 g_print("audio recorder create failed 0x%x\n", err);
1365 hcamcorder->mode = MODE_AUDIO;
1366 err = recorder_create_audiorecorder(&hcamcorder->recorder);
1367 if (err != RECORDER_ERROR_NONE) {
1368 g_print("audio recorder create failed 0x%d\n", err);
1372 sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _sound_stream_focus_state_changed_cb, hcamcorder, &stream_info);
1374 recorder_set_sound_stream_info(hcamcorder->recorder, stream_info);
1375 sound_manager_destroy_stream_information(stream_info);
1381 err = recorder_add_device_state_changed_cb(_recorder_device_state_changed_cb,
1382 NULL, &g_recorder_device_changed_cb_id);
1383 g_print("add result 0x%x - cb id %d\n", err, g_recorder_device_changed_cb_id);
1386 if (g_recorder_device_changed_cb_id > 0) {
1387 err = recorder_remove_device_state_changed_cb(g_recorder_device_changed_cb_id);
1388 g_recorder_device_changed_cb_id = 0;
1389 g_print("remove result 0x%x\n", err);
1391 g_print("invalid callback id %d\n", g_recorder_device_changed_cb_id);
1395 err = recorder_get_device_state(RECORDER_TYPE_AUDIO, &device_state);
1396 g_print("get result 0x%x - audio state %d\n", err, device_state);
1397 err = recorder_get_device_state(RECORDER_TYPE_VIDEO, &device_state);
1398 g_print("get result 0x%x - video state %d\n", err, device_state);
1401 g_print("\t Quit Camcorder Testsuite!!\n");
1402 hcamcorder->mode = -1;
1406 g_print("\t Invalid media type(%c)\n", media_type);
1410 if (!init(hcamcorder->mode)) {
1411 g_print("testsuite init() failed.\n");
1415 err = recorder_prepare(hcamcorder->recorder);
1417 g_print("recorder_prepare() : %12.6lfs\n", g_timer_elapsed(timer, NULL));
1419 if (err != RECORDER_ERROR_NONE) {
1420 g_print("recorder_prepare = %x\n", err);
1424 gettimeofday(¤t, NULL);
1425 timersub(¤t, &previous, &res);
1427 g_print("Recorder Preparing Time : %ld.%lds\n", res.tv_sec, res.tv_usec);
1429 hcamcorder->menu_state = MENU_STATE_MAIN;
1435 static int app_create(void *data)
1437 appdata *app_data = data;
1440 Evas_Object *win = NULL;
1441 Evas_Object *eo = NULL;
1442 Evas_Object *bg = NULL;
1443 Evas_Object *rect = NULL;
1445 if (app_data == NULL) {
1446 g_print("\t\nappdata is NULL\n");
1450 /* use gl backend */
1451 elm_config_accel_preference_set("opengl");
1453 win = elm_win_add(NULL, "camera_test", ELM_WIN_BASIC);
1455 elm_win_title_set(win, "camera_test");
1456 elm_win_borderless_set(win, EINA_TRUE);
1457 elm_win_screen_size_get(win, NULL, NULL, &w, &h);
1458 g_print("\n\tscreen size %dx%d\n\n", w, h);
1459 evas_object_resize(win, w, h);
1460 elm_win_autodel_set(win, EINA_TRUE);
1461 elm_win_alpha_set(win, EINA_TRUE);
1463 g_print("\n\tfailed to get window\n\n");
1467 bg = elm_bg_add(win);
1469 elm_win_resize_object_add(win, bg);
1470 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1471 evas_object_show(bg);
1473 g_print("\n\tfailed to get elm bg\n\n");
1477 rect = evas_object_rectangle_add(evas_object_evas_get(win));
1479 evas_object_color_set(rect, 0, 0, 0, 0);
1480 evas_object_render_op_set(rect, EVAS_RENDER_COPY);
1482 g_print("\n\tfailed to get rectangle\n\n");
1486 elm_win_resize_object_add(win, rect);
1487 evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1488 evas_object_show(rect);
1490 /* Create evas image object for EVAS surface */
1491 eo = evas_object_image_add(evas_object_evas_get(win));
1492 evas_object_image_size_set(eo, w, h);
1493 evas_object_image_fill_set(eo, 0, 0, w, h);
1494 evas_object_resize(eo, w, h);
1495 evas_object_show(eo);
1497 elm_win_activate(win);
1498 evas_object_show(win);
1500 app_data->win = win;
1503 timer = g_timer_new();
1504 g_timer_reset(timer);
1513 static int app_terminate(void *data)
1515 appdata *app_data = data;
1517 if (app_data == NULL) {
1518 g_print("\n\tappdata is NULL\n");
1523 g_timer_stop(timer);
1524 g_timer_destroy(timer);
1533 * This function is the example main function for mmcamcorder API.
1537 * @return This function returns 0.
1539 * @see other functions
1541 int main(int argc, char **argv)
1545 hcamcorder = (cam_handle_t *)g_malloc0(sizeof(cam_handle_t));
1546 recorder_state = RECORDER_STATE_NONE;
1548 stdin_channel = g_io_channel_unix_new(fileno(stdin));/* read from stdin */
1549 g_io_add_watch(stdin_channel, G_IO_IN, (GIOFunc)cmd_input, NULL);
1551 memset(&ad, 0x0, sizeof(appdata));
1554 bret = appcore_efl_main("recorder_test", &argc, &argv, &ops);
1556 g_print("\n\treturn appcore_efl : %d\n\n", bret);
1559 g_io_channel_unref(stdin_channel);