X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_attribute.c;h=a5a88e4072695f426ad3a630c32ac38ce2f4b90a;hb=refs%2Fchanges%2F24%2F57924%2F3;hp=b7dd25a392123f501eee3e8b094f954fd83685e9;hpb=c8f57d6b6b2d7fc65adeedb5acd6eae45d28537f;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index b7dd25a..a5a88e4 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -38,6 +38,8 @@ -----------------------------------------------------------------------*/ #define MMCAMCORDER_DEFAULT_CAMERA_WIDTH 640 #define MMCAMCORDER_DEFAULT_CAMERA_HEIGHT 480 +#define MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_BITRATE (1024*1024*10) +#define MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_GOP_INTERVAL 1000 /*--------------------------------------------------------------------------------------- | GLOBAL VARIABLE DEFINITIONS for internal | @@ -153,9 +155,9 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, {(void*)MM_AUDIO_DEVICE_MIC}, - MM_ATTRS_VALID_TYPE_INT_RANGE, - {.int_min = 0}, - {.int_max = (MM_AUDIO_DEVICE_NUM-1)}, + MM_ATTRS_VALID_TYPE_INT_ARRAY, + {NULL}, + {0}, NULL, }, { @@ -388,7 +390,7 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) {(void*)1}, MM_ATTRS_VALID_TYPE_DOUBLE_RANGE, {.double_min = 0.0}, - {.double_max = _MMCAMCORDER_MAX_INT}, + {.double_max = _MMCAMCORDER_MAX_DOUBLE}, _mmcamcorder_commit_camera_recording_motion_rate, }, { @@ -397,9 +399,9 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, {(void*)30}, - MM_ATTRS_VALID_TYPE_INT_ARRAY, - {0}, + MM_ATTRS_VALID_TYPE_INT_RANGE, {0}, + {1024}, _mmcamcorder_commit_camera_fps, }, { @@ -696,7 +698,7 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) "display-surface", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, - {(void*)MM_DISPLAY_SURFACE_X}, + {(void*)MM_DISPLAY_SURFACE_OVERLAY}, MM_ATTRS_VALID_TYPE_INT_ARRAY, {0}, {0}, @@ -1410,6 +1412,73 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info ) {.int_min = FALSE}, {.int_max = TRUE}, NULL, + }, + { + MM_CAM_ENCODED_PREVIEW_BITRATE, + "encoded-preview-bitrate", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_BITRATE}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + {.int_min = 0}, + {.int_max = _MMCAMCORDER_MAX_INT}, + _mmcamcorder_commit_encoded_preview_bitrate, + }, + { + MM_CAM_ENCODED_PREVIEW_GOP_INTERVAL, + "encoded-preview-gop-interval", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)MMCAMCORDER_DEFAULT_ENCODED_PREVIEW_GOP_INTERVAL}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + {.int_min = 0}, + {.int_max = _MMCAMCORDER_MAX_INT}, + _mmcamcorder_commit_encoded_preview_gop_interval, + }, + { + MM_CAM_RECORDER_TAG_ENABLE, + "recorder-tag-enable", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)FALSE}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + {.int_min = FALSE}, + {.int_max = TRUE}, + NULL, + }, + { + MM_CAM_DISPLAY_SOCKET_PATH, + "display-socket-path", + MMF_VALUE_TYPE_STRING, + MM_ATTRS_FLAG_RW, + {(void*)NULL}, + MM_ATTRS_VALID_TYPE_NONE, + {0}, + {0}, + NULL, + }, + { + MM_CAM_PID_FOR_SOUND_FOCUS, + "pid-for-sound-focus", + MMF_VALUE_TYPE_INT, + MM_ATTRS_FLAG_RW, + {(void*)0}, + MM_ATTRS_VALID_TYPE_INT_RANGE, + {.int_min = 0}, + {.int_max = _MMCAMCORDER_MAX_INT}, + _mmcamcorder_commit_pid_for_sound_focus, + }, + //120 + { + MM_CAM_ROOT_DIRECTORY, + "root-directory", + MMF_VALUE_TYPE_STRING, + MM_ATTRS_FLAG_RW, + {(void*)NULL}, + MM_ATTRS_VALID_TYPE_NONE, + {0}, + {0}, + NULL, } }; @@ -1954,9 +2023,9 @@ bool _mmcamcorder_commit_camera_fps (MMHandleType handle, int attr_idx, const mm _mmcam_dbg_log("FPS(%d)", value->value.i_val); ret = mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_WIDTH, &resolution_width, - MMCAM_CAMERA_HEIGHT, &resolution_height, - NULL); + MMCAM_CAMERA_WIDTH, &resolution_width, + MMCAM_CAMERA_HEIGHT, &resolution_height, + NULL); if(ret != MM_ERROR_NONE) { _mmcam_dbg_err("FAILED : coult not get resolution values."); @@ -1964,13 +2033,12 @@ bool _mmcamcorder_commit_camera_fps (MMHandleType handle, int attr_idx, const mm } ret = mm_camcorder_get_fps_list_by_resolution(handle, resolution_width, resolution_height, &fps_info); - - if(ret != MM_ERROR_NONE) { + if (ret != MM_ERROR_NONE) { _mmcam_dbg_err("FAILED : coult not get FPS values by resolution."); return FALSE; } - for(i=0; ivalue.i_val == fps_info.int_array.array[i]) { return TRUE; } @@ -2062,7 +2130,14 @@ bool _mmcamcorder_commit_camera_width(MMHandleType handle, int attr_idx, const m NULL); if (current_state == MM_CAMCORDER_STATE_PREPARE) { - if (!pthread_mutex_trylock(&(hcamcorder->restart_preview_lock))) { + if (hcamcorder->resolution_changed == FALSE) { + _mmcam_dbg_log("no need to restart preview"); + return TRUE; + } + + hcamcorder->resolution_changed = FALSE; + + if (g_mutex_trylock(&hcamcorder->restart_preview_lock)) { _mmcam_dbg_log("restart preview"); MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "empty-buffers", TRUE); @@ -2081,7 +2156,7 @@ bool _mmcamcorder_commit_camera_width(MMHandleType handle, int attr_idx, const m _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_PLAYING); /* unlock */ - pthread_mutex_unlock(&(hcamcorder->restart_preview_lock)); + g_mutex_unlock(&hcamcorder->restart_preview_lock); } else { _mmcam_dbg_err("currently locked for preview restart"); return FALSE; @@ -2120,7 +2195,7 @@ bool _mmcamcorder_commit_camera_height(MMHandleType handle, int attr_idx, const mmf_return_val_if_fail(attr, FALSE); _mmcam_dbg_log("Height(%d)", value->value.i_val); - current_state = _mmcamcorder_get_state( handle); + current_state = _mmcamcorder_get_state(handle); if (current_state > MM_CAMCORDER_STATE_PREPARE) { _mmcam_dbg_log("Resolution can't be changed.(state=%d)", current_state); @@ -2143,7 +2218,14 @@ bool _mmcamcorder_commit_camera_height(MMHandleType handle, int attr_idx, const sc->info_video->preview_height = height; if (current_state == MM_CAMCORDER_STATE_PREPARE) { - if (!pthread_mutex_trylock(&(hcamcorder->restart_preview_lock))) { + if (hcamcorder->resolution_changed == FALSE) { + _mmcam_dbg_log("no need to restart preview"); + return TRUE; + } + + hcamcorder->resolution_changed = FALSE; + + if (g_mutex_trylock(&hcamcorder->restart_preview_lock)) { _mmcam_dbg_log("restart preview"); _mmcam_dbg_log("set empty buffers"); @@ -2165,7 +2247,7 @@ bool _mmcamcorder_commit_camera_height(MMHandleType handle, int attr_idx, const _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_PLAYING); /* unlock */ - pthread_mutex_unlock(&(hcamcorder->restart_preview_lock)); + g_mutex_unlock(&hcamcorder->restart_preview_lock); } else { _mmcam_dbg_err("currently locked for preview restart"); return FALSE; @@ -2408,11 +2490,13 @@ bool _mmcamcorder_commit_camera_af_scan_range (MMHandleType handle, int attr_idx return FALSE; } + bool _mmcamcorder_commit_camera_af_touch_area (MMHandleType handle, int attr_idx, const mmf_value_t *value) { _MMCamcorderSubContext *sc = NULL; GstCameraControl *control = NULL; - GstCameraControlRectType set_area = { 0, 0, 0, 0 }, get_area = { 0, 0, 0, 0 }; + GstCameraControlRectType set_area = { 0, 0, 0, 0 }; + GstCameraControlRectType get_area = { 0, 0, 0, 0 }; int current_state = MM_CAMCORDER_STATE_NONE; int ret = FALSE; @@ -2420,154 +2504,179 @@ bool _mmcamcorder_commit_camera_af_touch_area (MMHandleType handle, int attr_idx gboolean do_set = FALSE; - MMCamAttrsInfo info_y, info_w, info_h; + MMCamAttrsInfo info_y; + MMCamAttrsInfo info_w; + MMCamAttrsInfo info_h; sc = MMF_CAMCORDER_SUBCONTEXT(handle); - if (!sc) + if (!sc) { return TRUE; + } _mmcam_dbg_log("(%d)", attr_idx); - current_state = _mmcamcorder_get_state( handle); - - if( current_state < MM_CAMCORDER_STATE_PREPARE ) - { + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_PREPARE) { _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state); return TRUE; } ret = mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_FOCUS_MODE, &focus_mode, - NULL); - if( ret != MM_ERROR_NONE ) - { - _mmcam_dbg_warn( "Failed to get FOCUS MODE.[%x]", ret ); + MMCAM_CAMERA_FOCUS_MODE, &focus_mode, + NULL); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_warn("Failed to get FOCUS MODE.[%x]", ret); return FALSE; } - if ((focus_mode != MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO ) && (focus_mode != MM_CAMCORDER_FOCUS_MODE_CONTINUOUS)) - { - _mmcam_dbg_warn( "Focus mode is NOT TOUCH AUTO or CONTINUOUS(current[%d]). return FALSE", focus_mode ); + if ((focus_mode != MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO) && (focus_mode != MM_CAMCORDER_FOCUS_MODE_CONTINUOUS)) { + _mmcam_dbg_warn("Focus mode is NOT TOUCH AUTO or CONTINUOUS(current[%d]). return FALSE", focus_mode); return FALSE; } - if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst ) - { - if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) - { + if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) { + if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) { _mmcam_dbg_log("Can't cast Video source into camera control."); return TRUE; } - switch( attr_idx ) - { - case MM_CAM_CAMERA_AF_TOUCH_X: - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_Y, &info_y); - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w); - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); - if( !( (info_y.flag|info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED) ) - { - set_area.x = value->value.i_val; - mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, - MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, - MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, - NULL); - do_set = TRUE; - } - else - { - _mmcam_dbg_log( "Just store AF area[x:%d]", value->value.i_val ); - return TRUE; - } - break; - case MM_CAM_CAMERA_AF_TOUCH_Y: - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w); - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); - if( !( (info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED) ) - { - set_area.y = value->value.i_val; - mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, - MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, - MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, - NULL); - do_set = TRUE; - } - else - { - _mmcam_dbg_log( "Just store AF area[y:%d]", value->value.i_val ); - return TRUE; - } - break; - case MM_CAM_CAMERA_AF_TOUCH_WIDTH: - mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); - if( !( info_h.flag & MM_ATTRS_FLAG_MODIFIED) ) - { - set_area.width = value->value.i_val; - mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, - MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, - MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, - NULL); - do_set = TRUE; - } - else - { - _mmcam_dbg_log( "Just store AF area[width:%d]", value->value.i_val ); - return TRUE; - } - break; - case MM_CAM_CAMERA_AF_TOUCH_HEIGHT: - set_area.height = value->value.i_val; + memset(&info_y, 0x0, sizeof(MMCamAttrsInfo)); + memset(&info_w, 0x0, sizeof(MMCamAttrsInfo)); + memset(&info_h, 0x0, sizeof(MMCamAttrsInfo)); + + switch (attr_idx) { + case MM_CAM_CAMERA_AF_TOUCH_X: + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_Y, &info_y); + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w); + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); + if (!((info_y.flag|info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED)) { + set_area.x = value->value.i_val; mm_camcorder_get_attributes(handle, NULL, - MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, - MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, - MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, - NULL); + MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, + MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, + MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, + NULL); do_set = TRUE; - break; - default: - break; + } else { + _mmcam_dbg_log("Just store AF area[x:%d]", value->value.i_val); + return TRUE; + } + break; + case MM_CAM_CAMERA_AF_TOUCH_Y: + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_WIDTH, &info_w); + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); + if (!((info_w.flag|info_h.flag) & MM_ATTRS_FLAG_MODIFIED)) { + set_area.y = value->value.i_val; + mm_camcorder_get_attributes(handle, NULL, + MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, + MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, + MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, + NULL); + do_set = TRUE; + } else { + _mmcam_dbg_log( "Just store AF area[y:%d]", value->value.i_val ); + return TRUE; + } + break; + case MM_CAM_CAMERA_AF_TOUCH_WIDTH: + mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_TOUCH_HEIGHT, &info_h); + if (!(info_h.flag & MM_ATTRS_FLAG_MODIFIED)) { + set_area.width = value->value.i_val; + mm_camcorder_get_attributes(handle, NULL, + MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, + MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, + MMCAM_CAMERA_AF_TOUCH_HEIGHT, &set_area.height, + NULL); + do_set = TRUE; + } else { + _mmcam_dbg_log("Just store AF area[width:%d]", value->value.i_val); + return TRUE; + } + break; + case MM_CAM_CAMERA_AF_TOUCH_HEIGHT: + set_area.height = value->value.i_val; + mm_camcorder_get_attributes(handle, NULL, + MMCAM_CAMERA_AF_TOUCH_X, &set_area.x, + MMCAM_CAMERA_AF_TOUCH_Y, &set_area.y, + MMCAM_CAMERA_AF_TOUCH_WIDTH, &set_area.width, + NULL); + do_set = TRUE; + break; + default: + break; } - if( do_set ) - { + if (do_set) { + _MMCamcorderVideoInfo *info = sc->info_video; + + if (info == NULL) { + _mmcam_dbg_err("video info is NULL"); + return FALSE; + } + control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst); if (control == NULL) { _mmcam_dbg_err("cast CAMERA_CONTROL failed"); return FALSE; } - ret = gst_camera_control_get_auto_focus_area( control, &get_area ); - if( !ret ) - { + /* convert area */ + if (current_state >= MM_CAMCORDER_STATE_RECORDING && info->support_dual_stream == FALSE && + (info->preview_width != info->video_width || info->preview_height != info->video_height)) { + float ratio_width = 0.0; + float ratio_height = 0.0; + + if (info->preview_width != 0 && info->preview_height != 0) { + ratio_width = (float)info->video_width / (float)info->preview_width; + ratio_height = (float)info->video_height / (float)info->preview_height; + + _mmcam_dbg_log("original area %d,%d,%dx%d, resolution ratio : width %f, height %f", + set_area.x, set_area.y, set_area.width, set_area.height, ratio_width, ratio_height); + + set_area.x = (int)((float)set_area.x * ratio_width); + set_area.y = (int)((float)set_area.y * ratio_height); + set_area.width = (int)((float)set_area.width * ratio_width); + set_area.height = (int)((float)set_area.height * ratio_height); + + if (set_area.width <= 0) { + set_area.width = 1; + } + if (set_area.height <= 0) { + set_area.height = 1; + } + + _mmcam_dbg_log("converted area %d,%d,%dx%d", + set_area.x, set_area.y, set_area.width, set_area.height); + } else { + _mmcam_dbg_warn("invalid preview size %dx%d, skip AF area converting", + info->preview_width, info->preview_height); + } + } + + ret = gst_camera_control_get_auto_focus_area(control, &get_area); + if (!ret) { _mmcam_dbg_warn( "Failed to get AF area" ); return FALSE; } - if( get_area.x == set_area.x && get_area.y == set_area.y ) - // width and height are not supported now. - // get_area.width == set_area.width && get_area.height == set_area.height - { - _mmcam_dbg_log( "No need to set AF area[x,y:%d,%d]", get_area.x, get_area.y ); + /* width and height are not supported now */ + if (get_area.x == set_area.x && get_area.y == set_area.y) { + _mmcam_dbg_log("No need to set AF area[x,y:%d,%d]", + get_area.x, get_area.y); return TRUE; } - ret = gst_camera_control_set_auto_focus_area( control, set_area ); - if( ret ) - { - _mmcam_dbg_log( "Succeed to set AF area[%d,%d,%dx%d]", set_area.x, set_area.y, set_area.width, set_area.height ); + ret = gst_camera_control_set_auto_focus_area(control, set_area); + if (ret) { + _mmcam_dbg_log("Succeed to set AF area[%d,%d,%dx%d]", + set_area.x, set_area.y, set_area.width, set_area.height); return TRUE; - } - else - { - _mmcam_dbg_warn( "Failed to set AF area[%d,%d,%dx%d]", set_area.x, set_area.y, set_area.width, set_area.height ); + } else { + _mmcam_dbg_warn("Failed to set AF area[%d,%d,%dx%d]", + set_area.x, set_area.y, set_area.width, set_area.height); } } - } - else - { + } else { _mmcam_dbg_log("pointer of video src is null"); } @@ -2859,7 +2968,7 @@ bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, cons if (sc->encode_element && sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst) { _mmcam_dbg_log("new file location set.[%s] filesink %p", filename, sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst); - MMCAMCORDER_G_OBJECT_SET(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename); + MMCAMCORDER_G_OBJECT_SET_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename); _mmcam_dbg_log("new file location set.(%s)", filename); } else { _mmcam_dbg_log("element is not created yet. [%s] will be set later...", filename); @@ -3141,6 +3250,11 @@ bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const if (p_handle) { /* get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name); if (!strcmp(videosink_name, "xvimagesink") || @@ -3150,7 +3264,7 @@ bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const } else if (!strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "evaspixmapsink")) { _mmcam_dbg_log("Commit : Set evas object [%p]", p_handle); - MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "evas-object", p_handle); + MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "evas-object", p_handle); #ifdef HAVE_WAYLAND } else if (!strcmp(videosink_name, "waylandsink")) { MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)p_handle; @@ -3158,7 +3272,7 @@ bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display); if (context) { - gst_element_set_context(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), context); + gst_element_set_context(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, context); } else { _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed"); } @@ -3209,6 +3323,11 @@ bool _mmcamcorder_commit_display_mode(MMHandleType handle, int attr_idx, const m sc = MMF_CAMCORDER_SUBCONTEXT(handle); _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name); if (!strcmp(videosink_name, "xvimagesink")) { @@ -3243,7 +3362,7 @@ bool _mmcamcorder_commit_display_rotation(MMHandleType handle, int attr_idx, con return TRUE; } - return _mmcamcorder_set_display_rotation(handle, value->value.i_val); + return _mmcamcorder_set_display_rotation(handle, value->value.i_val, _MMCAMCORDER_VIDEOSINK_SINK); } @@ -3268,7 +3387,7 @@ bool _mmcamcorder_commit_display_flip(MMHandleType handle, int attr_idx, const m return TRUE; } - return _mmcamcorder_set_display_flip(handle, value->value.i_val); + return _mmcamcorder_set_display_flip(handle, value->value.i_val, _MMCAMCORDER_VIDEOSINK_SINK); } @@ -3299,6 +3418,11 @@ bool _mmcamcorder_commit_display_visible(MMHandleType handle, int attr_idx, cons /* Get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "evaspixmapsink")) { MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "visible", value->value.i_val); @@ -3339,6 +3463,11 @@ bool _mmcamcorder_commit_display_geometry_method (MMHandleType handle, int attr_ /* Get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "evaspixmapsink")) { method = value->value.i_val; @@ -3388,6 +3517,11 @@ bool _mmcamcorder_commit_display_rect(MMHandleType handle, int attr_idx, const m /* Get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evaspixmapsink")) { int rect_x = 0; @@ -3487,6 +3621,11 @@ bool _mmcamcorder_commit_display_scale(MMHandleType handle, int attr_idx, const /* Get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + zoom = value->value.i_val; if (!strcmp(videosink_name, "xvimagesink")) { vs_element = sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst; @@ -3532,6 +3671,11 @@ bool _mmcamcorder_commit_display_evas_do_scaling(MMHandleType handle, int attr_i /* Get videosink name */ _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name); + if (videosink_name == NULL) { + _mmcam_dbg_err("Please check videosink element in configuration file"); + return FALSE; + } + if (!strcmp(videosink_name, "evaspixmapsink")) { MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "origin-size", !do_scaling); _mmcam_dbg_log("Set origin-size to %d", !(value->value.i_val)); @@ -3550,7 +3694,6 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); int strobe_type, mslVal, newVal, cur_value; int current_state = MM_CAMCORDER_STATE_NONE; - int set_flash_state = -1; if (hcamcorder == NULL) { _mmcam_dbg_err("NULL handle"); @@ -3570,7 +3713,7 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va int flash_brightness = 0; /* get current flash brightness */ - if (_mmcamcorder_get_device_flash_brightness(&flash_brightness) != MM_ERROR_NONE) { + if (_mmcamcorder_get_device_flash_brightness(hcamcorder->gdbus_conn, &flash_brightness) != MM_ERROR_NONE) { _mmcam_dbg_err("_mmcamcorder_get_device_flash_brightness failed"); hcamcorder->error_code = MM_ERROR_COMMON_INVALID_PERMISSION; return FALSE; @@ -3585,14 +3728,7 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va _mmcam_dbg_err("other module already turned on flash. avoid to set flash mode here."); return FALSE; } else { - /* flash is OFF state, this case will set flash state key */ - if (mslVal == MM_CAMCORDER_STROBE_MODE_OFF) { - set_flash_state = VCONFKEY_CAMERA_FLASH_STATE_OFF; - } else { - set_flash_state = VCONFKEY_CAMERA_FLASH_STATE_ON; - } - - _mmcam_dbg_log("keep going, and will set flash state key %d", set_flash_state); + _mmcam_dbg_log("keep going"); } } @@ -3600,13 +3736,6 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va current_state = _mmcamcorder_get_state(handle); if (current_state < MM_CAMCORDER_STATE_READY) { _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state); - - if (set_flash_state != -1) { - _mmcam_dbg_log("set VCONFKEY_CAMERA_FLASH_STATE : %d", set_flash_state); - vconf_set_int(VCONFKEY_CAMERA_FLASH_STATE, set_flash_state); - vconf_set_int(VCONFKEY_CAMERA_PID, (int)getpid()); - } - return TRUE; } else if (current_state == MM_CAMCORDER_STATE_CAPTURING) { _mmcam_dbg_warn("invalid state[capturing]"); @@ -3668,12 +3797,6 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va } } - if (bret == TRUE && set_flash_state != -1) { - _mmcam_dbg_log("set VCONFKEY_CAMERA_FLASH_STATE : %d", set_flash_state); - vconf_set_int(VCONFKEY_CAMERA_FLASH_STATE, set_flash_state); - vconf_set_int(VCONFKEY_CAMERA_PID, (int)getpid()); - } - return bret; } @@ -3870,6 +3993,129 @@ bool _mmcamcorder_commit_detect(MMHandleType handle, int attr_idx, const mmf_val } +bool _mmcamcorder_commit_encoded_preview_bitrate(MMHandleType handle, int attr_idx, const mmf_value_t *value) +{ + int current_state = MM_CAMCORDER_STATE_NONE; + int preview_format = MM_PIXEL_FORMAT_NV12; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + _mmcam_dbg_log("Commit : encoded preview bitrate - %d", value->value.i_val); + + /* check preview format */ + mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FORMAT, &preview_format, NULL); + if (preview_format != MM_PIXEL_FORMAT_ENCODED_H264) { + _mmcam_dbg_err("current preview format[%d] is not encoded format", preview_format); + return FALSE; + } + + /* check state */ + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_READY) { + _mmcam_dbg_log("will be applied when preview starts"); + return TRUE; + } + + return _mmcamcorder_set_encoded_preview_bitrate(handle, value->value.i_val); +} + + +bool _mmcamcorder_commit_encoded_preview_gop_interval(MMHandleType handle, int attr_idx, const mmf_value_t *value) +{ + int current_state = MM_CAMCORDER_STATE_NONE; + int preview_format = MM_PIXEL_FORMAT_NV12; + + if ((void *)handle == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + _mmcam_dbg_log("Commit : encoded preview I-frame interval - %d", value->value.i_val); + + /* check preview format */ + mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FORMAT, &preview_format, NULL); + if (preview_format != MM_PIXEL_FORMAT_ENCODED_H264) { + _mmcam_dbg_err("current preview format[%d] is not encoded format", preview_format); + return FALSE; + } + + /* check state */ + current_state = _mmcamcorder_get_state(handle); + if (current_state < MM_CAMCORDER_STATE_READY) { + _mmcam_dbg_log("will be applied when preview starts"); + return TRUE; + } + + return _mmcamcorder_set_encoded_preview_gop_interval(handle, value->value.i_val); +} + + +bool _mmcamcorder_commit_pid_for_sound_focus(MMHandleType handle, int attr_idx, const mmf_value_t *value) +{ + int new_pid = 0; + int current_state = MM_CAMCORDER_STATE_NONE; + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + + if (hcamcorder == NULL) { + _mmcam_dbg_warn("handle is NULL"); + return FALSE; + } + + /* state check */ + current_state = _mmcamcorder_get_state( handle); + if (current_state > MM_CAMCORDER_STATE_NULL) { + _mmcam_dbg_log("invalid state %d", current_state); + return FALSE; + } + + new_pid = value->value.i_val; + + _mmcam_dbg_log("Commit : pid %d, current sound_focus_register %d, sound_focus_id %d", + new_pid, hcamcorder->sound_focus_register, hcamcorder->sound_focus_id); + + /* unregister sound focus before set new one */ + if (hcamcorder->sound_focus_register && hcamcorder->sound_focus_id > 0) { + if (MM_ERROR_NONE != mm_sound_unregister_focus(hcamcorder->sound_focus_id)) { + _mmcam_dbg_err("mm_sound_unregister_focus[id %d] failed", hcamcorder->sound_focus_id); + } else { + _mmcam_dbg_log("mm_sound_unregister_focus[id %d] done", hcamcorder->sound_focus_id); + } + } else { + _mmcam_dbg_log("no need to unregister sound focus"); + } + + /* register sound focus */ + if (hcamcorder->sound_focus_register) { + hcamcorder->sound_focus_id = 0; + if (MM_ERROR_NONE != mm_sound_focus_get_id(&hcamcorder->sound_focus_id)) { + _mmcam_dbg_err("mm_sound_focus_get_uniq failed"); + hcamcorder->error_code = MM_ERROR_POLICY_BLOCKED; + return FALSE; + } + + if (MM_ERROR_NONE != mm_sound_register_focus_for_session(hcamcorder->sound_focus_id, + new_pid, + "media", + _mmcamcorder_sound_focus_cb, + hcamcorder)) { + _mmcam_dbg_err("mm_sound_register_focus failed"); + hcamcorder->error_code = MM_ERROR_POLICY_BLOCKED; + return FALSE; + } + + _mmcam_dbg_log("mm_sound_register_focus done - id %d, session type %d, flags 0x%x", + hcamcorder->sound_focus_id, hcamcorder->session_type, hcamcorder->session_flags); + } else { + _mmcam_dbg_log("no need to register sound focus"); + } + + return TRUE; +} + + static bool __mmcamcorder_attrs_is_supported(MMHandleType handle, int idx) { @@ -4083,17 +4329,17 @@ static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width, } -static int -__mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args ) +static int __mmcamcorder_check_valid_pair(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args) { #define INIT_VALUE -1 #define CHECK_COUNT 3 - mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle); + mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); MMHandleType attrs = 0; int ret = MM_ERROR_NONE; - int i = 0, j = 0; + int i = 0; + int j = 0; const char *name = NULL; const char *check_pair_name[CHECK_COUNT][3] = { {MMCAM_CAMERA_WIDTH, MMCAM_CAMERA_HEIGHT, "MMCAM_CAMERA_WIDTH and HEIGHT"}, @@ -4243,6 +4489,25 @@ __mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const return MM_ERROR_CAMCORDER_INVALID_ARGUMENT; } + if (!strcmp(check_pair_name[i][0], MMCAM_CAMERA_WIDTH)) { + int current_width = 0; + int current_height = 0; + + mm_camcorder_get_attributes(handle, NULL, + MMCAM_CAMERA_WIDTH, ¤t_width, + MMCAM_CAMERA_HEIGHT, ¤t_height, + NULL); + + if (current_width != check_pair_value[i][0] || + current_height != check_pair_value[i][1]) { + hcamcorder->resolution_changed = TRUE; + } else { + hcamcorder->resolution_changed = FALSE; + } + + _mmcam_dbg_log("resolution changed : %d", hcamcorder->resolution_changed); + } + if (err_name) { free(err_name); err_name = NULL;