X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmm_camcorder_attribute.c;h=2120f1f3cc7e095ec92ef02bb7f71a5808c8279c;hb=02d194fc29293eede2e332206f7b2066ce2b28a9;hp=03936ca19e674be40a96804040c58086d65f96d8;hpb=567f5bf506bdb602829ae3aab4e5a798bfcc2aaf;p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git diff --git a/src/mm_camcorder_attribute.c b/src/mm_camcorder_attribute.c index 03936ca..2120f1f 100644 --- a/src/mm_camcorder_attribute.c +++ b/src/mm_camcorder_attribute.c @@ -29,7 +29,6 @@ #include #include #include -#include /*----------------------------------------------------------------------- | MACRO DEFINITIONS: | @@ -1534,17 +1533,6 @@ _mmcamcorder_alloc_attribute(MMHandleType handle, MMCamPreset *info) NULL, }, { - MM_CAM_SOUND_STREAM_TYPE, - "sound-stream-type", - MMF_VALUE_TYPE_STRING, - MM_ATTRS_FLAG_RW, - {(void*)NULL}, - MM_ATTRS_VALID_TYPE_NONE, - {0}, - {0}, - NULL, - }, - { MM_CAM_SOUND_STREAM_INDEX, "sound-stream-index", MMF_VALUE_TYPE_INT, @@ -1553,6 +1541,17 @@ _mmcamcorder_alloc_attribute(MMHandleType handle, MMCamPreset *info) MM_ATTRS_VALID_TYPE_INT_RANGE, {.int_min = -1}, {.int_max = _MMCAMCORDER_MAX_INT}, + NULL, + }, + { + MM_CAM_SOUND_STREAM_TYPE, + "sound-stream-type", + MMF_VALUE_TYPE_STRING, + MM_ATTRS_FLAG_RW, + {(void*)NULL}, + MM_ATTRS_VALID_TYPE_NONE, + {0}, + {0}, _mmcamcorder_commit_sound_stream_info, }, { @@ -1731,6 +1730,7 @@ _mmcamcorder_set_attributes(MMHandleType handle, char **err_attr_name, const cha MMHandleType attrs = 0; int ret = MM_ERROR_NONE; mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle); + va_list var_args_copy; mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT); /*mmf_return_val_if_fail(err_attr_name, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);*/ @@ -1740,6 +1740,9 @@ _mmcamcorder_set_attributes(MMHandleType handle, char **err_attr_name, const cha return MM_ERROR_CAMCORDER_CMD_IS_RUNNING; } + /* copy var_args to keep original var_args */ + va_copy(var_args_copy, var_args); + attrs = MMF_CAMCORDER_ATTRS(handle); if (attrs) { ret = __mmcamcorder_check_valid_pair(handle, err_attr_name, attribute_name, var_args); @@ -1750,9 +1753,12 @@ _mmcamcorder_set_attributes(MMHandleType handle, char **err_attr_name, const cha if (ret == MM_ERROR_NONE) { hcamcorder->error_code = MM_ERROR_NONE; - ret = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, var_args); + /* In 64bit environment, unexpected result is returned if var_args is used again. */ + ret = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, var_args_copy); } + va_end(var_args_copy); + _MMCAMCORDER_UNLOCK_CMD(handle); if (ret != MM_ERROR_NONE) { @@ -3383,9 +3389,13 @@ bool _mmcamcorder_commit_image_encoder_quality(MMHandleType handle, int attr_idx bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, const mmf_value_t *value) { - _MMCamcorderSubContext *sc = NULL; - const char *filename = NULL; + int ret = MM_ERROR_NONE; int size = 0; + const char *filename = NULL; + _MMCamcorderSubContext *sc = NULL; + GstElement *encode_link = NULL; + GstElement *encode_sink = NULL; + GstElement *encode_pipeline = NULL; mmf_return_val_if_fail(handle && value, FALSE); @@ -3410,9 +3420,71 @@ 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_POINTER(sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename); - _mmcam_dbg_log("new file location set.(%s)", filename); + encode_sink = sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst; + encode_pipeline = sc->encode_element[_MMCAMCORDER_ENCODE_MAIN_PIPE].gst; + + _mmcam_dbg_log("file location set.[%s], current encode sink [%s]", + filename, GST_OBJECT_NAME(gst_element_get_factory(encode_sink))); + + /* check whether it's filesink or not */ + if (strncmp(GST_OBJECT_NAME(gst_element_get_factory(encode_sink)), "filesink", strlen("filesink"))) { + _mmcam_dbg_log("remove current sink and create filesink"); + + /* remove fakesink and create/add filesink to encode pipeline */ + /* set NULL state */ + ret = _mmcamcorder_gst_set_state(handle, encode_sink, GST_STATE_NULL); + if (ret != MM_ERROR_NONE) { + _mmcam_dbg_err("failed to set NULL encoder sink"); + return FALSE; + } + + /* remove encode sink - pads will be unlinked automatically in remove function */ + if (!gst_bin_remove(GST_BIN(encode_pipeline), encode_sink)) { + _mmcam_dbg_err("failed to remove encode sink from pipeline"); + return FALSE; + } + + _mmcam_dbg_log("remove done"); + + /* create filesink */ + encode_sink = gst_element_factory_make("filesink", NULL); + if (!encode_sink) { + _mmcam_dbg_err("filesink creation failed"); + return FALSE; + } + + sc->encode_element[_MMCAMCORDER_ENCSINK_SINK].gst = encode_sink; + + /* set release notification callback */ + g_object_weak_ref(G_OBJECT(encode_sink), (GWeakNotify)_mmcamcorder_element_release_noti, sc); + + /* add to pipeline */ + if (!gst_bin_add(GST_BIN(encode_pipeline), encode_sink)) { + _mmcam_dbg_err("failed to add filesink to encode pipeline"); + gst_object_unref(encode_sink); + return FALSE; + } + + /* link filesink */ + if (sc->encode_element[_MMCAMCORDER_ENCSINK_MUX].gst) { + /* mux element is used */ + _mmcam_dbg_log("Link mux to encode_sink"); + encode_link = sc->encode_element[_MMCAMCORDER_ENCSINK_MUX].gst; + } else { + /* no mux element */ + _mmcam_dbg_log("Link audio encoder to encode_sink"); + encode_link = sc->encode_element[_MMCAMCORDER_ENCSINK_AENC].gst; + } + + if (!_MM_GST_ELEMENT_LINK(encode_link, encode_sink)) { + _mmcam_dbg_err("Link FAILED"); + return FALSE; + } + + _mmcam_dbg_log("Link OK"); + } + + MMCAMCORDER_G_OBJECT_SET_POINTER(encode_sink, "location", filename); } else { _mmcam_dbg_log("element is not created yet. [%s] will be set later...", filename); } @@ -3794,11 +3866,11 @@ bool _mmcamcorder_commit_display_mode(MMHandleType handle, int attr_idx, const m if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "waylandsink")) { _mmcam_dbg_log("Commit : display mode [%d]", value->value.i_val); MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-mode", value->value.i_val); - return TRUE; } else { - _mmcam_dbg_warn("Commit : This element [%s] does not support display mode", videosink_name); - return FALSE; + _mmcam_dbg_warn("[%s] does not support display mode, but no error", videosink_name); } + + return TRUE; } @@ -3888,11 +3960,11 @@ bool _mmcamcorder_commit_display_visible(MMHandleType handle, int attr_idx, cons !strcmp(videosink_name, "evaspixmapsink") || !strcmp(videosink_name, "evasimagesink")) { MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "visible", value->value.i_val); _mmcam_dbg_log("Set visible [%d] done.", value->value.i_val); - return TRUE; } else { - _mmcam_dbg_warn("videosink[%s] does not support VISIBLE.", videosink_name); - return FALSE; + _mmcam_dbg_warn("[%s] does not support VISIBLE, but no error", videosink_name); } + + return TRUE; } @@ -3933,11 +4005,11 @@ bool _mmcamcorder_commit_display_geometry_method(MMHandleType handle, int attr_i !strcmp(videosink_name, "evaspixmapsink") || !strcmp(videosink_name, "evasimagesink")) { method = value->value.i_val; MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-geometry-method", method); - return TRUE; } else { - _mmcam_dbg_warn("videosink[%s] does not support geometry method.", videosink_name); - return FALSE; + _mmcam_dbg_warn("[%s] does not support geometry method, but no error", videosink_name); } + + return TRUE; } @@ -4599,12 +4671,18 @@ bool _mmcamcorder_commit_pid_for_sound_focus(MMHandleType handle, int attr_idx, bool _mmcamcorder_commit_sound_stream_info(MMHandleType handle, int attr_idx, const mmf_value_t *value) { + int stream_index = 0; char *stream_type = NULL; - int stream_type_len = 0; _MMCamcorderSubContext *sc = NULL; mmf_return_val_if_fail(handle && value, FALSE); + stream_type = value->value.s_val; + if (!stream_type) { + _mmcam_dbg_err("NULL string"); + return FALSE; + } + sc = MMF_CAMCORDER_SUBCONTEXT(handle); if (!sc || !sc->encode_element || !sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst) { @@ -4613,17 +4691,16 @@ bool _mmcamcorder_commit_sound_stream_info(MMHandleType handle, int attr_idx, co } mm_camcorder_get_attributes(handle, NULL, - MMCAM_SOUND_STREAM_TYPE, &stream_type, &stream_type_len, + MMCAM_SOUND_STREAM_INDEX, &stream_index, NULL); - - if (stream_type == NULL) { - _mmcam_dbg_err("stream type is not set"); + if (stream_index < 0) { + _mmcam_dbg_err("invalid stream index %d", stream_index); return FALSE; } - _mmcam_dbg_log("Commit : sound stream info - type %s", stream_type); + _mmcam_dbg_log("Commit : sound stream info - type %s, index %d", stream_type, stream_index); - return _mmcamcorder_set_sound_stream_info(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, stream_type, value->value.i_val); + return _mmcamcorder_set_sound_stream_info(sc->encode_element[_MMCAMCORDER_AUDIOSRC_SRC].gst, stream_type, stream_index); }