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.
23 /*=======================================================================================
25 =======================================================================================*/
26 #include "mm_camcorder_internal.h"
28 #include <gst/interfaces/colorbalance.h>
29 #include <gst/interfaces/cameracontrol.h>
30 #include <gst/interfaces/xoverlay.h>
33 /*---------------------------------------------------------------------------------------
34 | GLOBAL VARIABLE DEFINITIONS for internal |
35 ---------------------------------------------------------------------------------------*/
36 int video_input_rotation[] = {MM_VIDEO_INPUT_ROTATION_NONE,
37 MM_VIDEO_INPUT_ROTATION_90,
38 MM_VIDEO_INPUT_ROTATION_180,
39 MM_VIDEO_INPUT_ROTATION_270,
40 MM_VIDEO_INPUT_ROTATION_FLIP_HORZ,
41 MM_VIDEO_INPUT_ROTATION_FLIP_VERT};
43 int depth[] = {MM_CAMCORDER_AUDIO_FORMAT_PCM_U8,
44 MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE};
46 int rotation[] = {MM_DISPLAY_ROTATION_NONE,
47 MM_DISPLAY_ROTATION_90,
48 MM_DISPLAY_ROTATION_180,
49 MM_DISPLAY_ROTATION_270,
50 MM_DISPLAY_ROTATION_FLIP_HORZ,
51 MM_DISPLAY_ROTATION_FLIP_VERT};
53 int visible_values[] = { 0, 1 }; /*0: off, 1:on*/
55 int strobe_mode[] = {MM_CAMCORDER_STROBE_MODE_OFF,
56 MM_CAMCORDER_STROBE_MODE_ON,
57 MM_CAMCORDER_STROBE_MODE_AUTO,
58 MM_CAMCORDER_STROBE_MODE_REDEYE_REDUCTION,
59 MM_CAMCORDER_STROBE_MODE_SLOW_SYNC,
60 MM_CAMCORDER_STROBE_MODE_FRONT_CURTAIN,
61 MM_CAMCORDER_STROBE_MODE_REAR_CURTAIN,
62 MM_CAMCORDER_STROBE_MODE_PERMANENT};
64 int tag_enable_values[] = { 0, 1 };
66 int tag_orientation_values[] =
68 1, /*The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.*/
69 2, /*the 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.*/
70 3, /*the 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.*/
71 4, /*the 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.*/
72 5, /*the 0th row is the visual left-hand side of the image, and the 0th column is the visual top.*/
73 6, /*the 0th row is the visual right-hand side of the image, and the 0th column is the visual top.*/
74 7, /*the 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.*/
75 8, /*the 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.*/
78 /* basic attributes' info */
79 mm_cam_attr_construct_info cam_attrs_const_info[] ={
84 MMF_VALUE_TYPE_INT, /* Type */
85 MM_ATTRS_FLAG_RW, /* Flag */
86 (void*)MM_CAMCORDER_MODE_IMAGE, /* Default value */
87 MM_ATTRS_VALID_TYPE_INT_RANGE, /* Validity type */
88 MM_CAMCORDER_MODE_IMAGE, /* Validity val1 (min, *array,...) */
89 MM_CAMCORDER_MODE_VIDEO, /* Validity val2 (max, count, ...) */
90 NULL, /* Runtime setting function of the attribute */
98 (void*)MM_AUDIO_DEVICE_MIC,
99 MM_ATTRS_VALID_TYPE_INT_RANGE,
101 MM_AUDIO_DEVICE_NUM-1,
106 MM_CAM_CAMERA_DEVICE,
110 (void*)MM_VIDEO_DEVICE_NONE,
111 MM_ATTRS_VALID_TYPE_INT_RANGE,
112 MM_VIDEO_DEVICE_NONE,
113 MM_VIDEO_DEVICE_NUM-1,
118 MM_CAM_AUDIO_ENCODER,
122 (void*)MM_AUDIO_CODEC_AMR,
123 MM_ATTRS_VALID_TYPE_INT_ARRAY,
130 MM_CAM_VIDEO_ENCODER,
134 (void*)MM_VIDEO_CODEC_MPEG4,
135 MM_ATTRS_VALID_TYPE_INT_ARRAY,
142 MM_CAM_IMAGE_ENCODER,
146 (void*)MM_IMAGE_CODEC_JPEG,
147 MM_ATTRS_VALID_TYPE_INT_ARRAY,
158 (void*)MM_FILE_FORMAT_MP4,
159 MM_ATTRS_VALID_TYPE_INT_ARRAY,
166 MM_CAM_CAMERA_DEVICE_NAME,
167 "camera-device-name",
168 MMF_VALUE_TYPE_STRING,
171 MM_ATTRS_VALID_TYPE_NONE,
178 MM_CAM_AUDIO_SAMPLERATE,
183 MM_ATTRS_VALID_TYPE_INT_RANGE,
185 _MMCAMCORDER_MAX_INT,
194 (void*)MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
195 MM_ATTRS_VALID_TYPE_INT_ARRAY,
202 MM_CAM_AUDIO_CHANNEL,
207 MM_ATTRS_VALID_TYPE_INT_RANGE,
216 MMF_VALUE_TYPE_DOUBLE,
219 MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
222 _mmcamcorder_commit_audio_volume,
226 MM_CAM_AUDIO_INPUT_ROUTE,
230 (void*)MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
231 MM_ATTRS_VALID_TYPE_INT_RANGE,
232 MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
233 MM_AUDIOROUTE_CAPTURE_STEREOMIC_ONLY,
234 _mmcamcorder_commit_audio_input_route,
238 MM_CAM_FILTER_SCENE_MODE,
243 MM_ATTRS_VALID_TYPE_INT_ARRAY,
246 _mmcamcorder_commit_filter_scene_mode,
250 MM_CAM_FILTER_BRIGHTNESS,
255 MM_ATTRS_VALID_TYPE_INT_RANGE,
258 _mmcamcorder_commit_filter,
262 MM_CAM_FILTER_CONTRAST,
267 MM_ATTRS_VALID_TYPE_INT_RANGE,
270 _mmcamcorder_commit_filter,
279 MM_ATTRS_VALID_TYPE_INT_ARRAY,
282 _mmcamcorder_commit_filter,
286 MM_CAM_FILTER_COLOR_TONE,
291 MM_ATTRS_VALID_TYPE_INT_ARRAY,
294 _mmcamcorder_commit_filter,
298 MM_CAM_FILTER_SATURATION,
303 MM_ATTRS_VALID_TYPE_INT_RANGE,
306 _mmcamcorder_commit_filter,
315 MM_ATTRS_VALID_TYPE_INT_RANGE,
318 _mmcamcorder_commit_filter,
322 MM_CAM_FILTER_SHARPNESS,
327 MM_ATTRS_VALID_TYPE_INT_RANGE,
330 _mmcamcorder_commit_filter,
334 MM_CAM_CAMERA_FORMAT,
338 (void*)MM_PIXEL_FORMAT_YUYV,
339 MM_ATTRS_VALID_TYPE_INT_ARRAY,
346 MM_CAM_CAMERA_SLOW_MOTION_FPS,
347 "camera-slow-motion-fps",
351 MM_ATTRS_VALID_TYPE_INT_RANGE,
353 _MMCAMCORDER_MAX_INT,
363 MM_ATTRS_VALID_TYPE_INT_ARRAY,
366 _mmcamcorder_commit_camera_fps,
375 MM_ATTRS_VALID_TYPE_INT_ARRAY,
378 _mmcamcorder_commit_camera_width,
382 MM_CAM_CAMERA_HEIGHT,
387 MM_ATTRS_VALID_TYPE_INT_ARRAY,
390 _mmcamcorder_commit_camera_height,
394 MM_CAM_CAMERA_DIGITAL_ZOOM,
395 "camera-digital-zoom",
399 MM_ATTRS_VALID_TYPE_INT_RANGE,
402 _mmcamcorder_commit_camera_zoom,
406 MM_CAM_CAMERA_OPTICAL_ZOOM,
407 "camera-optical-zoom",
411 MM_ATTRS_VALID_TYPE_INT_RANGE,
414 _mmcamcorder_commit_camera_zoom,
418 MM_CAM_CAMERA_FOCUS_MODE,
422 (void*)MM_CAMCORDER_FOCUS_MODE_NONE,
423 MM_ATTRS_VALID_TYPE_INT_ARRAY,
426 _mmcamcorder_commit_camera_focus_mode,
430 MM_CAM_CAMERA_AF_SCAN_RANGE,
431 "camera-af-scan-range",
435 MM_ATTRS_VALID_TYPE_INT_ARRAY,
438 _mmcamcorder_commit_camera_af_scan_range,
442 MM_CAM_CAMERA_EXPOSURE_MODE,
443 "camera-exposure-mode",
447 MM_ATTRS_VALID_TYPE_INT_ARRAY,
450 _mmcamcorder_commit_camera_capture_mode,
454 MM_CAM_CAMERA_EXPOSURE_VALUE,
455 "camera-exposure-value",
459 MM_ATTRS_VALID_TYPE_INT_RANGE,
462 _mmcamcorder_commit_camera_capture_mode,
466 MM_CAM_CAMERA_F_NUMBER,
471 MM_ATTRS_VALID_TYPE_INT_ARRAY,
474 _mmcamcorder_commit_camera_capture_mode,
478 MM_CAM_CAMERA_SHUTTER_SPEED,
479 "camera-shutter-speed",
483 MM_ATTRS_VALID_TYPE_INT_ARRAY,
486 _mmcamcorder_commit_camera_capture_mode,
495 MM_ATTRS_VALID_TYPE_INT_ARRAY,
498 _mmcamcorder_commit_camera_capture_mode,
507 MM_ATTRS_VALID_TYPE_INT_ARRAY,
510 _mmcamcorder_commit_camera_wdr,
514 MM_CAM_CAMERA_ANTI_HANDSHAKE,
515 "camera-anti-handshake",
519 MM_ATTRS_VALID_TYPE_INT_ARRAY,
522 _mmcamcorder_commit_camera_anti_handshake,
526 MM_CAM_CAMERA_FPS_AUTO,
531 MM_ATTRS_VALID_TYPE_INT_RANGE,
538 MM_CAM_CAMERA_HOLD_AF_AFTER_CAPTURING,
539 "camera-hold-af-after-capturing",
543 MM_ATTRS_VALID_TYPE_INT_RANGE,
546 _mmcamcorder_commit_camera_hold_af_after_capturing,
550 MM_CAM_CAMERA_DELAY_ATTR_SETTING,
551 "camera-delay-attr-setting",
555 MM_ATTRS_VALID_TYPE_INT_RANGE,
562 MM_CAM_AUDIO_ENCODER_BITRATE,
563 "audio-encoder-bitrate",
567 MM_ATTRS_VALID_TYPE_INT_RANGE,
569 _MMCAMCORDER_MAX_INT,
574 MM_CAM_VIDEO_ENCODER_BITRATE,
575 "video-encoder-bitrate",
579 MM_ATTRS_VALID_TYPE_INT_RANGE,
581 _MMCAMCORDER_MAX_INT,
586 MM_CAM_IMAGE_ENCODER_QUALITY,
587 "image-encoder-quality",
591 MM_ATTRS_VALID_TYPE_INT_RANGE,
594 _mmcamcorder_commit_image_encoder_quality,
598 MM_CAM_CAPTURE_FORMAT,
602 (void*)MM_PIXEL_FORMAT_ENCODED,
603 MM_ATTRS_VALID_TYPE_INT_ARRAY,
610 MM_CAM_CAPTURE_WIDTH,
615 MM_ATTRS_VALID_TYPE_INT_ARRAY,
618 _mmcamcorder_commit_capture_width ,
622 MM_CAM_CAPTURE_HEIGHT,
627 MM_ATTRS_VALID_TYPE_INT_ARRAY,
630 _mmcamcorder_commit_capture_height,
634 MM_CAM_CAPTURE_COUNT,
639 MM_ATTRS_VALID_TYPE_INT_RANGE,
642 _mmcamcorder_commit_capture_count,
646 MM_CAM_CAPTURE_INTERVAL,
651 MM_ATTRS_VALID_TYPE_INT_RANGE,
653 _MMCAMCORDER_MAX_INT,
658 MM_CAM_CAPTURE_BREAK_CONTINUOUS_SHOT,
659 "capture-break-cont-shot",
663 MM_ATTRS_VALID_TYPE_INT_RANGE,
666 _mmcamcorder_commit_capture_break_cont_shot,
670 MM_CAM_DISPLAY_HANDLE,
675 MM_ATTRS_VALID_TYPE_NONE,
678 _mmcamcorder_commit_display_handle,
682 MM_CAM_DISPLAY_DEVICE,
686 (void*)MM_DISPLAY_DEVICE_MAINLCD,
687 MM_ATTRS_VALID_TYPE_INT_ARRAY,
694 MM_CAM_DISPLAY_SURFACE,
698 (void*)MM_DISPLAY_SURFACE_X,
699 MM_ATTRS_VALID_TYPE_INT_ARRAY,
706 MM_CAM_DISPLAY_RECT_X,
711 MM_ATTRS_VALID_TYPE_INT_RANGE,
713 _MMCAMCORDER_MAX_INT,
714 _mmcamcorder_commit_display_rect,
718 MM_CAM_DISPLAY_RECT_Y,
723 MM_ATTRS_VALID_TYPE_INT_RANGE,
725 _MMCAMCORDER_MAX_INT,
726 _mmcamcorder_commit_display_rect,
730 MM_CAM_DISPLAY_RECT_WIDTH,
731 "display-rect-width",
735 MM_ATTRS_VALID_TYPE_INT_RANGE,
737 _MMCAMCORDER_MAX_INT,
738 _mmcamcorder_commit_display_rect,
742 MM_CAM_DISPLAY_RECT_HEIGHT,
743 "display-rect-height",
747 MM_ATTRS_VALID_TYPE_INT_RANGE,
749 _MMCAMCORDER_MAX_INT,
750 _mmcamcorder_commit_display_rect,
754 MM_CAM_DISPLAY_SOURCE_X,
759 MM_ATTRS_VALID_TYPE_INT_RANGE,
761 _MMCAMCORDER_MAX_INT,
766 MM_CAM_DISPLAY_SOURCE_Y,
771 MM_ATTRS_VALID_TYPE_INT_RANGE,
773 _MMCAMCORDER_MAX_INT,
778 MM_CAM_DISPLAY_SOURCE_WIDTH,
783 MM_ATTRS_VALID_TYPE_INT_RANGE,
785 _MMCAMCORDER_MAX_INT,
790 MM_CAM_DISPLAY_SOURCE_HEIGHT,
791 "display-src-height",
795 MM_ATTRS_VALID_TYPE_INT_RANGE,
797 _MMCAMCORDER_MAX_INT,
802 MM_CAM_DISPLAY_ROTATION,
806 (void*)MM_DISPLAY_ROTATION_NONE,
807 MM_ATTRS_VALID_TYPE_INT_ARRAY,
809 ARRAY_SIZE(rotation),
810 _mmcamcorder_commit_display_rotation,
814 MM_CAM_DISPLAY_VISIBLE,
819 MM_ATTRS_VALID_TYPE_INT_ARRAY,
821 ARRAY_SIZE(visible_values),
822 _mmcamcorder_commit_display_visible,
826 MM_CAM_DISPLAY_SCALE,
831 MM_ATTRS_VALID_TYPE_INT_RANGE,
832 MM_DISPLAY_SCALE_DEFAULT,
833 MM_DISPLAY_SCALE_TRIPLE_LENGTH,
834 _mmcamcorder_commit_display_scale,
838 MM_CAM_DISPLAY_GEOMETRY_METHOD,
839 "display-geometry-method",
843 MM_ATTRS_VALID_TYPE_INT_RANGE,
844 MM_DISPLAY_METHOD_LETTER_BOX,
845 MM_DISPLAY_METHOD_CUSTOM_ROI,
846 _mmcamcorder_commit_display_geometry_method,
850 MM_CAM_TARGET_FILENAME,
852 MMF_VALUE_TYPE_STRING,
854 (void*)"/tmp/CAM-NONAME",
855 MM_ATTRS_VALID_TYPE_NONE,
858 _mmcamcorder_commit_target_filename,
862 MM_CAM_TARGET_MAX_SIZE,
867 MM_ATTRS_VALID_TYPE_INT_RANGE,
869 _MMCAMCORDER_MAX_INT,
874 MM_CAM_TARGET_TIME_LIMIT,
879 MM_ATTRS_VALID_TYPE_INT_RANGE,
881 _MMCAMCORDER_MAX_INT,
890 // (void*)tag_enable_values[0],
892 MM_ATTRS_VALID_TYPE_INT_RANGE,
899 MM_CAM_TAG_IMAGE_DESCRIPTION,
900 "tag-image-description",
901 MMF_VALUE_TYPE_STRING,
904 MM_ATTRS_VALID_TYPE_NONE,
911 MM_CAM_TAG_ORIENTATION,
915 // (void*)tag_orientation_values[0],
917 MM_ATTRS_VALID_TYPE_INT_ARRAY,
918 (int)tag_orientation_values,
919 ARRAY_SIZE(tag_orientation_values),
926 MMF_VALUE_TYPE_STRING,
929 MM_ATTRS_VALID_TYPE_NONE,
938 MMF_VALUE_TYPE_DOUBLE,
941 MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
948 MM_CAM_TAG_LONGITUDE,
950 MMF_VALUE_TYPE_DOUBLE,
953 MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
962 MMF_VALUE_TYPE_DOUBLE,
965 MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
972 MM_CAM_STROBE_CONTROL,
977 MM_ATTRS_VALID_TYPE_INT_RANGE,
980 _mmcamcorder_commit_strobe,
984 MM_CAM_STROBE_CAPABILITIES,
985 "strobe-capabilities",
989 MM_ATTRS_VALID_TYPE_INT_RANGE,
992 _mmcamcorder_commit_strobe,
1001 MM_ATTRS_VALID_TYPE_INT_ARRAY,
1003 ARRAY_SIZE(strobe_mode),
1004 _mmcamcorder_commit_strobe,
1013 MM_ATTRS_VALID_TYPE_INT_ARRAY,
1016 _mmcamcorder_commit_detect,
1020 MM_CAM_DETECT_NUMBER,
1025 MM_ATTRS_VALID_TYPE_INT_RANGE,
1028 _mmcamcorder_commit_detect,
1032 MM_CAM_DETECT_FOCUS_SELECT,
1033 "detect-focus-select",
1037 MM_ATTRS_VALID_TYPE_INT_RANGE,
1040 _mmcamcorder_commit_detect,
1044 MM_CAM_DETECT_SELECT_NUMBER,
1045 "detect-select-number",
1049 MM_ATTRS_VALID_TYPE_INT_RANGE,
1052 _mmcamcorder_commit_detect,
1056 MM_CAM_DETECT_STATUS,
1061 MM_ATTRS_VALID_TYPE_INT_ARRAY,
1064 _mmcamcorder_commit_detect,
1068 MM_CAM_CAPTURE_ZERO_SYSTEMLAG,
1069 "capture-zero-systemlag",
1073 MM_ATTRS_VALID_TYPE_INT_RANGE,
1080 MM_CAM_CAMERA_AF_TOUCH_X,
1081 "camera-af-touch-x",
1085 MM_ATTRS_VALID_TYPE_INT_RANGE,
1087 _MMCAMCORDER_MAX_INT,
1088 _mmcamcorder_commit_camera_af_touch_area,
1092 MM_CAM_CAMERA_AF_TOUCH_Y,
1093 "camera-af-touch-y",
1097 MM_ATTRS_VALID_TYPE_INT_RANGE,
1099 _MMCAMCORDER_MAX_INT,
1100 _mmcamcorder_commit_camera_af_touch_area,
1104 MM_CAM_CAMERA_AF_TOUCH_WIDTH,
1105 "camera-af-touch-width",
1109 MM_ATTRS_VALID_TYPE_INT_RANGE,
1111 _MMCAMCORDER_MAX_INT,
1112 _mmcamcorder_commit_camera_af_touch_area,
1116 MM_CAM_CAMERA_AF_TOUCH_HEIGHT,
1117 "camera-af-touch-height",
1121 MM_ATTRS_VALID_TYPE_INT_RANGE,
1123 _MMCAMCORDER_MAX_INT,
1124 _mmcamcorder_commit_camera_af_touch_area,
1128 MM_CAM_CAMERA_FOCAL_LENGTH,
1129 "camera-focal-length",
1130 MMF_VALUE_TYPE_DOUBLE,
1133 MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
1136 _mmcamcorder_commit_camera_capture_mode,
1140 MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE,
1141 "recommend-preview-format-for-capture",
1144 (void*)MM_PIXEL_FORMAT_YUYV,
1145 MM_ATTRS_VALID_TYPE_INT_RANGE,
1146 MM_PIXEL_FORMAT_NV12,
1147 MM_PIXEL_FORMAT_ENCODED,
1152 MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING,
1153 "recommend-preview-format-for-recording",
1156 (void*)MM_PIXEL_FORMAT_NV12,
1157 MM_ATTRS_VALID_TYPE_INT_RANGE,
1158 MM_PIXEL_FORMAT_NV12,
1159 MM_PIXEL_FORMAT_ENCODED,
1164 MM_CAM_CAPTURE_THUMBNAIL,
1165 "capture-thumbnail",
1169 MM_ATTRS_VALID_TYPE_NONE,
1176 MM_CAM_TAG_GPS_ENABLE,
1181 MM_ATTRS_VALID_TYPE_INT_RANGE,
1188 MM_CAM_TAG_GPS_TIME_STAMP,
1189 "tag-gps-time-stamp",
1190 MMF_VALUE_TYPE_DOUBLE,
1193 MM_ATTRS_VALID_TYPE_NONE,
1200 MM_CAM_TAG_GPS_DATE_STAMP,
1201 "tag-gps-date-stamp",
1202 MMF_VALUE_TYPE_STRING,
1205 MM_ATTRS_VALID_TYPE_NONE,
1212 MM_CAM_TAG_GPS_PROCESSING_METHOD,
1213 "tag-gps-processing-method",
1214 MMF_VALUE_TYPE_STRING,
1217 MM_ATTRS_VALID_TYPE_NONE,
1224 MM_CAM_CAMERA_ROTATION,
1228 (void*)MM_VIDEO_INPUT_ROTATION_NONE,
1229 MM_ATTRS_VALID_TYPE_INT_ARRAY,
1230 (int)video_input_rotation,
1231 ARRAY_SIZE(video_input_rotation),
1232 _mmcamcorder_commit_camera_rotate,
1236 MM_CAM_ENABLE_CONVERTED_STREAM_CALLBACK,
1237 "enable-converted-stream-callback",
1241 MM_ATTRS_VALID_TYPE_INT_RANGE,
1248 MM_CAM_CAPTURED_SCREENNAIL,
1249 "captured-screennail",
1250 MMF_VALUE_TYPE_DATA,
1253 MM_ATTRS_VALID_TYPE_NONE,
1260 MM_CAM_CAPTURE_SOUND_ENABLE,
1261 "capture-sound-enable",
1265 MM_ATTRS_VALID_TYPE_INT_RANGE,
1272 MM_CAM_RECOMMEND_DISPLAY_ROTATION,
1273 "recommend-display-rotation",
1276 (void*)MM_DISPLAY_ROTATION_270,
1277 MM_ATTRS_VALID_TYPE_INT_RANGE,
1278 MM_DISPLAY_ROTATION_NONE,
1279 MM_DISPLAY_ROTATION_FLIP_VERT,
1284 MM_CAM_CAMCORDER_ROTATION,
1285 "camcorder-rotation",
1288 (void*)MM_VIDEO_INPUT_ROTATION_NONE,
1289 MM_ATTRS_VALID_TYPE_INT_RANGE,
1290 MM_VIDEO_INPUT_ROTATION_NONE,
1291 MM_VIDEO_INPUT_ROTATION_270,
1292 _mmcamcorder_commit_camcorder_rotate,
1297 /*---------------------------------------------------------------------------
1298 | LOCAL VARIABLE DEFINITIONS for internal |
1299 ---------------------------------------------------------------------------*/
1300 /* Readonly attributes list.
1301 * If you want to make some attributes read only, write down here.
1302 * It will make them read only after composing whole attributes.
1305 static int readonly_attributes[] = {
1306 MM_CAM_CAMERA_DEVICE,
1307 MM_CAM_CAMERA_DEVICE_NAME,
1308 MM_CAM_CAMERA_SHUTTER_SPEED,
1309 MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE,
1310 MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING,
1311 MM_CAM_CAPTURED_SCREENNAIL,
1312 MM_CAM_RECOMMEND_DISPLAY_ROTATION,
1315 /*---------------------------------------------------------------------------
1316 | LOCAL FUNCTION PROTOTYPES: |
1317 ---------------------------------------------------------------------------*/
1318 /* STATIC INTERNAL FUNCTION */
1319 static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width, int height);
1320 static bool __mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int height);
1321 static int __mmcamcorder_set_conf_to_valid_info(MMHandleType handle);
1322 static bool __mmcamcorder_attrs_is_supported(MMHandleType handle, int idx);
1323 static int __mmcamcorder_check_valid_pair(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args);
1325 /*===========================================================================================
1327 | FUNCTION DEFINITIONS |
1329 ========================================================================================== */
1330 /*---------------------------------------------------------------------------
1331 | GLOBAL FUNCTION DEFINITIONS: |
1332 ---------------------------------------------------------------------------*/
1334 _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info )
1336 _mmcam_dbg_log( "" );
1338 MMHandleType attrs = 0;
1339 mmf_attrs_construct_info_t * attrs_const_info = NULL;
1343 /* Create attribute constructor */
1344 _mmcam_dbg_log( "start" );
1345 //set runtime values to 'cam_attrs_const_info'
1347 cam_attrs_const_info[MM_CAM_CAMERA_DEVICE].default_value = (void*)info->videodev_type;
1350 //alloc 'mmf_attrs_construct_info_t'
1351 attr_count = ARRAY_SIZE( cam_attrs_const_info );
1352 attrs_const_info = malloc(attr_count * sizeof(mmf_attrs_construct_info_t));
1354 if (!attrs_const_info)
1356 _mmcam_dbg_err( "Fail to alloc constructor." );
1360 for (idx = 0; idx < attr_count; idx++)
1362 //attribute order check.
1363 if (idx != cam_attrs_const_info[idx].attrid) //This should be same.
1365 _mmcam_dbg_err( "Please check attributes order. Is the idx same with enum val?" );
1369 attrs_const_info[idx].name = cam_attrs_const_info[idx].name;
1370 attrs_const_info[idx].value_type = cam_attrs_const_info[idx].value_type;
1371 attrs_const_info[idx].flags = cam_attrs_const_info[idx].flags;
1372 attrs_const_info[idx].default_value = cam_attrs_const_info[idx].default_value;
1375 /* Camcorder Attributes */
1376 _mmcam_dbg_log( "Create Camcorder Attributes[%p, %d]", attrs_const_info, attr_count);
1378 attrs = mmf_attrs_new_from_data( "Camcorder_Attributes",
1381 _mmcamcorder_commit_camcorder_attrs,
1384 free(attrs_const_info);
1385 attrs_const_info = NULL;
1389 _mmcam_dbg_err( "Fail to alloc attribute handle" );
1393 __mmcamcorder_set_conf_to_valid_info(handle);
1395 for (idx = 0; idx < attr_count; idx++)
1397 /* _mmcam_dbg_log("Valid type [%s:%d, %d, %d]", cam_attrs_const_info[idx].name, cam_attrs_const_info[idx].validity_type
1398 , cam_attrs_const_info[idx].validity_value1, cam_attrs_const_info[idx].validity_value2);
1400 mmf_attrs_set_valid_type (attrs, idx, cam_attrs_const_info[idx].validity_type);
1402 switch (cam_attrs_const_info[idx].validity_type)
1404 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
1405 if ((cam_attrs_const_info[idx].validity_value1) &&(cam_attrs_const_info[idx].validity_value2 > 0))
1406 mmf_attrs_set_valid_array (attrs, idx, (const int*)(cam_attrs_const_info[idx].validity_value1), cam_attrs_const_info[idx].validity_value2);
1408 case MM_ATTRS_VALID_TYPE_INT_RANGE:
1409 mmf_attrs_set_valid_range (attrs, idx, cam_attrs_const_info[idx].validity_value1, cam_attrs_const_info[idx].validity_value2);
1411 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
1412 if ((cam_attrs_const_info[idx].validity_value1) &&(cam_attrs_const_info[idx].validity_value2 > 0))
1413 mmf_attrs_set_valid_double_array (attrs, idx, (const double*)(cam_attrs_const_info[idx].validity_value1), cam_attrs_const_info[idx].validity_value2);
1415 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
1416 mmf_attrs_set_valid_double_range (attrs, idx, (double)cam_attrs_const_info[idx].validity_value1, (double)cam_attrs_const_info[idx].validity_value2);
1418 case MM_ATTRS_VALID_TYPE_NONE:
1420 case MM_ATTRS_VALID_TYPE_INVALID:
1422 _mmcam_dbg_err("Valid type error.");
1432 _mmcamcorder_dealloc_attribute(MMHandleType attrs)
1438 mmf_attrs_free(attrs);
1440 _mmcam_dbg_log("released attribute");
1446 _mmcamcorder_get_attributes(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args)
1448 MMHandleType attrs = 0;
1449 int ret = MM_ERROR_NONE;
1451 mmf_return_val_if_fail( handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1452 // mmf_return_val_if_fail( err_attr_name, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1454 attrs = MMF_CAMCORDER_ATTRS(handle);
1455 mmf_return_val_if_fail( attrs, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
1457 ret = mm_attrs_get_valist (attrs, err_attr_name, attribute_name, var_args);
1464 _mmcamcorder_set_attributes(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args)
1466 MMHandleType attrs = 0;
1467 int ret = MM_ERROR_NONE;
1469 mmf_return_val_if_fail( handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1470 // mmf_return_val_if_fail( err_attr_name, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1472 attrs = MMF_CAMCORDER_ATTRS(handle);
1473 mmf_return_val_if_fail( attrs, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
1475 __ta__( "__mmcamcorder_check_valid_pair",
1476 ret = __mmcamcorder_check_valid_pair( handle, err_attr_name, attribute_name, var_args );
1479 if( ret == MM_ERROR_NONE )
1481 ret = mm_attrs_set_valist (attrs, err_attr_name, attribute_name, var_args);
1489 _mmcamcorder_get_attribute_info(MMHandleType handle, const char *attr_name, MMCamAttrsInfo *info)
1491 MMHandleType attrs = 0;
1492 MMAttrsInfo attrinfo;
1493 int ret = MM_ERROR_NONE;
1495 mmf_return_val_if_fail( handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1496 mmf_return_val_if_fail( attr_name, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1497 mmf_return_val_if_fail( info, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
1499 attrs = MMF_CAMCORDER_ATTRS(handle);
1500 mmf_return_val_if_fail( attrs, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
1502 ret = mm_attrs_get_info_by_name(attrs, attr_name, (MMAttrsInfo*)&attrinfo);
1504 if (ret == MM_ERROR_NONE)
1506 memset(info, 0x00, sizeof(MMCamAttrsInfo));
1507 info->type = attrinfo.type;
1508 info->flag = attrinfo.flag;
1509 info->validity_type= attrinfo.validity_type;
1511 switch(attrinfo.validity_type)
1513 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
1514 info->int_array.array = attrinfo.int_array.array;
1515 info->int_array.count = attrinfo.int_array.count;
1516 info->int_array.def = 0;
1518 case MM_ATTRS_VALID_TYPE_INT_RANGE:
1519 info->int_range.min = attrinfo.int_range.min;
1520 info->int_range.max = attrinfo.int_range.max;
1521 info->int_range.def = 0;
1523 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
1524 info->double_array.array = attrinfo.double_array.array;
1525 info->double_array.count = attrinfo.double_array.count;
1526 info->double_array.def = 0;
1528 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
1529 info->double_range.min = attrinfo.double_range.min;
1530 info->double_range.max = attrinfo.double_range.max;
1531 info->double_range.def = 0;
1533 case MM_ATTRS_VALID_TYPE_NONE:
1535 case MM_ATTRS_VALID_TYPE_INVALID:
1545 //attribute commiter
1547 __mmcamcorder_print_attrs (const char *attr_name, const mmf_value_t *value, char* cmt_way)
1551 case MMF_VALUE_TYPE_INT:
1552 _mmcam_dbg_log("%s :(%s:%d)", cmt_way, attr_name, value->value.i_val);
1554 case MMF_VALUE_TYPE_DOUBLE:
1555 _mmcam_dbg_log("%s :(%s:%f)", cmt_way, attr_name, value->value.d_val);
1557 case MMF_VALUE_TYPE_STRING:
1558 _mmcam_dbg_log("%s :(%s:%s)", cmt_way, attr_name, value->value.s_val);
1560 case MMF_VALUE_TYPE_DATA:
1561 _mmcam_dbg_log("%s :(%s:%p)", cmt_way, attr_name, value->value.p_val);
1569 _mmcamcorder_commit_camcorder_attrs (int attr_idx, const char *attr_name, const mmf_value_t *value, void *commit_param)
1573 mmf_return_val_if_fail(commit_param, FALSE);
1574 mmf_return_val_if_fail(attr_idx >= 0, FALSE);
1575 mmf_return_val_if_fail(attr_name, FALSE);
1576 mmf_return_val_if_fail(value, FALSE);
1578 if (cam_attrs_const_info[attr_idx].attr_commit)
1580 // _mmcam_dbg_log("Dynamic commit:(%s)", attr_name);
1581 __mmcamcorder_print_attrs(attr_name, value, "Dynamic");
1582 bret = cam_attrs_const_info[attr_idx].attr_commit((MMHandleType)commit_param, attr_idx, value);
1586 // _mmcam_dbg_log("Static commit:(%s)", attr_name);
1587 __mmcamcorder_print_attrs(attr_name, value, "Static");
1596 __mmcamcorder_set_conf_to_valid_info(MMHandleType handle)
1598 //mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
1600 int total_count = 0;
1603 total_count = _mmcamcorder_get_available_format(handle, CONFIGURE_CATEGORY_MAIN_AUDIO_ENCODER, &format);
1604 cam_attrs_const_info[MM_CAM_AUDIO_ENCODER].validity_value1 = (int)format;
1605 cam_attrs_const_info[MM_CAM_AUDIO_ENCODER].validity_value2 = (int)total_count;
1608 total_count = _mmcamcorder_get_available_format(handle, CONFIGURE_CATEGORY_MAIN_VIDEO_ENCODER, &format);
1609 cam_attrs_const_info[MM_CAM_VIDEO_ENCODER].validity_value1 = (int)format;
1610 cam_attrs_const_info[MM_CAM_VIDEO_ENCODER].validity_value2 = (int)total_count;
1613 total_count = _mmcamcorder_get_available_format(handle, CONFIGURE_CATEGORY_MAIN_IMAGE_ENCODER, &format);
1614 cam_attrs_const_info[MM_CAM_IMAGE_ENCODER].validity_value1 = (int)format;
1615 cam_attrs_const_info[MM_CAM_IMAGE_ENCODER].validity_value2 = (int)total_count;
1618 total_count = _mmcamcorder_get_available_format(handle, CONFIGURE_CATEGORY_MAIN_MUX, &format);
1619 cam_attrs_const_info[MM_CAM_FILE_FORMAT].validity_value1 = (int)format;
1620 cam_attrs_const_info[MM_CAM_FILE_FORMAT].validity_value2 = (int)total_count;
1622 return MM_ERROR_NONE;
1626 bool _mmcamcorder_commit_capture_width (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1628 MMHandleType attr = 0;
1629 int current_state = MM_CAMCORDER_STATE_NONE;
1631 attr = MMF_CAMCORDER_ATTRS(handle);
1632 mmf_return_val_if_fail(attr, FALSE);
1634 _mmcam_dbg_log("(%d)", attr_idx);
1636 current_state = _mmcamcorder_get_state( handle);
1638 if( !_mmcamcorder_is_state_changing(handle)
1639 && ( current_state == MM_CAMCORDER_STATE_NULL
1640 || current_state == MM_CAMCORDER_STATE_READY
1641 || current_state == MM_CAMCORDER_STATE_PREPARE ) )
1643 int flags = MM_ATTRS_FLAG_NONE;
1644 int capture_width, capture_height;
1645 MMCamAttrsInfo info;
1647 mm_camcorder_get_attribute_info(handle, MMCAM_CAPTURE_HEIGHT, &info);
1650 if (!(flags & MM_ATTRS_FLAG_MODIFIED))
1652 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_HEIGHT, &capture_height, NULL);
1653 capture_width = value->value.i_val;
1655 /* Check whether they are valid pair */
1656 return __mmcamcorder_set_capture_resolution(handle, capture_width, capture_height);
1663 _mmcam_dbg_log("Capture resolution can't be set.(state=%d)", current_state);
1669 bool _mmcamcorder_commit_capture_height (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1671 int current_state = MM_CAMCORDER_STATE_NONE;
1673 current_state = _mmcamcorder_get_state( handle);
1675 if( current_state == MM_CAMCORDER_STATE_NULL
1676 || current_state == MM_CAMCORDER_STATE_READY
1677 || current_state == MM_CAMCORDER_STATE_PREPARE )
1679 int capture_width, capture_height;
1681 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_WIDTH, &capture_width, NULL);
1682 capture_height = value->value.i_val;
1684 return __mmcamcorder_set_capture_resolution(handle, capture_width, capture_height);
1688 _mmcam_dbg_log("Capture resolution can't be set.(state=%d)", current_state);
1694 bool _mmcamcorder_commit_capture_break_cont_shot (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1696 int current_state = _mmcamcorder_get_state( handle);
1697 int ivalue = value->value.i_val;
1699 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1700 _MMCamcorderSubContext *sc = NULL;
1701 GstCameraControl *control = NULL;
1702 type_element *VideosrcElement = NULL;
1704 char* videosrc_name = NULL;
1706 _mmcamcorder_conf_get_element( hcamcorder->conf_main,
1707 CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
1710 _mmcamcorder_conf_get_value_element_name( VideosrcElement, &videosrc_name );
1712 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1716 if( ivalue && current_state == MM_CAMCORDER_STATE_CAPTURING )
1718 if( !strcmp( videosrc_name, "avsysvideosrc" ) || !strcmp( videosrc_name, "camerasrc" ) )
1720 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
1722 _mmcam_dbg_err("Can't cast Video source into camera control.");
1723 return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
1726 control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
1728 gst_camera_control_set_capture_command( control, GST_CAMERA_CONTROL_CAPTURE_COMMAND_STOP_MULTISHOT );
1730 _mmcam_dbg_warn( "Commit Break continuous shot : Set command OK. current state[%d]", current_state );
1734 _mmcam_dbg_warn( "Another videosrc plugin[%s] is not supported yet.", videosrc_name );
1739 _mmcam_dbg_warn( "Commit Break continuous shot : No effect. value[%d],current state[%d]", ivalue, current_state );
1746 bool _mmcamcorder_commit_capture_count (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1750 int mode = MM_CAMCORDER_MODE_IMAGE;
1752 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1754 mmf_return_val_if_fail(hcamcorder, FALSE);
1756 cap_count = value->value.i_val;
1758 mm_camcorder_get_attributes(handle, NULL, MMCAM_MODE, &mode, NULL);
1759 if (mode == MM_CAMCORDER_MODE_IMAGE) {
1760 if (cap_count > 1) {
1761 __ta__("_mmcamcorder_sound_init",
1762 ret = _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
1765 __ta__("_mmcamcorder_sound_prepare",
1766 ret = _mmcamcorder_sound_prepare(handle);
1768 _mmcam_dbg_log("sound prepare [%d]", ret);
1770 } else if (cap_count == 1) {
1771 __ta__("_mmcamcorder_sound_finalize",
1772 ret = _mmcamcorder_sound_finalize(handle);
1774 _mmcam_dbg_log("sound finalize [%d]", ret);
1778 _mmcam_dbg_log("Capture Count(%d)", cap_count);
1784 bool _mmcamcorder_commit_audio_volume (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1786 int current_state = MM_CAMCORDER_STATE_NONE;
1787 _MMCamcorderSubContext *sc = NULL;
1790 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1794 current_state = _mmcamcorder_get_state( handle);
1796 if ((current_state == MM_CAMCORDER_STATE_RECORDING)||(current_state == MM_CAMCORDER_STATE_PAUSED))
1798 double mslNewVal = 0;
1799 mslNewVal = value->value.d_val;
1801 if (sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst)
1803 if(mslNewVal == 0.0)
1805 //Because data probe of audio src do the same job, it doesn't need to set mute here. Already null raw data.
1806 // MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "mute", TRUE);
1807 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "volume", 1.0);
1811 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "mute", FALSE);
1812 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "volume", mslNewVal);
1816 _mmcam_dbg_log("Commit : volume(%f)", mslNewVal);
1821 _mmcam_dbg_log("Commit : nothing to commit. status(%d)", current_state);
1829 bool _mmcamcorder_commit_camera_fps (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1831 _mmcam_dbg_log("FPS(%d)", value->value.i_val);
1836 bool _mmcamcorder_commit_camera_width (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1838 MMHandleType attr = 0;
1839 int current_state = MM_CAMCORDER_STATE_NONE;
1842 attr = MMF_CAMCORDER_ATTRS(handle);
1843 mmf_return_val_if_fail(attr, FALSE);
1845 _mmcam_dbg_log("Width(%d)", value->value.i_val);
1847 current_state = _mmcamcorder_get_state( handle);
1849 if ((current_state > MM_CAMCORDER_STATE_READY) || _mmcamcorder_is_state_changing( handle ) ) {
1850 _mmcam_dbg_log("Resolution can't be changed.(state=%d)", current_state);
1853 int flags = MM_ATTRS_FLAG_NONE;
1854 MMCamAttrsInfo info;
1855 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_HEIGHT, &info);
1858 if (!(flags & MM_ATTRS_FLAG_MODIFIED)) {
1859 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_HEIGHT, &height, NULL);
1860 width = value->value.i_val;
1861 //This means that width is changed while height isn't changed. So call _mmcamcorder_commit_camera_height forcely.
1862 _mmcam_dbg_log("Call _mmcamcorder_commit_camera_height");
1863 return __mmcamcorder_set_camera_resolution(handle, width, height);
1870 bool _mmcamcorder_commit_camera_height (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1873 int current_state = MM_CAMCORDER_STATE_NONE;
1874 MMHandleType attr = 0;
1876 attr = MMF_CAMCORDER_ATTRS(handle);
1877 mmf_return_val_if_fail(attr, FALSE);
1879 _mmcam_dbg_log("Height(%d)", value->value.i_val);
1880 current_state = _mmcamcorder_get_state( handle);
1882 if ( (current_state > MM_CAMCORDER_STATE_READY) || _mmcamcorder_is_state_changing( handle )) {
1883 _mmcam_dbg_log("Resolution can't be changed.(state=%d)", current_state);
1886 height = value->value.i_val;
1887 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_WIDTH, &width, NULL);
1888 return __mmcamcorder_set_camera_resolution(handle, width, height);
1893 bool _mmcamcorder_commit_camera_zoom (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1895 _MMCamcorderSubContext *sc = NULL;
1896 int current_state = MM_CAMCORDER_STATE_NONE;
1897 GstCameraControl *control = NULL;
1898 int zoom_level = value->value.i_val;
1901 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1902 mmf_return_val_if_fail(sc, TRUE);
1904 _mmcam_dbg_log("(%d)", attr_idx);
1906 current_state = _mmcamcorder_get_state(handle);
1908 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
1912 if (attr_idx == MM_CAM_CAMERA_OPTICAL_ZOOM) {
1913 zoom_type = GST_CAMERA_CONTROL_OPTICAL_ZOOM;
1915 zoom_type = GST_CAMERA_CONTROL_DIGITAL_ZOOM;
1918 if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
1921 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
1922 _mmcam_dbg_log("Can't cast Video source into camera control.");
1926 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1928 __ta__(" gst_camera_control_set_zoom",
1929 ret = gst_camera_control_set_zoom(control, zoom_type, zoom_level);
1933 _mmcam_dbg_log("Succeed in operating Zoom[%d].", zoom_level);
1936 _mmcam_dbg_warn("Failed to operate Zoom. Type[%d],Level[%d]", zoom_type, zoom_level);
1939 _mmcam_dbg_log("pointer of video src is null");
1946 bool _mmcamcorder_commit_camera_focus_mode (MMHandleType handle, int attr_idx, const mmf_value_t *value)
1948 MMHandleType attr = 0;
1949 int current_state = MM_CAMCORDER_STATE_NONE;
1950 _MMCamcorderSubContext *sc = NULL;
1951 GstCameraControl *control = NULL;
1953 int mode, cur_focus_mode, cur_focus_range;
1955 attr = MMF_CAMCORDER_ATTRS(handle);
1956 mmf_return_val_if_fail(attr, FALSE);
1958 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1962 _mmcam_dbg_log("Focus mode(%d)", value->value.i_val);
1964 current_state = _mmcamcorder_get_state( handle);
1966 if (current_state < MM_CAMCORDER_STATE_READY) {
1967 _mmcam_dbg_log("Focus mode will be changed later.(state=%d)", current_state);
1971 if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst )
1973 int flags = MM_ATTRS_FLAG_NONE;
1974 MMCamAttrsInfo info;
1976 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
1978 _mmcam_dbg_log("Can't cast Video source into camera control.");
1982 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
1984 mslVal = value->value.i_val;
1985 mode = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
1987 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_SCAN_RANGE, &info);
1990 if (!(flags & MM_ATTRS_FLAG_MODIFIED))
1992 if( gst_camera_control_get_focus( control, &cur_focus_mode, &cur_focus_range ) )
1994 if( mode != cur_focus_mode )
1996 MMTA_ACUM_ITEM_BEGIN(" gst_camera_control_set_focus", 0);
1997 if( gst_camera_control_set_focus( control, mode, cur_focus_range ) )
1999 MMTA_ACUM_ITEM_END(" gst_camera_control_set_focus", 0);
2000 //_mmcam_dbg_log( "Succeed in setting AF mode[%d]", mslVal );
2005 _mmcam_dbg_warn( "Failed to set AF mode[%d]", mslVal );
2007 MMTA_ACUM_ITEM_END(" gst_camera_control_set_focus", 0);
2011 //_mmcam_dbg_log( "No need to set AF mode. Current[%d]", mslVal );
2017 _mmcam_dbg_warn( "Failed to get AF mode, so do not set new AF mode[%d]", mslVal );
2023 _mmcam_dbg_log("pointer of video src is null");
2029 bool _mmcamcorder_commit_camera_af_scan_range (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2031 _MMCamcorderSubContext *sc = NULL;
2032 GstCameraControl *control = NULL;
2033 int current_state = MM_CAMCORDER_STATE_NONE;
2035 int cur_focus_mode = 0;
2036 int cur_focus_range = 0;
2037 int msl_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
2038 int converted_mode = 0;
2040 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2044 _mmcam_dbg_log("(%d)", attr_idx);
2046 current_state = _mmcamcorder_get_state( handle);
2048 mslVal = value->value.i_val;
2049 newVal = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
2051 if( current_state < MM_CAMCORDER_STATE_PREPARE )
2053 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2057 if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst )
2059 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
2061 _mmcam_dbg_log("Can't cast Video source into camera control.");
2065 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2067 mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FOCUS_MODE, &msl_mode, NULL);
2068 converted_mode = _mmcamcorder_convert_msl_to_sensor( MM_CAM_CAMERA_FOCUS_MODE, msl_mode );
2070 if( gst_camera_control_get_focus( control, &cur_focus_mode, &cur_focus_range ) )
2073 if (( newVal != cur_focus_range ) || ( converted_mode != cur_focus_mode ))
2075 MMTA_ACUM_ITEM_BEGIN(" gst_camera_control_set_focus", 0);
2076 if( gst_camera_control_set_focus( control, converted_mode, newVal ) )
2078 MMTA_ACUM_ITEM_END(" gst_camera_control_set_focus", 0);
2079 //_mmcam_dbg_log( "Succeed in setting AF mode[%d]", mslVal );
2084 MMTA_ACUM_ITEM_END(" gst_camera_control_set_focus", 0);
2085 _mmcam_dbg_warn( "Failed to set AF mode[%d]", mslVal );
2090 //_mmcam_dbg_log( "No need to set AF mode. Current[%d]", mslVal );
2096 _mmcam_dbg_warn( "Failed to get AF mode, so do not set new AF mode[%d]", mslVal );
2101 _mmcam_dbg_log("pointer of video src is null");
2106 bool _mmcamcorder_commit_camera_af_touch_area (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2108 _MMCamcorderSubContext *sc = NULL;
2109 GstCameraControl *control = NULL;
2110 GstCameraControlRectType set_area = { 0, 0, 0, 0 }, get_area = { 0, 0, 0, 0 };
2112 int current_state = MM_CAMCORDER_STATE_NONE;
2114 int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
2116 gboolean do_set = FALSE;
2118 MMCamAttrsInfo info_y, info_w, info_h;
2120 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2124 _mmcam_dbg_log("(%d)", attr_idx);
2126 current_state = _mmcamcorder_get_state( handle);
2128 if( current_state < MM_CAMCORDER_STATE_PREPARE )
2130 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2134 ret = mm_camcorder_get_attributes(handle, NULL,
2135 MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
2137 if( ret != MM_ERROR_NONE )
2139 _mmcam_dbg_warn( "Failed to get FOCUS MODE.[%x]", ret );
2143 if ((focus_mode != MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO ) && (focus_mode != MM_CAMCORDER_FOCUS_MODE_CONTINUOUS))
2145 _mmcam_dbg_warn( "Focus mode is NOT TOUCH AUTO or CONTINUOUS(current[%d]). return FALSE", focus_mode );
2149 if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst )
2151 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
2153 _mmcam_dbg_log("Can't cast Video source into camera control.");
2159 case MM_CAM_CAMERA_AF_TOUCH_X:
2160 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_Y, &info_y);
2161 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w);
2162 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h);
2163 if( !( (info_y.flag|info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED) )
2165 set_area.x = value->value.i_val;
2166 mm_camcorder_get_attributes(handle, NULL,
2167 MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y,
2168 MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width,
2169 MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height,
2175 _mmcam_dbg_log( "Just store AF area[x:%d]", value->value.i_val );
2179 case MM_CAM_CAMERA_AF_TOUCH_Y:
2180 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w);
2181 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h);
2182 if( !( (info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED) )
2184 set_area.y = value->value.i_val;
2185 mm_camcorder_get_attributes(handle, NULL,
2186 MMCAM_CAMERA_AF_TOUCH_X, &set_area.x,
2187 MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width,
2188 MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height,
2194 _mmcam_dbg_log( "Just store AF area[y:%d]", value->value.i_val );
2198 case MM_CAM_CAMERA_AF_TOUCH_WIDTH:
2199 mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h);
2200 if( !( info_h.flag & MM_ATTRS_FLAG_MODIFIED) )
2202 set_area.width = value->value.i_val;
2203 mm_camcorder_get_attributes(handle, NULL,
2204 MMCAM_CAMERA_AF_TOUCH_X, &set_area.x,
2205 MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y,
2206 MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height,
2212 _mmcam_dbg_log( "Just store AF area[width:%d]", value->value.i_val );
2216 case MM_CAM_CAMERA_AF_TOUCH_HEIGHT:
2217 set_area.height = value->value.i_val;
2218 mm_camcorder_get_attributes(handle, NULL,
2219 MMCAM_CAMERA_AF_TOUCH_X, &set_area.x,
2220 MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y,
2221 MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width,
2231 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2233 __ta__( " gst_camera_control_get_focus_area",
2234 ret = gst_camera_control_get_auto_focus_area( control, &get_area );
2238 _mmcam_dbg_warn( "Failed to get AF area" );
2242 if( get_area.x == set_area.x && get_area.y == set_area.y )
2243 // width and height are not supported now.
2244 // get_area.width == set_area.width && get_area.height == set_area.height
2246 _mmcam_dbg_log( "No need to set AF area[x,y:%d,%d]", get_area.x, get_area.y );
2250 __ta__( " gst_camera_control_set_focus_area",
2251 ret = gst_camera_control_set_auto_focus_area( control, set_area );
2255 _mmcam_dbg_log( "Succeed to set AF area[%d,%d,%dx%d]", set_area.x, set_area.y, set_area.width, set_area.height );
2260 _mmcam_dbg_warn( "Failed to set AF area[%d,%d,%dx%d]", set_area.x, set_area.y, set_area.width, set_area.height );
2266 _mmcam_dbg_log("pointer of video src is null");
2273 bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2275 GstCameraControl *control = NULL;
2276 int ivalue = value->value.i_val;
2277 int mslVal1 = 0, mslVal2 = 0;
2278 int newVal1 = 0, newVal2 = 0;
2279 int cur_value1 = 0, cur_value2 = 0;
2280 int exposure_type = 0;
2281 int current_state = MM_CAMCORDER_STATE_NONE;
2282 _MMCamcorderSubContext *sc = NULL;
2284 int scene_mode = MM_CAMCORDER_SCENE_MODE_NORMAL;
2285 gboolean check_scene_mode = FALSE;
2287 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2291 current_state = _mmcamcorder_get_state( handle);
2293 if (current_state < MM_CAMCORDER_STATE_READY) {
2297 if (attr_idx == MM_CAM_CAMERA_F_NUMBER) {
2298 exposure_type = GST_CAMERA_CONTROL_F_NUMBER;
2299 mslVal1 = newVal1 = MM_CAMCORDER_GET_NUMERATOR( ivalue );
2300 mslVal2 = newVal2 = MM_CAMCORDER_GET_DENOMINATOR( ivalue );
2301 } else if (attr_idx == MM_CAM_CAMERA_SHUTTER_SPEED) {
2302 exposure_type = GST_CAMERA_CONTROL_SHUTTER_SPEED;
2303 mslVal1 = newVal1 = MM_CAMCORDER_GET_NUMERATOR( ivalue );
2304 mslVal2 = newVal2 = MM_CAMCORDER_GET_DENOMINATOR( ivalue );
2305 } else if (attr_idx == MM_CAM_CAMERA_ISO) {
2306 exposure_type = GST_CAMERA_CONTROL_ISO;
2308 newVal1 = _mmcamcorder_convert_msl_to_sensor(attr_idx, mslVal1);
2309 check_scene_mode = TRUE;
2310 } else if (attr_idx == MM_CAM_CAMERA_EXPOSURE_MODE) {
2311 exposure_type = GST_CAMERA_CONTROL_EXPOSURE_MODE;
2313 newVal1 = _mmcamcorder_convert_msl_to_sensor(attr_idx, mslVal1);
2314 } else if (attr_idx == MM_CAM_CAMERA_EXPOSURE_VALUE) {
2315 exposure_type = GST_CAMERA_CONTROL_EXPOSURE_VALUE;
2316 mslVal1 = newVal1 = MM_CAMCORDER_GET_NUMERATOR( ivalue );
2317 mslVal2 = newVal2 = MM_CAMCORDER_GET_DENOMINATOR( ivalue );
2320 if (check_scene_mode) {
2321 mm_camcorder_get_attributes(handle, NULL, MMCAM_FILTER_SCENE_MODE, &scene_mode, NULL);
2322 if (scene_mode != MM_CAMCORDER_SCENE_MODE_NORMAL) {
2323 _mmcam_dbg_warn("can not set [%d] when scene mode is NOT normal.", attr_idx);
2328 if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
2329 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2330 _mmcam_dbg_log("Can't cast Video source into camera control.");
2334 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2335 if (gst_camera_control_get_exposure(control, exposure_type, &cur_value1, &cur_value2)) {
2336 if (newVal1 != cur_value1 || newVal2 != cur_value2) {
2338 __ta__(" gst_camera_control_set_exposure",
2339 ret = gst_camera_control_set_exposure(control, exposure_type, newVal1, newVal2);
2343 //_mmcam_dbg_log( "Succeed in setting exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
2346 _mmcam_dbg_warn( "Failed to set exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
2349 //_mmcam_dbg_log( "No need to set exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
2353 _mmcam_dbg_warn( "Failed to get exposure. Type[%d]", exposure_type );
2356 _mmcam_dbg_log("pointer of video src is null");
2363 bool _mmcamcorder_commit_camera_wdr (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2365 GstCameraControl *control = NULL;
2366 int mslVal = value->value.i_val;
2367 int newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_CAMERA_WDR, mslVal);
2369 _MMCamcorderSubContext *sc = NULL;
2370 int current_state = MM_CAMCORDER_STATE_NONE;
2372 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2376 current_state = _mmcamcorder_get_state( handle);
2378 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
2379 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2383 if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst )
2385 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
2387 _mmcam_dbg_log("Can't cast Video source into camera control.");
2391 control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
2393 if( gst_camera_control_get_wdr( control, &cur_value ) )
2395 if( newVal != cur_value )
2397 if( gst_camera_control_set_wdr( control, newVal ) )
2399 //_mmcam_dbg_log( "Success - set wdr[%d]", mslVal );
2404 _mmcam_dbg_warn( "Failed to set WDR. NewVal[%d],CurVal[%d]", newVal, cur_value );
2409 //_mmcam_dbg_log( "No need to set new WDR. Current[%d]", mslVal );
2415 _mmcam_dbg_warn( "Failed to get WDR." );
2420 _mmcam_dbg_log("pointer of video src is null");
2427 bool _mmcamcorder_commit_camera_anti_handshake (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2429 GstCameraControl *control = NULL;
2430 int mslVal = value->value.i_val;
2431 int newVal = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_ANTI_HANDSHAKE, mslVal);
2433 _MMCamcorderSubContext *sc = NULL;
2434 int current_state = MM_CAMCORDER_STATE_NONE;
2436 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2440 current_state = _mmcamcorder_get_state( handle);
2442 if (current_state < MM_CAMCORDER_STATE_READY) {
2443 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2447 if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)
2449 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
2451 _mmcam_dbg_log("Can't cast Video source into camera control.");
2455 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2457 if( gst_camera_control_get_ahs( control, &cur_value ) )
2459 if( newVal != cur_value )
2461 if (gst_camera_control_set_ahs(control, newVal))
2463 //_mmcam_dbg_log("Succeed in operating anti-handshake.");
2468 _mmcam_dbg_warn("Failed to operate anti-handshake. value[%d]", newVal);
2473 //_mmcam_dbg_log( "No need to set new Anti-Handshake. Current[%d]", mslVal );
2479 _mmcam_dbg_warn( "Failed to get Anti-Handshake." );
2484 _mmcam_dbg_warn("pointer of video src is null");
2491 bool _mmcamcorder_commit_camera_hold_af_after_capturing (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2493 _MMCamcorderSubContext *sc = NULL;
2494 int current_state = MM_CAMCORDER_STATE_NONE;
2496 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2500 current_state = _mmcamcorder_get_state( handle);
2502 if( current_state < MM_CAMCORDER_STATE_READY )
2504 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2508 if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)
2510 _mmcam_dbg_log("Commit : value of Hold af after capturing is %d", value->value.i_val);
2511 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hold-af-after-capturing", value->value.i_val);
2514 _mmcam_dbg_warn("Commit : Hold af after capturing cannot be set");
2520 bool _mmcamcorder_commit_camera_rotate (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2522 int current_state = MM_CAMCORDER_STATE_NONE;
2523 gboolean bstate_changing = FALSE;
2525 _mmcam_dbg_log("rotate(%d)", value->value.i_val);
2527 current_state = _mmcamcorder_get_state( handle);
2528 bstate_changing = _mmcamcorder_is_state_changing( handle);
2530 if ((current_state > MM_CAMCORDER_STATE_READY) || bstate_changing ) {
2531 _mmcam_dbg_err("camera rotation setting failed.(state=%d, is_state_changing(%d))", current_state, bstate_changing);
2534 return _mmcamcorder_set_videosrc_rotation( handle, value->value.i_val );
2539 bool _mmcamcorder_commit_image_encoder_quality (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2541 _mmcam_dbg_log("Image encoder quality(%d)", value->value.i_val);
2546 bool _mmcamcorder_commit_target_filename (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2548 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
2549 _MMCamcorderSubContext *sc = NULL;
2550 char * filename = NULL;
2553 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2557 //Set basic infomation
2558 if (value->type != MM_ATTRS_TYPE_STRING)
2560 _mmcam_dbg_log("Mismatched value type (%d)", value->type);
2565 filename = (char*)mmf_value_get_string(value, &size);
2568 if (sc->element != NULL)
2570 if ((hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) || (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO))
2572 if (sc->element[_MMCAMCORDER_ENCSINK_BIN].gst != NULL)
2574 if (sc->element[_MMCAMCORDER_ENCSINK_SINK].gst != NULL)
2576 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename);
2577 _mmcam_dbg_log("new file location set.(%s)", filename);
2581 _mmcam_dbg_warn("filesink is not created.");
2586 _mmcam_dbg_warn("filesink is not created.");
2591 _mmcam_dbg_log("new file location set.(%s)", filename);
2596 _mmcam_dbg_warn("gstreamer pipeline is not created.");
2604 bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2606 GstColorBalance *balance = NULL;
2607 GstColorBalanceChannel *Colorchannel = NULL;
2608 const GList *controls = NULL;
2609 const GList *item = NULL;
2613 int current_state = MM_CAMCORDER_STATE_NONE;
2614 gchar * control_label = NULL;
2615 _MMCamcorderSubContext *sc = NULL;
2617 int scene_mode = MM_CAMCORDER_SCENE_MODE_NORMAL;
2618 gboolean check_scene_mode = FALSE;
2620 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2624 current_state = _mmcamcorder_get_state(handle);
2627 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
2628 //_mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2632 if (value->type != MM_ATTRS_TYPE_INT) {
2633 _mmcam_dbg_warn("Mismatched value type (%d)", value->type);
2636 mslNewVal = value->value.i_val;
2641 case MM_CAM_FILTER_BRIGHTNESS:
2642 control_label = "brightness";
2643 check_scene_mode = TRUE;
2646 case MM_CAM_FILTER_CONTRAST:
2647 control_label = "contrast";
2650 case MM_CAM_FILTER_WB:
2651 control_label = "white balance";
2652 check_scene_mode = TRUE;
2655 case MM_CAM_FILTER_COLOR_TONE:
2656 control_label = "color tone";
2659 case MM_CAM_FILTER_SATURATION:
2660 control_label = "saturation";
2661 check_scene_mode = TRUE;
2664 case MM_CAM_FILTER_HUE:
2665 control_label = "hue";
2668 case MM_CAM_FILTER_SHARPNESS:
2669 control_label = "sharpness";
2670 check_scene_mode = TRUE;
2674 if (check_scene_mode) {
2675 mm_camcorder_get_attributes(handle, NULL, MMCAM_FILTER_SCENE_MODE, &scene_mode, NULL);
2676 if (scene_mode != MM_CAMCORDER_SCENE_MODE_NORMAL) {
2677 _mmcam_dbg_warn("can not set %s when scene mode is NOT normal.", control_label);
2682 newVal = _mmcamcorder_convert_msl_to_sensor(attr_idx, mslNewVal);
2683 if (newVal == _MMCAMCORDER_SENSOR_ENUM_NONE)
2686 _mmcam_dbg_log("label(%s): MSL(%d)->Sensor(%d)", control_label, mslNewVal, newVal);
2688 if (!GST_IS_COLOR_BALANCE(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
2690 _mmcam_dbg_log("Can't cast Video source into color balance.");
2694 balance = GST_COLOR_BALANCE (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2696 controls = gst_color_balance_list_channels (balance);
2697 //_mmcam_dbg_log("controls(%x)", controls);
2698 if (controls == NULL) {
2699 _mmcam_dbg_log("There is no list of colorbalance controls");
2703 for (item = controls;item != NULL;item = item->next)
2709 Colorchannel = item->data;
2710 //_mmcam_dbg_log("Getting name of CID=(%s), input CID=(%s)", Colorchannel->label, control_label);
2712 if (strcmp(Colorchannel->label, control_label) == 0)
2717 Colorchannel = NULL;
2722 if (Colorchannel== NULL) {
2723 _mmcam_dbg_log("There is no data in the colorbalance controls(%d)", attr_idx);
2727 //_mmcam_dbg_log("Colorchannel(%x, %s)", Colorchannel, Colorchannel->label);
2729 cur_value = gst_color_balance_get_value( balance, Colorchannel );
2730 _mmcam_dbg_log( "device[cur:%d,new%d]", cur_value, newVal );
2732 if( newVal != cur_value )
2734 __ta__(" gst_color_balance_set_value",
2735 gst_color_balance_set_value (balance, Colorchannel, newVal);
2737 //_mmcam_dbg_log( "Set complete - %s[%d]", Colorchannel->label, mslNewVal );
2741 _mmcam_dbg_log( "No need to set %s. Current[%d]", Colorchannel->label, mslNewVal);
2748 bool _mmcamcorder_commit_filter_scene_mode (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2750 GstCameraControl *control = NULL;
2751 int mslVal = value->value.i_val;
2752 int newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_FILTER_SCENE_MODE, mslVal );
2753 int cur_program_mode = MM_CAMCORDER_SCENE_MODE_NORMAL;
2754 _MMCamcorderSubContext *sc = NULL;
2755 int current_state = MM_CAMCORDER_STATE_NONE;
2757 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2761 current_state = _mmcamcorder_get_state( handle);
2763 if (current_state < MM_CAMCORDER_STATE_PREPARE) {
2764 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2768 if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
2769 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
2770 _mmcam_dbg_log("Can't cast Video source into camera control.");
2774 control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
2775 if( gst_camera_control_get_exposure( control, GST_CAMERA_CONTROL_PROGRAM_MODE, &cur_program_mode, NULL ) )
2777 if( newVal != cur_program_mode )
2780 __ta__(" gst_camera_control_set_exposure:GST_CAMERA_CONTROL_PROGRAM_MODE",
2781 ret = gst_camera_control_set_exposure(control, GST_CAMERA_CONTROL_PROGRAM_MODE, newVal, 0);
2784 _mmcam_dbg_log("Succeed in setting program mode[%d].", mslVal);
2786 if (mslVal == MM_CAMCORDER_SCENE_MODE_NORMAL) {
2790 , MM_CAM_FILTER_BRIGHTNESS
2792 , MM_CAM_FILTER_SATURATION
2793 , MM_CAM_FILTER_SHARPNESS
2795 mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
2797 for (i = 0 ; i < ARRAY_SIZE(attr_idxs) ; i++) {
2798 if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs[i])) {
2799 mmf_attribute_set_modified(&(attr->items[attr_idxs[i]]));
2806 _mmcam_dbg_log( "Failed to set program mode[%d].", mslVal );
2809 _mmcam_dbg_log( "No need to set program mode. Current[%d]", mslVal );
2813 _mmcam_dbg_warn( "Failed to get program mode, so do not set new program mode[%d]", mslVal );
2816 _mmcam_dbg_warn("pointer of video src is null");
2823 bool _mmcamcorder_commit_filter_flip (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2825 _mmcam_dbg_warn("Filter Flip(%d)", value->value.i_val);
2830 bool _mmcamcorder_commit_camcorder_rotate(MMHandleType handle, int attr_idx, const mmf_value_t *value)
2832 int current_state = MM_CAMCORDER_STATE_NONE;
2833 gboolean bstate_changing = FALSE;
2835 _mmcam_dbg_log("camcorder-rotation(%d)", value->value.i_val);
2836 current_state = _mmcamcorder_get_state( handle);
2837 bstate_changing = _mmcamcorder_is_state_changing( handle);
2839 if ((current_state > MM_CAMCORDER_STATE_PREPARE) || bstate_changing ) {
2840 _mmcam_dbg_err("camcorder-rotation setting failed.(state=%d, is_state_changing(%d))", current_state, bstate_changing);
2848 bool _mmcamcorder_commit_audio_input_route (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2850 _mmcam_dbg_log("Commit : Do nothing. this attr will be removed soon.");
2856 bool _mmcamcorder_commit_display_handle (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2858 _MMCamcorderSubContext *sc = NULL;
2860 char* videosink_name = NULL;
2862 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2868 _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
2869 _mmcam_dbg_log( "Commit : videosinkname[%s]", videosink_name );
2871 if( !strcmp( videosink_name, "xvimagesink" ) || !strcmp( videosink_name, "xvimagesink" ) )
2875 if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
2877 _mmcam_dbg_log( "Commit : Set XID[%x]", *(int*)(value->value.p_val) );
2878 gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), *(int*)(value->value.p_val) );
2884 _mmcam_dbg_log( "Commit : Nothing to commit with this element[%s]", videosink_name );
2889 _mmcam_dbg_log( "Commit : Nothing to commit with this attribute(MM_CAMCORDER_DISPLAY_HANDLE)" );
2897 bool _mmcamcorder_commit_display_rotation (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2899 mmf_camcorder_t *hcamcorder = NULL;
2900 _MMCamcorderSubContext *sc = NULL;
2901 int current_state = MM_CAMCORDER_STATE_NONE;
2903 hcamcorder = MMF_CAMCORDER(handle);
2906 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2910 current_state = _mmcamcorder_get_state( handle);
2912 if( current_state > MM_CAMCORDER_STATE_NULL ) {
2913 if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO ) {
2914 return _mmcamcorder_set_display_rotation( handle, value->value.i_val );
2916 _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
2920 _mmcam_dbg_err("display rotation change failed.(state=%d)", current_state);
2926 bool _mmcamcorder_commit_display_visible (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2928 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
2929 _MMCamcorderSubContext *sc = NULL;
2932 int current_state = MM_CAMCORDER_STATE_NONE;
2935 char *videosink_name = NULL;
2937 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
2940 current_state = _mmcamcorder_get_state( handle);
2942 if( current_state > MM_CAMCORDER_STATE_NULL )
2944 if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO )
2946 if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
2948 // Get videosink name
2949 _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
2951 is_visible = value->value.i_val;
2953 if( !strcmp( videosink_name, "xvimagesink" )
2954 || !strcmp( videosink_name, "avsysvideosink" ) )
2956 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
2957 "visible", is_visible);
2959 _mmcam_dbg_log( "Set visible [%d] done.", is_visible );
2964 _mmcam_dbg_warn( "videosink[%s] does not support VISIBLE.", videosink_name );
2970 _mmcam_dbg_warn( "Videosink element is null, but current state is [%d]", current_state );
2976 _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
2982 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
2989 bool _mmcamcorder_commit_display_geometry_method (MMHandleType handle, int attr_idx, const mmf_value_t *value)
2991 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
2992 _MMCamcorderSubContext *sc = NULL;
2995 int current_state = MM_CAMCORDER_STATE_NONE;
2998 char *videosink_name = NULL;
3000 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3003 current_state = _mmcamcorder_get_state( handle);
3005 if (current_state > MM_CAMCORDER_STATE_NULL)
3007 if (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)
3009 // Get videosink name
3010 _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
3012 if(strcmp(videosink_name, "xvimagesink") == 0) //only for xvimagesink
3014 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO)
3016 newattrs = value->value.i_val;
3017 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-geometry-method", newattrs);
3024 _mmcam_dbg_log("Videosink element is null");
3030 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
3038 bool _mmcamcorder_commit_display_rect (MMHandleType handle, int attr_idx, const mmf_value_t *value)
3040 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
3041 _MMCamcorderSubContext *sc = NULL;
3043 int current_state = MM_CAMCORDER_STATE_NONE;
3046 char *videosink_name = NULL;
3048 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3051 current_state = _mmcamcorder_get_state( handle);
3053 if (current_state > MM_CAMCORDER_STATE_NULL)
3055 if (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)
3057 // Get videosink name
3058 _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
3060 if(strcmp(videosink_name, "xvimagesink") == 0) //only for xvimagesink
3062 if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO)
3065 int rectx, recty, rectw, recth;
3066 int display_geometry_method = 0;
3068 err = mm_camcorder_get_attributes(handle, NULL,
3069 MMCAM_DISPLAY_RECT_X, &rectx,
3070 MMCAM_DISPLAY_RECT_Y, &recty,
3071 MMCAM_DISPLAY_RECT_WIDTH, &rectw,
3072 MMCAM_DISPLAY_RECT_HEIGHT, &recth,
3073 MMCAM_DISPLAY_GEOMETRY_METHOD, &display_geometry_method,
3077 _mmcam_dbg_warn("Get display-geometry-method attrs fail. (%x)", err);
3081 if (display_geometry_method == MM_DISPLAY_METHOD_CUSTOM_ROI)
3083 int flags = MM_ATTRS_FLAG_NONE;
3084 MMCamAttrsInfo info;
3085 _mmcam_dbg_log("FRECT(x,y,w,h) = (%d,%d,%d,%d)", rectx, recty, rectw, recth);
3088 case MM_CAM_DISPLAY_RECT_X:
3089 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_Y, &info);
3091 memset(&info, 0x00, sizeof(info));
3092 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
3094 memset(&info, 0x00, sizeof(info));
3095 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
3098 rectx = value->value.i_val;
3100 case MM_CAM_DISPLAY_RECT_Y:
3101 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
3103 memset(&info, 0x00, sizeof(info));
3104 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
3107 recty = value->value.i_val;
3109 case MM_CAM_DISPLAY_RECT_WIDTH:
3110 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
3113 rectw = value->value.i_val;
3115 case MM_CAM_DISPLAY_RECT_HEIGHT:
3116 recth = value->value.i_val;
3119 _mmcam_dbg_err("Wrong attr_idx!");
3123 if (!(flags & MM_ATTRS_FLAG_MODIFIED))
3125 _mmcam_dbg_log("RECT(x,y,w,h) = (%d,%d,%d,%d)", rectx, recty, rectw, recth);
3127 //Do we need to check all?
3128 if(g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)), "dst-roi-x"))
3130 g_object_set (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
3145 _mmcam_dbg_log("Videosink element is null");
3151 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
3159 bool _mmcamcorder_commit_display_scale (MMHandleType handle, int attr_idx, const mmf_value_t *value)
3161 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
3162 _MMCamcorderSubContext *sc = NULL;
3165 int current_state = MM_CAMCORDER_STATE_NONE;
3168 char *videosink_name = NULL;
3170 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3173 current_state = _mmcamcorder_get_state( handle);
3175 if( current_state > MM_CAMCORDER_STATE_NULL )
3177 if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO )
3179 if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
3181 // Get videosink name
3182 _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
3184 zoom = value->value.i_val;
3186 if( !strcmp( videosink_name, "xvimagesink" ))
3191 case MM_DISPLAY_SCALE_DEFAULT:
3193 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 1);
3195 _mmcam_dbg_log( "Set display zoom to default.");
3198 case MM_DISPLAY_SCALE_DOUBLE_LENGTH:
3200 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 2);
3202 _mmcam_dbg_log( "Set display zoom to double.");
3205 case MM_DISPLAY_SCALE_TRIPLE_LENGTH:
3207 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 3);
3209 _mmcam_dbg_log( "Set display zoom to triple.");
3214 _mmcam_dbg_warn( "Unsupported value.");
3220 else if (!strcmp( videosink_name, "avsysvideosink" ) )
3227 _mmcam_dbg_warn( "videosink[%s] does not support 'zoom'.", videosink_name );
3233 _mmcam_dbg_warn( "Videosink element is null, but current state is [%d]", current_state );
3239 _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
3245 _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
3253 bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_value_t *value)
3256 _MMCamcorderSubContext* sc = NULL;
3257 int strobe_type, mslVal, newVal, cur_value;
3258 int current_state = MM_CAMCORDER_STATE_NONE;
3260 sc = MMF_CAMCORDER_SUBCONTEXT( handle );
3264 _mmcam_dbg_log( "Commit : strobe attribute(%d)", attr_idx );
3267 current_state = _mmcamcorder_get_state( handle);
3269 if (current_state < MM_CAMCORDER_STATE_PREPARE ||
3270 current_state == MM_CAMCORDER_STATE_CAPTURING) {
3271 //_mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
3275 mslVal = value->value.i_val;
3279 case MM_CAM_STROBE_CONTROL:
3280 strobe_type = GST_CAMERA_CONTROL_STROBE_CONTROL;
3281 newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_STROBE_CONTROL, mslVal);
3283 case MM_CAM_STROBE_CAPABILITIES:
3284 strobe_type = GST_CAMERA_CONTROL_STROBE_CAPABILITIES;
3287 case MM_CAM_STROBE_MODE:
3288 strobe_type = GST_CAMERA_CONTROL_STROBE_MODE;
3289 newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_STROBE_MODE, mslVal);
3293 _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
3298 GstCameraControl *control = NULL;
3299 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
3301 _mmcam_dbg_err("Can't cast Video source into camera control.");
3306 control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
3308 if( gst_camera_control_get_strobe( control, strobe_type, &cur_value ) )
3310 if( newVal != cur_value )
3312 if( gst_camera_control_set_strobe( control, strobe_type, newVal ) )
3314 _mmcam_dbg_log( "Succeed in setting strobe. Type[%d],value[%d]", strobe_type, mslVal );
3319 _mmcam_dbg_warn( "Set strobe failed. Type[%d],value[%d]", strobe_type, mslVal );
3325 _mmcam_dbg_log( "No need to set strobe. Type[%d],value[%d]", strobe_type, mslVal );
3331 _mmcam_dbg_warn( "Failed to get strobe. Type[%d]", strobe_type );
3340 bool _mmcamcorder_commit_detect (MMHandleType handle, int attr_idx, const mmf_value_t *value)
3343 _MMCamcorderSubContext* sc = NULL;
3344 int detect_type, mslVal, newVal, curVal;
3345 GstCameraControl *control = NULL;
3346 int current_state = MM_CAMCORDER_STATE_NONE;
3348 sc = MMF_CAMCORDER_SUBCONTEXT( handle );
3352 _mmcam_dbg_log( "Commit : detect attribute(%d)", attr_idx);
3355 current_state = _mmcamcorder_get_state( handle);
3357 if (current_state < MM_CAMCORDER_STATE_READY) {
3358 //_mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
3364 case MM_CAM_DETECT_MODE:
3365 detect_type = GST_CAMERA_CONTROL_FACE_DETECT_MODE;
3367 case MM_CAM_DETECT_NUMBER:
3368 detect_type = GST_CAMERA_CONTROL_FACE_DETECT_NUMBER;
3370 case MM_CAM_DETECT_FOCUS_SELECT:
3371 detect_type = GST_CAMERA_CONTROL_FACE_FOCUS_SELECT;
3373 case MM_CAM_DETECT_SELECT_NUMBER:
3374 detect_type = GST_CAMERA_CONTROL_FACE_SELECT_NUMBER;
3376 case MM_CAM_DETECT_STATUS:
3377 detect_type = GST_CAMERA_CONTROL_FACE_DETECT_STATUS;
3381 _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
3387 mslVal = value->value.i_val;
3388 newVal = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
3391 if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
3393 _mmcam_dbg_err("Can't cast Video source into camera control.");
3398 control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
3400 if( gst_camera_control_get_detect( control, detect_type, &curVal ) )
3402 if( curVal == newVal )
3404 _mmcam_dbg_log( "No need to set detect. Type[%d],value[%d]", detect_type, mslVal );
3409 if( !gst_camera_control_set_detect( control, detect_type, newVal ) )
3411 _mmcam_dbg_warn( "Set detect failed. Type[%d],value[%d]", detect_type, mslVal );
3416 _mmcam_dbg_log( "Set detect success. Type[%d],value[%d]", detect_type, mslVal );
3423 _mmcam_dbg_warn( "Get detect failed. Type[%d]", detect_type );
3433 __mmcamcorder_attrs_is_supported(MMHandleType handle, int idx)
3435 mmf_attrs_t *attr = (mmf_attrs_t*)handle;
3438 if (mm_attrs_get_flags(handle, idx, &flag) == MM_ERROR_NONE) {
3439 if (flag == MM_ATTRS_FLAG_NONE) {
3446 if (attr->items[idx].value_spec.type == MM_ATTRS_VALID_TYPE_INT_RANGE) {
3448 mm_attrs_get_valid_range((MMHandleType)attr, idx, &min, &max);
3452 } else if (attr->items[idx].value_spec.type == MM_ATTRS_VALID_TYPE_INT_ARRAY) {
3455 mm_attrs_get_valid_array((MMHandleType)attr, idx, &count, &array);
3466 _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
3468 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
3469 mmf_attrs_t *attr = NULL;
3471 int scene_mode = MM_CAMCORDER_SCENE_MODE_NORMAL;
3475 int attr_idxs_default[] = {
3476 MM_CAM_CAMERA_DIGITAL_ZOOM
3477 , MM_CAM_CAMERA_OPTICAL_ZOOM
3478 , MM_CAM_CAMERA_FOCUS_MODE
3479 , MM_CAM_CAMERA_AF_SCAN_RANGE
3480 , MM_CAM_CAMERA_EXPOSURE_MODE
3481 , MM_CAM_CAMERA_EXPOSURE_VALUE
3482 , MM_CAM_CAMERA_F_NUMBER
3483 , MM_CAM_CAMERA_SHUTTER_SPEED
3485 , MM_CAM_CAMERA_ANTI_HANDSHAKE
3486 , MM_CAM_CAMERA_FPS_AUTO
3487 , MM_CAM_CAMERA_HOLD_AF_AFTER_CAPTURING
3488 , MM_CAM_FILTER_CONTRAST
3489 , MM_CAM_FILTER_COLOR_TONE
3491 , MM_CAM_STROBE_CONTROL
3492 , MM_CAM_STROBE_MODE
3493 , MM_CAM_DETECT_MODE
3494 , MM_CAM_DETECT_NUMBER
3495 , MM_CAM_DETECT_FOCUS_SELECT
3496 , MM_CAM_DETECT_SELECT_NUMBER
3497 , MM_CAM_CAMERA_AF_TOUCH_X
3498 , MM_CAM_CAMERA_AF_TOUCH_Y
3499 , MM_CAM_CAMERA_AF_TOUCH_WIDTH
3500 , MM_CAM_CAMERA_AF_TOUCH_HEIGHT
3503 int attr_idxs_extra[] = {
3505 , MM_CAM_FILTER_BRIGHTNESS
3507 , MM_CAM_FILTER_SATURATION
3508 , MM_CAM_FILTER_SHARPNESS
3511 mmf_return_val_if_fail(hcamcorder, FALSE);
3513 _mmcam_dbg_log("Set all attribute again.");
3515 MMTA_ACUM_ITEM_BEGIN(" _mmcamcorder_set_attribute_to_camsensor", 0);
3517 attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
3519 _mmcam_dbg_err("Get attribute handle failed.");
3522 /* Get Scene mode */
3523 mm_camcorder_get_attributes(handle, NULL, MMCAM_FILTER_SCENE_MODE, &scene_mode, NULL);
3525 _mmcam_dbg_log("attribute count(%d)", attr->count);
3527 for (i = 0 ; i < ARRAY_SIZE(attr_idxs_default) ; i++) {
3528 if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs_default[i])) {
3529 mmf_attribute_set_modified(&(attr->items[attr_idxs_default[i]]));
3533 /* Set extra if scene mode is NORMAL */
3534 if (scene_mode == MM_CAMCORDER_SCENE_MODE_NORMAL) {
3535 for (i = 0 ; i < ARRAY_SIZE(attr_idxs_extra) ; i++) {
3536 if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs_extra[i])) {
3537 mmf_attribute_set_modified(&(attr->items[attr_idxs_extra[i]]));
3541 /* Set scene mode if scene mode is NOT NORMAL */
3542 if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, MM_CAM_FILTER_SCENE_MODE)) {
3543 mmf_attribute_set_modified(&(attr->items[MM_CAM_FILTER_SCENE_MODE]));
3547 if (mmf_attrs_commit((MMHandleType)attr) == -1) {
3554 MMTA_ACUM_ITEM_END(" _mmcamcorder_set_attribute_to_camsensor", 0);
3556 _mmcam_dbg_log("Done.");
3562 int _mmcamcorder_lock_readonly_attributes(MMHandleType handle)
3564 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
3567 mmf_attrs_t *attr = NULL;
3568 int nerror = MM_ERROR_NONE ;
3570 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
3572 attr = (mmf_attrs_t*) MMF_CAMCORDER_ATTRS(handle);
3573 mmf_return_val_if_fail(attr, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3577 table_size = ARRAY_SIZE(readonly_attributes);
3578 _mmcam_dbg_log("%d", table_size);
3579 for (i = 0; i < table_size; i++)
3581 int sCategory = readonly_attributes[i];
3583 mmf_attribute_set_readonly(&(attr->items[sCategory]));
3590 int _mmcamcorder_set_disabled_attributes(MMHandleType handle)
3592 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
3593 //int table_size = 0;
3595 mmf_attrs_t *attr = NULL;
3596 type_string_array * disabled_attr = NULL;
3598 int nerror = MM_ERROR_NONE ;
3600 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
3602 attr = (mmf_attrs_t*) MMF_CAMCORDER_ATTRS(handle);
3603 mmf_return_val_if_fail(attr, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
3608 _mmcamcorder_conf_get_value_string_array( hcamcorder->conf_main,
3609 CONFIGURE_CATEGORY_MAIN_GENERAL,
3610 "DisabledAttributes",
3612 if (disabled_attr != NULL && disabled_attr->value) {
3613 cnt_str = disabled_attr->count;
3614 for (i = 0; i < cnt_str; i++) {
3616 _mmcam_dbg_log("[%d]%s", i, disabled_attr->value[i] );
3617 nerror = mm_attrs_get_index((MMHandleType)attr, disabled_attr->value[i], &idx);
3618 if (nerror == MM_ERROR_NONE) {
3619 mmf_attribute_set_disabled(&(attr->items[idx]));
3621 _mmcam_dbg_warn("No ATTR named %s[%d]",disabled_attr->value[i], i);
3630 /*---------------------------------------------------------------------------------------
3631 | INTERNAL FUNCTION DEFINITIONS: |
3632 ---------------------------------------------------------------------------------------*/
3633 static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width, int height)
3635 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
3636 _MMCamcorderSubContext *sc = NULL;
3637 int current_state = MM_CAMCORDER_STATE_NULL;
3639 mmf_return_val_if_fail(hcamcorder, FALSE);
3641 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3642 mmf_return_val_if_fail(sc && sc->info, TRUE);
3644 current_state = _mmcamcorder_get_state(handle);
3646 if (sc->element && sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
3647 if (current_state <= MM_CAMCORDER_STATE_PREPARE) {
3648 _mmcam_dbg_log("set capture width and height [%dx%d] to camera plugin", width, height);
3649 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-width", width);
3650 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-height", height);
3652 _mmcam_dbg_warn("invalid state[%d]", current_state);
3656 _mmcam_dbg_log("element is not created yet");
3663 static bool __mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int height)
3665 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
3667 _MMCamcorderSubContext *sc = NULL;
3668 GstCaps *caps = NULL;
3669 int set_width, set_height;
3671 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
3675 mm_camcorder_get_attributes(handle, NULL,
3676 MMCAM_CAMERA_FPS, &fps,
3677 "camera-slow-motion-fps", &slow_fps,
3680 if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
3683 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps);
3685 sc->is_slow = FALSE;
3686 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", 0);
3689 sc->is_slow = FALSE;
3693 set_height = height;
3695 caps = gst_caps_new_simple( "video/x-raw-yuv",
3696 "format", GST_TYPE_FOURCC, sc->fourcc,
3697 "width", G_TYPE_INT, set_width,
3698 "height", G_TYPE_INT, set_height,
3699 "framerate", GST_TYPE_FRACTION, (sc->is_slow ? slow_fps : fps), 1,
3702 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
3703 gst_caps_unref(caps);
3709 __mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args )
3711 #define INIT_VALUE -1
3712 #define CHECK_COUNT 2
3713 #define CAMERA_RESOLUTION 0
3714 #define CAPTURE_RESOLUTION 1
3716 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
3717 MMHandleType attrs = 0;
3719 int ret = MM_ERROR_NONE;
3722 char *check_pair_name[2][3] = {
3723 { MMCAM_CAMERA_WIDTH, MMCAM_CAMERA_HEIGHT, "MMCAM_CAMERA_WIDTH and HEIGHT" },
3724 { MMCAM_CAPTURE_WIDTH, MMCAM_CAPTURE_HEIGHT, "MMCAM_CAPTURE_WIDTH and HEIGHT" },
3727 int check_pair_value[2][2] = {
3728 { INIT_VALUE, INIT_VALUE },
3729 { INIT_VALUE, INIT_VALUE },
3732 if( hcamcorder == NULL || attribute_name == NULL )
3734 _mmcam_dbg_warn( "handle[%p] or attribute_name[%p] is NULL.",
3735 hcamcorder, attribute_name );
3736 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
3740 *err_attr_name = NULL;
3742 //_mmcam_dbg_log( "ENTER" );
3744 attrs = MMF_CAMCORDER_ATTRS(handle);
3746 name = (char*)attribute_name;
3751 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
3753 /*_mmcam_dbg_log( "NAME : %s", name );*/
3755 /* attribute name check */
3756 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
3759 *err_attr_name = strdup(name);
3761 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
3762 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
3768 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
3773 case MM_ATTRS_TYPE_INT:
3775 gboolean matched = FALSE;
3776 for( i = 0 ; i < CHECK_COUNT ; i++ ) {
3777 for( j = 0 ; j < 2 ; j++ ) {
3778 if( !strcmp( name, check_pair_name[i][j] ) )
3780 check_pair_value[i][j] = va_arg( (var_args), int );
3781 _mmcam_dbg_log( "%s : %d", check_pair_name[i][j], check_pair_value[i][j] );
3789 if( matched == FALSE )
3791 va_arg ((var_args), int);
3795 case MM_ATTRS_TYPE_DOUBLE:
3796 va_arg ((var_args), double);
3798 case MM_ATTRS_TYPE_STRING:
3799 va_arg ((var_args), char*); /* string */
3800 va_arg ((var_args), int); /* size */
3802 case MM_ATTRS_TYPE_DATA:
3803 va_arg ((var_args), void*); /* data */
3804 va_arg ((var_args), int); /* size */
3806 case MM_ATTRS_TYPE_ARRAY:
3807 va_arg ((var_args), void*); /* array */
3808 va_arg ((var_args), int); /* length */
3810 case MM_ATTRS_TYPE_RANGE:
3811 va_arg ((var_args), int); /* min */
3812 va_arg ((var_args), int); /* max */
3814 case MM_ATTRS_TYPE_INVALID:
3816 _mmcam_dbg_err( "Not supported attribute type(%d, name:%s)", attr_type, name);
3818 *err_attr_name = strdup(name);
3819 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
3823 name = va_arg (var_args, char*);
3826 for( i = 0 ; i < CHECK_COUNT ; i++ )
3828 if( check_pair_value[i][0] != INIT_VALUE || check_pair_value[i][1] != INIT_VALUE )
3830 gboolean check_result = FALSE;
3831 char *err_name = NULL;
3832 MMCamAttrsInfo attr_info_0, attr_info_1;
3834 if( check_pair_value[i][0] == INIT_VALUE )
3836 mm_attrs_get_int_by_name( attrs, check_pair_name[i][0], &check_pair_value[i][0] );
3837 err_name = strdup(check_pair_name[i][1]);
3839 else if( check_pair_value[i][1] == INIT_VALUE )
3841 mm_attrs_get_int_by_name( attrs, check_pair_name[i][1], &check_pair_value[i][1] );
3842 err_name = strdup(check_pair_name[i][0]);
3846 err_name = strdup(check_pair_name[i][2]);
3849 mm_camcorder_get_attribute_info(handle, check_pair_name[i][0], &attr_info_0);
3850 mm_camcorder_get_attribute_info(handle, check_pair_name[i][1], &attr_info_1);
3852 check_result = FALSE;
3854 for( j = 0 ; j < attr_info_0.int_array.count ; j++ ) {
3855 if( attr_info_0.int_array.array[j] == check_pair_value[i][0]
3856 && attr_info_1.int_array.array[j] == check_pair_value[i][1] )
3858 _mmcam_dbg_log( "Valid Pair[%s,%s] existed %dx%d[index:%d]",
3859 check_pair_name[i][0], check_pair_name[i][1],
3860 check_pair_value[i][0], check_pair_value[i][1], i );
3861 check_result = TRUE;
3866 if( check_result == FALSE )
3868 _mmcam_dbg_err( "INVALID pair[%s,%s] %dx%d",
3869 check_pair_name[i][0], check_pair_name[i][1],
3870 check_pair_value[i][0], check_pair_value[i][1] );
3872 *err_attr_name = err_name;
3874 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
3879 /*_mmcam_dbg_log("DONE");*/
3881 return MM_ERROR_NONE;