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 /*===========================================================================================
26 ========================================================================================== */
27 #include "mm_camcorder_internal.h"
28 #include "mm_camcorder_platform.h"
29 #include "mm_camcorder_configure.h"
31 /*---------------------------------------------------------------------------
32 | GLOBAL VARIABLE DEFINITIONS for internal |
33 ---------------------------------------------------------------------------*/
35 /*---------------------------------------------------------------------------
36 | LOCAL VARIABLE DEFINITIONS for internal |
37 ---------------------------------------------------------------------------*/
40 // Rule 1. 1:1 match except NONE.
41 // Rule 2. MSL should be Superset.
42 // Rule 3. sensor value should not be same as _MMCAMCORDER_SENSOR_ENUM_NONE.
44 static int __enum_conv_whitebalance[MM_CAMCORDER_WHITE_BALANCE_NUM] ;
46 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_whitebalance =
48 MM_CAMCORDER_WHITE_BALANCE_NUM,
49 __enum_conv_whitebalance,
50 CONFIGURE_CATEGORY_CTRL_EFFECT,
55 static int __enum_conv_colortone[MM_CAMCORDER_COLOR_TONE_NUM];
57 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_colortone =
59 MM_CAMCORDER_COLOR_TONE_NUM,
60 __enum_conv_colortone,
61 CONFIGURE_CATEGORY_CTRL_EFFECT,
66 static int __enum_conv_iso[MM_CAMCORDER_ISO_NUM];
68 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_iso =
72 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
77 static int __enum_conv_prgrm[MM_CAMCORDER_SCENE_MODE_NUM];
79 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_prgrm =
81 MM_CAMCORDER_SCENE_MODE_NUM,
83 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
88 static int __enum_conv_focus_mode[MM_CAMCORDER_FOCUS_MODE_NUM];
90 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_focus_mode =
92 MM_CAMCORDER_FOCUS_MODE_NUM,
93 __enum_conv_focus_mode,
94 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
99 static int __enum_conv_focus_type[MM_CAMCORDER_AUTO_FOCUS_NUM];
101 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_focus_type =
103 MM_CAMCORDER_AUTO_FOCUS_NUM,
104 __enum_conv_focus_type,
105 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
110 static int __enum_conv_ae_type[MM_CAMCORDER_AUTO_EXPOSURE_NUM];
112 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_ae_type =
114 MM_CAMCORDER_AUTO_EXPOSURE_NUM,
116 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
121 static int __enum_conv_strobe_ctrl[MM_CAMCORDER_STROBE_CONTROL_NUM];
123 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_strobe_ctrl =
125 MM_CAMCORDER_STROBE_CONTROL_NUM,
126 __enum_conv_strobe_ctrl,
127 CONFIGURE_CATEGORY_CTRL_STROBE,
132 static int __enum_conv_strobe_mode[MM_CAMCORDER_STROBE_MODE_NUM];
134 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_strobe_mode =
136 MM_CAMCORDER_STROBE_MODE_NUM,
137 __enum_conv_strobe_mode,
138 CONFIGURE_CATEGORY_CTRL_STROBE,
143 static int __enum_conv_wdr_ctrl[MM_CAMCORDER_WDR_NUM];
145 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_wdr_ctrl =
147 MM_CAMCORDER_WDR_NUM,
148 __enum_conv_wdr_ctrl,
149 CONFIGURE_CATEGORY_CTRL_EFFECT,
153 static int __enum_conv_flip_ctrl[MM_CAMCORDER_FLIP_NUM];
155 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_flip_ctrl =
157 MM_CAMCORDER_FLIP_NUM,
158 __enum_conv_flip_ctrl,
159 CONFIGURE_CATEGORY_CTRL_EFFECT,
163 static int __enum_conv_rotation_ctrl[MM_CAMCORDER_ROTATION_NUM];
165 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_rotation_ctrl =
167 MM_CAMCORDER_ROTATION_NUM,
168 __enum_conv_rotation_ctrl,
169 CONFIGURE_CATEGORY_CTRL_EFFECT,
174 static int __enum_conv_ahs[MM_CAMCORDER_AHS_NUM];
176 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_ahs =
178 MM_CAMCORDER_AHS_NUM,
180 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
185 static int __enum_conv_video_stabilization[MM_CAMCORDER_VIDEO_STABILIZATION_NUM];
187 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_video_stabilization =
189 MM_CAMCORDER_VIDEO_STABILIZATION_NUM,
190 __enum_conv_video_stabilization,
191 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
196 static int __enum_conv_hdr_capture[MM_CAMCORDER_HDR_CAPTURE_NUM];
198 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_hdr_capture =
200 MM_CAMCORDER_HDR_CAPTURE_NUM,
201 __enum_conv_hdr_capture,
202 CONFIGURE_CATEGORY_CTRL_CAPTURE,
206 static int __enum_conv_detect_mode[MM_CAMCORDER_DETECT_MODE_NUM];
208 _MMCamcorderEnumConvert _mmcamcorder_enum_conv_detect_mode =
210 MM_CAMCORDER_DETECT_MODE_NUM,
211 __enum_conv_detect_mode,
212 CONFIGURE_CATEGORY_CTRL_DETECT,
218 * Matching table of caminfo index with category enum of attribute.
219 * If predefined item is changed, this static variables should be changed.
220 * For detail information, refer below documents.
223 static _MMCamcorderInfoConverting g_audio_info[] = {
226 CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT,
228 MM_CAMCORDER_ATTR_NONE,
230 MM_CAMCONVERT_TYPE_INT_ARRAY,
235 static _MMCamcorderInfoConverting g_display_info[] = {
238 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
239 MM_CAM_DISPLAY_DEVICE,
240 MM_CAMCORDER_ATTR_NONE,
242 MM_CAMCONVERT_TYPE_INT_ARRAY,
247 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
249 MM_CAMCORDER_ATTR_NONE,
251 MM_CAMCONVERT_TYPE_INT_ARRAY,
256 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
257 MM_CAM_DISPLAY_SURFACE,
258 MM_CAMCORDER_ATTR_NONE,
260 MM_CAMCONVERT_TYPE_INT_ARRAY,
265 static _MMCamcorderInfoConverting g_caminfo_convert[CAMINFO_CONVERT_NUM] = {
268 CONFIGURE_CATEGORY_CTRL_CAMERA,
269 MM_CAM_CAMERA_DEVICE_NAME,
270 MM_CAMCORDER_ATTR_NONE,
272 MM_CAMCONVERT_TYPE_STRING,
277 CONFIGURE_CATEGORY_CTRL_CAMERA,
279 MM_CAM_CAMERA_HEIGHT,
281 MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY,
286 CONFIGURE_CATEGORY_CTRL_CAMERA,
287 MM_CAM_CAPTURE_WIDTH,
288 MM_CAM_CAPTURE_HEIGHT,
290 MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY,
295 CONFIGURE_CATEGORY_CTRL_CAMERA,
296 MM_CAM_CAMERA_FORMAT,
297 MM_CAMCORDER_ATTR_NONE,
299 MM_CAMCONVERT_TYPE_INT_ARRAY,
304 CONFIGURE_CATEGORY_CTRL_CAMERA,
305 MM_CAM_CAMERA_PAN_MECHA,
306 MM_CAMCORDER_ATTR_NONE,
308 MM_CAMCONVERT_TYPE_INT_RANGE,
313 CONFIGURE_CATEGORY_CTRL_CAMERA,
314 MM_CAM_CAMERA_PAN_ELEC,
315 MM_CAMCORDER_ATTR_NONE,
317 MM_CAMCONVERT_TYPE_INT_RANGE,
322 CONFIGURE_CATEGORY_CTRL_CAMERA,
323 MM_CAM_CAMERA_TILT_MECHA,
324 MM_CAMCORDER_ATTR_NONE,
326 MM_CAMCONVERT_TYPE_INT_RANGE,
331 CONFIGURE_CATEGORY_CTRL_CAMERA,
332 MM_CAM_CAMERA_TILT_ELEC,
333 MM_CAMCORDER_ATTR_NONE,
335 MM_CAMCONVERT_TYPE_INT_RANGE,
340 CONFIGURE_CATEGORY_CTRL_CAMERA,
341 MM_CAM_CAMERA_PTZ_TYPE,
342 MM_CAMCORDER_ATTR_NONE,
344 MM_CAMCONVERT_TYPE_INT_ARRAY,
349 CONFIGURE_CATEGORY_CTRL_STROBE,
350 MM_CAM_STROBE_CONTROL,
351 MM_CAMCORDER_ATTR_NONE,
353 MM_CAMCONVERT_TYPE_INT_ARRAY,
354 &_mmcamcorder_enum_conv_strobe_ctrl,
358 CONFIGURE_CATEGORY_CTRL_STROBE,
359 MM_CAM_STROBE_CAPABILITIES,
360 MM_CAMCORDER_ATTR_NONE,
361 "StrobeCapabilities",
362 MM_CAMCONVERT_TYPE_INT_ARRAY,
367 CONFIGURE_CATEGORY_CTRL_STROBE,
369 MM_CAMCORDER_ATTR_NONE,
371 MM_CAMCONVERT_TYPE_INT_ARRAY,
372 &_mmcamcorder_enum_conv_strobe_mode,
376 CONFIGURE_CATEGORY_CTRL_EFFECT,
377 MM_CAM_FILTER_BRIGHTNESS,
378 MM_CAMCORDER_ATTR_NONE,
380 MM_CAMCONVERT_TYPE_INT_RANGE,
385 CONFIGURE_CATEGORY_CTRL_EFFECT,
386 MM_CAM_FILTER_CONTRAST,
387 MM_CAMCORDER_ATTR_NONE,
389 MM_CAMCONVERT_TYPE_INT_RANGE,
394 CONFIGURE_CATEGORY_CTRL_EFFECT,
395 MM_CAM_FILTER_SATURATION,
396 MM_CAMCORDER_ATTR_NONE,
398 MM_CAMCONVERT_TYPE_INT_RANGE,
403 CONFIGURE_CATEGORY_CTRL_EFFECT,
405 MM_CAMCORDER_ATTR_NONE,
407 MM_CAMCONVERT_TYPE_INT_RANGE,
412 CONFIGURE_CATEGORY_CTRL_EFFECT,
413 MM_CAM_FILTER_SHARPNESS,
414 MM_CAMCORDER_ATTR_NONE,
416 MM_CAMCONVERT_TYPE_INT_RANGE,
421 CONFIGURE_CATEGORY_CTRL_EFFECT,
423 MM_CAMCORDER_ATTR_NONE,
425 MM_CAMCONVERT_TYPE_INT_ARRAY,
426 &_mmcamcorder_enum_conv_whitebalance,
430 CONFIGURE_CATEGORY_CTRL_EFFECT,
431 MM_CAM_FILTER_COLOR_TONE,
432 MM_CAMCORDER_ATTR_NONE,
434 MM_CAMCONVERT_TYPE_INT_ARRAY,
435 &_mmcamcorder_enum_conv_colortone,
439 CONFIGURE_CATEGORY_CTRL_EFFECT,
441 MM_CAMCORDER_ATTR_NONE,
443 MM_CAMCONVERT_TYPE_INT_ARRAY,
444 &_mmcamcorder_enum_conv_wdr_ctrl,
448 CONFIGURE_CATEGORY_CTRL_EFFECT,
450 MM_CAMCORDER_ATTR_NONE,
452 MM_CAMCONVERT_TYPE_INT_ARRAY,
453 &_mmcamcorder_enum_conv_flip_ctrl,
457 CONFIGURE_CATEGORY_CTRL_EFFECT,
458 MM_CAM_CAMERA_ROTATION,
459 MM_CAMCORDER_ATTR_NONE,
461 MM_CAMCONVERT_TYPE_INT_ARRAY,
462 &_mmcamcorder_enum_conv_rotation_ctrl,
466 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
467 MM_CAM_CAMERA_DIGITAL_ZOOM,
468 MM_CAMCORDER_ATTR_NONE,
470 MM_CAMCONVERT_TYPE_INT_RANGE,
475 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
476 MM_CAM_CAMERA_OPTICAL_ZOOM,
477 MM_CAMCORDER_ATTR_NONE,
479 MM_CAMCONVERT_TYPE_INT_RANGE,
484 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
485 MM_CAM_CAMERA_FOCUS_MODE,
486 MM_CAMCORDER_ATTR_NONE,
488 MM_CAMCONVERT_TYPE_INT_ARRAY,
489 &_mmcamcorder_enum_conv_focus_mode,
493 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
494 MM_CAM_CAMERA_AF_SCAN_RANGE,
495 MM_CAMCORDER_ATTR_NONE,
497 MM_CAMCONVERT_TYPE_INT_ARRAY,
498 &_mmcamcorder_enum_conv_focus_type,
502 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
503 MM_CAM_CAMERA_EXPOSURE_MODE,
504 MM_CAMCORDER_ATTR_NONE,
506 MM_CAMCONVERT_TYPE_INT_ARRAY,
507 &_mmcamcorder_enum_conv_ae_type,
511 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
512 MM_CAM_CAMERA_EXPOSURE_VALUE,
513 MM_CAMCORDER_ATTR_NONE,
515 MM_CAMCONVERT_TYPE_INT_RANGE,
520 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
521 MM_CAM_CAMERA_F_NUMBER,
522 MM_CAMCORDER_ATTR_NONE,
524 MM_CAMCONVERT_TYPE_INT_ARRAY,
529 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
530 MM_CAM_CAMERA_SHUTTER_SPEED,
531 MM_CAMCORDER_ATTR_NONE,
533 MM_CAMCONVERT_TYPE_INT_ARRAY,
538 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
540 MM_CAMCORDER_ATTR_NONE,
542 MM_CAMCONVERT_TYPE_INT_ARRAY,
543 &_mmcamcorder_enum_conv_iso,
547 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
548 MM_CAM_FILTER_SCENE_MODE,
549 MM_CAMCORDER_ATTR_NONE,
551 MM_CAMCONVERT_TYPE_INT_ARRAY,
552 &_mmcamcorder_enum_conv_prgrm,
556 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
557 MM_CAM_CAMERA_ANTI_HANDSHAKE,
558 MM_CAMCORDER_ATTR_NONE,
560 MM_CAMCONVERT_TYPE_INT_ARRAY,
561 &_mmcamcorder_enum_conv_ahs,
565 CONFIGURE_CATEGORY_CTRL_CAPTURE,
566 MM_CAM_CAPTURE_FORMAT,
567 MM_CAMCORDER_ATTR_NONE,
569 MM_CAMCONVERT_TYPE_INT_ARRAY,
574 CONFIGURE_CATEGORY_CTRL_CAPTURE,
575 MM_CAM_IMAGE_ENCODER_QUALITY,
576 MM_CAMCORDER_ATTR_NONE,
578 MM_CAMCONVERT_TYPE_INT_RANGE,
583 CONFIGURE_CATEGORY_CTRL_CAPTURE,
584 MM_CAM_CAPTURE_COUNT,
585 MM_CAMCORDER_ATTR_NONE,
587 MM_CAMCONVERT_TYPE_INT_RANGE,
592 CONFIGURE_CATEGORY_CTRL_CAPTURE,
593 MM_CAM_CAMERA_HDR_CAPTURE,
594 MM_CAMCORDER_ATTR_NONE,
596 MM_CAMCONVERT_TYPE_INT_ARRAY,
597 &_mmcamcorder_enum_conv_hdr_capture,
601 CONFIGURE_CATEGORY_CTRL_DETECT,
603 MM_CAMCORDER_ATTR_NONE,
605 MM_CAMCONVERT_TYPE_INT_ARRAY,
606 &_mmcamcorder_enum_conv_detect_mode,
610 CONFIGURE_CATEGORY_CTRL_DETECT,
611 MM_CAM_DETECT_NUMBER,
612 MM_CAMCORDER_ATTR_NONE,
614 MM_CAMCONVERT_TYPE_INT_RANGE,
619 CONFIGURE_CATEGORY_CTRL_DETECT,
620 MM_CAM_DETECT_FOCUS_SELECT,
621 MM_CAMCORDER_ATTR_NONE,
623 MM_CAMCONVERT_TYPE_INT_RANGE,
628 CONFIGURE_CATEGORY_CTRL_DETECT,
629 MM_CAM_DETECT_SELECT_NUMBER,
630 MM_CAMCORDER_ATTR_NONE,
631 "DetectSelectNumber",
632 MM_CAMCONVERT_TYPE_INT_RANGE,
637 CONFIGURE_CATEGORY_CTRL_DETECT,
638 MM_CAM_DETECT_STATUS,
639 MM_CAMCORDER_ATTR_NONE,
641 MM_CAMCONVERT_TYPE_INT_ARRAY,
646 CONFIGURE_CATEGORY_CTRL_CAMERA,
647 MM_CAM_RECOMMEND_CAMERA_WIDTH,
648 MM_CAM_RECOMMEND_CAMERA_HEIGHT,
649 "RecommendPreviewResolution",
650 MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY,
655 CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
656 MM_CAM_CAMERA_VIDEO_STABILIZATION,
657 MM_CAMCORDER_ATTR_NONE,
658 "VideoStabilization",
659 MM_CAMCONVERT_TYPE_INT_ARRAY,
660 &_mmcamcorder_enum_conv_video_stabilization,
664 CONFIGURE_CATEGORY_CTRL_CAMERA,
668 MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY,
673 /*---------------------------------------------------------------------------
674 | LOCAL FUNCTION PROTOTYPES: |
675 ---------------------------------------------------------------------------*/
676 /* STATIC INTERNAL FUNCTION */
677 static int __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** valid_array, int * valid_default );
679 /*===========================================================================================
681 | FUNCTION DEFINITIONS |
683 ========================================================================================== */
684 /*---------------------------------------------------------------------------
685 | GLOBAL FUNCTION DEFINITIONS: |
686 ---------------------------------------------------------------------------*/
687 //convert MSL value to sensor value
688 int _mmcamcorder_convert_msl_to_sensor(MMHandleType handle, int attr_idx, int mslval)
690 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
691 _MMCamcorderInfoConverting *info = NULL;
693 int size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
695 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
697 //_mmcam_dbg_log("attr_idx(%d), mslval(%d)", attr_idx, mslval);
699 info = hcamcorder->caminfo_convert;
701 for (i = 0; i < size; i++)
703 if (info[i].attr_idx == attr_idx)
705 _MMCamcorderEnumConvert * enum_convert = NULL;
706 enum_convert = info[i].enum_convert;
708 if (enum_convert == NULL)
710 //_mmcam_dbg_log("enum_convert is NULL. Just return the original value.");
714 if (enum_convert->enum_arr == NULL)
716 _mmcam_dbg_warn("Unexpected error. Array pointer of enum_convert is NULL. Just return the original value.");
720 if( enum_convert->total_enum_num > mslval && mslval >= 0 )
722 //_mmcam_dbg_log("original value(%d) -> converted value(%d)", mslval, enum_convert->enum_arr[mslval]);
723 return enum_convert->enum_arr[mslval];
727 _mmcam_dbg_warn( "Input mslval[%d] is invalid(out of array[idx:%d,size:%d]), so can not convert. Just return the original value.", mslval, attr_idx, enum_convert->total_enum_num );
733 _mmcam_dbg_warn("There is no category to match. Just return the original value.");
738 int _mmcamcorder_get_fps_array_by_resolution(MMHandleType handle, int width, int height, MMCamAttrsInfo* fps_info)
740 MMCamAttrsInfo *infoW = NULL;
741 MMCamAttrsInfo *infoH = NULL;
743 char nameFps[10] = {0,};
744 bool valid_check = false;
746 type_int_array *fps_array;
748 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
750 //_mmcam_dbg_log("prev resolution w:%d, h:%d", width, height);
752 infoW = (MMCamAttrsInfo*)calloc(1, sizeof(MMCamAttrsInfo));
754 _mmcam_dbg_err("failed to alloc infoW");
755 return MM_ERROR_CAMCORDER_LOW_MEMORY;
758 infoH = (MMCamAttrsInfo*)calloc(1, sizeof(MMCamAttrsInfo));
760 _mmcam_dbg_err("failed to alloc infoH");
765 return MM_ERROR_CAMCORDER_LOW_MEMORY;
768 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_WIDTH, infoW);
769 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_HEIGHT, infoH);
771 for(i=0; i < infoW->int_array.count; i++) {
772 //_mmcam_dbg_log("width :%d, height : %d\n", infoW->int_array.array[i], infoH->int_array.array[i]);
773 if(infoW->int_array.array[i] == width && infoH->int_array.array[i] == height) {
775 snprintf(nameFps, 10, "FPS%d", i);
776 _mmcam_dbg_log("nameFps : %s!!!", nameFps);
787 _mmcam_dbg_err("FAILED : Can't find the valid resolution from attribute.");
788 return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
791 if (!_mmcamcorder_conf_get_value_int_array(hcamcorder->conf_ctrl, CONFIGURE_CATEGORY_CTRL_CAMERA, nameFps, &fps_array)) {
792 _mmcam_dbg_err("FAILED : Can't find the valid FPS array.");
793 return MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
796 fps_info->int_array.count = fps_array->count;
797 fps_info->int_array.array = fps_array->value;
798 fps_info->int_array.def = fps_array->default_value;
800 return MM_ERROR_NONE;
803 //convert sensor value to MSL value
804 int _mmcamcorder_convert_sensor_to_msl(MMHandleType handle, int attr_idx, int sensval)
806 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
807 _MMCamcorderInfoConverting *info = NULL;
809 int size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
811 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
813 info = hcamcorder->caminfo_convert;
815 for( i = 0 ; i < size ; i++ )
817 if( info[i].attr_idx == attr_idx )
819 _MMCamcorderEnumConvert * enum_convert = NULL;
820 enum_convert = info[i].enum_convert;
822 if( enum_convert == NULL )
824 //_mmcam_dbg_log("enum_convert is NULL. Just return the original value.");
828 if( enum_convert->enum_arr == NULL )
830 _mmcam_dbg_warn("Unexpected error. Array pointer of enum_convert is NULL. Just return the original value.");
834 for( j = 0 ; j < enum_convert->total_enum_num ; j++ )
836 if( sensval == enum_convert->enum_arr[j] )
838 //_mmcam_dbg_log("original value(%d) -> converted value(%d)", sensval, j);
843 _mmcam_dbg_warn("There is no sensor value matched with input param. Just return the original value.");
849 _mmcam_dbg_log("There is no category to match. Just return the original value.");
854 __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** valid_array, int * valid_default )
858 int new_default = _MMCAMCORDER_SENSOR_ENUM_NONE;
860 for (i = 0; i < original_count; i++) {
861 if (original_array[i] != _MMCAMCORDER_SENSOR_ENUM_NONE) {
866 if (valid_count > 0) {
867 *valid_array = (int*)malloc(sizeof(int) * valid_count);
871 for (i = 0; i < original_count; i++) {
872 if (original_array[i] != _MMCAMCORDER_SENSOR_ENUM_NONE) {
873 (*valid_array)[valid_count++] = i;
874 /*_mmcam_dbg_log( "valid_array[%d] = %d", valid_count-1, (*valid_array)[valid_count-1] );*/
876 if (original_array[i] == *valid_default &&
877 new_default == _MMCAMCORDER_SENSOR_ENUM_NONE) {
879 /*_mmcam_dbg_log( "converted MSL default[%d]", new_default );*/
889 if (new_default != _MMCAMCORDER_SENSOR_ENUM_NONE) {
890 *valid_default = new_default;
897 int _mmcamcorder_init_attr_from_configure(MMHandleType handle, MMCamConvertingCategory category)
899 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
900 _MMCamcorderInfoConverting *info = NULL;
903 int ret = MM_ERROR_NONE;
905 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
907 _mmcam_dbg_log("category : %d", category);
909 if (category & MM_CAMCONVERT_CATEGORY_CAMERA) {
910 /* Initialize attribute related to camera control */
911 info = hcamcorder->caminfo_convert;
912 table_size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
913 ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
914 if (ret != MM_ERROR_NONE) {
915 _mmcam_dbg_err("camera info set error : 0x%x", ret);
920 if (category & MM_CAMCONVERT_CATEGORY_DISPLAY) {
921 /* Initialize attribute related to display */
922 info = g_display_info;
923 table_size = sizeof(g_display_info) / sizeof(_MMCamcorderInfoConverting);
924 ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
925 if (ret != MM_ERROR_NONE) {
926 _mmcam_dbg_err("display info set error : 0x%x", ret);
931 if (category & MM_CAMCONVERT_CATEGORY_AUDIO) {
932 /* Initialize attribute related to audio */
934 table_size = sizeof(g_audio_info) / sizeof(_MMCamcorderInfoConverting);
935 ret = __mmcamcorder_set_info_to_attr(handle, info, table_size);
936 if (ret != MM_ERROR_NONE) {
937 _mmcam_dbg_err("audio info set error : 0x%x", ret);
942 _mmcam_dbg_log("done");
948 int __mmcamcorder_set_info_to_attr(MMHandleType handle, _MMCamcorderInfoConverting *info, int table_size)
950 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
951 MMHandleType attrs = 0;
954 int ret = MM_ERROR_NONE;
956 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
958 attrs = MMF_CAMCORDER_ATTRS (handle);
959 mmf_return_val_if_fail(attrs, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
961 camera_conf *conf_info = NULL;
963 for (i = 0; i < table_size ; i++ )
966 _mmcam_dbg_log( "%d,%d,%d,%d,%s,%d",
970 info[i].attr_idx_pair,
975 if( info[i].type == CONFIGURE_TYPE_MAIN )
977 conf_info = hcamcorder->conf_main;
978 /*_mmcam_dbg_log( "MAIN configure [%s]", info[i].keyword );*/
982 conf_info = hcamcorder->conf_ctrl;
983 /*_mmcam_dbg_log( "CTRL configure [%s]", info[i].keyword );*/
986 switch(info[i].conv_type)
988 case MM_CAMCONVERT_TYPE_INT:
992 if (!_mmcamcorder_conf_get_value_int(handle, conf_info, info[i].category, info[i].keyword, &ivalue))
994 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
998 ret = mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, ivalue);
1001 case MM_CAMCONVERT_TYPE_INT_ARRAY:
1004 int iarray_size = 0;
1006 type_int_array *tarray = NULL;
1008 if (!_mmcamcorder_conf_get_value_int_array( conf_info, info[i].category, info[i].keyword, &tarray ))
1010 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
1011 break; //skip to set
1016 idefault = tarray->default_value;
1018 if( info[i].enum_convert )
1020 iarray_size = __mmcamcorder_get_valid_array(tarray->value, tarray->count, &iarray, &idefault);
1024 iarray = tarray->value;
1025 iarray_size = tarray->count;
1028 if( iarray_size > 0 )
1031 _mmcam_dbg_log("INT Array. attr idx=%d array=%p, size=%d, default=%d",
1032 info[i].attr_idx, iarray, iarray_size, idefault);
1035 /* "mmf_attrs_set_valid_type" initializes spec value in attribute, so allocated memory could be missed */
1036 //mmf_attrs_set_valid_type(attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
1037 mmf_attrs_set_valid_array(attrs, info[i].attr_idx, iarray, iarray_size, idefault);
1039 ret = mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, idefault);
1043 if (iarray && iarray != tarray->value )
1048 case MM_CAMCONVERT_TYPE_INT_RANGE:
1050 type_int_range *irange = NULL;
1052 if (!_mmcamcorder_conf_get_value_int_range(conf_info, info[i].category, info[i].keyword, &irange))
1054 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
1055 break; //skip to set
1060 //_mmcam_dbg_log("INT Range. m:%d, s:%d, min=%d, max=%d", info[i].main_key, info[i].sub_key1, irange->min, irange->max);
1061 /* "mmf_attrs_set_valid_type" initializes spec value in attribute, so allocated memory could be missed */
1062 //mmf_attrs_set_valid_type (attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_RANGE);
1063 mmf_attrs_set_valid_range(attrs, info[i].attr_idx, irange->min, irange->max, irange->default_value);
1065 ret = mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, irange->default_value);
1070 case MM_CAMCONVERT_TYPE_STRING:
1072 const char *cString = NULL;
1073 unsigned int iString_len = 0;
1075 if (!_mmcamcorder_conf_get_value_string(handle, conf_info, info[i].category, info[i].keyword, &cString ))
1077 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
1078 break; //skip to set
1081 //_mmcam_dbg_log("String. m:%d, s:%d, cString=%s", info[i].main_key, info[i].sub_key1, cString);
1082 //strlen makes a crash when null pointer is passed.
1084 iString_len = strlen(cString);
1088 ret = mm_attrs_set_string(attrs, info[i].attr_idx, cString, iString_len);
1091 case MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY:
1093 type_int_pair_array *pair_array = NULL;
1095 /*_mmcam_dbg_log("INT PAIR Array. type:%d, attr_idx:%d, attr_idx_pair:%d", info[i].type, info[i].attr_idx, info[i].attr_idx_pair);*/
1097 if (!_mmcamcorder_conf_get_value_int_pair_array(conf_info, info[i].category, info[i].keyword, &pair_array))
1099 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
1100 break; //skip to set
1103 if( pair_array && pair_array->count > 0 )
1105 /* "mmf_attrs_set_valid_type" initializes spec value in attribute, so allocated memory could be missed */
1106 //mmf_attrs_set_valid_type(attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
1107 mmf_attrs_set_valid_array(attrs, info[i].attr_idx,
1108 pair_array->value[0],
1110 pair_array->default_value[0]);
1111 /* "mmf_attrs_set_valid_type" initializes spec value in attribute, so allocated memory could be missed */
1112 //mmf_attrs_set_valid_type(attrs, info[i].attr_idx_pair, MM_ATTRS_VALID_TYPE_INT_ARRAY);
1113 mmf_attrs_set_valid_array(attrs, info[i].attr_idx_pair,
1114 pair_array->value[1],
1116 pair_array->default_value[1]);
1118 mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, pair_array->default_value[0]);
1119 mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx_pair, pair_array->default_value[1]);
1124 case MM_CAMCONVERT_TYPE_USER:
1126 _mmcam_dbg_log("default : s:%d", info[i].attr_idx);
1131 if (ret != MM_ERROR_NONE || mmf_attrs_commit(attrs) == -1)
1132 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
1134 return MM_ERROR_NONE;
1138 int _mmcamcorder_set_converted_value(MMHandleType handle, _MMCamcorderEnumConvert * convert)
1140 mmf_camcorder_t* hcamcorder = MMF_CAMCORDER(handle);
1141 type_int_array *array = NULL;
1143 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1145 _mmcamcorder_conf_get_value_int_array( hcamcorder->conf_ctrl, convert->category, convert->keyword, &array );
1149 convert->enum_arr = array->value;
1152 return MM_ERROR_NONE;
1156 int _mmcamcorder_init_convert_table(MMHandleType handle)
1158 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1159 int enum_conv_size = sizeof(_MMCamcorderEnumConvert);
1160 int caminfo_conv_size = sizeof(g_caminfo_convert);
1161 int caminfo_conv_length = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
1164 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1166 /* copy default conv data into memory of handle */
1167 memcpy(&(hcamcorder->caminfo_convert), &g_caminfo_convert, caminfo_conv_size);
1168 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]), &_mmcamcorder_enum_conv_whitebalance, enum_conv_size);
1169 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]), &_mmcamcorder_enum_conv_colortone, enum_conv_size);
1170 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_ISO]), &_mmcamcorder_enum_conv_iso, enum_conv_size);
1171 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]), &_mmcamcorder_enum_conv_prgrm, enum_conv_size);
1172 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]), &_mmcamcorder_enum_conv_focus_mode, enum_conv_size);
1173 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]), &_mmcamcorder_enum_conv_focus_type, enum_conv_size);
1174 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]), &_mmcamcorder_enum_conv_ae_type, enum_conv_size);
1175 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]), &_mmcamcorder_enum_conv_strobe_mode, enum_conv_size);
1176 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_WDR]), &_mmcamcorder_enum_conv_wdr_ctrl, enum_conv_size);
1177 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_FLIP]), &_mmcamcorder_enum_conv_flip_ctrl, enum_conv_size);
1178 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_ROTATION]), &_mmcamcorder_enum_conv_rotation_ctrl, enum_conv_size);
1179 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]), &_mmcamcorder_enum_conv_ahs, enum_conv_size);
1180 memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]), &_mmcamcorder_enum_conv_video_stabilization, enum_conv_size);
1182 /* set ini info to conv data */
1183 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]));
1184 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]));
1185 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_ISO]));
1186 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]));
1187 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]));
1188 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]));
1189 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]));
1190 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]));
1191 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_WDR]));
1192 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_FLIP]));
1193 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_ROTATION]));
1194 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]));
1195 _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]));
1197 /* set modified conv data to handle */
1198 for (i = 0 ; i < caminfo_conv_length ; i++) {
1199 if (hcamcorder->caminfo_convert[i].type == CONFIGURE_TYPE_CTRL) {
1200 switch (hcamcorder->caminfo_convert[i].category) {
1201 case CONFIGURE_CATEGORY_CTRL_STROBE:
1202 if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "StrobeMode")) {
1203 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]);
1206 case CONFIGURE_CATEGORY_CTRL_EFFECT:
1207 if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "WhiteBalance")) {
1208 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]);
1209 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ColorTone")) {
1210 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]);
1211 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "WDR")) {
1212 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_WDR]);
1213 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "Flip")) {
1214 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_FLIP]);
1215 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "Rotation")) {
1216 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_ROTATION]);
1219 case CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH:
1220 if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "FocusMode")) {
1221 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]);
1222 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AFType")) {
1223 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]);
1224 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AEType")) {
1225 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]);
1226 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ISO")) {
1227 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_ISO]);
1228 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ProgramMode")) {
1229 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]);
1230 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AntiHandshake")) {
1231 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]);
1232 } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "VideoStabilization")) {
1233 hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]);
1242 return MM_ERROR_NONE;
1246 double _mmcamcorder_convert_volume(int mslVal)
1258 _mmcam_dbg_warn("out of range");