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 =======================================================================================*/
25 #include "recorder_test.h"
27 /*-----------------------------------------------------------------------
29 -----------------------------------------------------------------------*/
30 static int g_recorder_state;
31 static int g_recorder_device_changed_cb_id;
32 static int g_recorder_ve_frame_count = 0;
33 static cam_handle_t *g_cam_handle;
36 /*-----------------------------------------------------------------------
38 -----------------------------------------------------------------------*/
39 #define SRC_VIDEO_FRAME_RATE_15 15 /* video input frame rate */
40 #define SRC_VIDEO_FRAME_RATE_30 30 /* video input frame rate */
41 #define TARGET_FILENAME_PATH "/opt/usr/home/owner/media/"
42 #define TARGET_FILENAME_VIDEO TARGET_FILENAME_PATH"test_rec_video.mp4"
43 #define TARGET_FILENAME_AUDIO TARGET_FILENAME_PATH"test_rec_audio.m4a"
44 #define TARGET_FILENAME_MUXED_CB TARGET_FILENAME_PATH"muxed_stream_cb.mp4"
45 #define TARGET_FILENAME_VE_DECISION_CB TARGET_FILENAME_PATH"ve_decision_cb.data"
46 #define AUDIO_SOURCE_SAMPLERATE_AAC 44100
47 #define AUDIO_SOURCE_SAMPLERATE_AMR 8000
48 #define AUDIO_SOURCE_CHANNEL_AAC 2
49 #define AUDIO_SOURCE_CHANNEL_AMR 1
50 #define VIDEO_ENCODE_BITRATE 40000000 /* bps */
51 #define CHECK_MM_ERROR(expr) \
56 g_print("[%s:%d] error code : %x \n", __func__, __LINE__, ret); \
61 #define SAFE_FREE(x) if (x) { g_free(x); x = NULL; }
65 /*-----------------------------------------------------------------------
67 -----------------------------------------------------------------------*/
69 MODE_VIDEO_CAPTURE, /* recording and image capture mode */
70 MODE_AUDIO, /* audio recording*/
81 /*-----------------------------------------------------------------------
83 -----------------------------------------------------------------------*/
91 /*---------------------------------------------------------------------------
92 | CONSTANT VARIABLES: |
93 ---------------------------------------------------------------------------*/
94 static const char *video_codec[] = {
101 static const char *audio_codec[] = {
109 static const char *file_format[] = {
119 static const char *display_mode[] = {
121 "Original Size mode",
123 "Cropped Full Screen mode",
124 "Original size or Letter Box mode",
128 static const char* strobe_mode[] = {
139 static const char *vs_mode[] = {
145 /*---------------------------------------------------------------------------
146 | FUNCTION PROTOTYPES: |
147 ---------------------------------------------------------------------------*/
148 static gboolean init(int type);
149 static gboolean mode_change(gchar buf);
152 static bool resolution_cb(int width, int height, void *user_data)
154 resolution_stack_t *data = (resolution_stack_t*)user_data;
157 g_print("NULL data\n");
161 data->width[data->count] = width;
162 data->height[data->count] = height;
164 g_print("%d. %dx%d\n", data->count, width, height);
171 static bool video_codec_cb(recorder_video_codec_e codec, void *user_data)
173 g_print("%d. %s\n", codec, video_codec[codec]);
177 static bool audio_codec_cb(recorder_audio_codec_e codec, void *user_data)
179 g_print("%d. %s\n", codec, audio_codec[codec]);
183 static bool file_format_cb(recorder_file_format_e format, void *user_data)
185 g_print("%d. %s\n", format, file_format[format]);
189 static bool strobe_mode_cb(camera_attr_flash_mode_e mode , void *user_data)
191 g_print("%d.%s\n", mode, strobe_mode[mode]);
195 static void _state_changed_cb(recorder_state_e previous_state, recorder_state_e current_state, bool by_policy, void *user_data)
197 g_print("\tstate changed[by_policy:%d] : %d -> %d\n\n", by_policy, previous_state, current_state);
201 static void _interrupted_cb(recorder_policy_e policy, recorder_state_e previous_state, recorder_state_e current_state, void *user_data)
203 g_print("\nrecorder interrupted callback called [state %d -> %d, policy %d]\n",
204 previous_state, current_state, policy);
208 static void _recorder_device_state_changed_cb(recorder_type_e type, recorder_device_state_e state, void *user_data)
210 g_print("\nrecorder device[%d] state changed to %d\n", type, state);
214 static void _recording_status_cb(unsigned long long elapsed_time, unsigned long long file_size, void *user_data)
216 static unsigned long long elapsed = -1;
218 if (elapsed != elapsed_time / 1000) {
219 unsigned long temp_time;
220 unsigned long long hour, minute, second;
221 elapsed = elapsed_time / 1000;
223 hour = temp_time / 3600;
224 temp_time = elapsed % 3600;
225 minute = temp_time / 60;
226 second = temp_time % 60;
227 g_print("\tCurrent Time - %lld:%lld:%lld, filesize %lld KB\n",
228 hour, minute, second, file_size);
234 static void _recording_limit_reached_cb(recorder_recording_limit_type_e type, void *user_data)
236 g_print("\tRECORDING LIMIT REACHED [type: %d]\n\n", type);
240 static void _recording_muxed_stream_cb(void *stream, int size, unsigned long long offset, void *user_data)
242 static unsigned long long current_offset = 0;
246 g_print("\tRECORDING MUXED STREAM CB - %p, size %d, offset %llu\n", stream, size, offset);
248 if (stream && size > 0) {
250 fp = fopen(TARGET_FILENAME_MUXED_CB, "w");
252 fp = fopen(TARGET_FILENAME_MUXED_CB, "rb+");
255 if (current_offset > offset) {
256 g_print("\tback to %llu\n", offset);
259 if (fseeko(fp, (off_t)offset, SEEK_SET) == 0)
260 fwrite(stream, 1, size, fp);
262 g_print("\nSeek Error : offset %llu\n", offset);
267 g_print("\tFile open failed [%s], errno %d", TARGET_FILENAME_MUXED_CB, errno);
270 current_offset = offset;
277 static void _dump_video_frame(recorder_video_data_s *frame)
282 g_print("\n==== NULL video frame ====\n");
286 fp = fopen(TARGET_FILENAME_VE_DECISION_CB, "a");
288 g_print("\n==== file[%s] open failed ====\n", TARGET_FILENAME_VE_DECISION_CB);
292 if (frame->format == CAMERA_PIXEL_FORMAT_RGBA ||
293 frame->format == CAMERA_PIXEL_FORMAT_ARGB) {
294 fwrite(frame->data.rgb_plane.data, 1, frame->data.rgb_plane.size, fp);
295 } else if (frame->format == CAMERA_PIXEL_FORMAT_INVZ) {
296 fwrite(frame->data.depth_plane.data, 1, frame->data.depth_plane.size, fp);
297 } else if (frame->format == CAMERA_PIXEL_FORMAT_MJPEG) {
298 fwrite(frame->data.encoded_plane.data, 1, frame->data.encoded_plane.size, fp);
300 switch (frame->num_of_planes) {
302 fwrite(frame->data.single_plane.yuv, 1, frame->data.single_plane.size, fp);
305 fwrite(frame->data.double_plane.y, 1, frame->data.double_plane.y_size, fp);
306 fwrite(frame->data.double_plane.uv, 1, frame->data.double_plane.uv_size, fp);
309 fwrite(frame->data.triple_plane.y, 1, frame->data.triple_plane.y_size, fp);
310 fwrite(frame->data.triple_plane.u, 1, frame->data.triple_plane.u_size, fp);
311 fwrite(frame->data.triple_plane.v, 1, frame->data.triple_plane.v_size, fp);
323 static bool _recording_video_encode_decision_cb(recorder_video_data_s *frame, void *user_data)
325 if (g_recorder_ve_frame_count == 0) {
326 g_print("==== VE decision cb : file[%s][fmt %d, %dx%d, plane %d] ====\n",
327 TARGET_FILENAME_VE_DECISION_CB,
328 frame->format, frame->width, frame->height, frame->num_of_planes);
330 _dump_video_frame(frame);
333 if ((g_recorder_ve_frame_count++ % 10) >= 5) {
334 g_print("-------- VE decision cb : [ret:false]\n");
337 g_print("-------- VE decision cb : [ret:true ]\n");
346 while ((ch = getchar()) != EOF && ch != '\n');
350 static gboolean _release_idle_event_callback(void *data)
352 g_print("destroy recorder handle\n\n");
354 recorder_destroy(g_cam_handle->recorder);
355 g_cam_handle->recorder = NULL;
356 g_cam_handle->menu_state = MENU_STATE_INIT;
362 static void _recorder_error_cb(int error, recorder_state_e current_state, void *user_data)
364 g_print("\tERROR [0x%x], current state %d\n", error, current_state);
367 case RECORDER_ERROR_RESOURCE_CONFLICT:
368 g_print("\t\t[RECORDER_ERROR_RESOURCE_CONFLICT]\n\n");
370 case RECORDER_ERROR_SECURITY_RESTRICTED:
371 g_print("\t\t[RECORDER_ERROR_SECURITY_RESTRICTED]\n\n");
373 case RECORDER_ERROR_SERVICE_DISCONNECTED:
374 g_print("\t\t[RECORDER_ERROR_SERVICE_DISCONNECTED]\n\n");
375 g_idle_add_full(G_PRIORITY_DEFAULT,
376 (GSourceFunc)_release_idle_event_callback,
387 static int _recorder_set_muxed_stream_cb(void)
392 g_print("* Muxed stream callback\n");
396 g_print("[set(1)/unset(2)] : ");
398 err = scanf("%d", &idx);
402 return recorder_set_muxed_stream_cb(g_cam_handle->recorder, _recording_muxed_stream_cb, NULL);
404 return recorder_unset_muxed_stream_cb(g_cam_handle->recorder);
406 return RECORDER_ERROR_INVALID_PARAMETER;
411 static int _recorder_set_audio_encoder(void)
416 g_print("* Audio codec\n");
420 g_print("-1. DISABLE\n");
421 recorder_foreach_supported_audio_encoder(g_cam_handle->recorder, audio_codec_cb, (void *)g_cam_handle);
423 err = scanf("%d", &encoder);
425 return recorder_set_audio_encoder(g_cam_handle->recorder, encoder);
429 static int _recorder_set_file_format(void)
434 g_print("* File format\n");
438 recorder_foreach_supported_file_format(g_cam_handle->recorder, file_format_cb, (void *)g_cam_handle);
440 err = scanf("%d", &format);
442 return recorder_set_file_format(g_cam_handle->recorder, format);
446 static int _recorder_set_size_limit(void)
451 g_print("* Size limit\n");
455 g_print("[KByte] : ");
457 err = scanf("%d", &limit);
459 return recorder_attr_set_size_limit(g_cam_handle->recorder, limit);
463 static int _recorder_set_time_limit(void)
468 g_print("* Time limit\n");
472 g_print("[Second] : ");
474 err = scanf("%d", &limit);
476 return recorder_attr_set_time_limit(g_cam_handle->recorder, limit);
480 static int _recorder_set_audio_samplerate(void)
485 g_print("* Samplerate\n");
491 err = scanf("%d", &samplerate);
493 return recorder_attr_set_audio_samplerate(g_cam_handle->recorder, samplerate);
497 static int _recorder_set_audio_channel(void)
502 g_print("* Channel\n");
506 g_print("[1 or 2] : ");
508 err = scanf("%d", &channel);
510 return recorder_attr_set_audio_channel(g_cam_handle->recorder, channel);
514 static int _recorder_set_encoder_bitrate(void)
520 g_print("* Bitrate\n");
524 g_print("[type(1:Audio,2:Video) bps] : ");
526 err = scanf("%d %d", &type, &bitrate);
530 return recorder_attr_set_audio_encoder_bitrate(g_cam_handle->recorder, bitrate);
532 return recorder_attr_set_video_encoder_bitrate(g_cam_handle->recorder, bitrate);
534 g_print("invalid type [%d]", type);
542 switch (g_cam_handle->menu_state) {
543 case MENU_STATE_INIT:
544 g_print("\n\t=======================================\n");
545 g_print("\t RECORDER_TESTSUIT\n");
546 g_print("\t=======================================\n");
547 g_print("\t '1' Video Recording - Rear Camera\n");
548 g_print("\t '2' Audio Recording\n");
549 g_print("\t '3' Audio Recording with stream info\n");
550 g_print("\t '4' Add recorder device changed callback\n");
551 g_print("\t '5' Remove recorder device changed callback\n");
552 g_print("\t '6' Get recorder device state\n");
553 g_print("\t 'q' Exit\n");
554 g_print("\t=======================================\n");
555 g_print("\t Choose the menu : ");
557 case MENU_STATE_MAIN:
558 g_print("\n\t=======================================\n");
559 if (g_cam_handle->mode == MODE_VIDEO_CAPTURE)
560 g_print("\t Video + Audio Recording\n");
562 g_print("\t Audio Recording\n");
563 g_print("\t=======================================\n");
564 if (g_recorder_state <= RECORDER_STATE_NONE) {
565 g_print("\t '1' Start Recording\n");
566 g_print("\t '2' Setting\n");
567 g_print("\t 'b' back\n");
568 } else if (g_recorder_state == RECORDER_STATE_RECORDING) {
569 g_print("\t 'p' Pause Recording\n");
570 g_print("\t 'c' Cancel\n");
571 g_print("\t 's' Save\n");
572 } else if (g_recorder_state == RECORDER_STATE_PAUSED) {
573 g_print("\t 'r' Resume Recording\n");
574 g_print("\t 'c' Cancel\n");
575 g_print("\t 's' Save\n");
577 g_print("\t=======================================\n");
580 case MENU_STATE_SETTING:
581 if (g_cam_handle->mode == MODE_VIDEO_CAPTURE) {
582 g_print("\n\t=======================================\n");
583 g_print("\t Video + Audio recording > Setting\n");
584 g_print("\t=======================================\n");
585 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera/Recorder] \n");
586 g_print("\t '0' Preview resolution \n");
587 g_print("\t '1' Video resolution \n");
588 g_print("\t '2' Video codec \n");
589 g_print("\t '3' Audio codec \n");
590 g_print("\t '4' File format \n");
591 g_print("\t '5' Size limit \n");
592 g_print("\t '6' Time limit \n");
593 g_print("\t '7' Samplerate \n");
594 g_print("\t '8' Channel \n");
595 g_print("\t '9' Encoder bitrate \n");
596 g_print("\t >>>>>>>>>>>>>>>>>>>> [Display]\n");
597 g_print("\t 'v' Display visible \n");
598 g_print("\t 'd' Display mode \n");
599 g_print("\t 'r' Display rotation \n");
600 g_print("\t 'f' Display flip\n");
601 g_print("\t >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc]\n");
602 g_print("\t 's' Strobe (Flash) \n");
603 g_print("\t 'z' Video-stabilization \n");
604 g_print("\t 'm' Recording Motion Rate setting \n");
605 g_print("\t 'M' Set/Unset muxed stream callback \n");
606 g_print("\t 'E' Set/Unset video encode decision callback \n");
607 g_print("\t 'F' Set file name - %s\n", TARGET_FILENAME_VIDEO);
608 g_print("\t 'b' back\n");
609 g_print("\t=======================================\n");
611 g_print("\n\t=======================================\n");
612 g_print("\t Audio recording > Setting\n");
613 g_print("\t=======================================\n");
614 g_print("\t '1' Audio codec \n");
615 g_print("\t '2' File format \n");
616 g_print("\t '3' Size limit \n");
617 g_print("\t '4' Time limit \n");
618 g_print("\t '5' Samplerate \n");
619 g_print("\t '6' Channel \n");
620 g_print("\t '7' Encoder bitrate \n");
621 g_print("\t 'M' Set/Unset muxed stream callback \n");
622 g_print("\t 'F' Set file name - %s\n", TARGET_FILENAME_AUDIO);
623 g_print("\t 'b' back\n");
624 g_print("\t=======================================\n");
629 g_print("unknow menu state !!\n");
636 static void main_menu(gchar buf)
640 if (g_cam_handle->mode != MODE_VIDEO_CAPTURE && g_cam_handle->mode != MODE_AUDIO) {
641 g_print("\t Invalid mode, back to upper menu \n");
642 g_cam_handle->menu_state = MENU_STATE_INIT;
646 if (g_recorder_state == RECORDER_STATE_NONE) {
648 case '1': /* Start Recording */
649 g_print("*Recording start!\n");
651 g_cam_handle->elapsed_time = 0;
652 g_recorder_ve_frame_count = 0;
654 err = recorder_start(g_cam_handle->recorder);
657 g_print("Rec start camcorder_record 0x%x\n", err);
659 g_recorder_state = RECORDER_STATE_RECORDING;
662 case '2': /* Setting */
663 g_cam_handle->menu_state = MENU_STATE_SETTING;
667 recorder_unprepare(g_cam_handle->recorder);
668 recorder_destroy(g_cam_handle->recorder);
669 g_cam_handle->recorder = NULL;
671 if (g_cam_handle->camera) {
672 camera_destroy(g_cam_handle->camera);
673 g_cam_handle->camera = NULL;
676 g_cam_handle->menu_state = MENU_STATE_INIT;
680 g_print("\t Invalid input \n");
683 } else if (g_recorder_state == RECORDER_STATE_RECORDING || g_recorder_state == RECORDER_STATE_PAUSED) {
685 case 'p': /* Pause Recording */
686 g_print("*Pause!\n");
687 err = recorder_pause(g_cam_handle->recorder);
690 g_print("Rec pause camcorder_pause = %x\n", err);
692 g_recorder_state = RECORDER_STATE_PAUSED;
695 case 'r': /* Resume Recording */
696 g_print("*Resume!\n");
697 err = recorder_start(g_cam_handle->recorder);
699 g_print("Rec start camcorder_record = %x\n", err);
701 g_recorder_state = RECORDER_STATE_RECORDING;
704 case 'c': /* Cancel */
705 g_print("*Cancel Recording !\n");
707 err = recorder_cancel(g_cam_handle->recorder);
710 g_print("Cancel recording camcorder_cancel = %x\n", err);
712 g_recorder_state = RECORDER_STATE_NONE;
716 g_print("*Save Recording!\n");
718 err = recorder_commit(g_cam_handle->recorder);
721 g_print("Save recording recorder_commit = %x\n", err);
723 g_recorder_state = RECORDER_STATE_NONE;
727 g_print("\t Invalid input \n");
731 g_print("Wrong camcorder state, check status!!\n");
738 static void setting_menu(gchar buf)
745 if (g_cam_handle->mode == MODE_VIDEO_CAPTURE) {
750 float motion_rate = 0.0;
751 resolution_stack_t resolution_list;
754 /* Camera/Recorder setting */
755 case '0': /* Setting > Preview Resolution setting */
756 g_print("* Preview resolution\n");
757 resolution_list.count = 0;
761 camera_foreach_supported_preview_resolution(g_cam_handle->camera,
762 resolution_cb, &resolution_list);
764 err = scanf("%d", &idx);
765 if (resolution_list.count > idx && idx >= 0) {
766 g_print("----------------- SET %dx%d ---------------------\n",
767 resolution_list.width[idx], resolution_list.height[idx]);
769 result = camera_set_preview_resolution(g_cam_handle->camera,
770 resolution_list.width[idx], resolution_list.height[idx]);
772 g_print("invalid input %d\n", idx);
776 resolution_list.count = 0;
779 case '1': /* Setting > Video Resolution setting */
780 g_print("* Video resolution\n");
781 resolution_list.count = 0;
785 recorder_foreach_supported_video_resolution(g_cam_handle->recorder,
786 resolution_cb, &resolution_list);
788 err = scanf("%d", &idx);
789 if (resolution_list.count > idx && idx >= 0) {
790 g_print("----------------- SET %dx%d ---------------------\n",
791 resolution_list.width[idx], resolution_list.height[idx]);
793 result = recorder_set_video_resolution(g_cam_handle->recorder,
794 resolution_list.width[idx], resolution_list.height[idx]);
796 g_print("invalid input %d\n", idx);
800 resolution_list.count = 0;
803 case '2': /* Setting > Video codec */
804 g_print("* Video codec\n");
808 recorder_foreach_supported_video_encoder(g_cam_handle->recorder, video_codec_cb, (void *)g_cam_handle);
810 err = scanf("%d", &idx);
812 result = recorder_set_video_encoder(g_cam_handle->recorder, idx);
815 case '3': /* Setting > Audio codec */
816 result = _recorder_set_audio_encoder();
819 case '4': /* Setting > File format */
820 result = _recorder_set_file_format();
823 case '5': /* Setting > Size limit */
824 result = _recorder_set_size_limit();
827 case '6': /* Setting > Time limit */
828 result = _recorder_set_time_limit();
831 case '7': /* Setting > Samplerate */
832 result = _recorder_set_audio_samplerate();
835 case '8': /* Setting > Channel */
836 result = _recorder_set_audio_channel();
839 case '9': /* Setting > Bitrate */
840 result = _recorder_set_encoder_bitrate();
843 /* Display setting */
844 case 'v': /* Display visible */
845 g_print("* Display visible\n");
849 g_print("\t 0. OFF\n");
850 g_print("\t 1. ON\n");
852 err = scanf("%d", &idx);
854 result = camera_set_display_visible(g_cam_handle->camera, idx);
857 case 'd': /* Setting > Display mode */
858 g_print("* Display mode\n");
861 for (idx = 0 ; idx < 6 ; idx++)
862 g_print("%d. %s\n", idx, display_mode[idx]);
864 err = scanf("%d", &idx);
866 if (idx == CAMERA_DISPLAY_MODE_CUSTOM_ROI) {
867 g_print("ROI area [x y width height] : ");
868 err = scanf("%d %d %d %d", &x, &y, &width, &height);
871 result = camera_set_display_mode(g_cam_handle->camera, idx - 1);
873 if (idx == CAMERA_DISPLAY_MODE_CUSTOM_ROI)
874 result |= camera_attr_set_display_roi_area(g_cam_handle->camera, x, y, width, height);
877 case 'r': /* Setting > Display Rotate */
878 g_print("* Display rotation\n");
882 g_print("\t0. 0\n\t1. 90\n\t2. 180\n\t3. 270\n\n");
884 err = scanf("%d", &idx);
886 result = camera_set_display_rotation(g_cam_handle->camera, idx);
889 case 'f': /* Setting > Display Flip */
890 g_print("* Display flip\n");
894 g_print("\t0. NONE\n\t1. HORIZONTAL\n\t2. VERTICAL\n\t3. BOTH\n\n");
896 err = scanf("%d", &idx);
898 result = camera_set_display_flip(g_cam_handle->camera, idx);
902 case 's': /* Setting > Strobe setting */
903 g_print("* Strobe Mode\n");
907 camera_attr_foreach_supported_flash_mode(g_cam_handle->camera, strobe_mode_cb, NULL);
909 err = scanf("%d", &idx);
911 result = camera_attr_set_flash_mode(g_cam_handle->camera, idx);
914 case 'z': /* Setting > Video-stabilization */
915 g_print("* Video stabilization\n");
919 for (idx = 0 ; idx < 2 ; idx++)
920 g_print("\t %d. %s\n", idx + 1, vs_mode[idx]);
922 err = scanf("%d", &idx);
925 g_print("\n Restart preview with NV12 and 720p resolution\n");
927 result = camera_stop_preview(g_cam_handle->camera);
928 result |= camera_set_preview_resolution(g_cam_handle->camera, 1280, 720);
929 result |= camera_set_preview_format(g_cam_handle->camera, CAMERA_PIXEL_FORMAT_NV12);
931 result |= camera_attr_enable_video_stabilization(g_cam_handle->camera, idx-1);
934 result |= camera_start_preview(g_cam_handle->camera);
939 g_print("*Recording Motion Rate setting! (should be bigger than zero)\n");
943 err = scanf("%f", &motion_rate);
945 result = recorder_attr_set_recording_motion_rate(g_cam_handle->recorder, motion_rate);
948 case 'M': /* Setting > muxed stream callback */
949 result = _recorder_set_muxed_stream_cb();
952 case 'E': /* Setting > video encode decision callback */
953 g_print("* Video encode decision callback\n");
957 g_print("[set(1)/unset(2)] : ");
959 err = scanf("%d", &idx);
962 result = recorder_set_video_encode_decision_cb(g_cam_handle->recorder, _recording_video_encode_decision_cb, NULL);
964 result = recorder_unset_video_encode_decision_cb(g_cam_handle->recorder);
966 result = RECORDER_ERROR_INVALID_PARAMETER;
970 case 'F': /* Set file name */
971 result = recorder_set_filename(g_cam_handle->recorder, TARGET_FILENAME_VIDEO);
975 g_cam_handle->menu_state = MENU_STATE_MAIN;
979 g_print("\t Invalid input \n");
984 case '1': /* Setting > Audio codec */
985 result = _recorder_set_audio_encoder();
988 case '2': /* Setting > File format */
989 result = _recorder_set_file_format();
992 case '3': /* Setting > Size limit */
993 result = _recorder_set_size_limit();
996 case '4': /* Setting > Time limit */
997 result = _recorder_set_time_limit();
1000 case '5': /* Setting > Samplerate */
1001 result = _recorder_set_audio_samplerate();
1004 case '6': /* Setting > Channel */
1005 result = _recorder_set_audio_channel();
1008 case '7': /* Setting > Bitrate */
1009 g_print("* Bitrate\n");
1013 g_print("[bps] : ");
1015 err = scanf("%d", &bitrate);
1017 result = recorder_attr_set_audio_encoder_bitrate(g_cam_handle->recorder, bitrate);
1020 case 'M': /* Setting > muxed stream callback */
1021 result = _recorder_set_muxed_stream_cb();
1024 case 'F': /* Set file name */
1025 result = recorder_set_filename(g_cam_handle->recorder, TARGET_FILENAME_AUDIO);
1028 case 'b': /* back */
1029 g_cam_handle->menu_state = MENU_STATE_MAIN;
1033 g_print("\t Invalid input \n");
1039 if (result == 0) /* CAMERA_ERROR_NONE or RECORDER_ERROR_NONE */
1040 g_print("\n===== SET OK =====\n");
1042 g_print("\n===== SET FAIL 0x%x =====\n", result);
1049 gboolean cmd_input(GIOChannel *channel, GIOCondition condition, gpointer data)
1053 GError *g_error = NULL;
1055 g_io_channel_read_line(channel, &buf, &read_size, NULL, &g_error);
1057 g_print("\tg_io_channel_read_chars error\n");
1058 g_error_free(g_error);
1065 g_print("\tMenu Status : %d\n", g_cam_handle->menu_state);
1066 switch (g_cam_handle->menu_state) {
1067 case MENU_STATE_INIT:
1068 mode_change(buf[0]);
1070 case MENU_STATE_MAIN:
1073 case MENU_STATE_SETTING:
1074 setting_menu(buf[0]);
1085 g_print("\tNo read input\n");
1091 static gboolean init(int type)
1095 if (!g_cam_handle || !g_cam_handle->recorder) {
1096 g_print("NULL handle[%p]\n", g_cam_handle);
1100 ret = recorder_set_file_format(g_cam_handle->recorder, RECORDER_FILE_FORMAT_MP4);
1101 if (ret != RECORDER_ERROR_NONE) {
1102 g_print("recorder_set_file_format failed[0x%x]\n", ret);
1106 ret = recorder_attr_set_audio_device(g_cam_handle->recorder, RECORDER_AUDIO_DEVICE_MIC);
1107 if (ret != RECORDER_ERROR_NONE) {
1108 g_print("recorder_attr_set_audio_device failed[0x%x]\n", ret);
1112 ret = recorder_set_audio_encoder(g_cam_handle->recorder, RECORDER_AUDIO_CODEC_AAC);
1113 if (ret != RECORDER_ERROR_NONE) {
1114 g_print("recorder_set_audio_encoder failed[0x%x]\n", ret);
1118 ret = recorder_attr_set_audio_samplerate(g_cam_handle->recorder, AUDIO_SOURCE_SAMPLERATE_AAC);
1119 if (ret != RECORDER_ERROR_NONE) {
1120 g_print("recorder_attr_set_audio_samplerate failed[0x%x]\n", ret);
1124 ret = recorder_attr_set_audio_channel(g_cam_handle->recorder, AUDIO_SOURCE_CHANNEL_AAC);
1125 if (ret != RECORDER_ERROR_NONE) {
1126 g_print("recorder_attr_set_audio_channel failed[0x%x]\n", ret);
1130 if (type == MODE_VIDEO_CAPTURE) {
1131 /*================================================================================
1133 *=================================================================================*/
1134 ret = recorder_set_video_encoder(g_cam_handle->recorder, RECORDER_VIDEO_CODEC_MPEG4);
1135 if (ret != RECORDER_ERROR_NONE) {
1136 g_print("recorder_set_video_encoder failed[0x%x]\n", ret);
1140 ret = recorder_attr_set_video_encoder_bitrate(g_cam_handle->recorder, VIDEO_ENCODE_BITRATE);
1141 if (ret != RECORDER_ERROR_NONE) {
1142 g_print("recorder_attr_set_video_encoder_bitrate failed[0x%x]\n", ret);
1145 } else if (type == MODE_AUDIO) {
1146 /*================================================================================
1148 *=================================================================================*/
1149 ret = recorder_attr_set_time_limit(g_cam_handle->recorder, 360000);
1150 if (ret != RECORDER_ERROR_NONE) {
1151 g_print("recorder_attr_set_time_limit failed[0x%x]\n", ret);
1155 ret = recorder_attr_set_audio_encoder_bitrate(g_cam_handle->recorder, 128000);
1156 if (ret != RECORDER_ERROR_NONE) {
1157 g_print("recorder_attr_set_audio_encoder_bitrate failed[0x%x]\n", ret);
1162 recorder_set_error_cb(g_cam_handle->recorder, _recorder_error_cb, NULL);
1163 recorder_set_state_changed_cb(g_cam_handle->recorder, _state_changed_cb, NULL);
1164 recorder_set_interrupted_cb(g_cam_handle->recorder, _interrupted_cb, NULL);
1165 recorder_set_recording_status_cb(g_cam_handle->recorder, _recording_status_cb, NULL);
1166 recorder_set_recording_limit_reached_cb(g_cam_handle->recorder, _recording_limit_reached_cb, NULL);
1168 g_print("Init DONE.\n");
1173 cam_handle_t *init_handle()
1175 g_cam_handle = g_new0(cam_handle_t, 1);
1177 g_cam_handle->mode = MODE_VIDEO_CAPTURE; /* image(capture)/video(recording) mode */
1178 g_cam_handle->menu_state = MENU_STATE_INIT;
1179 g_cam_handle->isMute = FALSE;
1180 g_cam_handle->elapsed_time = 0;
1181 g_cam_handle->fps = SRC_VIDEO_FRAME_RATE_15; /*SRC_VIDEO_FRAME_RATE_30;*/
1183 return g_cam_handle;
1186 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,
1187 sound_stream_focus_change_reason_e reason_for_change, int sound_behavior, const char *additional_info, void *user_data)
1189 g_print("focus changed : reason %d\n", reason_for_change);
1195 * This function is to change camcorder mode.
1197 * @param buf [in] user input
1199 * @return This function returns TRUE/FALSE
1201 * @see other functions
1203 static gboolean mode_change(gchar buf)
1205 int err = RECORDER_ERROR_NONE;
1206 int state = RECORDER_STATE_NONE;
1207 char media_type = '\0';
1209 struct timeval time_previous;
1210 struct timeval time_current;
1211 struct timeval time_result;
1212 recorder_device_state_e device_state = RECORDER_DEVICE_STATE_IDLE;
1213 sound_stream_info_h stream_info = NULL;
1215 gettimeofday(&time_previous, NULL);
1217 if (g_cam_handle->recorder) {
1218 err = recorder_get_state(g_cam_handle->recorder, (recorder_state_e*)&state);
1219 if (state != RECORDER_STATE_NONE) {
1220 if (state == RECORDER_STATE_RECORDING ||
1221 state == RECORDER_STATE_PAUSED) {
1222 g_print("recorder_cancel\n");
1223 err = recorder_cancel(g_cam_handle->recorder);
1224 if (err != RECORDER_ERROR_NONE) {
1225 g_print("exit recorder_cancel failed 0x%x\n", err);
1230 err = recorder_get_state(g_cam_handle->recorder, (recorder_state_e*)&state);
1231 if (state == RECORDER_STATE_READY) {
1232 g_print("recorder_unprepare\n");
1233 recorder_unprepare(g_cam_handle->recorder);
1236 err = recorder_get_state(g_cam_handle->recorder, (recorder_state_e*)&state);
1237 if (state == RECORDER_STATE_CREATED) {
1238 g_print("recorder_destroy\n");
1239 err = recorder_destroy(g_cam_handle->recorder);
1240 if (err == RECORDER_ERROR_NONE) {
1241 g_print("recorder_destroy done\n");
1242 g_cam_handle->recorder = NULL;
1250 g_cam_handle->mode = MODE_VIDEO_CAPTURE;
1252 err = camera_create(CAMERA_DEVICE_CAMERA0, &g_cam_handle->camera);
1253 if (err != CAMERA_ERROR_NONE) {
1254 g_print("camera create failed 0x%d\n", err);
1258 set_display(g_cam_handle);
1260 err = recorder_create_videorecorder(g_cam_handle->camera, &g_cam_handle->recorder);
1261 if (err != RECORDER_ERROR_NONE) {
1262 g_print("video recorder create failed 0x%d\n", err);
1263 camera_stop_preview(g_cam_handle->camera);
1264 camera_destroy(g_cam_handle->camera);
1265 g_cam_handle->camera = NULL;
1272 g_cam_handle->mode = MODE_AUDIO;
1273 err = recorder_create_audiorecorder(&g_cam_handle->recorder);
1274 if (err != RECORDER_ERROR_NONE) {
1275 g_print("audio recorder create failed 0x%x\n", err);
1282 g_cam_handle->mode = MODE_AUDIO;
1283 err = recorder_create_audiorecorder(&g_cam_handle->recorder);
1284 if (err != RECORDER_ERROR_NONE) {
1285 g_print("audio recorder create failed 0x%d\n", err);
1289 sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _sound_stream_focus_state_changed_cb, g_cam_handle, &stream_info);
1291 recorder_set_sound_stream_info(g_cam_handle->recorder, stream_info);
1292 sound_manager_destroy_stream_information(stream_info);
1298 err = recorder_add_device_state_changed_cb(_recorder_device_state_changed_cb,
1299 NULL, &g_recorder_device_changed_cb_id);
1300 g_print("add result 0x%x - cb id %d\n", err, g_recorder_device_changed_cb_id);
1303 if (g_recorder_device_changed_cb_id > 0) {
1304 err = recorder_remove_device_state_changed_cb(g_recorder_device_changed_cb_id);
1305 g_recorder_device_changed_cb_id = 0;
1306 g_print("remove result 0x%x\n", err);
1308 g_print("invalid callback id %d\n", g_recorder_device_changed_cb_id);
1312 err = recorder_get_device_state(RECORDER_TYPE_AUDIO, &device_state);
1313 g_print("get result 0x%x - audio state %d\n", err, device_state);
1314 err = recorder_get_device_state(RECORDER_TYPE_VIDEO, &device_state);
1315 g_print("get result 0x%x - video state %d\n", err, device_state);
1318 g_print("\t Quit Recorder Testsuite!!\n");
1319 g_cam_handle->mode = -1;
1323 g_print("\t Invalid media type(%c)\n", media_type);
1327 if (!init(g_cam_handle->mode)) {
1328 g_print("testsuite init() failed.\n");
1332 err = recorder_prepare(g_cam_handle->recorder);
1333 if (err != RECORDER_ERROR_NONE) {
1334 g_print("recorder_prepare = %x\n", err);
1338 gettimeofday(&time_current, NULL);
1339 timersub(&time_current, &time_previous, &time_result);
1341 g_print("Recorder Preparing Time : %ld.%lds\n", time_result.tv_sec, time_result.tv_usec);
1343 g_cam_handle->menu_state = MENU_STATE_MAIN;