4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jeongmo Yang <jm80.yang@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 /*===========================================================================================
26 ========================================================================================== */
29 #include <gst/app/gstappsrc.h>
30 #include <gst/video/videooverlay.h>
32 #include <gst/wayland/wayland.h>
43 #include "mm_camcorder_client.h"
44 #include "mm_camcorder_internal.h"
50 static int _storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data)
52 char **root_directory = (char **)user_data;
54 if (root_directory == NULL) {
55 _mmcam_dbg_warn("user data is NULL");
59 _mmcam_dbg_log("storage id %d, type %d, state %d, path %s",
60 storage_id, type, state, path ? path : "NULL");
62 if (type == STORAGE_TYPE_INTERNAL && path) {
63 if (*root_directory) {
64 free(*root_directory);
65 *root_directory = NULL;
68 *root_directory = strdup(path);
69 if (*root_directory) {
70 _mmcam_dbg_log("get root directory %s", *root_directory);
73 _mmcam_dbg_warn("strdup %s failed");
80 bool _mmcamcorder_client_commit_display_handle(MMHandleType handle, int attr_idx, const mmf_value_t *value)
82 int current_state = MM_CAMCORDER_STATE_NONE;
83 const char *videosink_name = NULL;
84 void *p_handle = NULL;
86 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
87 _MMCamcorderSubContext *sc = NULL;
89 mmf_return_val_if_fail(handle, FALSE);
92 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
93 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
97 /* check current state */
98 current_state = _mmcamcorder_get_state(handle);
99 if (current_state < MM_CAMCORDER_STATE_READY) {
100 _mmcam_dbg_log("NOT initialized. this will be applied later");
104 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
106 p_handle = value->value.p_val;
108 /* get videosink name */
109 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
110 if (videosink_name == NULL) {
111 _mmcam_dbg_err("Please check videosink element in configuration file");
115 _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name);
117 if (!strcmp(videosink_name, "xvimagesink") ||
118 !strcmp(videosink_name, "ximagesink")) {
119 _mmcam_dbg_log("Commit : Set XID[%x]", *(int*)(p_handle));
120 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst), *(int*)(p_handle));
121 } else if (!strcmp(videosink_name, "evasimagesink") ||
122 !strcmp(videosink_name, "evaspixmapsink")) {
123 _mmcam_dbg_log("Commit : Set evas object [%p]", p_handle);
124 MMCAMCORDER_G_OBJECT_SET_POINTER(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, "evas-object", p_handle);
126 } else if (!strcmp(videosink_name, "waylandsink")) {
127 MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)p_handle;
128 GstContext *context = NULL;
130 context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
132 gst_element_set_context(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, context);
134 _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
137 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst), (guintptr)wl_info->surface);
138 gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst),
141 wl_info->window_width,
142 wl_info->window_height);
143 #endif /* HAVE_WAYLAND */
145 _mmcam_dbg_warn("Commit : Nothing to commit with this element[%s]", videosink_name);
149 _mmcam_dbg_warn("Display handle is NULL");
156 bool _mmcamcorder_client_commit_display_rect(MMHandleType handle, int attr_idx, const mmf_value_t *value)
158 int current_state = MM_CAMCORDER_STATE_NONE;
160 const char *videosink_name = NULL;
162 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
163 _MMCamcorderSubContext *sc = NULL;
165 mmf_return_val_if_fail(handle, FALSE);
168 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
169 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
173 /* check current state */
174 current_state = _mmcamcorder_get_state(handle);
175 if (current_state < MM_CAMCORDER_STATE_READY) {
176 _mmcam_dbg_log("NOT initialized. this will be applied later");
180 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
182 /* check current method */
183 mm_camcorder_get_attributes(handle, NULL,
184 MMCAM_DISPLAY_GEOMETRY_METHOD, &method,
186 if (method != MM_DISPLAY_METHOD_CUSTOM_ROI) {
187 _mmcam_dbg_log("current method[%d] is not supported rect", method);
191 /* Get videosink name */
192 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
193 if (videosink_name == NULL) {
194 _mmcam_dbg_err("Please check videosink element in configuration file");
198 if (!strcmp(videosink_name, "xvimagesink") ||
199 !strcmp(videosink_name, "evaspixmapsink")) {
204 int flags = MM_ATTRS_FLAG_NONE;
207 mm_camcorder_get_attributes(handle, NULL,
208 MMCAM_DISPLAY_RECT_X, &rect_x,
209 MMCAM_DISPLAY_RECT_Y, &rect_y,
210 MMCAM_DISPLAY_RECT_WIDTH, &rect_width,
211 MMCAM_DISPLAY_RECT_HEIGHT, &rect_height,
214 case MM_CAM_CLIENT_DISPLAY_RECT_X:
215 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_Y, &info);
217 memset(&info, 0x00, sizeof(info));
218 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
220 memset(&info, 0x00, sizeof(info));
221 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
223 rect_x = value->value.i_val;
225 case MM_CAM_CLIENT_DISPLAY_RECT_Y:
226 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
228 memset(&info, 0x00, sizeof(info));
229 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
231 rect_y = value->value.i_val;
233 case MM_CAM_CLIENT_DISPLAY_RECT_WIDTH:
234 mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
236 rect_width = value->value.i_val;
238 case MM_CAM_CLIENT_DISPLAY_RECT_HEIGHT:
239 rect_height = value->value.i_val;
242 _mmcam_dbg_err("Wrong attr_idx!");
246 if (!(flags & MM_ATTRS_FLAG_MODIFIED)) {
247 _mmcam_dbg_log("RECT(x,y,w,h) = (%d,%d,%d,%d)",
248 rect_x, rect_y, rect_width, rect_height);
249 g_object_set(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst,
252 "dst-roi-w", rect_width,
253 "dst-roi-h", rect_height,
259 _mmcam_dbg_warn("videosink[%s] does not support display rect.", videosink_name);
264 bool _mmcamcorder_client_commit_display_rotation(MMHandleType handle, int attr_idx, const mmf_value_t *value)
266 int current_state = MM_CAMCORDER_STATE_NONE;
268 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
270 mmf_return_val_if_fail(handle, FALSE);
273 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
274 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
278 /* check current state */
279 current_state = _mmcamcorder_get_state(handle);
280 if (current_state < MM_CAMCORDER_STATE_READY) {
281 _mmcam_dbg_log("NOT initialized. this will be applied later [rotate:%d]", value->value.i_val);
285 return _mmcamcorder_set_display_rotation(handle, value->value.i_val);
288 bool _mmcamcorder_client_commit_display_visible(MMHandleType handle, int attr_idx, const mmf_value_t *value)
290 int current_state = MM_CAMCORDER_STATE_NONE;
291 const char *videosink_name = NULL;
293 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
294 _MMCamcorderSubContext *sc = NULL;
296 mmf_return_val_if_fail(handle, FALSE);
299 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
300 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
304 /* check current state */
305 current_state = _mmcamcorder_get_state(handle);
306 if (current_state < MM_CAMCORDER_STATE_READY) {
307 _mmcam_dbg_log("NOT initialized. this will be applied later");
311 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
313 /* Get videosink name */
314 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
315 if (videosink_name == NULL) {
316 _mmcam_dbg_err("Please check videosink element in configuration file");
320 if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") ||
321 !strcmp(videosink_name, "evaspixmapsink")) {
322 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, "visible", value->value.i_val);
323 _mmcam_dbg_log("Set visible [%d] done.", value->value.i_val);
326 _mmcam_dbg_warn("videosink[%s] does not support VISIBLE.", videosink_name);
331 bool _mmcamcorder_client_commit_display_geometry_method (MMHandleType handle, int attr_idx, const mmf_value_t *value)
334 int current_state = MM_CAMCORDER_STATE_NONE;
335 const char *videosink_name = NULL;
337 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
338 _MMCamcorderSubContext *sc = NULL;
340 mmf_return_val_if_fail(handle, FALSE);
343 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
344 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
348 /* check current state */
349 current_state = _mmcamcorder_get_state(handle);
350 if (current_state < MM_CAMCORDER_STATE_READY) {
351 _mmcam_dbg_log("NOT initialized. this will be applied later");
355 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
357 /* Get videosink name */
358 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
359 if (videosink_name == NULL) {
360 _mmcam_dbg_err("Please check videosink element in configuration file");
364 if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "evasimagesink") ||
365 !strcmp(videosink_name, "evaspixmapsink")) {
366 method = value->value.i_val;
367 MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, "display-geometry-method", method);
370 _mmcam_dbg_warn("videosink[%s] does not support geometry method.", videosink_name);
375 bool _mmcamcorder_client_commit_display_scale(MMHandleType handle, int attr_idx, const mmf_value_t *value)
378 int current_state = MM_CAMCORDER_STATE_NONE;
379 const char *videosink_name = NULL;
380 GstElement *vs_element = NULL;
382 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
383 _MMCamcorderSubContext *sc = NULL;
385 mmf_return_val_if_fail(handle, FALSE);
388 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
389 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
393 /* check current state */
394 current_state = _mmcamcorder_get_state(handle);
395 if (current_state < MM_CAMCORDER_STATE_READY) {
396 _mmcam_dbg_log("NOT initialized. this will be applied later");
400 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
402 /* Get videosink name */
403 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
404 if (videosink_name == NULL) {
405 _mmcam_dbg_err("Please check videosink element in configuration file");
409 zoom = value->value.i_val;
410 if (!strcmp(videosink_name, "xvimagesink")) {
411 vs_element = sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst;
413 MMCAMCORDER_G_OBJECT_SET(vs_element, "zoom", (float)(zoom + 1));
414 _mmcam_dbg_log("Set display zoom to %d", zoom + 1);
418 _mmcam_dbg_warn("videosink[%s] does not support scale", videosink_name);
423 bool _mmcamcorder_client_commit_display_mode(MMHandleType handle, int attr_idx, const mmf_value_t *value)
425 int current_state = MM_CAMCORDER_STATE_NONE;
426 const char *videosink_name = NULL;
428 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
429 _MMCamcorderSubContext *sc = NULL;
431 mmf_return_val_if_fail(handle, FALSE);
434 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
435 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
439 /* check current state */
440 current_state = _mmcamcorder_get_state(handle);
441 if (current_state < MM_CAMCORDER_STATE_READY) {
442 _mmcam_dbg_log("NOT initialized. this will be applied later");
446 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
448 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
449 if (videosink_name == NULL) {
450 _mmcam_dbg_err("Please check videosink element in configuration file");
454 _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name);
456 if (!strcmp(videosink_name, "xvimagesink")) {
457 _mmcam_dbg_log("Commit : display mode [%d]", value->value.i_val);
458 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, "display-mode", value->value.i_val);
461 _mmcam_dbg_warn("Commit : This element [%s] does not support display mode", videosink_name);
466 bool _mmcamcorder_client_commit_display_evas_do_scaling(MMHandleType handle, int attr_idx, const mmf_value_t *value)
468 int current_state = MM_CAMCORDER_STATE_NONE;
470 const char *videosink_name = NULL;
472 mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
473 _MMCamcorderSubContext *sc = NULL;
475 mmf_return_val_if_fail(handle, FALSE);
478 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
479 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
483 /* check current state */
484 current_state = _mmcamcorder_get_state(handle);
485 if (current_state < MM_CAMCORDER_STATE_READY) {
486 _mmcam_dbg_log("NOT initialized. this will be applied later");
490 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
492 do_scaling = value->value.i_val;
494 /* Get videosink name */
495 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
496 if (videosink_name == NULL) {
497 _mmcam_dbg_err("Please check videosink element in configuration file");
501 if (!strcmp(videosink_name, "evaspixmapsink")) {
502 MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, "origin-size", !do_scaling);
503 _mmcam_dbg_log("Set origin-size to %d", !(value->value.i_val));
506 _mmcam_dbg_warn("videosink[%s] does not support scale", videosink_name);
511 bool _mmcamcorder_client_commit_display_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value)
513 int current_state = MM_CAMCORDER_STATE_NONE;
515 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
517 mmf_return_val_if_fail(handle, FALSE);
520 if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
521 _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
525 /* check current state */
526 current_state = _mmcamcorder_get_state(handle);
527 if (current_state < MM_CAMCORDER_STATE_READY) {
528 _mmcam_dbg_log("NOT initialized. this will be applied later [flip:%d]", value->value.i_val);
532 return _mmcamcorder_set_display_flip(handle, value->value.i_val);
535 int _mmcamcorder_client_videosink_window_set(MMHandleType handle, type_element* VideosinkElement)
537 int err = MM_ERROR_NONE;
544 int rotation = MM_DISPLAY_ROTATION_NONE;
545 int flip = MM_FLIP_NONE;
546 int display_mode = MM_DISPLAY_MODE_DEFAULT;
547 int display_geometry_method = MM_DISPLAY_METHOD_LETTER_BOX;
551 int do_scaling = FALSE;
554 char *err_name = NULL;
555 const char *videosink_name = NULL;
557 GstElement *vsink = NULL;
559 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
560 _MMCamcorderSubContext *sc = NULL;
562 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
563 mmf_return_val_if_fail(VideosinkElement, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
567 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
568 mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
569 mmf_return_val_if_fail(sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
570 mmf_return_val_if_fail(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
572 vsink = sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst;
574 /* Get video display information */
575 err = mm_camcorder_get_attributes(handle, &err_name,
576 MMCAM_DISPLAY_RECT_X, &retx,
577 MMCAM_DISPLAY_RECT_Y, &rety,
578 MMCAM_DISPLAY_RECT_WIDTH, &retwidth,
579 MMCAM_DISPLAY_RECT_HEIGHT, &retheight,
580 MMCAM_DISPLAY_ROTATION, &rotation,
581 MMCAM_DISPLAY_FLIP, &flip,
582 MMCAM_DISPLAY_VISIBLE, &visible,
583 MMCAM_DISPLAY_HANDLE, (void**)&overlay, &size,
584 MMCAM_DISPLAY_MODE, &display_mode,
585 MMCAM_DISPLAY_GEOMETRY_METHOD, &display_geometry_method,
586 MMCAM_DISPLAY_SCALE, &zoom_attr,
587 MMCAM_DISPLAY_EVAS_DO_SCALING, &do_scaling,
589 if (err != MM_ERROR_NONE) {
591 _mmcam_dbg_err("failed to get attributes [%s][0x%x]", err_name, err);
595 _mmcam_dbg_err("failed to get attributes [0x%x]", err);
601 _mmcam_dbg_log("(overlay=%p, size=%d)", overlay, size);
603 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
605 if (videosink_name == NULL) {
606 _mmcam_dbg_err("videosink_name is empty");
607 return MM_ERROR_CAMCORDER_INVALID_CONDITION;
611 /* Set display handle */
612 if (!strcmp(videosink_name, "xvimagesink") ||
613 !strcmp(videosink_name, "ximagesink")) {
616 _mmcam_dbg_log("xid = %lu )", xid);
617 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), xid);
619 _mmcam_dbg_warn("Handle is NULL. Set xid as 0.. but, it's not recommended.");
620 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), 0);
622 } else if (!strcmp(videosink_name, "evasimagesink") ||
623 !strcmp(videosink_name, "evaspixmapsink")) {
624 _mmcam_dbg_log("videosink : %s, handle : %p", videosink_name, overlay);
626 MMCAMCORDER_G_OBJECT_SET_POINTER(vsink, "evas-object", overlay);
627 MMCAMCORDER_G_OBJECT_SET(vsink, "origin-size", !do_scaling);
629 _mmcam_dbg_err("display handle(eavs object) is NULL");
630 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
633 } else if (!strcmp(videosink_name, "waylandsink")) {
634 MMCamWaylandInfo *wl_info = (MMCamWaylandInfo *)overlay;
636 GstContext *context = NULL;
638 context = gst_wayland_display_handle_context_new((struct wl_display *)wl_info->display);
640 gst_element_set_context(vsink, context);
642 _mmcam_dbg_warn("gst_wayland_display_handle_context_new failed");
645 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(vsink), (guintptr)wl_info->surface);
646 gst_video_overlay_set_render_rectangle(GST_VIDEO_OVERLAY(vsink),
649 wl_info->window_width,
650 wl_info->window_height);
652 _mmcam_dbg_warn("Handle is NULL. skip setting.");
654 #endif /* HAVE_WAYLAND */
656 _mmcam_dbg_warn("Who are you?? (Videosink: %s)", videosink_name);
659 _mmcam_dbg_log("%s set: display_geometry_method[%d],origin-size[%d],visible[%d],rotate[%d],flip[%d]",
660 videosink_name, display_geometry_method, origin_size, visible, rotation, flip);
663 if (!strcmp(videosink_name, "xvimagesink") ||
664 !strcmp(videosink_name, "evaspixmapsink")) {
666 MMCAMCORDER_G_OBJECT_SET(vsink, "rotate", rotation);
669 MMCAMCORDER_G_OBJECT_SET(vsink, "flip", flip);
672 case MM_DISPLAY_SCALE_DEFAULT:
675 case MM_DISPLAY_SCALE_DOUBLE_LENGTH:
678 case MM_DISPLAY_SCALE_TRIPLE_LENGTH:
682 _mmcam_dbg_warn("Unsupported zoom value. set as default.");
687 MMCAMCORDER_G_OBJECT_SET(vsink, "display-geometry-method", display_geometry_method);
688 MMCAMCORDER_G_OBJECT_SET(vsink, "display-mode", display_mode);
689 MMCAMCORDER_G_OBJECT_SET(vsink, "visible", visible);
690 MMCAMCORDER_G_OBJECT_SET(vsink, "zoom", zoom_level);
692 if (display_geometry_method == MM_DISPLAY_METHOD_CUSTOM_ROI) {
696 "dst-roi-w", retwidth,
697 "dst-roi-h", retheight,
702 return MM_ERROR_NONE;
706 _mmcamcorder_client_alloc_attribute(MMHandleType handle)
708 _mmcam_dbg_log( "" );
710 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
711 MMHandleType attrs = 0;
712 mmf_attrs_construct_info_t *attrs_const_info = NULL;
713 unsigned int attr_count = 0;
715 static int visible_values[] = { 0, 1 }; /*0: off, 1:on*/
717 mmf_return_val_if_fail(hcamcorder, NULL);
719 /* Create attribute constructor */
720 _mmcam_dbg_log("start");
722 /* alloc 'mmf_attrs_construct_info_t' */
723 attr_count = MM_CAM_CLIENT_ATTRIBUTE_NUM;
724 attrs_const_info = malloc(attr_count * sizeof(mmf_attrs_construct_info_t));
725 if (!attrs_const_info) {
726 _mmcam_dbg_err("Fail to alloc constructor.");
730 /* alloc default attribute info */
731 hcamcorder->cam_attrs_const_info = (mm_cam_attr_construct_info *)malloc(sizeof(mm_cam_attr_construct_info) * attr_count);
732 if (hcamcorder->cam_attrs_const_info == NULL) {
733 _mmcam_dbg_err("failed to alloc default attribute info");
734 free(attrs_const_info);
735 attrs_const_info = NULL;
739 /* basic attributes' info */
740 mm_cam_attr_construct_info temp_info[] = {
742 MM_CAM_CLIENT_DISPLAY_SHM_SOCKET_PATH,
743 MMCAM_DISPLAY_SHM_SOCKET_PATH,
744 MMF_VALUE_TYPE_STRING,
747 MM_ATTRS_VALID_TYPE_NONE,
753 MM_CAM_CLIENT_DISPLAY_HANDLE,
758 MM_ATTRS_VALID_TYPE_NONE,
761 _mmcamcorder_client_commit_display_handle,
764 MM_CAM_CLIENT_DISPLAY_DEVICE,
768 {(void*)MM_DISPLAY_DEVICE_MAINLCD},
769 MM_ATTRS_VALID_TYPE_INT_ARRAY,
776 MM_CAM_CLIENT_DISPLAY_SURFACE,
780 {(void*)MM_DISPLAY_SURFACE_X},
781 MM_ATTRS_VALID_TYPE_INT_ARRAY,
787 MM_CAM_CLIENT_DISPLAY_RECT_X,
792 MM_ATTRS_VALID_TYPE_INT_RANGE,
794 {.int_max = _MMCAMCORDER_MAX_INT},
795 _mmcamcorder_client_commit_display_rect,
798 MM_CAM_CLIENT_DISPLAY_RECT_Y,
803 MM_ATTRS_VALID_TYPE_INT_RANGE,
805 {.int_max = _MMCAMCORDER_MAX_INT},
806 _mmcamcorder_client_commit_display_rect,
809 MM_CAM_CLIENT_DISPLAY_RECT_WIDTH,
810 "display-rect-width",
814 MM_ATTRS_VALID_TYPE_INT_RANGE,
816 {.int_max = _MMCAMCORDER_MAX_INT},
817 _mmcamcorder_client_commit_display_rect,
820 MM_CAM_CLIENT_DISPLAY_RECT_HEIGHT,
821 "display-rect-height",
825 MM_ATTRS_VALID_TYPE_INT_RANGE,
827 {.int_max = _MMCAMCORDER_MAX_INT},
828 _mmcamcorder_client_commit_display_rect,
831 MM_CAM_CLIENT_DISPLAY_SOURCE_X,
836 MM_ATTRS_VALID_TYPE_INT_RANGE,
838 {.int_max = _MMCAMCORDER_MAX_INT},
842 MM_CAM_CLIENT_DISPLAY_SOURCE_Y,
847 MM_ATTRS_VALID_TYPE_INT_RANGE,
849 {.int_max = _MMCAMCORDER_MAX_INT},
853 MM_CAM_CLIENT_DISPLAY_SOURCE_WIDTH,
858 MM_ATTRS_VALID_TYPE_INT_RANGE,
860 {.int_max = _MMCAMCORDER_MAX_INT},
864 MM_CAM_CLIENT_DISPLAY_SOURCE_HEIGHT,
865 "display-src-height",
869 MM_ATTRS_VALID_TYPE_INT_RANGE,
871 {.int_max = _MMCAMCORDER_MAX_INT},
875 MM_CAM_CLIENT_DISPLAY_ROTATION,
879 {(void*)MM_DISPLAY_ROTATION_NONE},
880 MM_ATTRS_VALID_TYPE_INT_RANGE,
881 {.int_min = MM_DISPLAY_ROTATION_NONE},
882 {.int_max = MM_DISPLAY_ROTATION_270},
883 _mmcamcorder_client_commit_display_rotation,
886 MM_CAM_CLIENT_DISPLAY_VISIBLE,
891 MM_ATTRS_VALID_TYPE_INT_ARRAY,
893 {ARRAY_SIZE(visible_values)},
894 _mmcamcorder_client_commit_display_visible,
897 MM_CAM_CLIENT_DISPLAY_SCALE,
902 MM_ATTRS_VALID_TYPE_INT_RANGE,
903 {.int_min = MM_DISPLAY_SCALE_DEFAULT},
904 {.int_max = MM_DISPLAY_SCALE_TRIPLE_LENGTH},
905 _mmcamcorder_client_commit_display_scale,
908 MM_CAM_CLIENT_DISPLAY_GEOMETRY_METHOD,
909 "display-geometry-method",
913 MM_ATTRS_VALID_TYPE_INT_RANGE,
914 {.int_min = MM_DISPLAY_METHOD_LETTER_BOX},
915 {.int_max = MM_DISPLAY_METHOD_CUSTOM_ROI},
916 _mmcamcorder_client_commit_display_geometry_method,
919 MM_CAM_CLIENT_DISPLAY_MODE,
923 {(void*)MM_DISPLAY_MODE_DEFAULT},
924 MM_ATTRS_VALID_TYPE_INT_ARRAY,
927 _mmcamcorder_client_commit_display_mode,
930 MM_CAM_CLIENT_DISPLAY_EVAS_SURFACE_SINK,
931 "display-evas-surface-sink",
932 MMF_VALUE_TYPE_STRING,
933 MM_ATTRS_FLAG_READABLE,
935 MM_ATTRS_VALID_TYPE_NONE,
941 MM_CAM_CLIENT_DISPLAY_EVAS_DO_SCALING,
942 "display-evas-do-scaling",
946 MM_ATTRS_VALID_TYPE_INT_RANGE,
949 _mmcamcorder_client_commit_display_evas_do_scaling,
952 MM_CAM_CLIENT_DISPLAY_FLIP,
956 {(void*)MM_FLIP_NONE},
957 MM_ATTRS_VALID_TYPE_INT_RANGE,
958 {.int_min = MM_FLIP_NONE},
959 {.int_max = MM_FLIP_BOTH},
960 _mmcamcorder_client_commit_display_flip,
964 memcpy(hcamcorder->cam_attrs_const_info, temp_info, sizeof(mm_cam_attr_construct_info) * attr_count);
966 for (idx = 0 ; idx < attr_count ; idx++) {
967 /* attribute order check. This should be same. */
968 if (idx != hcamcorder->cam_attrs_const_info[idx].attrid) {
969 _mmcam_dbg_err("Please check attributes order. Is the idx same with enum val?");
970 free(attrs_const_info);
971 attrs_const_info = NULL;
972 free(hcamcorder->cam_attrs_const_info);
973 hcamcorder->cam_attrs_const_info = NULL;
977 attrs_const_info[idx].name = hcamcorder->cam_attrs_const_info[idx].name;
978 attrs_const_info[idx].value_type = hcamcorder->cam_attrs_const_info[idx].value_type;
979 attrs_const_info[idx].flags = hcamcorder->cam_attrs_const_info[idx].flags;
980 attrs_const_info[idx].default_value = hcamcorder->cam_attrs_const_info[idx].default_value.value_void;
983 /* Camcorder Attributes */
984 _mmcam_dbg_log("Create Camcorder Attributes[%p, %d]", attrs_const_info, attr_count);
986 attrs = mmf_attrs_new_from_data("Camcorder_Mused_Attributes",
989 _mmcamcorder_commit_camcorder_attrs,
992 free(attrs_const_info);
993 attrs_const_info = NULL;
996 _mmcam_dbg_err("Fail to alloc attribute handle");
997 free(hcamcorder->cam_attrs_const_info);
998 hcamcorder->cam_attrs_const_info = NULL;
1002 for (idx = 0; idx < attr_count; idx++)
1004 _mmcam_dbg_log("Valid type [%s]", hcamcorder->cam_attrs_const_info[idx].name);
1006 mmf_attrs_set_valid_type (attrs, idx, hcamcorder->cam_attrs_const_info[idx].validity_type);
1008 switch (hcamcorder->cam_attrs_const_info[idx].validity_type)
1010 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
1011 if (hcamcorder->cam_attrs_const_info[idx].validity_value_1.int_array &&
1012 hcamcorder->cam_attrs_const_info[idx].validity_value_2.count > 0) {
1013 mmf_attrs_set_valid_array(attrs, idx,
1014 (const int *)(hcamcorder->cam_attrs_const_info[idx].validity_value_1.int_array),
1015 hcamcorder->cam_attrs_const_info[idx].validity_value_2.count,
1016 hcamcorder->cam_attrs_const_info[idx].default_value.value_int);
1019 case MM_ATTRS_VALID_TYPE_INT_RANGE:
1020 _mmcam_dbg_err("MM_ATTRS_VALID_TYPE_INT_RANGE");
1021 mmf_attrs_set_valid_range(attrs, idx,
1022 hcamcorder->cam_attrs_const_info[idx].validity_value_1.int_min,
1023 hcamcorder->cam_attrs_const_info[idx].validity_value_2.int_max,
1024 hcamcorder->cam_attrs_const_info[idx].default_value.value_int);
1026 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
1027 if (hcamcorder->cam_attrs_const_info[idx].validity_value_1.double_array &&
1028 hcamcorder->cam_attrs_const_info[idx].validity_value_2.count > 0) {
1029 mmf_attrs_set_valid_double_array(attrs, idx,
1030 (const double *)(hcamcorder->cam_attrs_const_info[idx].validity_value_1.double_array),
1031 hcamcorder->cam_attrs_const_info[idx].validity_value_2.count,
1032 hcamcorder->cam_attrs_const_info[idx].default_value.value_double);
1035 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
1036 mmf_attrs_set_valid_double_range(attrs, idx,
1037 hcamcorder->cam_attrs_const_info[idx].validity_value_1.double_min,
1038 hcamcorder->cam_attrs_const_info[idx].validity_value_2.double_max,
1039 hcamcorder->cam_attrs_const_info[idx].default_value.value_double);
1041 case MM_ATTRS_VALID_TYPE_NONE:
1043 case MM_ATTRS_VALID_TYPE_INVALID:
1045 _mmcam_dbg_err("Valid type error.");
1054 __mmcamcorder_client_gstreamer_init(camera_conf * conf)
1056 static const int max_argc = 10;
1060 gchar **argv = NULL;
1062 gboolean ret = FALSE;
1063 type_string_array *GSTInitOption = NULL;
1065 mmf_return_val_if_fail(conf, FALSE);
1070 argc = malloc(sizeof(int));
1071 argv = malloc(sizeof(gchar *) * max_argc);
1073 if (!argc || !argv) {
1077 memset(argv, 0, sizeof(gchar *) * max_argc);
1081 argv[0] = g_strdup("mmcamcorder");
1084 _mmcamcorder_conf_get_value_string_array(conf,
1085 CONFIGURE_CATEGORY_MAIN_GENERAL,
1088 if (GSTInitOption != NULL && GSTInitOption->value) {
1089 cnt_str = GSTInitOption->count;
1090 for( ; *argc < max_argc && *argc <= cnt_str ; (*argc)++ )
1092 argv[*argc] = g_strdup(GSTInitOption->value[(*argc)-1]);
1096 _mmcam_dbg_log("initializing gstreamer with following parameter[argc:%d]", *argc);
1098 for (i = 0; i < *argc; i++) {
1099 _mmcam_dbg_log("argv[%d] : %s", i, argv[i]);
1102 /* initializing gstreamer */
1103 ret = gst_init_check (argc, &argv, &err);
1105 _mmcam_dbg_err("Could not initialize GStreamer: %s ",
1106 err ? err->message : "unknown error occurred");
1113 for (i = 0; i < *argc; i++) {
1133 _mmcam_dbg_err("failed to initialize gstreamer");
1148 int _mmcamcorder_client_create_preview_elements(MMHandleType handle, const char *videosink_name, char *string_caps)
1150 int ret = MM_ERROR_NONE;
1151 GList *element_list = NULL;
1152 GstElement *pipeline = NULL;
1153 char *socket_path = NULL;
1154 int socket_path_length;
1157 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1158 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1159 mmf_return_val_if_fail(hcamcorder->sub_context, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1161 _MMCamcorderSubContext *sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1163 /* create pipeline */
1164 _MMCAMCORDER_PIPELINE_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_MAIN_PIPE, "camera_client", ret);
1167 _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSRC_SRC, "shmsrc", "shmsrc", element_list, ret);
1169 mm_camcorder_get_attributes(handle, NULL,
1170 MMCAM_DISPLAY_SHM_SOCKET_PATH, &socket_path, &socket_path_length,
1173 if (socket_path == NULL ) {
1174 _mmcam_dbg_err("shmsink's socket path is not set");
1175 goto set_videosrc_error;
1178 _mmcam_dbg_err("shm src socket path : %s", socket_path);
1180 g_object_set(sc->element[_MMCAMCORDER_CLIENT_VIDEOSRC_SRC].gst,
1181 "socket-path", socket_path,
1185 /* Making Video sink from here */
1186 _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_QUE, "queue", "videosink_queue", element_list, ret);
1188 /* Add color converting element */
1189 if (!strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "ximagesink")) {
1190 _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_CLS, "videoconvert", "videosrc_convert", element_list, ret);
1194 _MMCAMCORDER_ELEMENT_MAKE(sc, sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_SINK, videosink_name, "videosink_sink", element_list, ret);
1196 if (strcmp(videosink_name, "fakesink") != 0 && strcmp(videosink_name, "shmsink") != 0) {
1198 if (_mmcamcorder_client_videosink_window_set(handle, sc->VideosinkElement) != MM_ERROR_NONE) {
1199 _mmcam_dbg_err("_mmcamcorder_videosink_window_set error");
1200 ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
1201 goto pipeline_creation_error;
1205 _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_CLIENT_VIDEOSINK_SINK].gst, sc->VideosinkElement);
1207 /* add elements to main pipeline */
1208 if (!_mmcamcorder_add_elements_to_bin(GST_BIN(sc->element[_MMCAMCORDER_CLIENT_MAIN_PIPE].gst), element_list)) {
1209 _mmcam_dbg_err("element_list add error.");
1210 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
1211 goto pipeline_creation_error;
1214 caps = gst_caps_from_string(string_caps);
1216 if (!_mmcamcorder_filtered_link_elements(element_list, caps)) {
1217 _mmcam_dbg_err( "element link error." );
1218 ret = MM_ERROR_CAMCORDER_GST_LINK;
1219 goto pipeline_creation_error;
1222 pipeline = sc->element[_MMCAMCORDER_CLIENT_MAIN_PIPE].gst;
1224 ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
1225 if (ret != MM_ERROR_NONE) {
1226 _mmcam_dbg_err("error : destroy pipeline");
1227 goto pipeline_creation_error;
1231 g_list_free(element_list);
1232 element_list = NULL;
1235 return MM_ERROR_NONE;
1237 pipeline_creation_error:
1238 _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_SINK);
1239 if (!strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "ximagesink")) {
1240 _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_CLS);
1242 _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_CLIENT_VIDEOSINK_QUE);
1244 _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_CLIENT_VIDEOSRC_SRC);
1245 _MMCAMCORDER_ELEMENT_REMOVE(sc->element, _MMCAMCORDER_CLIENT_MAIN_PIPE);
1248 g_list_free(element_list);
1249 element_list = NULL;
1255 void __mmcamcorder_client_gst_destroy_pipeline(MMHandleType handle)
1257 _MMCamcorderSubContext *sc;
1258 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1260 if (sc->element[_MMCAMCORDER_CLIENT_MAIN_PIPE].gst) {
1261 _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_CLIENT_MAIN_PIPE].gst, GST_STATE_NULL);
1262 _mmcamcorder_remove_all_handlers(handle, _MMCAMCORDER_HANDLER_CATEGORY_ALL);
1264 gst_object_unref(sc->element[_MMCAMCORDER_CLIENT_MAIN_PIPE].gst);
1269 int _mmcamcorder_client_realize(MMHandleType handle, char *string_caps)
1271 int ret = MM_ERROR_NONE;
1272 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1274 _MMCamcorderSubContext *sc;
1275 int display_surface_type = MM_DISPLAY_SURFACE_X;
1276 char *videosink_element_type = NULL;
1277 const char *videosink_name = NULL;
1278 char *err_name = NULL;
1280 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1281 _mmcam_dbg_log("Enter");
1283 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1284 _mmcam_dbg_err("Another command is running.");
1285 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1286 goto _ERR_CAMCORDER_CMD_PRECON;
1289 /* alloc sub context */
1290 hcamcorder->sub_context = _mmcamcorder_alloc_subcontext(hcamcorder->type);
1291 if(!hcamcorder->sub_context) {
1292 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
1293 goto _ERR_CAMCORDER_CMD;
1296 sc = MMF_CAMCORDER_SUBCONTEXT(handle);
1298 ret = mm_camcorder_get_attributes(handle, &err_name,
1299 MMCAM_DISPLAY_SURFACE, &display_surface_type,
1302 if (ret != MM_ERROR_NONE) {
1303 _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
1304 SAFE_FREE(err_name);
1305 goto _ERR_CAMCORDER_SET_DISPLAY;
1308 _mmcam_dbg_warn("display_surface_type : %d", display_surface_type);
1310 switch (display_surface_type) {
1311 case MM_DISPLAY_SURFACE_X:
1312 videosink_element_type = strdup("VideosinkElementX");
1314 case MM_DISPLAY_SURFACE_EVAS:
1315 videosink_element_type = strdup("VideosinkElementEvas");
1317 case MM_DISPLAY_SURFACE_GL:
1318 videosink_element_type = strdup("VideosinkElementGL");
1320 case MM_DISPLAY_SURFACE_NULL:
1321 videosink_element_type = strdup("VideosinkElementNull");
1324 videosink_element_type = strdup("VideosinkElementX");
1328 /* check string of videosink element */
1329 if (videosink_element_type) {
1330 _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
1331 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
1332 videosink_element_type,
1333 &sc->VideosinkElement);
1334 free(videosink_element_type);
1335 videosink_element_type = NULL;
1337 _mmcam_dbg_warn("strdup failed(display_surface_type %d). Use default X type",
1338 display_surface_type);
1340 _mmcamcorder_conf_get_element(handle, hcamcorder->conf_main,
1341 CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
1342 _MMCAMCORDER_DEFAULT_VIDEOSINK_TYPE,
1343 &sc->VideosinkElement);
1346 _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
1348 if(videosink_name != NULL) {
1349 _mmcam_dbg_log("Videosink name : %s", videosink_name);
1350 ret = _mmcamcorder_client_create_preview_elements(handle, videosink_name, string_caps);
1351 if (ret != MM_ERROR_NONE) {
1352 _mmcam_dbg_err("create client's preview elements Failed.");
1353 goto _ERR_CAMCORDER_SET_DISPLAY;
1356 _mmcam_dbg_err("Get Videosink name error");
1357 goto _ERR_CAMCORDER_SET_DISPLAY;
1360 /* set command function */
1361 _mmcamcorder_set_state(handle, MM_CAMCORDER_STATE_READY);
1363 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1366 _ERR_CAMCORDER_SET_DISPLAY:
1367 if (hcamcorder->sub_context) {
1368 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1369 hcamcorder->sub_context = NULL;
1372 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1373 _ERR_CAMCORDER_CMD_PRECON:
1377 int _mmcamcorder_client_unrealize(MMHandleType handle)
1379 int ret = MM_ERROR_NONE;
1380 int state = MM_CAMCORDER_STATE_NONE;
1381 int state_FROM = MM_CAMCORDER_STATE_READY;
1382 int state_TO = MM_CAMCORDER_STATE_NULL;
1384 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1385 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
1386 _mmcam_dbg_log("Enter");
1389 _mmcam_dbg_err("Not initialized");
1390 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1394 _mmcam_dbg_log("try lock");
1395 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1396 _mmcam_dbg_err("Another command is running.");
1397 ret = MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
1398 goto _ERR_CAMCORDER_CMD_PRECON;
1401 state = _mmcamcorder_get_state(handle);
1402 if (state != state_FROM) {
1403 _mmcam_dbg_err("Wrong state(%d)", state);
1404 ret = MM_ERROR_CAMCORDER_INVALID_STATE;
1405 goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
1408 /* Release SubContext */
1409 if (hcamcorder->sub_context) {
1410 /* destroy pipeline */
1411 _mmcam_dbg_warn("destroy pipeline");
1412 __mmcamcorder_client_gst_destroy_pipeline(handle);
1413 /* Deallocate SubContext */
1414 _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
1415 hcamcorder->sub_context = NULL;
1418 /* Deinitialize main context member */
1419 hcamcorder->command = NULL;
1421 _mmcam_dbg_log("un lock");
1422 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1424 _mmcamcorder_set_state(handle, state_TO);
1426 return MM_ERROR_NONE;
1428 _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
1429 _mmcam_dbg_log("un lock");
1430 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1432 _ERR_CAMCORDER_CMD_PRECON:
1434 _mmcam_dbg_err("Unrealize fail (type %d, ret %x)",
1435 hcamcorder->type, ret);
1440 static int _mm_camcorder_client_set_shm_socket_path(MMHandleType handle, const char *path)
1442 int ret = MM_ERROR_NONE;
1443 _mmcam_dbg_log("handle : 0x%x, path:%s", handle, path);
1444 mm_camcorder_set_attributes(handle, NULL,
1445 MMCAM_DISPLAY_SHM_SOCKET_PATH, path, strlen(path),
1451 int mm_camcorder_client_create(MMHandleType *handle)
1453 int ret = MM_ERROR_NONE;
1454 mmf_camcorder_t *hcamcorder = NULL;
1456 _mmcam_dbg_log("Enter");
1457 mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
1459 /* Create mmf_camcorder_t handle and initialize every variable */
1460 hcamcorder = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
1461 mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_LOW_MEMORY);
1462 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
1465 hcamcorder->type = 0;
1466 hcamcorder->state = MM_CAMCORDER_STATE_NONE;
1467 hcamcorder->sub_context = NULL;
1468 hcamcorder->target_state = MM_CAMCORDER_STATE_NULL;
1469 hcamcorder->capture_in_recording = FALSE;
1471 pthread_mutex_init(&((hcamcorder->mtsafe).lock), NULL);
1472 pthread_cond_init(&((hcamcorder->mtsafe).cond), NULL);
1473 pthread_mutex_init(&((hcamcorder->mtsafe).cmd_lock), NULL);
1474 pthread_mutex_init(&((hcamcorder->mtsafe).state_lock), NULL);
1475 pthread_mutex_init(&((hcamcorder->mtsafe).gst_state_lock), NULL);
1476 pthread_mutex_init(&((hcamcorder->mtsafe).message_cb_lock), NULL);
1477 pthread_mutex_init(&(hcamcorder->restart_preview_lock), NULL);
1479 /* Get Camera Configure information from Camcorder INI file */
1480 _mmcamcorder_conf_get_info((MMHandleType)hcamcorder, CONFIGURE_TYPE_MAIN, CONFIGURE_MAIN_FILE, &hcamcorder->conf_main);
1482 if (!(hcamcorder->conf_main)) {
1483 _mmcam_dbg_err( "Failed to get configure(main) info." );
1485 ret = MM_ERROR_CAMCORDER_CREATE_CONFIGURE;
1486 goto _ERR_CAMCORDER_CREATE_CONFIGURE;
1488 _mmcam_dbg_log("aloc attribute handle : 0x%x", (MMHandleType)hcamcorder);
1489 hcamcorder->attributes = _mmcamcorder_client_alloc_attribute((MMHandleType)hcamcorder);
1490 if (!(hcamcorder->attributes)) {
1491 _mmcam_dbg_err("_mmcamcorder_create::alloc attribute error.");
1493 ret = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
1494 goto _ERR_CAMCORDER_RESOURCE_CREATION;
1497 ret = __mmcamcorder_client_gstreamer_init(hcamcorder->conf_main);
1499 _mmcam_dbg_err( "Failed to initialize gstreamer!!" );
1500 ret = MM_ERROR_CAMCORDER_NOT_INITIALIZED;
1501 goto _ERR_DEFAULT_VALUE_INIT;
1504 /* Set initial state */
1505 _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
1507 _mmcam_dbg_log("created handle %p", hcamcorder);
1509 *handle = (MMHandleType)hcamcorder;
1510 _mmcam_dbg_log("created client handle : 0x%x", *handle);
1512 return MM_ERROR_NONE;
1514 _ERR_CAMCORDER_CREATE_CONFIGURE:
1515 _ERR_CAMCORDER_RESOURCE_CREATION:
1516 _ERR_DEFAULT_VALUE_INIT:
1517 /* Release lock, cond */
1518 pthread_mutex_destroy(&((hcamcorder->mtsafe).lock));
1519 pthread_cond_destroy(&((hcamcorder->mtsafe).cond));
1520 pthread_mutex_destroy(&((hcamcorder->mtsafe).cmd_lock));
1521 pthread_mutex_destroy(&((hcamcorder->mtsafe).state_lock));
1522 pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_state_lock));
1523 pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_encode_state_lock));
1524 pthread_mutex_destroy(&((hcamcorder->mtsafe).message_cb_lock));
1526 pthread_mutex_destroy(&(hcamcorder->restart_preview_lock));
1528 if (hcamcorder->conf_ctrl) {
1529 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_ctrl);
1532 if (hcamcorder->conf_main) {
1533 _mmcamcorder_conf_release_info(handle, &hcamcorder->conf_main);
1536 /* Release handle */
1537 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
1543 void mm_camcorder_client_destroy(MMHandleType handle)
1545 mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
1547 _mmcam_dbg_log("try lock");
1549 if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
1550 _mmcam_dbg_err("Another command is running.");
1551 goto _ERR_CAMCORDER_CMD_PRECON;
1554 if (hcamcorder->attributes) {
1555 _mmcamcorder_dealloc_attribute(handle, hcamcorder->attributes);
1558 _mmcam_dbg_log("unlock");
1559 _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
1561 pthread_mutex_destroy(&((hcamcorder->mtsafe).lock));
1562 pthread_cond_destroy(&((hcamcorder->mtsafe).cond));
1563 pthread_mutex_destroy(&((hcamcorder->mtsafe).cmd_lock));
1564 pthread_mutex_destroy(&((hcamcorder->mtsafe).state_lock));
1565 pthread_mutex_destroy(&((hcamcorder->mtsafe).gst_state_lock));
1566 pthread_mutex_destroy(&((hcamcorder->mtsafe).message_cb_lock));
1567 pthread_mutex_destroy(&(hcamcorder->restart_preview_lock));
1568 _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NONE);
1569 /* Release handle */
1570 memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
1573 _ERR_CAMCORDER_CMD_PRECON:
1577 int mm_camcorder_client_realize(MMHandleType handle, char *caps)
1579 int ret = MM_ERROR_NONE;
1580 ret = _mmcamcorder_client_realize(handle, caps);
1584 int mm_camcorder_client_unrealize(MMHandleType handle)
1586 int ret = MM_ERROR_NONE;
1587 ret = _mmcamcorder_client_unrealize(handle);
1591 int mm_camcorder_client_set_shm_socket_path(MMHandleType handle, const char *path)
1593 int ret = MM_ERROR_NONE;
1594 _mmcam_dbg_log("Entered ");
1595 ret = _mm_camcorder_client_set_shm_socket_path(handle, path);
1599 int mm_camcorder_client_get_root_directory(char **root_directory)
1601 int ret = STORAGE_ERROR_NONE;
1603 if (root_directory == NULL) {
1604 _mmcam_dbg_warn("user data is NULL");
1605 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
1608 ret = storage_foreach_device_supported((storage_device_supported_cb)_storage_device_supported_cb, root_directory);
1609 if (ret != STORAGE_ERROR_NONE) {
1610 _mmcam_dbg_err("storage_foreach_device_supported failed 0x%x", ret);
1611 return MM_ERROR_CAMCORDER_INTERNAL;
1614 return MM_ERROR_NONE;