Tizen 2.1 base
authorJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:49:54 +0000 (01:49 +0900)
committerJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:49:54 +0000 (01:49 +0900)
34 files changed:
AUTHORS [new file with mode: 0644]
LICENSE.APLv2 [new file with mode: 0644]
NOTICE [new file with mode: 0644]
configure.ac
libmm-camcorder.manifest [new file with mode: 0644]
packaging/libmm-camcorder.spec
sounds/capture_shutter_01.wav
sounds/capture_shutter_02.wav
sounds/recording_start_01.wav
sounds/recording_stop_01.wav
src/Makefile.am
src/include/mm_camcorder.h
src/include/mm_camcorder_attribute.h
src/include/mm_camcorder_audiorec.h
src/include/mm_camcorder_gstcommon.h
src/include/mm_camcorder_internal.h
src/include/mm_camcorder_platform.h
src/include/mm_camcorder_sound.h
src/include/mm_camcorder_stillshot.h
src/include/mm_camcorder_util.h
src/include/mm_camcorder_videorec.h
src/mm_camcorder_attribute.c
src/mm_camcorder_audiorec.c
src/mm_camcorder_configure.c
src/mm_camcorder_exifinfo.c
src/mm_camcorder_gstcommon.c
src/mm_camcorder_internal.c
src/mm_camcorder_platform.c
src/mm_camcorder_sound.c
src/mm_camcorder_stillshot.c
src/mm_camcorder_util.c
src/mm_camcorder_videorec.c
test/Makefile.am [changed mode: 0755->0644]
test/mm_camcorder_testsuite.c

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..fdd00d0
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Jeongmo Yang <jm80.yang at samsung dot com>
+Jonghyuk Choi <jhchoi.choi at samsung dot com>
diff --git a/LICENSE.APLv2 b/LICENSE.APLv2
new file mode 100644 (file)
index 0000000..bbe9d02
--- /dev/null
@@ -0,0 +1,206 @@
+Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.\r
+\r
+                                 Apache License\r
+                           Version 2.0, January 2004\r
+                        http://www.apache.org/licenses/\r
+\r
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r
+\r
+   1. Definitions.\r
+\r
+      "License" shall mean the terms and conditions for use, reproduction,\r
+      and distribution as defined by Sections 1 through 9 of this document.\r
+\r
+      "Licensor" shall mean the copyright owner or entity authorized by\r
+      the copyright owner that is granting the License.\r
+\r
+      "Legal Entity" shall mean the union of the acting entity and all\r
+      other entities that control, are controlled by, or are under common\r
+      control with that entity. For the purposes of this definition,\r
+      "control" means (i) the power, direct or indirect, to cause the\r
+      direction or management of such entity, whether by contract or\r
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r
+      outstanding shares, or (iii) beneficial ownership of such entity.\r
+\r
+      "You" (or "Your") shall mean an individual or Legal Entity\r
+      exercising permissions granted by this License.\r
+\r
+      "Source" form shall mean the preferred form for making modifications,\r
+      including but not limited to software source code, documentation\r
+      source, and configuration files.\r
+\r
+      "Object" form shall mean any form resulting from mechanical\r
+      transformation or translation of a Source form, including but\r
+      not limited to compiled object code, generated documentation,\r
+      and conversions to other media types.\r
+\r
+      "Work" shall mean the work of authorship, whether in Source or\r
+      Object form, made available under the License, as indicated by a\r
+      copyright notice that is included in or attached to the work\r
+      (an example is provided in the Appendix below).\r
+\r
+      "Derivative Works" shall mean any work, whether in Source or Object\r
+      form, that is based on (or derived from) the Work and for which the\r
+      editorial revisions, annotations, elaborations, or other modifications\r
+      represent, as a whole, an original work of authorship. For the purposes\r
+      of this License, Derivative Works shall not include works that remain\r
+      separable from, or merely link (or bind by name) to the interfaces of,\r
+      the Work and Derivative Works thereof.\r
+\r
+      "Contribution" shall mean any work of authorship, including\r
+      the original version of the Work and any modifications or additions\r
+      to that Work or Derivative Works thereof, that is intentionally\r
+      submitted to Licensor for inclusion in the Work by the copyright owner\r
+      or by an individual or Legal Entity authorized to submit on behalf of\r
+      the copyright owner. For the purposes of this definition, "submitted"\r
+      means any form of electronic, verbal, or written communication sent\r
+      to the Licensor or its representatives, including but not limited to\r
+      communication on electronic mailing lists, source code control systems,\r
+      and issue tracking systems that are managed by, or on behalf of, the\r
+      Licensor for the purpose of discussing and improving the Work, but\r
+      excluding communication that is conspicuously marked or otherwise\r
+      designated in writing by the copyright owner as "Not a Contribution."\r
+\r
+      "Contributor" shall mean Licensor and any individual or Legal Entity\r
+      on behalf of whom a Contribution has been received by Licensor and\r
+      subsequently incorporated within the Work.\r
+\r
+   2. Grant of Copyright License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      copyright license to reproduce, prepare Derivative Works of,\r
+      publicly display, publicly perform, sublicense, and distribute the\r
+      Work and such Derivative Works in Source or Object form.\r
+\r
+   3. Grant of Patent License. Subject to the terms and conditions of\r
+      this License, each Contributor hereby grants to You a perpetual,\r
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r
+      (except as stated in this section) patent license to make, have made,\r
+      use, offer to sell, sell, import, and otherwise transfer the Work,\r
+      where such license applies only to those patent claims licensable\r
+      by such Contributor that are necessarily infringed by their\r
+      Contribution(s) alone or by combination of their Contribution(s)\r
+      with the Work to which such Contribution(s) was submitted. If You\r
+      institute patent litigation against any entity (including a\r
+      cross-claim or counterclaim in a lawsuit) alleging that the Work\r
+      or a Contribution incorporated within the Work constitutes direct\r
+      or contributory patent infringement, then any patent licenses\r
+      granted to You under this License for that Work shall terminate\r
+      as of the date such litigation is filed.\r
+\r
+   4. Redistribution. You may reproduce and distribute copies of the\r
+      Work or Derivative Works thereof in any medium, with or without\r
+      modifications, and in Source or Object form, provided that You\r
+      meet the following conditions:\r
+\r
+      (a) You must give any other recipients of the Work or\r
+          Derivative Works a copy of this License; and\r
+\r
+      (b) You must cause any modified files to carry prominent notices\r
+          stating that You changed the files; and\r
+\r
+      (c) You must retain, in the Source form of any Derivative Works\r
+          that You distribute, all copyright, patent, trademark, and\r
+          attribution notices from the Source form of the Work,\r
+          excluding those notices that do not pertain to any part of\r
+          the Derivative Works; and\r
+\r
+      (d) If the Work includes a "NOTICE" text file as part of its\r
+          distribution, then any Derivative Works that You distribute must\r
+          include a readable copy of the attribution notices contained\r
+          within such NOTICE file, excluding those notices that do not\r
+          pertain to any part of the Derivative Works, in at least one\r
+          of the following places: within a NOTICE text file distributed\r
+          as part of the Derivative Works; within the Source form or\r
+          documentation, if provided along with the Derivative Works; or,\r
+          within a display generated by the Derivative Works, if and\r
+          wherever such third-party notices normally appear. The contents\r
+          of the NOTICE file are for informational purposes only and\r
+          do not modify the License. You may add Your own attribution\r
+          notices within Derivative Works that You distribute, alongside\r
+          or as an addendum to the NOTICE text from the Work, provided\r
+          that such additional attribution notices cannot be construed\r
+          as modifying the License.\r
+\r
+      You may add Your own copyright statement to Your modifications and\r
+      may provide additional or different license terms and conditions\r
+      for use, reproduction, or distribution of Your modifications, or\r
+      for any such Derivative Works as a whole, provided Your use,\r
+      reproduction, and distribution of the Work otherwise complies with\r
+      the conditions stated in this License.\r
+\r
+   5. Submission of Contributions. Unless You explicitly state otherwise,\r
+      any Contribution intentionally submitted for inclusion in the Work\r
+      by You to the Licensor shall be under the terms and conditions of\r
+      this License, without any additional terms or conditions.\r
+      Notwithstanding the above, nothing herein shall supersede or modify\r
+      the terms of any separate license agreement you may have executed\r
+      with Licensor regarding such Contributions.\r
+\r
+   6. Trademarks. This License does not grant permission to use the trade\r
+      names, trademarks, service marks, or product names of the Licensor,\r
+      except as required for reasonable and customary use in describing the\r
+      origin of the Work and reproducing the content of the NOTICE file.\r
+\r
+   7. Disclaimer of Warranty. Unless required by applicable law or\r
+      agreed to in writing, Licensor provides the Work (and each\r
+      Contributor provides its Contributions) on an "AS IS" BASIS,\r
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r
+      implied, including, without limitation, any warranties or conditions\r
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r
+      PARTICULAR PURPOSE. You are solely responsible for determining the\r
+      appropriateness of using or redistributing the Work and assume any\r
+      risks associated with Your exercise of permissions under this License.\r
+\r
+   8. Limitation of Liability. In no event and under no legal theory,\r
+      whether in tort (including negligence), contract, or otherwise,\r
+      unless required by applicable law (such as deliberate and grossly\r
+      negligent acts) or agreed to in writing, shall any Contributor be\r
+      liable to You for damages, including any direct, indirect, special,\r
+      incidental, or consequential damages of any character arising as a\r
+      result of this License or out of the use or inability to use the\r
+      Work (including but not limited to damages for loss of goodwill,\r
+      work stoppage, computer failure or malfunction, or any and all\r
+      other commercial damages or losses), even if such Contributor\r
+      has been advised of the possibility of such damages.\r
+\r
+   9. Accepting Warranty or Additional Liability. While redistributing\r
+      the Work or Derivative Works thereof, You may choose to offer,\r
+      and charge a fee for, acceptance of support, warranty, indemnity,\r
+      or other liability obligations and/or rights consistent with this\r
+      License. However, in accepting such obligations, You may act only\r
+      on Your own behalf and on Your sole responsibility, not on behalf\r
+      of any other Contributor, and only if You agree to indemnify,\r
+      defend, and hold each Contributor harmless for any liability\r
+      incurred by, or claims asserted against, such Contributor by reason\r
+      of your accepting any such warranty or additional liability.\r
+\r
+   END OF TERMS AND CONDITIONS\r
+\r
+   APPENDIX: How to apply the Apache License to your work.\r
+\r
+      To apply the Apache License to your work, attach the following\r
+      boilerplate notice, with the fields enclosed by brackets "[]"\r
+      replaced with your own identifying information. (Don't include\r
+      the brackets!)  The text should be enclosed in the appropriate\r
+      comment syntax for the file format. We also recommend that a\r
+      file or class name and description of purpose be included on the\r
+      same "printed page" as the copyright notice for easier\r
+      identification within third-party archives.\r
+\r
+   Copyright [yyyy] [name of copyright owner]\r
+\r
+   Licensed under the Apache License, Version 2.0 (the "License");\r
+   you may not use this file except in compliance with the License.\r
+   You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+\r
+\r
+\r
diff --git a/NOTICE b/NOTICE
new file mode 100644 (file)
index 0000000..0e0f016
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,3 @@
+Copyright (c) Samsung Electronics Co., Ltd. All rights reserved.
+Except as noted, this software is licensed under Apache License, Version 2.
+Please, see the LICENSE.APLv2 file for Apache License terms and conditions.
index e15e812..ae545e5 100644 (file)
@@ -53,6 +53,10 @@ PKG_CHECK_MODULES(MM_SOUND, mm-sound)
 AC_SUBST(MM_SOUND_CFLAGS)
 AC_SUBST(MM_SOUND_LIBS)
 
+PKG_CHECK_MODULES(AVSYSTEM, avsysaudio)
+AC_SUBST(AVSYSTEM_CFLAGS)
+AC_SUBST(AVSYSTEM_LIBS)
+
 #PKG_CHECK_MODULES(INIPARSER, iniparser)
 #AC_SUBST(INIPARSER_CFLAGS)
 #AC_SUBST(INIPARSER_LIBS)
@@ -77,6 +81,10 @@ PKG_CHECK_MODULES(MMSOUND, mm-sound)
 AC_SUBST(MMSOUND_CFLAGS)
 AC_SUBST(MMSOUND_LIBS)
 
+PKG_CHECK_MODULES(MMUTIL_IMGP, mmutil-imgp)
+AC_SUBST(MMUTIL_IMGP_CFLAGS)
+AC_SUBST(MMUTIL_IMGP_LIBS)
+
 PKG_CHECK_MODULES(SNDFILE, sndfile)
 AC_SUBST(SNDFILE_CFLAGS)
 AC_SUBST(SNDFILE_LIBS)
@@ -85,6 +93,9 @@ PKG_CHECK_MODULES(CAMSRCJPEGENC, camsrcjpegenc)
 AC_SUBST(CAMSRCJPEGENC_CFLAGS)
 AC_SUBST(CAMSRCJPEGENC_LIBS)
 
+PKG_CHECK_MODULES(VCONF, vconf)
+AC_SUBST(VCONF_CFLAGS)
+AC_SUBST(VCONF_LIBS)
 
 # Checks for header files.
 AC_HEADER_STDC
diff --git a/libmm-camcorder.manifest b/libmm-camcorder.manifest
new file mode 100644 (file)
index 0000000..a76fdba
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_" />
+       </request>
+</manifest>
index 6f323f0..b284020 100644 (file)
@@ -1,42 +1,41 @@
 Name:       libmm-camcorder
-Summary:    camcorder library
-Version:    0.5.5
-Release:    1
+Summary:    Camera and recorder library
+Version:    0.7.7
+Release:    0
 Group:      libs
-License:    Samsung
-URL:        N/A
+License:    Apache-2.0
 Source0:    %{name}-%{version}.tar.gz
+Requires(post): /usr/bin/vconftool
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 BuildRequires:  pkgconfig(mm-common)
 BuildRequires:  pkgconfig(mm-sound)
+BuildRequires:  pkgconfig(avsystem)
 BuildRequires:  pkgconfig(libexif)
 BuildRequires:  pkgconfig(mmutil-imgp)
-BuildRequires:  pkgconfig(elementary)
-BuildRequires:  pkgconfig(appcore-efl)
-BuildRequires:  pkgconfig(vconf)
 BuildRequires:  pkgconfig(mm-log)
 BuildRequires:  pkgconfig(gstreamer-plugins-base-0.10)
 BuildRequires:  pkgconfig(mm-ta)
+BuildRequires:  pkgconfig(sndfile)
 BuildRequires:  pkgconfig(mm-session)
 BuildRequires:  pkgconfig(audio-session-mgr)
-BuildRequires:  pkgconfig(gstreamer-floatcast-0.10)
-BuildRequires:  pkgconfig(gstreamer-check-0.10)
 BuildRequires:  pkgconfig(camsrcjpegenc)
+BuildRequires:  pkgconfig(libpulse)
+BuildRequires:  pkgconfig(vconf)
 BuildRequires:  gst-plugins-base-devel
 
 %description
-camcorder library.
+Camera and recorder library.
 
 
 %package devel
-Summary:    camcorder development library
+Summary:    Camera and recorder development library
 Group:      libdevel
 Version:    %{version}
 Requires:   %{name} = %{version}-%{release}
 
 %description devel 
-camcorder development library.
+Camera and recorder development library.
 
 
 %prep
@@ -44,27 +43,36 @@ camcorder development library.
 
 
 %build
+export CFLAGS+=" -DGST_EXT_TIME_ANALYSIS"
 ./autogen.sh
 %configure --disable-static
 make %{?jobs:-j%jobs}
 
 %install
 rm -rf %{buildroot}
+mkdir -p %{buildroot}/usr/share/license
+cp LICENSE.APLv2 %{buildroot}/usr/share/license/%{name}
 %make_install
 
 
-%post -p /sbin/ldconfig
+%post
+/sbin/ldconfig
+
+vconftool set -t int memory/camera/state 0 -i -u 5000
+vconftool set -t int file/camera/shutter_sound_policy 0 -u 5000
 
 %postun -p /sbin/ldconfig
 
 %files
+%manifest libmm-camcorder.manifest
 %defattr(-,root,root,-)
 %{_bindir}/*
 %{_libdir}/*.so.*
-%{_datadir}/edje/*
 /usr/share/sounds/mm-camcorder/*
+%{_datadir}/license/%{name}
 
 %files devel
+%manifest libmm-camcorder.manifest
 %defattr(-,root,root,-)
 %{_includedir}/mmf/mm_camcorder.h
 %{_libdir}/pkgconfig/mm-camcorder.pc
index 3752fc4..cc46565 100644 (file)
Binary files a/sounds/capture_shutter_01.wav and b/sounds/capture_shutter_01.wav differ
index 41af197..cc46565 100644 (file)
Binary files a/sounds/capture_shutter_02.wav and b/sounds/capture_shutter_02.wav differ
index 5f89edd..82cf30a 100644 (file)
Binary files a/sounds/recording_start_01.wav and b/sounds/recording_start_01.wav differ
index 5f89edd..0346d4a 100644 (file)
Binary files a/sounds/recording_stop_01.wav and b/sounds/recording_stop_01.wav differ
index dfaa6ba..1b04dfd 100644 (file)
@@ -42,8 +42,11 @@ libmmfcamcorder_la_CFLAGS = -I$(srcdir)/include \
                             $(MM_COMMON_CFLAGS) \
                             $(MMSESSION_CFLAGS) \
                             $(MMSOUND_CFLAGS) \
+                            $(AVSYSTEM_CFLAGS) \
                             $(SNDFILE_CFLAGS) \
                             $(CAMSRCJPEGENC_CFLAGS) \
+                            $(VCONF_CFLAGS) \
+                            $(MMUTIL_IMGP_CFLAGS) \
                             $(AUDIOSESSIONMGR_CFLAGS)
 
 libmmfcamcorder_la_LIBADD = \
@@ -56,8 +59,11 @@ libmmfcamcorder_la_LIBADD = \
                            $(EXIF_LIBS) \
                            $(MMSESSION_LIBS) \
                            $(MMSOUND_LIBS) \
+                           $(AVSYSTEM_LIBS) \
                            $(SNDFILE_LIBS) \
                            $(CAMSRCJPEGENC_LIBS) \
+                           $(VCONF_LIBS) \
+                           $(MMUTIL_IMGP_LIBS) \
                            $(AUDIOSESSIONMGR_LIBS)
 
 libmmfcamcorder_la_CFLAGS += $(MMLOGSVR_CFLAGS) -DMMF_LOG_OWNER=0x010 -DMMF_DEBUG_PREFIX=\"MMF-CAMCORDER\" -D_INTERNAL_SESSION_MANAGER_
index a3f2f73..e078aa2 100644 (file)
                <td>Audio device ID for capturing audio stream</td>
        </tr>
        <tr>
-               <td>#MMCAM_CAMERA_DEVICE</td>
-               <td>Video device ID for capturing video stream</td>
+               <td>#MMCAM_CAMERA_DEVICE_COUNT</td>
+               <td>Video device count</td>
        </tr>
        <tr>
                <td>#MMCAM_AUDIO_ENCODER</td>
                <td>Target filename. Only used in Audio/Video recording. This is not used for capturing.</td>
        </tr>
        <tr>
+               <td>#MMCAM_TARGET_MAX_SIZE</td>
+               <td>Maximum size of recording file(Kbyte). If the size of file reaches this value.</td>
+       </tr>
+       <tr>
                <td>#MMCAM_TARGET_TIME_LIMIT</td>
                <td>Time limit of recording file. If the elapsed time of recording reaches this value.</td>
        </tr>
@@ -629,10 +633,15 @@ extern "C" {
 #define MMCAM_AUDIO_DEVICE                      "audio-device"
 
 /**
- * Video device ID for capturing video stream.
- * @see                MMVideoDeviceType (in mm_types.h)
+ * Video device count.
  */
-#define MMCAM_CAMERA_DEVICE                     "camera-device"
+#define MMCAM_CAMERA_DEVICE_COUNT               "camera-device-count"
+
+/**
+ * Facing direction of camera device.
+ * @see                MMCamcorderCameraFacingDirection
+ */
+#define MMCAM_CAMERA_FACING_DIRECTION           "camera-facing-direction"
 
 /**
  * Audio codec for encoding audio stream.
@@ -680,6 +689,11 @@ extern "C" {
 #define MMCAM_AUDIO_VOLUME                      "audio-volume"
 
 /**
+ * Disable Audio stream when record.
+ */
+#define MMCAM_AUDIO_DISABLE                     "audio-disable"
+
+/**
  * Set audio input route
  * @remarks    Deprecated. This will be removed soon.
  * @see                MMAudioRoutePolicy (in mm_types.h)
@@ -693,6 +707,21 @@ extern "C" {
 #define MMCAM_CAMERA_FORMAT                     "camera-format"
 
 /**
+ * Slow motion rate when video recording
+ * @remarks    Deprecated
+ */
+#define MMCAM_CAMERA_SLOW_MOTION_RATE           "camera-slow-motion-rate"
+
+/**
+ * Motion rate when video recording
+ * @remarks    This should be bigger than 0(zero).
+ *             Default value is 1 and it's for normal video recording.
+ *             If the value is smaller than 1, recorded file will be played slower,
+ *             otherwise, recorded file will be played faster.
+ */
+#define MMCAM_CAMERA_RECORDING_MOTION_RATE      "camera-recording-motion-rate"
+
+/**
  * Frames per second. This is an integer field
  * 
  */
@@ -800,6 +829,12 @@ extern "C" {
 #define MMCAM_CAMERA_ANTI_HANDSHAKE             "camera-anti-handshake"
 
 /**
+ * Video Stabilization
+ * @see                MMCamcorderVideoStabilizationMode
+ */
+#define MMCAM_CAMERA_VIDEO_STABILIZATION        "camera-video-stabilization"
+
+/**
  * FPS Auto. When you set true to this attribute, FPS will vary depending on the amount of the light.
  */
 #define MMCAM_CAMERA_FPS_AUTO                   "camera-fps-auto"
@@ -811,6 +846,12 @@ extern "C" {
 #define MMCAM_CAMERA_ROTATION                   "camera-rotation"
 
 /**
+ * HDR(High Dynamic Range) Capture mode
+ * @see                MMCamcorderHDRMode
+ */
+#define MMCAM_CAMERA_HDR_CAPTURE                "camera-hdr-capture"
+
+/**
  * Bitrate of Audio Encoder
  */
 #define MMCAM_AUDIO_ENCODER_BITRATE             "audio-encoder-bitrate"
@@ -904,6 +945,18 @@ extern "C" {
 #define MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT     "capture-break-cont-shot"
 
 /**
+ * Raw data of captured image which resolution is same as preview.
+ * This is READ-ONLY attribute and only available in capture callback.
+ * This should be used after casted as MMCamcorderCaptureDataType.
+ */
+#define MMCAM_CAPTURED_SCREENNAIL               "captured-screennail"
+
+/**
+ * Raw data of EXIF. This is READ-ONLY attribute and only available in capture callback.
+ */
+#define MMCAM_CAPTURED_EXIF_RAW_DATA            "captured-exif-raw-data"
+
+/**
  * Pointer of display buffer or ID of xwindow.
  */
 #define MMCAM_DISPLAY_HANDLE                    "display-handle"
@@ -921,6 +974,12 @@ extern "C" {
 #define MMCAM_DISPLAY_SURFACE                    "display-surface"
 
 /**
+ * Mode of display.
+ * @see                MMDisplayModeType (in mm_types.h)
+ */
+#define MMCAM_DISPLAY_MODE                       "display-mode"
+
+/**
  * X position of display rectangle.
  * This is only available when #MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI.
  * @see                MMCamcorderGeometryMethod
@@ -975,6 +1034,12 @@ extern "C" {
 #define MMCAM_DISPLAY_ROTATION                  "display-rotation"
 
 /**
+ * Flip of display.
+ * @see                MMFlipType (in mm_types.h)
+ */
+#define MMCAM_DISPLAY_FLIP                      "display-flip"
+
+/**
  * Visible of display.
  */
 #define MMCAM_DISPLAY_VISIBLE                   "display-visible"
@@ -992,11 +1057,28 @@ extern "C" {
 #define MMCAM_DISPLAY_GEOMETRY_METHOD           "display-geometry-method"
 
 /**
+ * A videosink name of evas surface.
+ * This is READ-ONLY attribute.
+ */
+#define MMCAM_DISPLAY_EVAS_SURFACE_SINK         "display-evas-surface-sink"
+
+/**
+ * This attribute is only available if value of MMCAM_DISPLAY_EVAS_SURFACE_SINK "evaspixmapsink"
+ */
+#define MMCAM_DISPLAY_EVAS_DO_SCALING           "display-evas-do-scaling"
+
+/**
  * Target filename. Only used in Audio/Video recording. This is not used for capturing.
  */
 #define MMCAM_TARGET_FILENAME                   "target-filename"
 
 /**
+ * Maximum size(Kbyte) of recording file. If the size of file reaches this value,
+ * camcorder will send 'MM_MESSAGE_CAMCORDER_MAX_SIZE' message.
+ */
+#define MMCAM_TARGET_MAX_SIZE                   "target-max-size"
+
+/**
  * Time limit(Second) of recording file. If the elapsed time of recording reaches this value, 
  * camcorder will send 'MM_MESSAGE_CAMCORDER_TIME_LIMIT' message.
  */
@@ -1087,9 +1169,46 @@ extern "C" {
 #define MMCAM_RECOMMEND_DISPLAY_ROTATION               "recommend-display-rotation"
 
 /**
- * Rotation angle of video input stream and display for video recording.
+ * Recommend width of camera preview.
+ * This attribute can be used with #mm_camcorder_get_attribute_info and #MMCamcorderPreviewType.
+ * @see                mm_camcorder_get_attribute_info, MMCamcorderPreviewType
  */
-#define MMCAM_CAMCORDER_ROTATION                   "camcorder-rotation"
+#define MMCAM_RECOMMEND_CAMERA_WIDTH                   "recommend-camera-width"
+
+/**
+ * Recommend height of camera preview
+ * This attribute can be used with #mm_camcorder_get_attribute_info and #MMCamcorderPreviewType.
+ * @see                mm_camcorder_get_attribute_info, MMCamcorderPreviewType
+ */
+#define MMCAM_RECOMMEND_CAMERA_HEIGHT                  "recommend-camera-height"
+
+/**
+ * Flip of video input stream.
+ * @see                MMFlipType (in mm_types.h)
+ */
+#define MMCAM_CAMERA_FLIP                              "camera-flip"
+
+/**
+ * X coordinate of Face zoom.
+ */
+#define MMCAM_CAMERA_FACE_ZOOM_X                      "camera-face-zoom-x"
+
+/**
+ * Y coordinate of Face zoom.
+ */
+#define MMCAM_CAMERA_FACE_ZOOM_Y                      "camera-face-zoom-y"
+
+/**
+ * Zoom level of Face zoom.
+ */
+#define MMCAM_CAMERA_FACE_ZOOM_LEVEL                  "camera-face-zoom-level"
+
+/**
+ * Mode of Face zoom.
+ * @see                MMCamcorderFaceZoomMode
+ */
+#define MMCAM_CAMERA_FACE_ZOOM_MODE                   "camera-face-zoom-mode"
+
 
 /*=======================================================================================
 | ENUM DEFINITIONS                                                                     |
@@ -1112,11 +1231,18 @@ typedef enum {
  * An enumeration for camcorder mode.
  */
 typedef enum {
-       MM_CAMCORDER_MODE_IMAGE = 0,            /**< Still image capture mode */
-       MM_CAMCORDER_MODE_AUDIO,                /**< Audio recording mode */
-       MM_CAMCORDER_MODE_VIDEO,                /**< Video recording mode */
+       MM_CAMCORDER_MODE_VIDEO_CAPTURE = 0,    /**< Video recording and Image capture mode */
+       MM_CAMCORDER_MODE_AUDIO,                /**< Audio recording mode */
 } MMCamcorderModeType;
 
+/**
+ * An enumeration for facing direction.
+ */
+typedef enum {
+       MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR = 0, /**< Facing direction of camera is REAR */
+       MM_CAMCORDER_CAMERA_FACING_DIRECTION_FRONT,    /**< Facing direction of camera is FRONT */
+} MMCamcorderCameraFacingDirection;
+
 
 /**
  * An enumeration of Audio Format.
@@ -1133,34 +1259,36 @@ typedef enum
  * seeing through a tinted glass.
  */
 enum MMCamcorderColorToneType {
-       MM_CAMCORDER_COLOR_TONE_NONE = 0,               /**< None */
-       MM_CAMCORDER_COLOR_TONE_MONO,                   /**< Mono */
-       MM_CAMCORDER_COLOR_TONE_SEPIA,                  /**< Sepia */
-       MM_CAMCORDER_COLOR_TONE_NEGATIVE,               /**< Negative */
-       MM_CAMCORDER_COLOR_TONE_BLUE,                   /**< Blue */
-       MM_CAMCORDER_COLOR_TONE_GREEN,                  /**< Green */
-       MM_CAMCORDER_COLOR_TONE_AQUA,                   /**< Aqua */
-       MM_CAMCORDER_COLOR_TONE_VIOLET,                 /**< Violet */
-       MM_CAMCORDER_COLOR_TONE_ORANGE,                 /**< Orange */
-       MM_CAMCORDER_COLOR_TONE_GRAY,                   /**< Gray */
-       MM_CAMCORDER_COLOR_TONE_RED,                    /**< Red */
-       MM_CAMCORDER_COLOR_TONE_ANTIQUE,                /**< Antique */
-       MM_CAMCORDER_COLOR_TONE_WARM,                   /**< Warm */
-       MM_CAMCORDER_COLOR_TONE_PINK,                   /**< Pink */
-       MM_CAMCORDER_COLOR_TONE_YELLOW,                 /**< Yellow */
-       MM_CAMCORDER_COLOR_TONE_PURPLE,                 /**< Purple */
-       MM_CAMCORDER_COLOR_TONE_EMBOSS,                 /**< Emboss */
-       MM_CAMCORDER_COLOR_TONE_OUTLINE,                /**< Outline */
-
-       MM_CAMCORDER_COLOR_TONE_SOLARIZATION_1,         /**< Solarization1 */
-       MM_CAMCORDER_COLOR_TONE_SOLARIZATION_2,         /**< Solarization2 */
-       MM_CAMCORDER_COLOR_TONE_SOLARIZATION_3,         /**< Solarization3 */
-       MM_CAMCORDER_COLOR_TONE_SOLARIZATION_4,         /**< Solarization4 */
-
-       MM_CAMCORDER_COLOR_TONE_SKETCH_1,               /**< Sketch1 */
-       MM_CAMCORDER_COLOR_TONE_SKETCH_2,               /**< Sketch2 */
-       MM_CAMCORDER_COLOR_TONE_SKETCH_3,               /**< Sketch3 */
-       MM_CAMCORDER_COLOR_TONE_SKETCH_4,               /**< Sketch4 */ 
+       MM_CAMCORDER_COLOR_TONE_NONE = 0,               /**< None */
+       MM_CAMCORDER_COLOR_TONE_MONO,                   /**< Mono */
+       MM_CAMCORDER_COLOR_TONE_SEPIA,                  /**< Sepia */
+       MM_CAMCORDER_COLOR_TONE_NEGATIVE,               /**< Negative */
+       MM_CAMCORDER_COLOR_TONE_BLUE,                   /**< Blue */
+       MM_CAMCORDER_COLOR_TONE_GREEN,                  /**< Green */
+       MM_CAMCORDER_COLOR_TONE_AQUA,                   /**< Aqua */
+       MM_CAMCORDER_COLOR_TONE_VIOLET,                 /**< Violet */
+       MM_CAMCORDER_COLOR_TONE_ORANGE,                 /**< Orange */
+       MM_CAMCORDER_COLOR_TONE_GRAY,                   /**< Gray */
+       MM_CAMCORDER_COLOR_TONE_RED,                    /**< Red */
+       MM_CAMCORDER_COLOR_TONE_ANTIQUE,                /**< Antique */
+       MM_CAMCORDER_COLOR_TONE_WARM,                   /**< Warm */
+       MM_CAMCORDER_COLOR_TONE_PINK,                   /**< Pink */
+       MM_CAMCORDER_COLOR_TONE_YELLOW,                 /**< Yellow */
+       MM_CAMCORDER_COLOR_TONE_PURPLE,                 /**< Purple */
+       MM_CAMCORDER_COLOR_TONE_EMBOSS,                 /**< Emboss */
+       MM_CAMCORDER_COLOR_TONE_OUTLINE,                /**< Outline */
+       MM_CAMCORDER_COLOR_TONE_SOLARIZATION,           /**< Solarization */
+       MM_CAMCORDER_COLOR_TONE_SKETCH,                 /**< Sketch */
+       MM_CAMCORDER_COLOR_TONE_WASHED,                 /**< Washed */
+       MM_CAMCORDER_COLOR_TONE_VINTAGE_WARM,           /**< Vintage warm */
+       MM_CAMCORDER_COLOR_TONE_VINTAGE_COLD,           /**< Vintage cold */
+       MM_CAMCORDER_COLOR_TONE_POSTERIZATION,          /**< Posterization */
+       MM_CAMCORDER_COLOR_TONE_CARTOON,                /**< Cartoon */
+       MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED,          /**< Selective color - Red */
+       MM_CAMCORDER_COLOR_TONE_SELECTIVE_GREEN,        /**< Selective color - Green */
+       MM_CAMCORDER_COLOR_TONE_SELECTIVE_BLUE,         /**< Selective color - Blue */
+       MM_CAMCORDER_COLOR_TONE_SELECTIVE_YELLOW,       /**< Selective color - Yellow */
+       MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED_YELLOW,   /**< Selective color - Red and Yellow */
 };
 
 
@@ -1290,6 +1418,16 @@ enum MMCamcorderWDRMode {
 
 
 /**
+ * An enumeration for HDR capture mode
+ */
+enum MMCamcorderHDRMode {
+       MM_CAMCORDER_HDR_OFF = 0,               /**< HDR OFF */
+       MM_CAMCORDER_HDR_ON,                    /**< HDR ON and no original data - capture callback will be come once */
+       MM_CAMCORDER_HDR_ON_AND_ORIGINAL,       /**< HDR ON and original data - capture callback will be come twice(1st:Original, 2nd:HDR) */
+};
+
+
+/**
  * An enumeration for Anti-handshake mode .
  */
 enum MMCamcorderAHSMode {
@@ -1301,6 +1439,15 @@ enum MMCamcorderAHSMode {
 
 
 /**
+ * An enumeration for Video stabilization mode
+ */
+enum MMCamcorderVideoStabilizationMode {
+       MM_CAMCORDER_VIDEO_STABILIZATION_OFF = 0,       /**< Video Stabilization OFF*/
+       MM_CAMCORDER_VIDEO_STABILIZATION_ON,            /**< Video Stabilization ON*/
+};
+
+
+/**
  * Geometry method for camcorder display.
  */
 enum MMCamcorderGeometryMethod {
@@ -1308,6 +1455,7 @@ enum MMCamcorderGeometryMethod {
        MM_CAMCORDER_ORIGIN_SIZE,               /**< Origin size*/
        MM_CAMCORDER_FULL,                      /**< full-screen*/
        MM_CAMCORDER_CROPPED_FULL,              /**< Cropped full-screen*/
+       MM_CAMCORDER_ORIGIN_OR_LETTER,          /**< Origin size or Letter box*/
        MM_CAMCORDER_CUSTOM_ROI,                /**< Explicitely described destination ROI*/
 };
 
@@ -1362,6 +1510,23 @@ enum MMCamcorderDetectMode {
 };
 
 
+/**
+ * An enumeration for Face zoom mode.
+ */
+enum MMCamcorderFaceZoomMode {
+       MM_CAMCORDER_FACE_ZOOM_MODE_OFF = 0,    /**< turn face zoom off */
+       MM_CAMCORDER_FACE_ZOOM_MODE_ON,         /**< turn face zoom on */
+};
+
+/**
+ * An enumeration for recommended preview resolution.
+ */
+enum MMCamcorderPreviewType {
+       MM_CAMCORDER_PREVIEW_TYPE_NORMAL = 0,   /**< normal ratio like 4:3 */
+       MM_CAMCORDER_PREVIEW_TYPE_WIDE,         /**< wide ratio like 16:9 */
+};
+
+
 /**********************************
 *          Attribute info         *
 **********************************/
@@ -1374,8 +1539,6 @@ typedef enum{
        MM_CAM_ATTRS_TYPE_DOUBLE,               /**< Double type attribute */
        MM_CAM_ATTRS_TYPE_STRING,               /**< UTF-8 String type attribute */
        MM_CAM_ATTRS_TYPE_DATA,                 /**< Pointer type attribute */
-       MM_CAM_ATTRS_TYPE_ARRAY,                /**< Array type attribute */
-       MM_CAM_ATTRS_TYPE_RANGE,                /**< Range type attribute */
 }MMCamAttrsType;
 
 
@@ -1404,6 +1567,21 @@ typedef enum {
 } MMCamAttrsFlag;
 
 
+/**********************************
+*          Stream data            *
+**********************************/
+/**
+ * An enumeration for stream data type.
+ */
+typedef enum {
+       MM_CAM_STREAM_DATA_YUV420 = 0,          /**< YUV420 Packed type - 1 plane */
+       MM_CAM_STREAM_DATA_YUV422,              /**< YUV422 Packed type - 1 plane */
+       MM_CAM_STREAM_DATA_YUV420SP,            /**< YUV420 SemiPlannar type - 2 planes */
+       MM_CAM_STREAM_DATA_YUV420P,             /**< YUV420 Plannar type - 3 planes */
+       MM_CAM_STREAM_DATA_YUV422P,             /**< YUV422 Plannar type - 3 planes */
+} MMCamStreamData;
+
+
 /*=======================================================================================
 | STRUCTURE DEFINITIONS                                                                        |
 ========================================================================================*/
@@ -1478,12 +1656,33 @@ typedef struct {
  * Structure for video stream data.
  */
 typedef struct {
-       void *data;                     /**< pointer of captured stream */
-       unsigned int length;            /**< length of stream buffer (in byte)*/
-       MMPixelFormatType format;       /**< image format */
-       int width;                      /**< width of video buffer */
-       int height;                     /**< height of video buffer */
-       unsigned int timestamp;         /**< timestamp of stream buffer (msec)*/
+       union {
+               struct {
+                       unsigned char *yuv;
+                       unsigned int length_yuv;
+               } yuv420, yuv422;
+               struct {
+                       unsigned char *y;
+                       unsigned int length_y;
+                       unsigned char *uv;
+                       unsigned int length_uv;
+               } yuv420sp;
+               struct {
+                       unsigned char *y;
+                       unsigned int length_y;
+                       unsigned char *u;
+                       unsigned int length_u;
+                       unsigned char *v;
+                       unsigned int length_v;
+               } yuv420p, yuv422p;
+       } data;                         /**< pointer of captured stream */
+       MMCamStreamData data_type;      /**< data type */
+       unsigned int length_total;      /**< total length of stream buffer (in byte)*/
+       unsigned int num_planes;        /**< number of planes */
+       MMPixelFormatType format;       /**< image format */
+       int width;                      /**< width of video buffer */
+       int height;                     /**< height of video buffer */
+       unsigned int timestamp;         /**< timestamp of stream buffer (msec)*/
 } MMCamcorderVideoStreamDataType;
 
 
@@ -1514,9 +1713,27 @@ typedef struct {
 /**
  * Report structure of recording file
  */
-typedef struct MMCamRecordingReport {
+typedef struct {
        char *recording_filename;               /**< File name of stored recording file. Please free after using. */
-}MMCamRecordingReport; /**< report structure definition of recording file */
+} MMCamRecordingReport; /**< report structure definition of recording file */
+
+
+/**
+ * Face detect defailed information
+ */
+typedef struct _MMCamFaceInfo {
+       int id;                                 /**< id of each face */
+       int score;                              /**< score of each face */
+       MMRectType rect;                        /**< area of face */
+} MMCamFaceInfo;
+
+/**
+ * Face detect information
+ */
+typedef struct _MMCamFaceDetectInfo {
+       int num_of_faces;                       /**< number of detected faces */
+       MMCamFaceInfo *face_info;               /**< face information, this should be freed after use it. */
+} MMCamFaceDetectInfo;
 
 
 /*=======================================================================================
index 8a499e5..30b4cd8 100644 (file)
@@ -57,7 +57,7 @@ typedef enum
 {
        MM_CAM_MODE,                                    /* 0 */
        MM_CAM_AUDIO_DEVICE,
-       MM_CAM_CAMERA_DEVICE,
+       MM_CAM_CAMERA_DEVICE_COUNT,
        MM_CAM_AUDIO_ENCODER,
        MM_CAM_VIDEO_ENCODER,
        MM_CAM_IMAGE_ENCODER,
@@ -77,7 +77,7 @@ typedef enum
        MM_CAM_FILTER_HUE,
        MM_CAM_FILTER_SHARPNESS,                        /* 20 */
        MM_CAM_CAMERA_FORMAT,
-       MM_CAM_CAMERA_SLOW_MOTION_FPS,
+       MM_CAM_CAMERA_RECORDING_MOTION_RATE,
        MM_CAM_CAMERA_FPS,
        MM_CAM_CAMERA_WIDTH,
        MM_CAM_CAMERA_HEIGHT,
@@ -155,7 +155,22 @@ typedef enum
        MM_CAM_CAPTURED_SCREENNAIL,
        MM_CAM_CAPTURE_SOUND_ENABLE,
        MM_CAM_RECOMMEND_DISPLAY_ROTATION,
-       MM_CAM_CAMCORDER_ROTATION,                      /* 100 */
+       MM_CAM_CAMERA_FLIP,                             /* 100 */
+       MM_CAM_CAMERA_HDR_CAPTURE,
+       MM_CAM_DISPLAY_MODE,
+       MM_CAM_CAMERA_FACE_ZOOM_X,
+       MM_CAM_CAMERA_FACE_ZOOM_Y,
+       MM_CAM_CAMERA_FACE_ZOOM_LEVEL,
+       MM_CAM_CAMERA_FACE_ZOOM_MODE,
+       MM_CAM_AUDIO_DISABLE,
+       MM_CAM_RECOMMEND_CAMERA_WIDTH,
+       MM_CAM_RECOMMEND_CAMERA_HEIGHT,
+       MM_CAM_CAPTURED_EXIF_RAW_DATA,                  /* 110 */
+       MM_CAM_DISPLAY_EVAS_SURFACE_SINK,
+       MM_CAM_DISPLAY_EVAS_DO_SCALING,
+       MM_CAM_CAMERA_FACING_DIRECTION,
+       MM_CAM_DISPLAY_FLIP,
+       MM_CAM_CAMERA_VIDEO_STABILIZATION,
        MM_CAM_NUM
 }MMCamcorderAttrsID;
 
@@ -172,10 +187,15 @@ typedef struct {
        char *name;
        int value_type;
        int flags;
-       void* default_value;
+       union {
+               void *value_void;
+               char *value_string;
+               int value_int;
+               double value_double;
+       } default_value;              /* default value */
        MMCamAttrsValidType validity_type;
-       int validity_value1;    /* can be int min, int *array, double *array, or cast to double min. */
-       int validity_value2;    /* can be int max, int count, int count, or cast to double max. */
+       int validity_value1;    /* can be int min, int *array, double *array, or cast to double min. */
+       int validity_value2;    /* can be int max, int count, int count, or cast to double max. */
        mmf_cam_commit_func_t attr_commit;
 } mm_cam_attr_construct_info;
 
@@ -296,9 +316,12 @@ bool _mmcamcorder_commit_capture_width(MMHandleType handle, int attr_idx, const
 bool _mmcamcorder_commit_capture_height(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_capture_break_cont_shot(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_capture_count(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_capture_sound_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_audio_volume(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_audio_input_route(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_audio_disable(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_fps(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_camera_recording_motion_rate(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_width(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_height(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_zoom(MMHandleType handle, int attr_idx, const mmf_value_t *value);
@@ -308,31 +331,34 @@ bool _mmcamcorder_commit_camera_af_touch_area(MMHandleType handle, int attr_idx,
 bool _mmcamcorder_commit_camera_capture_mode(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_wdr(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_anti_handshake(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_camera_video_stabilization(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_hold_af_after_capturing(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_camera_rotate(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_camera_face_zoom(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_image_encoder_quality(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_filter(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_filter_scene_mode(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_filter_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_display_mode(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_rotation(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_display_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_visible(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_geometry_method(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_rect(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_display_scale(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_display_evas_do_scaling(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_strobe(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 bool _mmcamcorder_commit_detect(MMHandleType handle, int attr_idx, const mmf_value_t *value);
-bool _mmcamcorder_commit_camcorder_rotate(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_camera_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value);
+bool _mmcamcorder_commit_camera_hdr_capture(MMHandleType handle, int attr_idx, const mmf_value_t *value);
 
 /**
  * This function initialize effect setting.
  *
  * @param[in]  handle          Handle of camcorder.
- * @return     bool
- * @remarks
- * @see
- *
+ * @return     bool            Success on TRUE or return FALSE
  */
 bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle);
 
@@ -340,10 +366,7 @@ bool _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle);
  * This function removes writable flag from pre-defined attributes.
  *
  * @param[in]  handle          Handle of camcorder.
- * @return     void
- * @remarks
- * @see
- *
+ * @return     int             Success on MM_ERROR_NONE or return ERROR with error code
  */
 int _mmcamcorder_lock_readonly_attributes(MMHandleType handle);
 
@@ -351,13 +374,19 @@ int _mmcamcorder_lock_readonly_attributes(MMHandleType handle);
  * This function disable pre-defined attributes.
  *
  * @param[in]  handle          Handle of camcorder.
- * @return     void
- * @remarks
- * @see
- *
+ * @return     int             Success on MM_ERROR_NONE or return ERROR with error code
  */
 int _mmcamcorder_set_disabled_attributes(MMHandleType handle);
 
+/**
+ * check whether supported or not
+ *
+ * @param[in]  handle          Handle of camcorder.
+ * @param[in]  attr_index      index of attribute to check.
+ * @return     bool            TRUE if supported or FALSE
+ */
+bool _mmcamcorder_check_supported_attribute(MMHandleType handle, int attr_index);
+
 #ifdef __cplusplus
 }
 #endif
index eb10677..6366fd2 100644 (file)
@@ -45,6 +45,7 @@ typedef struct {
        gboolean b_commiting;           /**< Is it commiting now? */
        gboolean bMuxing;               /**< whether muxing */
        guint64 filesize;               /**< current recorded file size */
+       guint64 max_size;               /**< max recording size */
        guint64 max_time;               /**< max recording time */
        int fileformat;                 /**< recording file format */
 } _MMCamcorderAudioInfo;
index 7ba1605..eb33cab 100644 (file)
@@ -46,7 +46,7 @@ extern "C" {
 /**
 * Enumerations for AMR bitrate
 */
-typedef enum MMCamcorderAMRBitRate {
+typedef enum _MMCamcorderAMRBitRate {
        MM_CAMCORDER_MR475,     /**< MR475 : 4.75 kbit/s */
        MM_CAMCORDER_MR515,     /**< MR515 : 5.15 kbit/s */
        MM_CAMCORDER_MR59,      /**< MR59 : 5.90 kbit/s */
@@ -58,6 +58,16 @@ typedef enum MMCamcorderAMRBitRate {
        MM_CAMCORDER_MRDTX      /**< MRDTX */
 } MMCamcorderAMRBitRate;
 
+/**
+* Encodebin profile
+*/
+typedef enum _MMCamcorderEncodebinProfile {
+        MM_CAMCORDER_ENCBIN_PROFILE_VIDEO = 0,  /**< Video recording profile */
+        MM_CAMCORDER_ENCBIN_PROFILE_AUDIO,      /**< Audio recording profile */
+        MM_CAMCORDER_ENCBIN_PROFILE_IMAGE,      /**< Image capture profile */
+        MM_CAMCORDER_ENCBIN_PROFILE_NUM
+} MMCamcorderEncodebinProfile;
+
 /*=======================================================================================
 | STRUCTURE DEFINITIONS                                                                        |
 ========================================================================================*/
@@ -130,11 +140,12 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle);
  * This function creates outputsink bin.
  *
  * @param[in]  handle          Handle of camcorder context.
+ * @param[in]  profile         profile of encodesinkbin.
  * @return     This function returns MM_ERROR_NONE on success, or the other values on error.
  * @remarks
  * @see                __mmcamcorder_create_preview_pipeline()
  */
-int _mmcamcorder_create_encodesink_bin(MMHandleType handle);
+int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebinProfile profile);
 
 /**
  * This function creates bin of still shot sink.
@@ -165,8 +176,6 @@ int _mmcamcorder_create_preview_pipeline(MMHandleType handle);
 
 /* plug-in related */
 void _mmcamcorder_negosig_handler(GstElement *videosrc, MMHandleType handle);
-bool _mmcamcorder_set_display_rotation(MMHandleType handle, int display_rotate);
-bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate);
 
 /* etc */
 int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element *VideosinkElement);
@@ -176,6 +185,12 @@ int _mmcamcorder_get_eos_message(MMHandleType handle);
 void _mmcamcorder_remove_element_handle(MMHandleType handle, int first_elem, int last_elem);
 int _mmcamcorder_check_audiocodec_fileformat_compatibility(MMHandleType handle);
 int _mmcamcorder_check_videocodec_fileformat_compatibility(MMHandleType handle);
+bool _mmcamcorder_set_display_rotation(MMHandleType handle, int display_rotate);
+bool _mmcamcorder_set_display_flip(MMHandleType handle, int display_flip);
+bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate);
+bool _mmcamcorder_set_videosrc_flip(MMHandleType handle, int viderosrc_flip);
+bool _mmcamcorder_set_videosrc_anti_shake(MMHandleType handle, int anti_shake);
+bool _mmcamcorder_set_videosrc_stabilization(MMHandleType handle, int stabilization);
 
 #ifdef __cplusplus
 }
index c887273..8819aac 100644 (file)
@@ -22,7 +22,6 @@
 #ifndef __MM_CAMCORDER_INTERNAL_H__
 #define __MM_CAMCORDER_INTERNAL_H__
 
-
 /*=======================================================================================
 | INCLUDE FILES                                                                                |
 ========================================================================================*/
@@ -38,6 +37,7 @@
 #include <mm_message.h>
 #include <mm_ta.h>
 #include <sndfile.h>
+#include <vconf.h>
 
 #include "mm_camcorder.h"
 #include "mm_debug.h"
@@ -132,17 +132,34 @@ extern "C" {
                _mmcam_dbg_err("The element is existed. element_id=[%d], name=[%s]", eid, name); \
                gst_object_unref(sub_context->element[eid].gst); \
        } \
-       sub_context->element[eid].id = eid; \
        sub_context->element[eid].gst = gst_element_factory_make(name, nickname); \
        if (sub_context->element[eid].gst == NULL) { \
                _mmcam_dbg_err("Element creation fail. element_id=[%d], name=[%s]", eid, name); \
                err = MM_ERROR_CAMCORDER_RESOURCE_CREATION; \
                goto pipeline_creation_error; \
        } else { \
+               _mmcam_dbg_log("Element creation done. element_id=[%d], name=[%s]", eid, name); \
+               sub_context->element[eid].id = eid; \
                g_object_weak_ref(G_OBJECT(sub_context->element[eid].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sub_context); \
+               err = MM_ERROR_NONE; \
        } \
        elist = g_list_append(elist, &(sub_context->element[eid]));
 
+#define _MMCAMCORDER_ELEMENT_MAKE_IGNORE_ERROR(sub_context, eid, name /*char* */, nickname /*char* */, elist) \
+       if (sub_context->element[eid].gst != NULL) { \
+               _mmcam_dbg_err("The element is existed. element_id=[%d], name=[%s]", eid, name); \
+               gst_object_unref(sub_context->element[eid].gst); \
+       } \
+       sub_context->element[eid].gst = gst_element_factory_make(name, nickname); \
+       if (sub_context->element[eid].gst == NULL) { \
+               _mmcam_dbg_err("Element creation fail. element_id=[%d], name=[%s], but keep going...", eid, name); \
+       } else { \
+               _mmcam_dbg_log("Element creation done. element_id=[%d], name=[%s]", eid, name); \
+               sub_context->element[eid].id = eid; \
+               g_object_weak_ref(G_OBJECT(sub_context->element[eid].gst), (GWeakNotify)_mmcamcorder_element_release_noti, sub_context); \
+               elist = g_list_append(elist, &(sub_context->element[eid])); \
+       }
+
 #define _MMCAMCORDER_ENCODEBIN_ELMGET(sub_context, eid, name /*char* */, err) \
        if (sub_context->element[eid].gst != NULL) { \
                _mmcam_dbg_err("The element is existed. element_id=[%d], name=[%s]", eid, name); \
@@ -181,15 +198,33 @@ extern "C" {
 }
 
 #define _MM_GST_PAD_UNLINK_UNREF( srcpad, sinkpad) \
-       gst_pad_unlink( srcpad, sinkpad ); \
-       gst_object_unref( srcpad ); srcpad = NULL; \
-       gst_object_unref( sinkpad ); sinkpad = NULL;
+       if (srcpad && sinkpad) { \
+               gst_pad_unlink(srcpad, sinkpad); \
+       } else { \
+               _mmcam_dbg_warn("some pad(srcpad:%p,sinkpad:%p) is NULL", srcpad, sinkpad); \
+       } \
+       if (srcpad) { \
+               gst_object_unref(srcpad); srcpad = NULL; \
+       } \
+       if (sinkpad) { \
+               gst_object_unref(sinkpad); sinkpad = NULL; \
+       }
 
 #define        _MMCAMCORDER_STATE_SET_COUNT            3               /* checking interval */
 #define        _MMCAMCORDER_STATE_CHECK_TOTALTIME      5000000L        /* total wating time for state change */
 #define        _MMCAMCORDER_STATE_CHECK_INTERVAL       5000            /* checking interval */
 
 /**
+ * Default videosink type
+ */
+#define _MMCAMCORDER_DEFAULT_VIDEOSINK_TYPE     "VideosinkElementX"
+
+/**
+ * Default recording motion rate
+ */
+#define _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE   1.0
+
+/**
  * Total level count of manual focus */
 #define _MMFCAMCORDER_FOCUS_TOTAL_LEVEL                8
 
@@ -201,12 +236,22 @@ extern "C" {
 /**
  *     Minimum integer value
  */
-#define _MMCAMCORDER_MIN_INT   (-2147483648)
+#define _MMCAMCORDER_MIN_INT   (INT_MIN)
 
 /**
  *     Maximum integer value
  */
-#define _MMCAMCORDER_MAX_INT   (2147483647)
+#define _MMCAMCORDER_MAX_INT   (INT_MAX)
+
+/**
+ *     Minimum double value
+ */
+#define _MMCAMCORDER_MIN_DOUBLE        (DBL_MIN)
+
+/**
+ *     Maximum integer value
+ */
+#define _MMCAMCORDER_MAX_DOUBLE        (DBL_MAX)
 
 /**
  *     Audio timestamp margin (msec)
@@ -285,7 +330,7 @@ extern "C" {
  * If you increase any enum of attribute values, you also have to increase this.
  */
 #define MM_CAMCORDER_MODE_NUM                  3       /**< Number of mode type */
-#define MM_CAMCORDER_COLOR_TONE_NUM            27      /**< Number of color-tone modes */
+#define MM_CAMCORDER_COLOR_TONE_NUM            30      /**< Number of color-tone modes */
 #define MM_CAMCORDER_WHITE_BALANCE_NUM         10      /**< Number of WhiteBalance modes*/
 #define MM_CAMCORDER_SCENE_MODE_NUM            15      /**< Number of program-modes */
 #define MM_CAMCORDER_FOCUS_MODE_NUM            6       /**< Number of focus mode*/
@@ -295,7 +340,9 @@ extern "C" {
 #define MM_CAMCORDER_AUTO_EXPOSURE_NUM         9       /**< Number of Auto exposure type */
 #define MM_CAMCORDER_WDR_NUM                   3       /**< Number of wide dynamic range */
 #define MM_CAMCORDER_AHS_NUM                   4       /**< Number of anti-handshake */
-#define MM_CAMCORDER_GEOMETRY_METHOD_NUM       4       /**< Number of geometry method */
+#define MM_CAMCORDER_VIDEO_STABILIZATION_NUM   2       /**< Number of video stabilization */
+#define MM_CAMCORDER_HDR_CAPTURE_NUM           3       /**< Number of HDR capture mode */
+#define MM_CAMCORDER_GEOMETRY_METHOD_NUM       5       /**< Number of geometry method */
 #define MM_CAMCORDER_TAG_ORT_NUM               8       /**< Number of tag orientation */
 #define MM_CAMCORDER_STROBE_MODE_NUM           8       /**< Number of strobe mode type */
 #define MM_CAMCORDER_STROBE_CONTROL_NUM                3       /**< Number of strobe control type */
@@ -317,7 +364,6 @@ enum {
 
        /* Command for Image capture */
        _MMCamcorder_CMD_CAPTURE,
-       _MMCamcorder_CMD_CAPTURE_CANCEL,
 
        /* Command for Preview(Video/Image only effective) */
        _MMCamcorder_CMD_PREVIEW_START,
@@ -356,6 +402,7 @@ typedef enum {
        _MMCAMCORDER_VIDEOSRC_BIN,
        _MMCAMCORDER_VIDEOSRC_SRC,
        _MMCAMCORDER_VIDEOSRC_FILT,
+       _MMCAMCORDER_VIDEOSRC_QUE,
        _MMCAMCORDER_VIDEOSRC_CLS,
        _MMCAMCORDER_VIDEOSRC_SCALE,
        _MMCAMCORDER_VIDEOSRC_VSFLT,
@@ -443,7 +490,6 @@ typedef enum {
 } _MMCamcorderStateChange;
 
 
-
 /*=======================================================================================
 | STRUCTURE DEFINITIONS                                                                        |
 ========================================================================================*/
@@ -503,37 +549,41 @@ typedef struct {
  * MMCamcorder Sub Context
  */
 typedef struct {
-       bool isMaxsizePausing;                  /**< Because of size limit, pipeline is paused. */
-       bool isMaxtimePausing;                  /**< Because of time limit, pipeline is paused. */
-       int element_num;                        /**< count of element */
-       int cam_stability_count;                /**< camsensor stability count. the count of frame will drop */
-       GstClockTime pipeline_time;             /**< current time of Gstreamer Pipeline */
-       GstClockTime pause_time;                /** amount of time while pipeline is in PAUSE state.*/
-       GstClockTime stillshot_time;            /** pipeline time of capturing moment*/
-       gboolean is_slow;
-       gboolean error_occurs;
-       gboolean ferror_send;                   /** file write/seek error **/
-       guint ferror_count;                     /** file write/seek error count **/
+       bool isMaxsizePausing;                  /**< Because of size limit, pipeline is paused. */
+       bool isMaxtimePausing;                  /**< Because of time limit, pipeline is paused. */
+       int element_num;                        /**< count of element */
+       int cam_stability_count;                /**< camsensor stability count. the count of frame will drop */
+       GstClockTime pipeline_time;             /**< current time of Gstreamer Pipeline */
+       GstClockTime pause_time;                /**< amount of time while pipeline is in PAUSE state.*/
+       GstClockTime stillshot_time;            /**< pipeline time of capturing moment*/
+       gboolean is_modified_rate;              /**< whether recording motion rate is modified or not */
+       gboolean error_occurs;                  /**< flag for error */
+       int error_code;                         /**< error code for internal gstreamer error */
+       gboolean ferror_send;                   /**< file write/seek error **/
+       guint ferror_count;                     /**< file write/seek error count **/
        GstClockTime previous_slot_time;
-       int display_interval;                   /** This value is set as 'GST_SECOND / display FPS' */
-       gboolean bget_eos;                      /** Whether getting EOS */
-       gboolean bencbin_capture;               /** Use Encodebin for capturing */
-       gboolean now_continuous_af;             /** whether continuous af starts */
+       int display_interval;                   /**< This value is set as 'GST_SECOND / display FPS' */
+       gboolean bget_eos;                      /**< Whether getting EOS */
+       gboolean bencbin_capture;               /**< Use Encodebin for capturing */
+       gboolean audio_disable;                 /**< whether audio is disabled or not when record */
+       int videosrc_rotate;                    /**< rotate of videosrc */
 
        /* For dropping video frame when start recording */
-       int drop_vframe;                        /**< When this value is bigger than zero and pass_first_vframe is zero, MSL will drop video frame though cam_stability count is bigger then zero. */
-       int pass_first_vframe;                  /**< When this value is bigger than zero, MSL won't drop video frame though "drop_vframe" is bigger then zero. */
+       int drop_vframe;                        /**< When this value is bigger than zero and pass_first_vframe is zero, MSL will drop video frame though cam_stability count is bigger then zero. */
+       int pass_first_vframe;                  /**< When this value is bigger than zero, MSL won't drop video frame though "drop_vframe" is bigger then zero. */
 
        /* INI information */
-       unsigned int fourcc;                    /**< Get fourcc value of camera INI file */
-       void *info;                             /**< extra information for camcorder */
+       unsigned int fourcc;                    /**< Get fourcc value of camera INI file */
+       _MMCamcorderImageInfo *info_image;      /**< extra information for image capture */
+       _MMCamcorderVideoInfo *info_video;      /**< extra information for video recording */
+       _MMCamcorderAudioInfo *info_audio;      /**< extra information for audio recording */
 
-       _MMCamcorderGstElement *element;        /**< array of Gstreamer element */
-       _MMCamcorderKPIMeasure kpi;             /**< information related with performance measurement */
+       _MMCamcorderGstElement *element;        /**< array of Gstreamer element */
+       _MMCamcorderKPIMeasure kpi;             /**< information related with performance measurement */
 
-       type_element *VideosinkElement;         /**< configure data of videosink element */
-       gboolean SensorEncodedCapture;          /**< whether camera sensor support encoded image capture */
-       gboolean internal_encode;               /**< whether use internal encoding function */
+       type_element *VideosinkElement;         /**< configure data of videosink element */
+       gboolean SensorEncodedCapture;          /**< whether camera sensor support encoded image capture */
+       gboolean internal_encode;               /**< whether use internal encoding function */
 } _MMCamcorderSubContext;
 
 /**
@@ -541,49 +591,54 @@ typedef struct {
   */
 typedef struct mmf_camcorder {
        /* information */
-       int type;               /**< mmcamcorder_mode_type */
-       int state;              /**< state of camcorder */
-       int target_state;       /**< Target state that want to set. This is a flag that
-                                  * stands for async state changing. If this value differ from state,
-                                  * it means state is changing now asychronously. */
+       int type;               /**< mmcamcorder_mode_type */
+       int state;              /**< state of camcorder */
+       int target_state;       /**< Target state that want to set. This is a flag that
+                                  * stands for async state changing. If this value differ from state,
+                                  * it means state is changing now asychronously. */
 
        /* handles */
-       MMHandleType attributes;               /**< Attribute handle */
+       MMHandleType attributes;               /**< Attribute handle */
        _MMCamcorderSubContext *sub_context;   /**< sub context */
-       mm_exif_info_t *exif_info;             /**< EXIF */
-       GList *buffer_probes;                  /**< a list of buffer probe handle */
-       GList *event_probes;                   /**< a list of event probe handle */
-       GList *data_probes;                    /**< a list of data probe handle */
-       GList *signals;                        /**< a list of signal handle */
-       GList *msg_data;                       /**< a list of msg data */
-       camera_conf *conf_main;                /**< Camera configure Main structure */
-       camera_conf *conf_ctrl;                /**< Camera configure Control structure */
-       int asm_handle;                        /**< Audio session manager handle */
-       guint pipeline_cb_event_id;            /**< Event source ID of pipeline message callback */
-       guint setting_event_id;                /**< Event source ID of attributes setting to sensor */
-       SOUND_INFO snd_info;                   /**< Sound handle for multishot capture */
+       mm_exif_info_t *exif_info;             /**< EXIF */
+       GList *buffer_probes;                  /**< a list of buffer probe handle */
+       GList *event_probes;                   /**< a list of event probe handle */
+       GList *data_probes;                    /**< a list of data probe handle */
+       GList *signals;                        /**< a list of signal handle */
+       GList *msg_data;                       /**< a list of msg data */
+       camera_conf *conf_main;                /**< Camera configure Main structure */
+       camera_conf *conf_ctrl;                /**< Camera configure Control structure */
+       int asm_handle_sh;                     /**< Audio session manager handle of share session */
+       int asm_handle_ex;                     /**< Audio session manager handle of exclusive session */
+       guint pipeline_cb_event_id;            /**< Event source ID of pipeline message callback */
+       guint setting_event_id;                /**< Event source ID of attributes setting to sensor */
+       SOUND_INFO snd_info;                   /**< Sound handle for multishot capture */
 
        /* callback handlers */
-       MMMessageCallback msg_cb;                               /**< message callback */
-       void *msg_cb_param;                                     /**< message callback parameter */
-       mm_camcorder_video_stream_callback vstream_cb;          /**< Video stream callback */
-       void *vstream_cb_param;                                 /**< Video stream callback parameter */
-       mm_camcorder_audio_stream_callback astream_cb;          /**< Audio stream callback */
-       void *astream_cb_param;                                 /**< Audio stream callback parameter */
-       mm_camcorder_video_capture_callback vcapture_cb;        /**< Video capture callback */
-       void *vcapture_cb_param;                                /**< Video capture callback parameter */
-       int (*command)(MMHandleType, int);                      /**< camcorder's command */
+       MMMessageCallback msg_cb;                               /**< message callback */
+       void *msg_cb_param;                                     /**< message callback parameter */
+       mm_camcorder_video_stream_callback vstream_cb;          /**< Video stream callback */
+       void *vstream_cb_param;                                 /**< Video stream callback parameter */
+       mm_camcorder_audio_stream_callback astream_cb;          /**< Audio stream callback */
+       void *astream_cb_param;                                 /**< Audio stream callback parameter */
+       mm_camcorder_video_capture_callback vcapture_cb;        /**< Video capture callback */
+       void *vcapture_cb_param;                                /**< Video capture callback parameter */
+       int (*command)(MMHandleType, int);                      /**< camcorder's command */
 
        /* etc */
-       _MMCamcorderMTSafe mtsafe;              /**< Thread safe */
-       _MMCamcorderCommand cmd;                /**< information for command loop */
-       int sync_state_change;                  /**< Change framework state synchronously */
+       _MMCamcorderMTSafe mtsafe;                              /**< Thread safe */
+       _MMCamcorderCommand cmd;                                /**< information for command loop */
+       int sync_state_change;                                  /**< Change framework state synchronously */
        int quick_device_close;
-       int state_change_by_system;             /**< MSL changes its state by itself because of system(ASM,MDM..) **/
-       int asm_event_code;                     /**< event code of audio session manager */
-       pthread_mutex_t sound_lock;             /**< Capture sound mutex */
-       pthread_cond_t sound_cond;              /**< Capture sound cond */
-       int use_zero_copy_format;               /**< Whether use zero copy format for camera input */
+       int state_change_by_system;                             /**< MSL changes its state by itself because of system(ASM,MDM..) **/
+       int asm_event_code;                                     /**< event code of audio session manager */
+       pthread_mutex_t sound_lock;                             /**< Capture sound mutex */
+       pthread_cond_t sound_cond;                              /**< Capture sound cond */
+       int use_zero_copy_format;                               /**< Whether use zero copy format for camera input */
+       int shutter_sound_policy;                               /**< shutter sound policy */
+
+       _MMCamcorderInfoConverting caminfo_convert[CAMINFO_CONVERT_NUM];        /**< converting structure of camera info */
+       _MMCamcorderEnumConvert enum_conv[ENUM_CONVERT_NUM];                    /**< enum converting list that is modified by ini info */
 
        int reserved[4];                        /**< reserved */
 } mmf_camcorder_t;
@@ -996,6 +1051,22 @@ int _mmcamcorder_set_functions(MMHandleType handle, int type);
 gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpointer data);
 
 /**
+ * This function is callback function of main pipeline.
+ * Once this function is registered with certain pipeline using gst_bus_set_sync_handler(),
+ * this callback will be called every time when there is upcomming message from pipeline.
+ * Basically, this function is used as sync error handling function, now.
+ *
+ * @param[in]  bus             pointer of buf that called this function.
+ * @param[in]  message         callback message from pipeline.
+ * @param[in]  data            user data.
+ * @return     This function returns true on success, or false value with error
+ * @remarks
+ * @see                __mmcamcorder_create_preview_pipeline()
+ *
+ */
+GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data);
+
+/**
  * This function create main pipeline according to type.
  *
  * @param[in]  handle          Handle of camcorder context.
index 171a9f4..a9c747b 100644 (file)
@@ -142,6 +142,9 @@ extern "C" {
  */
 #define _MMCAMCORDER_SENSOR_ENUM_NONE  -255
 
+/* camera information related */
+#define CAMINFO_CONVERT_NUM            40
+
 
 /*=======================================================================================
 | ENUM DEFINITIONS                                                                     |
@@ -162,6 +165,21 @@ typedef enum {
        MM_CAMCONVERT_TYPE_USER,        /* user define */
 } MMCamConvertingType;
 
+typedef enum {
+       ENUM_CONVERT_WHITE_BALANCE = 0,
+       ENUM_CONVERT_COLOR_TONE,
+       ENUM_CONVERT_ISO,
+       ENUM_CONVERT_PROGRAM_MODE,
+       ENUM_CONVERT_FOCUS_MODE,
+       ENUM_CONVERT_AF_RANGE,
+       ENUM_CONVERT_EXPOSURE_MODE,
+       ENUM_CONVERT_STROBE_MODE,
+       ENUM_CONVERT_WDR,
+       ENUM_CONVERT_ANTI_HAND_SHAKE,
+       ENUM_CONVERT_VIDEO_STABILIZATION,
+       ENUM_CONVERT_NUM
+} MMCamConvertingEnum;
+
 /*=======================================================================================
 | STRUCTURE DEFINITIONS                                                                        |
 ========================================================================================*/
@@ -204,8 +222,8 @@ typedef struct {
 /*=======================================================================================
 | GLOBAL FUNCTION PROTOTYPES                                                           |
 ========================================================================================*/
-int _mmcamcorder_convert_msl_to_sensor(int attr_idx, int mslval);
-int _mmcamcorder_convert_sensor_to_msl(int attr_idx, int sensval);
+int _mmcamcorder_convert_msl_to_sensor(MMHandleType handle, int attr_idx, int mslval);
+int _mmcamcorder_convert_sensor_to_msl(MMHandleType handle, int attr_idx, int sensval);
 
 int _mmcamcorder_set_converted_value(MMHandleType handle, _MMCamcorderEnumConvert *convert);
 int _mmcamcorder_init_convert_table(MMHandleType handle);
index 199f27c..f193e5b 100644 (file)
@@ -25,6 +25,7 @@
 /*=======================================================================================
 | INCLUDE FILES                                                                                |
 ========================================================================================*/
+#include <pulse/pulseaudio.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -51,7 +52,6 @@ extern "C" {
 typedef enum {
        _MMCAMCORDER_SOUND_STATE_NONE,
        _MMCAMCORDER_SOUND_STATE_INIT,
-       _MMCAMCORDER_SOUND_STATE_PREPARE,
        _MMCAMCORDER_SOUND_STATE_PLAYING,
 } _MMCamcorderSoundState;
 
@@ -62,21 +62,30 @@ typedef enum {
  * Structure of sound info
  */
 typedef struct __SOUND_INFO {
-       SF_INFO sfinfo;
-       SNDFILE *infile;
-       short *pcm_buf;
-       int pcm_size;
-       char *filename;
-
+       /* PCM */
        MMSoundPcmHandle_t handle;
+       mm_sound_device_out active_out_backup;
 
-       int thread_run;
-       pthread_t thread;
+       /* mutex and cond */
        pthread_mutex_t play_mutex;
        pthread_cond_t play_cond;
        pthread_mutex_t open_mutex;
        pthread_cond_t open_cond;
-       system_audio_route_t route_policy_backup;
+
+       /* pulse audio */
+       pa_threaded_mainloop *pulse_mainloop;
+       pa_context *pulse_context;
+
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       /* sound file */
+       SF_INFO sfinfo;
+       SNDFILE *infile;
+       char *filename;
+       pa_stream *sample_stream;
+       pa_sample_spec sample_spec;
+       size_t sample_length;
+       pa_channel_map channel_map;
+#endif
 
        _MMCamcorderSoundState state;
 } SOUND_INFO;
@@ -89,11 +98,15 @@ typedef struct __SOUND_INFO {
 /*=======================================================================================
 | GLOBAL FUNCTION PROTOTYPES                                                           |
 ========================================================================================*/
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
 gboolean _mmcamcorder_sound_init(MMHandleType handle, char *filename);
-gboolean _mmcamcorder_sound_prepare(MMHandleType handle);
+#else /* _MMCAMCORDER_UPLOAD_SAMPLE */
+gboolean _mmcamcorder_sound_init(MMHandleType handle);
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 gboolean _mmcamcorder_sound_play(MMHandleType handle);
 gboolean _mmcamcorder_sound_finalize(MMHandleType handle);
 
+gboolean _mmcamcorder_sound_capture_play_cb(gpointer data);
 void _mmcamcorder_sound_solo_play(MMHandleType handle, const char *filepath, gboolean sync);
 
 #ifdef __cplusplus
index 525237a..58525a8 100644 (file)
@@ -43,10 +43,19 @@ extern "C" {
 #define _MMCAMCORDER_CAPTURE_STOP_CHECK_INTERVAL       5000
 #define _MMCAMCORDER_CAPTURE_STOP_CHECK_COUNT          600
 #define _MNOTE_VALUE_NONE                              0
+#define _SOUND_STATUS_INIT                              -1
 
 /*=======================================================================================
 | ENUM DEFINITIONS                                                                     |
 ========================================================================================*/
+/**
+ * Enumeration for flip of fimcconvert
+ */
+enum {
+       FIMCCONVERT_FLIP_NONE = 0,
+       FIMCCONVERT_FLIP_VERTICAL,
+       FIMCCONVERT_FLIP_HORIZONTAL
+};
 
 /*=======================================================================================
 | STRUCTURE DEFINITIONS                                                                        |
@@ -66,6 +75,11 @@ typedef struct {
        int width;                                      /**< Width of capture image */
        int height;                                     /**< Height of capture image */
        int interval;                                   /**< Capture interval */
+       int preview_format;                             /**< Preview format */
+       int hdr_capture_mode;                           /**< HDR Capture mode */
+       gboolean sound_status;                          /**< sound status of system */
+       unsigned int volume_level;                      /**< media volume level of system */
+       gboolean played_capture_sound;                  /**< whether play capture sound when capture starts */
 } _MMCamcorderImageInfo;
 
 /*=======================================================================================
@@ -106,6 +120,15 @@ int _mmcamcorder_add_stillshot_pipeline(MMHandleType handle);
 int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle);
 
 /**
+ * This function connects capture signal.
+ *
+ * @param[in]  handle          Handle of camcorder context.
+ * @return     This function returns MM_ERROR_NONE on success, or the other values on error.
+ * @remarks
+ */
+int _mmcamcorder_connect_capture_signal(MMHandleType handle);
+
+/**
  * This function destroy image pipeline.
  *
  * @param[in]  handle          Handle of camcorder context.
@@ -114,18 +137,17 @@ int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle);
  * @see                _mmcamcorder_destroy_pipeline()
  *
  */
-void _mmcamcorder_destroy_image_pipeline(MMHandleType handle);
-int _mmcamcorder_image_command(MMHandleType handle, int command);
+void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle);
+int _mmcamcorder_video_capture_command(MMHandleType handle, int command);
 int _mmcamcorder_set_resize_property(MMHandleType handle, int capture_width, int capture_height);
 
 /* Function for capture */
-int __mmcamcorder_set_exif_basic_info(MMHandleType handle);
+int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height);
 void __mmcamcorder_init_stillshot_info(MMHandleType handle);
 void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capture_data, int pixtype, GstBuffer *buffer);
 void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest);
-gboolean __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail);
-gboolean __mmcamcorder_capture_send_msg(MMHandleType handle, int type, int count);
-gboolean __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail);
+int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail);
+int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail);
 
 #ifdef __cplusplus
 }
index c9df689..284be2b 100644 (file)
@@ -144,6 +144,16 @@ do { \
         ((gchar)(((fourcc)>>16)&0xff)), \
         ((gchar)(((fourcc)>>24)&0xff))
 
+#define MMCAM_SEND_MESSAGE(handle, msg_id, msg_code) \
+{\
+       _MMCamcorderMsgItem msg;\
+       msg.id = msg_id;\
+       msg.param.code = msg_code;\
+       _mmcam_dbg_log("msg id : %x, code : %x", msg_id, msg_code);\
+       _mmcamcroder_send_message((MMHandleType)handle, &msg);\
+}
+
+
 /*=======================================================================================
 | ENUM DEFINITIONS                                                                     |
 ========================================================================================*/
@@ -188,6 +198,59 @@ typedef struct {
        MMMessageParamType param;       /**< message parameter */
 } _MMCamcorderMsgItem;
 
+/**
+ * Structure of zero copy image buffer
+ */
+#define SCMN_IMGB_MAX_PLANE         (4)
+
+/* image buffer definition ***************************************************
+
+    +------------------------------------------+ ---
+    |                                          |  ^
+    |     a[], p[]                             |  |
+    |     +---------------------------+ ---    |  |
+    |     |                           |  ^     |  |
+    |     |<---------- w[] ---------->|  |     |  |
+    |     |                           |  |     |  |
+    |     |                           |        |
+    |     |                           |  h[]   |  e[]
+    |     |                           |        |
+    |     |                           |  |     |  |
+    |     |                           |  |     |  |
+    |     |                           |  v     |  |
+    |     +---------------------------+ ---    |  |
+    |                                          |  v
+    +------------------------------------------+ ---
+
+    |<----------------- s[] ------------------>|
+*/
+
+typedef struct
+{
+       /* width of each image plane */
+       int w[SCMN_IMGB_MAX_PLANE];
+       /* height of each image plane */
+       int h[SCMN_IMGB_MAX_PLANE];
+       /* stride of each image plane */
+       int s[SCMN_IMGB_MAX_PLANE];
+       /* elevation of each image plane */
+       int e[SCMN_IMGB_MAX_PLANE];
+       /* user space address of each image plane */
+       void *a[SCMN_IMGB_MAX_PLANE];
+       /* physical address of each image plane, if needs */
+       void *p[SCMN_IMGB_MAX_PLANE];
+       /* color space type of image */
+       int cs;
+       /* left postion, if needs */
+       int x;
+       /* top position, if needs */
+       int y;
+       /* to align memory */
+       int __dummy2;
+       /* arbitrary data */
+       int data[16];
+} SCMN_IMGB;
+
 /*=======================================================================================
 | CONSTANT DEFINITIONS                                                                 |
 ========================================================================================*/
@@ -221,16 +284,20 @@ unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_co
 gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsigned int src_height,
                                   int src_format, unsigned int src_length, unsigned int jpeg_quality,
                                   void **result_data, unsigned int *result_length);
+/* resize */
+gboolean _mmcamcorder_resize_frame(unsigned char *src_data, int src_width, int src_height, int src_length, int src_format,
+                                   unsigned char **dst_data, int *dst_width, int *dst_height, int *dst_length);
 
 /* Recording */
 /* find top level tag only, do not use this function for finding sub level tags.
    tag_fourcc is Four-character-code (FOURCC) */
-gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc);
+gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc, gboolean do_rewind);
 gint32 _mmcamcorder_double_to_fix(gdouble d_number);
 gboolean _mmcamcorder_update_size(FILE *f, gint64 prev_pos, gint64 curr_pos);
 gboolean _mmcamcorder_write_loci(FILE *f, _MMCamcorderLocationInfo info);
 gboolean _mmcamcorder_write_udta(FILE *f, _MMCamcorderLocationInfo info);
-gulong _mmcamcorder_get_container_size(const guchar *size);
+guint64 _mmcamcorder_get_container_size(const guchar *size);
+gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation);
 
 /* File system */
 int _mmcamcorder_get_freespace(const gchar *path, guint64 *free_space);
index e5018d5..dd78abe 100644 (file)
@@ -52,10 +52,11 @@ extern "C" {
 typedef struct {
        gboolean b_commiting;           /**< Is it commiting now? */
        char *filename;                 /**< recorded filename */
-       gint multiple_fps;              /**< fps for high speed recording(slow motion recording) */
+       double record_timestamp_ratio;  /**< timestamp ratio of video recording for slow motion recording */
        guint64 video_frame_count;      /**< current video frame */
        guint64 audio_frame_count;      /**< current audio frame */
        guint64 filesize;               /**< current file size */
+       guint64 max_size;               /**< max recording size */
        guint64 max_time;               /**< max recording time */
        int fileformat;                 /**< recording file format */
 /*
@@ -132,6 +133,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command);
  */
 int _mmcamcorder_video_handle_eos(MMHandleType handle);
 
+
 #ifdef __cplusplus
 }
 #endif
index f9df6d7..15b9489 100644 (file)
 #include <gst/interfaces/cameracontrol.h>
 #include <gst/interfaces/xoverlay.h>
 
+/*-----------------------------------------------------------------------
+|    MACRO DEFINITIONS:                                                        |
+-----------------------------------------------------------------------*/
+#define MMCAMCORDER_DEFAULT_CAMERA_WIDTH        640
+#define MMCAMCORDER_DEFAULT_CAMERA_HEIGHT       480
 
 /*---------------------------------------------------------------------------------------
 |    GLOBAL VARIABLE DEFINITIONS for internal                                          |
 ---------------------------------------------------------------------------------------*/
-int video_input_rotation[] = {MM_VIDEO_INPUT_ROTATION_NONE,
-                             MM_VIDEO_INPUT_ROTATION_90,
-                             MM_VIDEO_INPUT_ROTATION_180,
-                             MM_VIDEO_INPUT_ROTATION_270,
-                             MM_VIDEO_INPUT_ROTATION_FLIP_HORZ,
-                             MM_VIDEO_INPUT_ROTATION_FLIP_VERT};
-
 int depth[] = {MM_CAMCORDER_AUDIO_FORMAT_PCM_U8,
               MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE};
 
-int rotation[] = {MM_DISPLAY_ROTATION_NONE,
-                 MM_DISPLAY_ROTATION_90,
-                 MM_DISPLAY_ROTATION_180,
-                 MM_DISPLAY_ROTATION_270,
-                 MM_DISPLAY_ROTATION_FLIP_HORZ,
-                 MM_DISPLAY_ROTATION_FLIP_VERT};
-
 int visible_values[] = { 0, 1 };       /*0: off, 1:on*/
 
 int strobe_mode[] = {MM_CAMCORDER_STROBE_MODE_OFF,
@@ -75,6 +66,7 @@ int tag_orientation_values[] =
        8,      /*the 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.*/
 };
 
+
 /* basic attributes' info */
 mm_cam_attr_construct_info cam_attrs_const_info[] ={
        //0
@@ -83,10 +75,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "mode",                             /* Name */
                MMF_VALUE_TYPE_INT,                 /* Type */
                MM_ATTRS_FLAG_RW,                   /* Flag */
-               (void*)MM_CAMCORDER_MODE_IMAGE,     /* Default value */
+               {(void*)MM_CAMCORDER_MODE_VIDEO_CAPTURE},     /* Default value */
                MM_ATTRS_VALID_TYPE_INT_RANGE,      /* Validity type */
-               MM_CAMCORDER_MODE_IMAGE,            /* Validity val1 (min, *array,...) */
-               MM_CAMCORDER_MODE_VIDEO,            /* Validity val2 (max, count, ...) */
+               MM_CAMCORDER_MODE_VIDEO_CAPTURE,    /* Validity val1 (min, *array,...) */
+               MM_CAMCORDER_MODE_AUDIO,            /* Validity val2 (max, count, ...) */
                NULL,                               /* Runtime setting function of the attribute */
        },
        // 1
@@ -95,7 +87,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-device",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_AUDIO_DEVICE_MIC,
+               {(void*)MM_AUDIO_DEVICE_MIC},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                MM_AUDIO_DEVICE_NUM-1,
@@ -103,14 +95,14 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
        },
        // 2
        {
-               MM_CAM_CAMERA_DEVICE,
-               "camera-device",
+               MM_CAM_CAMERA_DEVICE_COUNT,
+               "camera-device-count",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_VIDEO_DEVICE_NONE,
+               {(void*)MM_VIDEO_DEVICE_NUM},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_VIDEO_DEVICE_NONE,
-               MM_VIDEO_DEVICE_NUM-1,
+               MM_VIDEO_DEVICE_NUM,
                NULL,
        },
        // 3
@@ -119,7 +111,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-encoder",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_AUDIO_CODEC_AMR,
+               {(void*)MM_AUDIO_CODEC_AMR},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)NULL,
                0,
@@ -131,7 +123,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "video-encoder",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_VIDEO_CODEC_MPEG4,
+               {(void*)MM_VIDEO_CODEC_MPEG4},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)NULL,
                0,
@@ -143,7 +135,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "image-encoder",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_IMAGE_CODEC_JPEG,
+               {(void*)MM_IMAGE_CODEC_JPEG},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)NULL,
                0,
@@ -155,7 +147,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "file-format",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_FILE_FORMAT_MP4,
+               {(void*)MM_FILE_FORMAT_MP4},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)NULL,
                0,
@@ -167,7 +159,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-device-name",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               (void*)NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -179,7 +171,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-samplerate",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)8000,
+               {(void*)8000},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -191,7 +183,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-format",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
+               {(void*)MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)depth,
                ARRAY_SIZE(depth),
@@ -203,7 +195,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-channel",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)2,
+               {(void*)2},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                1,
                2,
@@ -215,7 +207,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-volume",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)1,
+               {(void*)1},
                MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                0,
                10.0,
@@ -227,7 +219,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-input-route",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
+               {(void*)MM_AUDIOROUTE_USE_EXTERNAL_SETTING},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
                MM_AUDIOROUTE_CAPTURE_STEREOMIC_ONLY,
@@ -239,7 +231,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-scene-mode",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -251,7 +243,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-brightness",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)1,
+               {(void*)1},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -263,7 +255,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-contrast",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -275,7 +267,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-wb",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -287,7 +279,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-color-tone",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -299,7 +291,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-saturation",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -311,7 +303,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-hue",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -323,7 +315,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "filter-sharpness",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -335,7 +327,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-format",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_PIXEL_FORMAT_YUYV,
+               {(void*)MM_PIXEL_FORMAT_YUYV},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -343,15 +335,15 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
        },
        //22
        {
-               MM_CAM_CAMERA_SLOW_MOTION_FPS,
-               "camera-slow-motion-fps",
-               MMF_VALUE_TYPE_INT,
+               MM_CAM_CAMERA_RECORDING_MOTION_RATE,
+               "camera-recording-motion-rate",
+               MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
-               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {(void*)1},
+               MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
-               NULL,
+               _mmcamcorder_commit_camera_recording_motion_rate,
        },
        //23
        {
@@ -359,7 +351,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-fps",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)30,
+               {(void*)30},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -371,7 +363,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-width",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)320,
+               {(void*)MMCAMCORDER_DEFAULT_CAMERA_WIDTH},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -383,7 +375,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-height",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)240,
+               {(void*)MMCAMCORDER_DEFAULT_CAMERA_HEIGHT},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -395,7 +387,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-digital-zoom",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)10,
+               {(void*)10},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -407,7 +399,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-optical-zoom",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -419,7 +411,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-focus-mode",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_CAMCORDER_FOCUS_MODE_NONE,
+               {(void*)MM_CAMCORDER_FOCUS_MODE_NONE},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -431,7 +423,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-af-scan-range",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -443,7 +435,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-exposure-mode",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -455,7 +447,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-exposure-value",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -467,7 +459,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-f-number",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -479,7 +471,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-shutter-speed",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -491,7 +483,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-iso",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -503,7 +495,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-wdr",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -515,7 +507,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-anti-handshake",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -527,7 +519,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-fps-auto",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)FALSE,
+               {(void*)FALSE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -539,7 +531,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-hold-af-after-capturing",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -551,7 +543,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-delay-attr-setting",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)FALSE,
+               {(void*)FALSE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -563,7 +555,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "audio-encoder-bitrate",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -575,7 +567,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "video-encoder-bitrate",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -587,7 +579,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "image-encoder-quality",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)95,
+               {(void*)95},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -599,7 +591,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-format",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_PIXEL_FORMAT_ENCODED,
+               {(void*)MM_PIXEL_FORMAT_ENCODED},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -611,7 +603,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-width",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)1600,
+               {(void*)1600},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -623,7 +615,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-height",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)1200,
+               {(void*)1200},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -635,7 +627,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-count",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)1,
+               {(void*)1},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -647,7 +639,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-interval",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -659,7 +651,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-break-cont-shot",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)FALSE,
+               {(void*)FALSE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -671,7 +663,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-handle",
                MMF_VALUE_TYPE_DATA,
                MM_ATTRS_FLAG_RW,
-               (void*)NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -683,7 +675,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-device",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_DISPLAY_DEVICE_MAINLCD,
+               {(void*)MM_DISPLAY_DEVICE_MAINLCD},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -695,7 +687,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-surface",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_DISPLAY_SURFACE_X,
+               {(void*)MM_DISPLAY_SURFACE_X},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -707,7 +699,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-rect-x",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -719,7 +711,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-rect-y",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -731,7 +723,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-rect-width",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -743,7 +735,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-rect-height",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -755,7 +747,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-src-x",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -767,7 +759,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-src-y",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -779,7 +771,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-src-width",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -791,7 +783,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-src-height",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -803,10 +795,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-rotation",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_DISPLAY_ROTATION_NONE,
-               MM_ATTRS_VALID_TYPE_INT_ARRAY,
-               (int)rotation,
-               ARRAY_SIZE(rotation),
+               {(void*)MM_DISPLAY_ROTATION_NONE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               MM_DISPLAY_ROTATION_NONE,
+               MM_DISPLAY_ROTATION_270,
                _mmcamcorder_commit_display_rotation,
        },
        //61
@@ -815,7 +807,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-visible",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)1,
+               {(void*)1},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)visible_values,
                ARRAY_SIZE(visible_values),
@@ -827,7 +819,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-scale",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_DISPLAY_SCALE_DEFAULT,
                MM_DISPLAY_SCALE_TRIPLE_LENGTH,
@@ -839,7 +831,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "display-geometry-method",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_DISPLAY_METHOD_LETTER_BOX,
                MM_DISPLAY_METHOD_CUSTOM_ROI,
@@ -851,7 +843,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "target-filename",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               (void*)"/tmp/CAM-NONAME",
+               {(void*)"/tmp/CAM-NONAME"},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -863,7 +855,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "target-max-size",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -875,7 +867,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "target-time-limit",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -887,8 +879,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-enable",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-//             (void*)tag_enable_values[0],
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -900,7 +891,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-image-description",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               (void*)NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -912,8 +903,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-orientation",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-//             (void*)tag_orientation_values[0],
-               (void*)1,
+               {(void*)1},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                (int)tag_orientation_values,
                ARRAY_SIZE(tag_orientation_values),
@@ -925,7 +915,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-software",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               (void*)NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -937,7 +927,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-latitude",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                -360,
                360,
@@ -949,7 +939,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-longitude",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                -360,
                360,
@@ -961,7 +951,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-altitude",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                -999999,
                999999,
@@ -973,7 +963,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "strobe-control",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -985,7 +975,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "strobe-capabilities",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -997,10 +987,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "strobe-mode",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
-               (int)strobe_mode,
-               ARRAY_SIZE(strobe_mode),
+               0,
+               0,
                _mmcamcorder_commit_strobe,
        },
        //77
@@ -1009,7 +999,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "detect-mode",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -1021,7 +1011,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "detect-number",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -1033,7 +1023,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "detect-focus-select",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -1045,7 +1035,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "detect-select-number",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                -1,
@@ -1057,7 +1047,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "detect-status",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_ARRAY,
                0,
                0,
@@ -1069,7 +1059,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-zero-systemlag",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)FALSE,
+               {(void*)FALSE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -1081,7 +1071,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-af-touch-x",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -1093,7 +1083,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-af-touch-y",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -1105,7 +1095,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-af-touch-width",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -1117,7 +1107,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-af-touch-height",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                _MMCAMCORDER_MAX_INT,
@@ -1129,7 +1119,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-focal-length",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
                0,
                1000,
@@ -1141,10 +1131,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "recommend-preview-format-for-capture",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_PIXEL_FORMAT_YUYV,
+               {(void*)MM_PIXEL_FORMAT_YUYV},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_PIXEL_FORMAT_NV12,
-               MM_PIXEL_FORMAT_ENCODED,
+               MM_PIXEL_FORMAT_ITLV_JPEG_UYVY,
                NULL,
        },
        //89
@@ -1153,10 +1143,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "recommend-preview-format-for-recording",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_PIXEL_FORMAT_NV12,
+               {(void*)MM_PIXEL_FORMAT_NV12},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_PIXEL_FORMAT_NV12,
-               MM_PIXEL_FORMAT_ENCODED,
+               MM_PIXEL_FORMAT_ITLV_JPEG_UYVY,
                NULL,
        },
        //90
@@ -1165,7 +1155,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-thumbnail",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)TRUE,
+               {(void*)TRUE},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -1177,7 +1167,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-gps-enable",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)TRUE,
+               {(void*)TRUE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -1189,7 +1179,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-gps-time-stamp",
                MMF_VALUE_TYPE_DOUBLE,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -1201,7 +1191,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-gps-date-stamp",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -1213,7 +1203,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "tag-gps-processing-method",
                MMF_VALUE_TYPE_STRING,
                MM_ATTRS_FLAG_RW,
-               NULL,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -1225,10 +1215,10 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "camera-rotation",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_VIDEO_INPUT_ROTATION_NONE,
-               MM_ATTRS_VALID_TYPE_INT_ARRAY,
-               (int)video_input_rotation,
-               ARRAY_SIZE(video_input_rotation),
+               {(void*)MM_VIDEO_INPUT_ROTATION_NONE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               MM_VIDEO_INPUT_ROTATION_NONE,
+               MM_VIDEO_INPUT_ROTATION_270,
                _mmcamcorder_commit_camera_rotate,
        },
        //96
@@ -1237,7 +1227,7 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "enable-converted-stream-callback",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)0,
+               {(void*)0},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
@@ -1248,8 +1238,8 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                MM_CAM_CAPTURED_SCREENNAIL,
                "captured-screennail",
                MMF_VALUE_TYPE_DATA,
-               MM_ATTRS_FLAG_RW,
-               (void*)NULL,
+               MM_ATTRS_FLAG_READABLE,
+               {(void*)NULL},
                MM_ATTRS_VALID_TYPE_NONE,
                0,
                0,
@@ -1261,11 +1251,11 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "capture-sound-enable",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)FALSE,
+               {(void*)TRUE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                0,
                1,
-               NULL,
+               _mmcamcorder_commit_capture_sound_enable,
        },
        //99
        {
@@ -1273,38 +1263,219 @@ mm_cam_attr_construct_info cam_attrs_const_info[] ={
                "recommend-display-rotation",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_DISPLAY_ROTATION_270,
+               {(void*)MM_DISPLAY_ROTATION_270},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
                MM_DISPLAY_ROTATION_NONE,
-               MM_DISPLAY_ROTATION_FLIP_VERT,
+               MM_DISPLAY_ROTATION_270,
                NULL,
        },
        //100
        {
-               MM_CAM_CAMCORDER_ROTATION,
-               "camcorder-rotation",
+               MM_CAM_CAMERA_FLIP,
+               "camera-flip",
                MMF_VALUE_TYPE_INT,
                MM_ATTRS_FLAG_RW,
-               (void*)MM_VIDEO_INPUT_ROTATION_NONE,
+               {(void*)MM_FLIP_NONE},
                MM_ATTRS_VALID_TYPE_INT_RANGE,
-               MM_VIDEO_INPUT_ROTATION_NONE,
-               MM_VIDEO_INPUT_ROTATION_270,
-               _mmcamcorder_commit_camcorder_rotate,
+               MM_FLIP_NONE,
+               MM_FLIP_BOTH,
+               _mmcamcorder_commit_camera_flip,
+       },
+       //101
+       {
+               MM_CAM_CAMERA_HDR_CAPTURE,
+               "camera-hdr-capture",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               _mmcamcorder_commit_camera_hdr_capture,
+       },
+       //102
+       {
+               MM_CAM_DISPLAY_MODE,
+               "display-mode",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MM_DISPLAY_MODE_DEFAULT},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               _mmcamcorder_commit_display_mode,
+       },
+       //103
+       {
+               MM_CAM_CAMERA_FACE_ZOOM_X,
+               "camera-face-zoom-x",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               0,
+               _MMCAMCORDER_MAX_INT,
+               _mmcamcorder_commit_camera_face_zoom,
+       },
+       //104
+       {
+               MM_CAM_CAMERA_FACE_ZOOM_Y,
+               "camera-face-zoom-y",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               0,
+               _MMCAMCORDER_MAX_INT,
+               _mmcamcorder_commit_camera_face_zoom,
+       },
+       //105
+       {
+               MM_CAM_CAMERA_FACE_ZOOM_LEVEL,
+               "camera-face-zoom-level",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               0,
+               -1,
+               NULL,
+       },
+       //106
+       {
+               MM_CAM_CAMERA_FACE_ZOOM_MODE,
+               "camera-face-zoom-mode",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               _mmcamcorder_commit_camera_face_zoom,
+       },
+       //107
+       {
+               MM_CAM_AUDIO_DISABLE,
+               "audio-disable",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               FALSE,
+               TRUE,
+               _mmcamcorder_commit_audio_disable,
+       },
+       //108
+       {
+               MM_CAM_RECOMMEND_CAMERA_WIDTH,
+               "recommend-camera-width",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MMCAMCORDER_DEFAULT_CAMERA_WIDTH},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               NULL,
+       },
+       //109
+       {
+               MM_CAM_RECOMMEND_CAMERA_HEIGHT,
+               "recommend-camera-height",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MMCAMCORDER_DEFAULT_CAMERA_HEIGHT},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               NULL,
+       },
+       //110
+       {
+               MM_CAM_CAPTURED_EXIF_RAW_DATA,
+               "captured-exif-raw-data",
+               MMF_VALUE_TYPE_DATA,
+               MM_ATTRS_FLAG_READABLE,
+               {(void*)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               0,
+               0,
+               NULL,
+       },
+       //111
+       {
+               MM_CAM_DISPLAY_EVAS_SURFACE_SINK,
+               "display-evas-surface-sink",
+               MMF_VALUE_TYPE_STRING,
+               MM_ATTRS_FLAG_READABLE,
+               {(void*)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               0,
+               0,
+               NULL,
+       },
+       //112
+       {
+               MM_CAM_DISPLAY_EVAS_DO_SCALING,
+               "display-evas-do-scaling",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)TRUE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               FALSE,
+               TRUE,
+               _mmcamcorder_commit_display_evas_do_scaling,
+       },
+       //113
+       {
+               MM_CAM_CAMERA_FACING_DIRECTION,
+               "camera-facing-direction",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR,
+               MM_CAMCORDER_CAMERA_FACING_DIRECTION_FRONT,
+               NULL,
        },
+       //114
+       {
+               MM_CAM_DISPLAY_FLIP,
+               "display-flip",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MM_FLIP_NONE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               MM_FLIP_NONE,
+               MM_FLIP_BOTH,
+               _mmcamcorder_commit_display_flip,
+       },
+       //115
+       {
+               MM_CAM_CAMERA_VIDEO_STABILIZATION,
+               "camera-video-stabilization",
+               MMF_VALUE_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void*)MM_CAMCORDER_VIDEO_STABILIZATION_OFF},
+               MM_ATTRS_VALID_TYPE_INT_ARRAY,
+               0,
+               0,
+               _mmcamcorder_commit_camera_video_stabilization,
+       }
 };
 
 
-/*---------------------------------------------------------------------------
-|    LOCAL VARIABLE DEFINITIONS for internal                                                           |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL VARIABLE DEFINITIONS for internal                           |
+-----------------------------------------------------------------------*/
 /*     Readonly attributes list.
 *      If you want to make some attributes read only, write down here.
 *      It will make them read only after composing whole attributes.
 */
 
-static int readonly_attributes[]       = {
-       MM_CAM_CAMERA_DEVICE,
+static int readonly_attributes[] = {
+       MM_CAM_CAMERA_DEVICE_COUNT,
        MM_CAM_CAMERA_DEVICE_NAME,
+       MM_CAM_CAMERA_FACING_DIRECTION,
        MM_CAM_CAMERA_SHUTTER_SPEED,
        MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE,
        MM_CAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING,
@@ -1312,81 +1483,72 @@ static int readonly_attributes[]        = {
        MM_CAM_RECOMMEND_DISPLAY_ROTATION,
 };
 
-/*---------------------------------------------------------------------------
-|    LOCAL FUNCTION PROTOTYPES:                                                                                                |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL FUNCTION PROTOTYPES:                                                |
+-----------------------------------------------------------------------*/
 /* STATIC INTERNAL FUNCTION */
 static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width, int height);
 static bool __mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int height);
 static int  __mmcamcorder_set_conf_to_valid_info(MMHandleType handle);
+static int  __mmcamcorder_release_conf_valid_info(MMHandleType handle);
 static bool __mmcamcorder_attrs_is_supported(MMHandleType handle, int idx);
 static int  __mmcamcorder_check_valid_pair(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list var_args);
 
-/*===========================================================================================
-|                                                                                                                                                                                      |
-|  FUNCTION DEFINITIONS                                                                                                                                                |
-|                                                                                                                                                                                      |
-========================================================================================== */
-/*---------------------------------------------------------------------------
-|    GLOBAL FUNCTION DEFINITIONS:                                                                                      |
----------------------------------------------------------------------------*/
+/*=======================================================================
+|  FUNCTION DEFINITIONS                                                        |
+=======================================================================*/
+/*-----------------------------------------------------------------------
+|    GLOBAL FUNCTION DEFINITIONS:                                      |
+-----------------------------------------------------------------------*/
 MMHandleType
 _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info )
 {
        _mmcam_dbg_log( "" );
 
        MMHandleType attrs = 0;
-       mmf_attrs_construct_info_t * attrs_const_info = NULL;
+       mmf_attrs_construct_info_t *attrs_const_info = NULL;
        int attr_count = 0;
        int idx;
-       
+
        /* Create attribute constructor */
-       _mmcam_dbg_log( "start" );
-       //set runtime values to 'cam_attrs_const_info'
-       {
-               cam_attrs_const_info[MM_CAM_CAMERA_DEVICE].default_value = (void*)info->videodev_type;
-       }
+       _mmcam_dbg_log("start");
 
-       //alloc 'mmf_attrs_construct_info_t'
-       attr_count = ARRAY_SIZE( cam_attrs_const_info );
+       /* alloc 'mmf_attrs_construct_info_t' */
+       attr_count = ARRAY_SIZE(cam_attrs_const_info);
        attrs_const_info = malloc(attr_count * sizeof(mmf_attrs_construct_info_t));
 
-       if (!attrs_const_info)
-       {
-               _mmcam_dbg_err( "Fail to alloc constructor." );
+       if (!attrs_const_info) {
+               _mmcam_dbg_err("Fail to alloc constructor.");
                return 0;
        }
 
-       for (idx = 0; idx < attr_count; idx++)
-       {
-               //attribute order check.
-               if (idx != cam_attrs_const_info[idx].attrid)            //This should be same.
-               {
-                       _mmcam_dbg_err( "Please check attributes order. Is the idx same with enum val?" );
+       for (idx = 0 ; idx < attr_count ; idx++) {
+               /* attribute order check. This should be same. */
+               if (idx != cam_attrs_const_info[idx].attrid) {
+                       _mmcam_dbg_err("Please check attributes order. Is the idx same with enum val?");
                        return 0;
                }
 
                attrs_const_info[idx].name = cam_attrs_const_info[idx].name;
                attrs_const_info[idx].value_type = cam_attrs_const_info[idx].value_type;
                attrs_const_info[idx].flags = cam_attrs_const_info[idx].flags;
-               attrs_const_info[idx].default_value = cam_attrs_const_info[idx].default_value;
+               attrs_const_info[idx].default_value = cam_attrs_const_info[idx].default_value.value_void;
        }
 
        /* Camcorder Attributes */
-       _mmcam_dbg_log( "Create Camcorder Attributes[%p, %d]", attrs_const_info, attr_count);
+       _mmcam_dbg_log("Create Camcorder Attributes[%p, %d]", attrs_const_info, attr_count);
 
-       attrs = mmf_attrs_new_from_data(        "Camcorder_Attributes",
-                                                                               attrs_const_info,
-                                                                               attr_count,
-                                                                               _mmcamcorder_commit_camcorder_attrs,
-                                                                               (void*)handle );
+       attrs = mmf_attrs_new_from_data("Camcorder_Attributes",
+                                       attrs_const_info,
+                                       attr_count,
+                                       _mmcamcorder_commit_camcorder_attrs,
+                                       (void *)handle);
 
        free(attrs_const_info);
        attrs_const_info = NULL;
 
-       if( attrs == 0 )
-       {
-               _mmcam_dbg_err( "Fail to alloc attribute handle" );
+       if (attrs == 0) {
+               _mmcam_dbg_err("Fail to alloc attribute handle");
                return 0;
        }
 
@@ -1402,18 +1564,34 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info )
                switch (cam_attrs_const_info[idx].validity_type)
                {
                        case MM_ATTRS_VALID_TYPE_INT_ARRAY:
-                               if ((cam_attrs_const_info[idx].validity_value1) &&(cam_attrs_const_info[idx].validity_value2 > 0))
-                                       mmf_attrs_set_valid_array (attrs, idx, (const int*)(cam_attrs_const_info[idx].validity_value1), cam_attrs_const_info[idx].validity_value2);
+                               if (cam_attrs_const_info[idx].validity_value1 &&
+                                   cam_attrs_const_info[idx].validity_value2 > 0) {
+                                       mmf_attrs_set_valid_array(attrs, idx,
+                                                                 (const int *)(cam_attrs_const_info[idx].validity_value1),
+                                                                 cam_attrs_const_info[idx].validity_value2,
+                                                                 (int)(cam_attrs_const_info[idx].default_value.value_int));
+                               }
                        break;
                        case MM_ATTRS_VALID_TYPE_INT_RANGE:
-                               mmf_attrs_set_valid_range (attrs, idx, cam_attrs_const_info[idx].validity_value1, cam_attrs_const_info[idx].validity_value2);
+                               mmf_attrs_set_valid_range(attrs, idx,
+                                                         cam_attrs_const_info[idx].validity_value1,
+                                                         cam_attrs_const_info[idx].validity_value2,
+                                                         (int)(cam_attrs_const_info[idx].default_value.value_int));
                        break;
                        case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
-                               if ((cam_attrs_const_info[idx].validity_value1) &&(cam_attrs_const_info[idx].validity_value2 > 0))
-                                       mmf_attrs_set_valid_double_array (attrs, idx, (const double*)(cam_attrs_const_info[idx].validity_value1), cam_attrs_const_info[idx].validity_value2);
+                               if (cam_attrs_const_info[idx].validity_value1 &&
+                                   cam_attrs_const_info[idx].validity_value2 > 0) {
+                                       mmf_attrs_set_valid_double_array(attrs, idx,
+                                                                        (const double *)(cam_attrs_const_info[idx].validity_value1),
+                                                                        cam_attrs_const_info[idx].validity_value2,
+                                                                        (double)(cam_attrs_const_info[idx].default_value.value_double));
+                               }
                        break;
                        case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
-                               mmf_attrs_set_valid_double_range (attrs, idx, (double)cam_attrs_const_info[idx].validity_value1, (double)cam_attrs_const_info[idx].validity_value2);
+                               mmf_attrs_set_valid_double_range(attrs, idx,
+                                                                (double)(cam_attrs_const_info[idx].validity_value1),
+                                                                (double)(cam_attrs_const_info[idx].validity_value2),
+                                                                (double)(cam_attrs_const_info[idx].default_value.value_double));
                        break;
                        case MM_ATTRS_VALID_TYPE_NONE:
                        break;
@@ -1424,6 +1602,8 @@ _mmcamcorder_alloc_attribute( MMHandleType handle, MMCamPreset *info )
                }
        }
 
+       __mmcamcorder_release_conf_valid_info(handle);
+
        return attrs;
 }
 
@@ -1454,7 +1634,7 @@ _mmcamcorder_get_attributes(MMHandleType handle,  char **err_attr_name, const ch
        attrs = MMF_CAMCORDER_ATTRS(handle);
        mmf_return_val_if_fail( attrs, MM_ERROR_CAMCORDER_NOT_INITIALIZED );
 
-       ret = mm_attrs_get_valist (attrs, err_attr_name, attribute_name, var_args);
+       ret = mm_attrs_get_valist(attrs, err_attr_name, attribute_name, var_args);
 
        return ret;
 }
@@ -1476,9 +1656,8 @@ _mmcamcorder_set_attributes(MMHandleType handle, char **err_attr_name, const cha
        ret = __mmcamcorder_check_valid_pair( handle, err_attr_name, attribute_name, var_args );
        );
 
-       if( ret == MM_ERROR_NONE )
-       {
-               ret = mm_attrs_set_valist (attrs, err_attr_name, attribute_name, var_args);
+       if (ret == MM_ERROR_NONE) {
+               ret = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, var_args);
        }
 
        return ret;
@@ -1496,7 +1675,7 @@ _mmcamcorder_get_attribute_info(MMHandleType handle, const char *attr_name, MMCa
        mmf_return_val_if_fail( attr_name, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
        mmf_return_val_if_fail( info, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
 
-       attrs = MMF_CAMCORDER_ATTRS(handle);    
+       attrs = MMF_CAMCORDER_ATTRS(handle);
        mmf_return_val_if_fail( attrs, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
 
        ret = mm_attrs_get_info_by_name(attrs, attr_name, (MMAttrsInfo*)&attrinfo);
@@ -1513,22 +1692,22 @@ _mmcamcorder_get_attribute_info(MMHandleType handle, const char *attr_name, MMCa
                        case MM_ATTRS_VALID_TYPE_INT_ARRAY:
                                info->int_array.array = attrinfo.int_array.array;
                                info->int_array.count = attrinfo.int_array.count;
-                               info->int_array.def = 0;
+                               info->int_array.def = attrinfo.int_array.dval;
                        break;
                        case MM_ATTRS_VALID_TYPE_INT_RANGE:
                                info->int_range.min = attrinfo.int_range.min;
                                info->int_range.max = attrinfo.int_range.max;
-                               info->int_range.def = 0;
+                               info->int_range.def = attrinfo.int_range.dval;
                        break;
                        case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
                                info->double_array.array = attrinfo.double_array.array;
                                info->double_array.count = attrinfo.double_array.count;
-                               info->double_array.def = 0;
+                               info->double_array.def = attrinfo.double_array.dval;
                        break;
                        case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
                                info->double_range.min = attrinfo.double_range.min;
                                info->double_range.max = attrinfo.double_range.max;
-                               info->double_range.def = 0;
+                               info->double_range.def = attrinfo.double_range.dval;
                        break;
                        case MM_ATTRS_VALID_TYPE_NONE:
                        break;
@@ -1592,10 +1771,8 @@ _mmcamcorder_commit_camcorder_attrs (int attr_idx, const char *attr_name, const
 }
 
 
-int
-__mmcamcorder_set_conf_to_valid_info(MMHandleType handle)
+int __mmcamcorder_set_conf_to_valid_info(MMHandleType handle)
 {
-       //mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
        int *format = NULL;
        int total_count = 0;
 
@@ -1623,6 +1800,50 @@ __mmcamcorder_set_conf_to_valid_info(MMHandleType handle)
 }
 
 
+int __mmcamcorder_release_conf_valid_info(MMHandleType handle)
+{
+       int *allocated_memory = NULL;
+
+       _mmcam_dbg_log("START");
+
+       /* Audio encoder info */
+       allocated_memory = (int*)(cam_attrs_const_info[MM_CAM_AUDIO_ENCODER].validity_value1);
+       if (allocated_memory) {
+               free(allocated_memory);
+               cam_attrs_const_info[MM_CAM_AUDIO_ENCODER].validity_value1 = (int)NULL;
+               cam_attrs_const_info[MM_CAM_AUDIO_ENCODER].validity_value2 = (int)0;
+       }
+
+       /* Video encoder info */
+       allocated_memory = (int*)(cam_attrs_const_info[MM_CAM_VIDEO_ENCODER].validity_value1);
+       if (allocated_memory) {
+               free(allocated_memory);
+               cam_attrs_const_info[MM_CAM_VIDEO_ENCODER].validity_value1 = (int)NULL;
+               cam_attrs_const_info[MM_CAM_VIDEO_ENCODER].validity_value2 = (int)0;
+       }
+
+       /* Image encoder info */
+       allocated_memory = (int*)(cam_attrs_const_info[MM_CAM_IMAGE_ENCODER].validity_value1);
+       if (allocated_memory) {
+               free(allocated_memory);
+               cam_attrs_const_info[MM_CAM_IMAGE_ENCODER].validity_value1 = (int)NULL;
+               cam_attrs_const_info[MM_CAM_IMAGE_ENCODER].validity_value2 = (int)0;
+       }
+
+       /* File format info */
+       allocated_memory = (int*)(cam_attrs_const_info[MM_CAM_FILE_FORMAT].validity_value1);
+       if (allocated_memory) {
+               free(allocated_memory);
+               cam_attrs_const_info[MM_CAM_FILE_FORMAT].validity_value1 = (int)NULL;
+               cam_attrs_const_info[MM_CAM_FILE_FORMAT].validity_value2 = (int)0;
+       }
+
+       _mmcam_dbg_log("DONE");
+
+       return MM_ERROR_NONE;
+}
+
+
 bool _mmcamcorder_commit_capture_width (MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
        MMHandleType attr = 0;
@@ -1633,13 +1854,8 @@ bool _mmcamcorder_commit_capture_width (MMHandleType handle, int attr_idx, const
 
        _mmcam_dbg_log("(%d)", attr_idx);
 
-       current_state = _mmcamcorder_get_state( handle);
-
-       if( !_mmcamcorder_is_state_changing(handle)
-        && ( current_state == MM_CAMCORDER_STATE_NULL
-          || current_state == MM_CAMCORDER_STATE_READY
-          || current_state == MM_CAMCORDER_STATE_PREPARE ) )
-       {
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state <= MM_CAMCORDER_STATE_PREPARE) {
                int flags = MM_ATTRS_FLAG_NONE;
                int capture_width, capture_height;
                MMCamAttrsInfo info;
@@ -1647,8 +1863,7 @@ bool _mmcamcorder_commit_capture_width (MMHandleType handle, int attr_idx, const
                mm_camcorder_get_attribute_info(handle, MMCAM_CAPTURE_HEIGHT, &info);
                flags = info.flag;
 
-               if (!(flags & MM_ATTRS_FLAG_MODIFIED))
-               {
+               if (!(flags & MM_ATTRS_FLAG_MODIFIED)) {
                        mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_HEIGHT, &capture_height, NULL);
                        capture_width = value->value.i_val;
 
@@ -1657,9 +1872,7 @@ bool _mmcamcorder_commit_capture_width (MMHandleType handle, int attr_idx, const
                }
 
                return TRUE;
-       }
-       else
-       {
+       } else {
                _mmcam_dbg_log("Capture resolution can't be set.(state=%d)", current_state);
                return FALSE;
        }
@@ -1670,22 +1883,18 @@ bool _mmcamcorder_commit_capture_height (MMHandleType handle, int attr_idx, cons
 {
        int current_state = MM_CAMCORDER_STATE_NONE;
 
-       current_state = _mmcamcorder_get_state( handle);
+       current_state = _mmcamcorder_get_state(handle);
 
-       if( current_state == MM_CAMCORDER_STATE_NULL
-        || current_state == MM_CAMCORDER_STATE_READY
-        || current_state == MM_CAMCORDER_STATE_PREPARE )
-       {
+       if (current_state <= MM_CAMCORDER_STATE_PREPARE) {
                int capture_width, capture_height;
 
                mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_WIDTH, &capture_width, NULL);
                capture_height = value->value.i_val;
 
                return __mmcamcorder_set_capture_resolution(handle, capture_width, capture_height);
-       }
-       else
-       {
+       } else {
                _mmcam_dbg_log("Capture resolution can't be set.(state=%d)", current_state);
+
                return FALSE;
        }
 }
@@ -1703,11 +1912,11 @@ bool _mmcamcorder_commit_capture_break_cont_shot (MMHandleType handle, int attr_
 
        char* videosrc_name = NULL;
 
-       _mmcamcorder_conf_get_element( hcamcorder->conf_main, 
-                       CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT, 
-                       "VideosrcElement", 
-                       &VideosrcElement );
-       _mmcamcorder_conf_get_value_element_name( VideosrcElement, &videosrc_name );
+       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
+                                     CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
+                                     "VideosrcElement",
+                                     &VideosrcElement );
+       _mmcamcorder_conf_get_value_element_name(VideosrcElement, &videosrc_name);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        if (!sc)
@@ -1743,41 +1952,48 @@ bool _mmcamcorder_commit_capture_break_cont_shot (MMHandleType handle, int attr_
 }
 
 
-bool _mmcamcorder_commit_capture_count (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_capture_count(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       int ret = FALSE;
-       int cap_count = 0;
-       int mode = MM_CAMCORDER_MODE_IMAGE;
+       int mode = MM_CAMCORDER_MODE_VIDEO_CAPTURE;
+       int current_state = MM_CAMCORDER_STATE_NONE;
 
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        mmf_return_val_if_fail(hcamcorder, FALSE);
 
-       cap_count = value->value.i_val;
-
+       current_state = _mmcamcorder_get_state(handle);
        mm_camcorder_get_attributes(handle, NULL, MMCAM_MODE, &mode, NULL);
-       if (mode == MM_CAMCORDER_MODE_IMAGE) {
-               if (cap_count > 1) {
-                       __ta__("_mmcamcorder_sound_init",
-                       ret = _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
-                       );
-                       if (ret == TRUE) {
-                               __ta__("_mmcamcorder_sound_prepare",
-                               ret = _mmcamcorder_sound_prepare(handle);
-                               );
-                               _mmcam_dbg_log("sound prepare [%d]", ret);
-                       }
-               } else if (cap_count == 1) {
-                       __ta__("_mmcamcorder_sound_finalize",
-                       ret = _mmcamcorder_sound_finalize(handle);
-                       );
-                       _mmcam_dbg_log("sound finalize [%d]", ret);
-               }
+
+       _mmcam_dbg_log("current state %d, mode %d, set count %d",
+                      current_state, mode, value->value.i_val);
+
+       if (mode != MM_CAMCORDER_MODE_AUDIO &&
+           current_state != MM_CAMCORDER_STATE_CAPTURING) {
+               return TRUE;
+       } else {
+               _mmcam_dbg_err("Invalid mode[%d] or state[%d]", mode, current_state);
+               return FALSE;
        }
+}
 
-       _mmcam_dbg_log("Capture Count(%d)", cap_count);
 
-       return TRUE;
+bool _mmcamcorder_commit_capture_sound_enable(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       _mmcam_dbg_log("shutter sound policy: %d", hcamcorder->shutter_sound_policy);
+
+       /* return error when disable shutter sound if policy is TRUE */
+       if (!value->value.i_val &&
+           hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               _mmcam_dbg_err("not permitted DISABLE SHUTTER SOUND");
+               return FALSE;
+       } else {
+               _mmcam_dbg_log("set value [%d] success", value->value.i_val);
+               return TRUE;
+       }
 }
 
 
@@ -1812,7 +2028,7 @@ bool _mmcamcorder_commit_audio_volume (MMHandleType handle, int attr_idx, const
                                MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_AUDIOSRC_VOL].gst, "volume", mslNewVal);
                        }
                }
-               
+
                _mmcam_dbg_log("Commit : volume(%f)", mslNewVal);
                bret = TRUE;
        }
@@ -1821,8 +2037,8 @@ bool _mmcamcorder_commit_audio_volume (MMHandleType handle, int attr_idx, const
                _mmcam_dbg_log("Commit : nothing to commit. status(%d)", current_state);
                bret = TRUE;
        }
-       return bret;
 
+       return bret;
 }
 
 
@@ -1833,6 +2049,41 @@ bool _mmcamcorder_commit_camera_fps (MMHandleType handle, int attr_idx, const mm
 }
 
 
+bool _mmcamcorder_commit_camera_recording_motion_rate(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(handle, TRUE);
+
+       current_state = _mmcamcorder_get_state(handle);
+
+       if (current_state > MM_CAMCORDER_STATE_PREPARE) {
+               _mmcam_dbg_warn("invalid state %d", current_state);
+               return FALSE;
+       }
+
+       /* Verify recording motion rate */
+       if (value->value.d_val > 0.0) {
+               sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+               mmf_return_val_if_fail(sc, TRUE);
+
+               /* set is_slow flag */
+               if (value->value.d_val != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
+                       sc->is_modified_rate = TRUE;
+               } else {
+                       sc->is_modified_rate = FALSE;
+               }
+
+               _mmcam_dbg_log("Set slow motion rate %lf", value->value.d_val);
+               return TRUE;
+       } else {
+               _mmcam_dbg_warn("Failed to set recording motion rate %lf", value->value.d_val);
+               return FALSE;
+       }
+}
+
+
 bool _mmcamcorder_commit_camera_width (MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
        MMHandleType attr = 0;
@@ -1844,9 +2095,9 @@ bool _mmcamcorder_commit_camera_width (MMHandleType handle, int attr_idx, const
 
        _mmcam_dbg_log("Width(%d)", value->value.i_val);
 
-       current_state = _mmcamcorder_get_state( handle);
+       current_state = _mmcamcorder_get_state(handle);
 
-       if ((current_state > MM_CAMCORDER_STATE_READY) || _mmcamcorder_is_state_changing( handle ) ) {
+       if (current_state > MM_CAMCORDER_STATE_READY) {
                _mmcam_dbg_log("Resolution can't be changed.(state=%d)", current_state);
                return FALSE;
        } else {
@@ -1879,7 +2130,7 @@ bool _mmcamcorder_commit_camera_height (MMHandleType handle, int attr_idx, const
        _mmcam_dbg_log("Height(%d)", value->value.i_val);
        current_state = _mmcamcorder_get_state( handle);
 
-       if ( (current_state > MM_CAMCORDER_STATE_READY) || _mmcamcorder_is_state_changing( handle )) {
+       if (current_state > MM_CAMCORDER_STATE_READY) {
                _mmcam_dbg_log("Resolution can't be changed.(state=%d)", current_state);
                return FALSE;
        } else {
@@ -1961,9 +2212,14 @@ bool _mmcamcorder_commit_camera_focus_mode (MMHandleType handle, int attr_idx, c
 
        _mmcam_dbg_log("Focus mode(%d)", value->value.i_val);
 
-       current_state = _mmcamcorder_get_state( handle);
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
 
-       if (current_state < MM_CAMCORDER_STATE_READY) {
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_NULL) {
                _mmcam_dbg_log("Focus mode will be changed later.(state=%d)", current_state);
                return TRUE;
        }
@@ -1976,13 +2232,13 @@ bool _mmcamcorder_commit_camera_focus_mode (MMHandleType handle, int attr_idx, c
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
                {
                        _mmcam_dbg_log("Can't cast Video source into camera control.");
-                       return TRUE; 
+                       return TRUE;
                }
-                                       
+
                control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
                mslVal = value->value.i_val;
-               mode = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
+               mode = _mmcamcorder_convert_msl_to_sensor( handle, attr_idx, mslVal );
 
                mm_camcorder_get_attribute_info(handle, MMCAM_CAMERA_AF_SCAN_RANGE, &info);
                flags = info.flag;
@@ -1997,7 +2253,7 @@ bool _mmcamcorder_commit_camera_focus_mode (MMHandleType handle, int attr_idx, c
                                        if( gst_camera_control_set_focus( control, mode, cur_focus_range ) )
                                        {
                                                MMTA_ACUM_ITEM_END("                gst_camera_control_set_focus", 0);
-                                               //_mmcam_dbg_log( "Succeed in setting AF mode[%d]", mslVal );
+                                               _mmcam_dbg_log( "Succeed in setting AF mode[%d]", mslVal );
                                                return TRUE;
                                        }
                                        else
@@ -2008,7 +2264,7 @@ bool _mmcamcorder_commit_camera_focus_mode (MMHandleType handle, int attr_idx, c
                                }
                                else
                                {
-                                       //_mmcam_dbg_log( "No need to set AF mode. Current[%d]", mslVal );
+                                       _mmcam_dbg_log( "No need to set AF mode. Current[%d]", mslVal );
                                        return TRUE;
                                }
                        }
@@ -2043,13 +2299,17 @@ bool _mmcamcorder_commit_camera_af_scan_range (MMHandleType handle, int attr_idx
 
        _mmcam_dbg_log("(%d)", attr_idx);
 
-       current_state = _mmcamcorder_get_state( handle);
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
 
        mslVal = value->value.i_val;
-       newVal = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
+       newVal = _mmcamcorder_convert_msl_to_sensor(handle, attr_idx, mslVal);
 
-       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;
        }
@@ -2059,13 +2319,13 @@ bool _mmcamcorder_commit_camera_af_scan_range (MMHandleType handle, int attr_idx
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
                {
                        _mmcam_dbg_log("Can't cast Video source into camera control.");
-                       return TRUE; 
+                       return TRUE;
                }
-                                       
+
                control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
                mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FOCUS_MODE, &msl_mode, NULL);
-               converted_mode = _mmcamcorder_convert_msl_to_sensor( MM_CAM_CAMERA_FOCUS_MODE, msl_mode );
+               converted_mode = _mmcamcorder_convert_msl_to_sensor( handle, MM_CAM_CAMERA_FOCUS_MODE, msl_mode );
 
                if( gst_camera_control_get_focus( control, &cur_focus_mode, &cur_focus_range ) )
                {
@@ -2276,7 +2536,6 @@ bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx,
        int ivalue = value->value.i_val;
        int mslVal1 = 0, mslVal2 = 0;
        int newVal1 = 0, newVal2 = 0;
-       int cur_value1 = 0, cur_value2 = 0;
        int exposure_type = 0;
        int current_state = MM_CAMCORDER_STATE_NONE;
        _MMCamcorderSubContext *sc = NULL;
@@ -2288,8 +2547,13 @@ bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx,
        if (!sc)
                return TRUE;
 
-       current_state = _mmcamcorder_get_state( handle);
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
 
+       current_state = _mmcamcorder_get_state( handle);
        if (current_state < MM_CAMCORDER_STATE_READY) {
                return TRUE;
        }
@@ -2305,16 +2569,17 @@ bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx,
        } else if (attr_idx == MM_CAM_CAMERA_ISO) {
                exposure_type = GST_CAMERA_CONTROL_ISO;
                mslVal1 = ivalue;
-               newVal1 = _mmcamcorder_convert_msl_to_sensor(attr_idx, mslVal1);
+               newVal1 = _mmcamcorder_convert_msl_to_sensor(handle, attr_idx, mslVal1);
                check_scene_mode = TRUE;
        } else if (attr_idx == MM_CAM_CAMERA_EXPOSURE_MODE) {
                exposure_type = GST_CAMERA_CONTROL_EXPOSURE_MODE;
                mslVal1 = ivalue;
-               newVal1 =  _mmcamcorder_convert_msl_to_sensor(attr_idx, mslVal1);
+               newVal1 =  _mmcamcorder_convert_msl_to_sensor(handle, attr_idx, mslVal1);
+               check_scene_mode = TRUE;
        } else if (attr_idx == MM_CAM_CAMERA_EXPOSURE_VALUE) {
                exposure_type = GST_CAMERA_CONTROL_EXPOSURE_VALUE;
                mslVal1 = newVal1 = MM_CAMCORDER_GET_NUMERATOR( ivalue );
-               mslVal2 = newVal2 = MM_CAMCORDER_GET_DENOMINATOR( ivalue );                             
+               mslVal2 = newVal2 = MM_CAMCORDER_GET_DENOMINATOR( ivalue );
        }
 
        if (check_scene_mode) {
@@ -2326,31 +2591,23 @@ bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx,
        }
 
        if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
+               int ret = 0;
+
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                        _mmcam_dbg_log("Can't cast Video source into camera control.");
-                       return TRUE; 
+                       return TRUE;
                }
 
                control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
-               if (gst_camera_control_get_exposure(control, exposure_type, &cur_value1, &cur_value2)) {
-                       if (newVal1 != cur_value1 || newVal2 != cur_value2) {
-                               int ret = 0;
-                               __ta__("                gst_camera_control_set_exposure",
-                               ret = gst_camera_control_set_exposure(control, exposure_type, newVal1, newVal2);
-                               );
 
-                               if (ret) {
-                                       //_mmcam_dbg_log( "Succeed in setting exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
-                                       return TRUE;
-                               } else {
-                                       _mmcam_dbg_warn( "Failed to set exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
-                               }
-                       } else {
-                               //_mmcam_dbg_log( "No need to set exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
-                               return TRUE;
-                       }
+               __ta__("                gst_camera_control_set_exposure",
+               ret = gst_camera_control_set_exposure(control, exposure_type, newVal1, newVal2);
+               );
+               if (ret) {
+                       _mmcam_dbg_log("Succeed in setting exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
+                       return TRUE;
                } else {
-                       _mmcam_dbg_warn( "Failed to get exposure. Type[%d]", exposure_type );
+                       _mmcam_dbg_warn("Failed to set exposure. Type[%d],value1[%d],value2[%d]", exposure_type, mslVal1, mslVal2 );
                }
        } else {
                _mmcam_dbg_log("pointer of video src is null");
@@ -2363,60 +2620,61 @@ bool _mmcamcorder_commit_camera_capture_mode (MMHandleType handle, int attr_idx,
 bool _mmcamcorder_commit_camera_wdr (MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
        GstCameraControl *control = NULL;
-       int mslVal = value->value.i_val;
-       int newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_CAMERA_WDR, mslVal);
+       int mslVal = 0;
+       int newVal = 0;
        int cur_value = 0;
        _MMCamcorderSubContext *sc = NULL;
        int current_state = MM_CAMCORDER_STATE_NONE;
 
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+       mmf_return_val_if_fail(handle && value, FALSE);
+
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
                return TRUE;
+       }
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, TRUE);
 
+       /* check current state */
        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;
-       }                       
+       }
 
-       if( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst )
-       {
-               if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
-               {
+       if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
+               _mmcam_dbg_warn("Can not set WDR while CAPTURING");
+               return FALSE;
+       }
+
+       mslVal = value->value.i_val;
+       newVal = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_WDR, mslVal);
+
+       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;
                }
-                                       
-               control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
 
-               if( gst_camera_control_get_wdr( control, &cur_value ) )
-               {
-                       if( newVal != cur_value )
-                       {
-                               if( gst_camera_control_set_wdr( control, newVal ) )
-                               {
-                                       //_mmcam_dbg_log( "Success - set wdr[%d]", mslVal );
+               control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+               if (gst_camera_control_get_wdr(control, &cur_value)) {
+                       if (newVal != cur_value) {
+                               if (gst_camera_control_set_wdr(control, newVal)) {
+                                       _mmcam_dbg_log( "Success - set wdr[%d]", mslVal );
                                        return TRUE;
+                               } else {
+                                       _mmcam_dbg_warn("Failed to set WDR. NewVal[%d],CurVal[%d]", newVal, cur_value);
                                }
-                               else
-                               {
-                                       _mmcam_dbg_warn( "Failed to set WDR. NewVal[%d],CurVal[%d]", newVal, cur_value );
-                               }
-                       }
-                       else
-                       {
-                               //_mmcam_dbg_log( "No need to set new WDR. Current[%d]", mslVal );
+                       } else {
+                               _mmcam_dbg_log( "No need to set new WDR. Current[%d]", mslVal );
                                return TRUE;
                        }
-               }
-               else
-               {
+               } else {
                        _mmcam_dbg_warn( "Failed to get WDR." );
                }
-       }
-       else
-       {
+       } else {
                _mmcam_dbg_log("pointer of video src is null");
        }
 
@@ -2424,67 +2682,43 @@ bool _mmcamcorder_commit_camera_wdr (MMHandleType handle, int attr_idx, const mm
 }
 
 
-bool _mmcamcorder_commit_camera_anti_handshake (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_camera_anti_handshake(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       GstCameraControl *control = NULL;
-       int mslVal = value->value.i_val;
-       int newVal = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_ANTI_HANDSHAKE, mslVal);
-       int cur_value = 0;
-       _MMCamcorderSubContext *sc = NULL;
        int current_state = MM_CAMCORDER_STATE_NONE;
 
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
                return TRUE;
+       }
 
-       current_state = _mmcamcorder_get_state( handle);
-
+       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);
                return TRUE;
-       }                       
+       } else if (current_state > MM_CAMCORDER_STATE_PREPARE) {
+               _mmcam_dbg_err("Invaild state (state %d)", current_state);
+               return FALSE;
+       }
 
-       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;
-               }
-                                       
-               control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+       return _mmcamcorder_set_videosrc_anti_shake(handle, value->value.i_val);
+}
 
-               if( gst_camera_control_get_ahs( control, &cur_value ) )
-               {
-                       if( newVal != cur_value )
-                       {
-                               if (gst_camera_control_set_ahs(control, newVal))
-                               {
-                                       //_mmcam_dbg_log("Succeed in operating anti-handshake.");
-                                       return TRUE;
-                               }
-                               else
-                               {
-                                       _mmcam_dbg_warn("Failed to operate anti-handshake. value[%d]", newVal);
-                               }
-                       }
-                       else
-                       {
-                               //_mmcam_dbg_log( "No need to set new Anti-Handshake. Current[%d]", mslVal );
-                               return TRUE;
-                       }
-               }
-               else
-               {
-                       _mmcam_dbg_warn( "Failed to get Anti-Handshake." );
-               }
-       }
-       else
-       {
-               _mmcam_dbg_warn("pointer of video src is null");
+
+bool _mmcamcorder_commit_camera_video_stabilization(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
+
+       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);
+               return TRUE;
+       } else if (current_state > MM_CAMCORDER_STATE_PREPARE) {
+               _mmcam_dbg_err("Invaild state (state %d)", current_state);
+               return FALSE;
        }
 
-       return FALSE;
+       return _mmcamcorder_set_videosrc_stabilization(handle, value->value.i_val);
 }
 
 
@@ -2497,7 +2731,7 @@ bool _mmcamcorder_commit_camera_hold_af_after_capturing (MMHandleType handle, in
        if (!sc)
                return TRUE;
 
-       current_state = _mmcamcorder_get_state( handle);
+       current_state = _mmcamcorder_get_state(handle);
 
        if( current_state < MM_CAMCORDER_STATE_READY )
        {
@@ -2517,35 +2751,61 @@ bool _mmcamcorder_commit_camera_hold_af_after_capturing (MMHandleType handle, in
 }
 
 
-bool _mmcamcorder_commit_camera_rotate (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_camera_rotate(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
        int current_state = MM_CAMCORDER_STATE_NONE;
-       gboolean bstate_changing = FALSE;
 
        _mmcam_dbg_log("rotate(%d)", value->value.i_val);
 
-       current_state = _mmcamcorder_get_state( handle);
-       bstate_changing = _mmcamcorder_is_state_changing( handle);
+       current_state = _mmcamcorder_get_state(handle);
 
-       if ((current_state > MM_CAMCORDER_STATE_READY) || bstate_changing ) {
-               _mmcam_dbg_err("camera rotation setting failed.(state=%d, is_state_changing(%d))", current_state, bstate_changing);
+       if (current_state > MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_err("camera rotation setting failed.(state=%d)", current_state);
                return FALSE;
        } else {
-               return _mmcamcorder_set_videosrc_rotation( handle, value->value.i_val );
+               return _mmcamcorder_set_videosrc_rotation(handle, value->value.i_val);
        }
 }
 
 
-bool _mmcamcorder_commit_image_encoder_quality (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_image_encoder_quality(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
+       int current_state = MM_CAMCORDER_STATE_NONE;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+
        _mmcam_dbg_log("Image encoder quality(%d)", value->value.i_val);
-       return TRUE;
+
+       if (current_state == MM_CAMCORDER_STATE_PREPARE) {
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-jpg-quality", value->value.i_val);
+               return TRUE;
+       } else {
+               _mmcam_dbg_err("invalid state %d", current_state);
+               return FALSE;
+       }
 }
 
 
-bool _mmcamcorder_commit_target_filename (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_target_filename(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
        char * filename = NULL;
        int size = 0;
@@ -2554,48 +2814,17 @@ bool _mmcamcorder_commit_target_filename (MMHandleType handle, int attr_idx, con
        if (!sc)
                return TRUE;
 
-       //Set basic infomation
-       if (value->type != MM_ATTRS_TYPE_STRING)
-       {
-               _mmcam_dbg_log("Mismatched value type (%d)", value->type);
-               return FALSE;   
-       }
-       else
-       {
-               filename = (char*)mmf_value_get_string(value, &size);
-       }
+       /* get string */
+       filename = (char *)mmf_value_get_string(value, &size);
 
-       if (sc->element != NULL) 
-       {
-               if ((hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) || (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO))
-               {
-                       if (sc->element[_MMCAMCORDER_ENCSINK_BIN].gst != NULL)
-                       {
-                               if (sc->element[_MMCAMCORDER_ENCSINK_SINK].gst != NULL)
-                               {
-                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_ENCSINK_SINK].gst, "location", filename);
-                                       _mmcam_dbg_log("new file location set.(%s)", filename);
-                               }
-                               else
-                               {
-                                       _mmcam_dbg_warn("filesink is not created.");
-                               }
-                       }
-                       else
-                       {
-                               _mmcam_dbg_warn("filesink is not created.");
-                       }
-               }
-               else
-               {
-                       _mmcam_dbg_log("new file location set.(%s)", filename);
-               }
-       }
-       else
-       {
-               _mmcam_dbg_warn("gstreamer pipeline is not created.");
+       if (sc->element && sc->element[_MMCAMCORDER_ENCSINK_SINK].gst) {
+               MMCAMCORDER_G_OBJECT_SET( sc->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);
        }
-       return TRUE;    
+
+       return TRUE;
 }
 
 
@@ -2609,7 +2838,6 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
        const GList *item = NULL;
        int newVal = 0;
        int mslNewVal = 0;
-       int cur_value = 0;
        int current_state = MM_CAMCORDER_STATE_NONE;
        gchar * control_label = NULL;
        _MMCamcorderSubContext *sc = NULL;
@@ -2621,11 +2849,15 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
        if (!sc)
                return TRUE;
 
-       current_state = _mmcamcorder_get_state(handle);
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
 
-       //status check
+       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);
+               _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
                return TRUE;
        }
 
@@ -2636,39 +2868,38 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
                mslNewVal = value->value.i_val;
        }
 
-       switch (attr_idx)
-       {
-               case MM_CAM_FILTER_BRIGHTNESS:
-                       control_label = "brightness";
-                       check_scene_mode = TRUE;
-                       break;
+       switch (attr_idx) {
+       case MM_CAM_FILTER_BRIGHTNESS:
+               control_label = "brightness";
+               check_scene_mode = TRUE;
+               break;
 
-               case MM_CAM_FILTER_CONTRAST:
-                       control_label = "contrast";
-                       break;
+       case MM_CAM_FILTER_CONTRAST:
+               control_label = "contrast";
+               break;
 
-               case MM_CAM_FILTER_WB:
-                       control_label = "white balance";
-                       check_scene_mode = TRUE;
-                       break;
+       case MM_CAM_FILTER_WB:
+               control_label = "white balance";
+               check_scene_mode = TRUE;
+               break;
 
-               case MM_CAM_FILTER_COLOR_TONE:
-                       control_label = "color tone";
-                       break;
+       case MM_CAM_FILTER_COLOR_TONE:
+               control_label = "color tone";
+               break;
 
-               case MM_CAM_FILTER_SATURATION:
-                       control_label = "saturation";
-                       check_scene_mode = TRUE;
-                       break;
+       case MM_CAM_FILTER_SATURATION:
+               control_label = "saturation";
+               check_scene_mode = TRUE;
+               break;
 
-               case MM_CAM_FILTER_HUE:
-                       control_label = "hue";
-                       break;
+       case MM_CAM_FILTER_HUE:
+               control_label = "hue";
+               break;
 
-               case MM_CAM_FILTER_SHARPNESS:
-                       control_label = "sharpness";
-                       check_scene_mode = TRUE;
-                       break;
+       case MM_CAM_FILTER_SHARPNESS:
+               control_label = "sharpness";
+               check_scene_mode = TRUE;
+               break;
        }
 
        if (check_scene_mode) {
@@ -2679,14 +2910,13 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
                }
        }
 
-       newVal = _mmcamcorder_convert_msl_to_sensor(attr_idx, mslNewVal);
+       newVal = _mmcamcorder_convert_msl_to_sensor(handle, attr_idx, mslNewVal);
        if (newVal == _MMCAMCORDER_SENSOR_ENUM_NONE)
                return FALSE;
                        
        _mmcam_dbg_log("label(%s): MSL(%d)->Sensor(%d)", control_label, mslNewVal, newVal);
        
-       if (!GST_IS_COLOR_BALANCE(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
-       {
+       if (!GST_IS_COLOR_BALANCE(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                _mmcam_dbg_log("Can't cast Video source into color balance.");
                return TRUE;
        }
@@ -2694,27 +2924,22 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
        balance = GST_COLOR_BALANCE (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
        controls = gst_color_balance_list_channels (balance);
-       //_mmcam_dbg_log("controls(%x)", controls);
        if (controls == NULL) {
                _mmcam_dbg_log("There is no list of colorbalance controls");
                return FALSE;
        }
 
-       for (item = controls;item != NULL;item = item->next)
-       {
-               if (item)
-               {
-                       if (item->data)
-                       {
+       for (item = controls ; item != NULL ; item = item->next) {
+               if (item) {
+                       if (item->data) {
                                Colorchannel = item->data;
-                               //_mmcam_dbg_log("Getting name of CID=(%s), input CID=(%s)", Colorchannel->label, control_label);
+                               /*_mmcam_dbg_log("Getting name of CID=(%s), input CID=(%s)", Colorchannel->label, control_label);*/
 
-                               if (strcmp(Colorchannel->label, control_label) == 0)
-                               {
+                               if (!strcmp(Colorchannel->label, control_label)) {
                                        break;
-                               }
-                               else
+                               } else {
                                        Colorchannel = NULL;
+                               }
                        }
                }
        }
@@ -2724,22 +2949,11 @@ bool _mmcamcorder_commit_filter (MMHandleType handle, int attr_idx, const mmf_va
                return FALSE;
        }
 
-       //_mmcam_dbg_log("Colorchannel(%x, %s)", Colorchannel, Colorchannel->label);
-
-       cur_value = gst_color_balance_get_value( balance, Colorchannel );
-       _mmcam_dbg_log( "device[cur:%d,new%d]", cur_value, newVal );
+       __ta__("                gst_color_balance_set_value",
+       gst_color_balance_set_value (balance, Colorchannel, newVal);
+       );
 
-       if( newVal != cur_value )
-       {
-               __ta__("                gst_color_balance_set_value",  
-               gst_color_balance_set_value (balance, Colorchannel, newVal);
-               );
-               //_mmcam_dbg_log( "Set complete - %s[%d]", Colorchannel->label, mslNewVal );
-       }
-       else
-       {
-               _mmcam_dbg_log( "No need to set %s. Current[%d]", Colorchannel->label, mslNewVal);
-       }
+       _mmcam_dbg_log( "Set complete - %s[msl:%d,real:%d]", Colorchannel->label, mslNewVal, newVal);
 
        return TRUE;
 }
@@ -2749,8 +2963,7 @@ bool _mmcamcorder_commit_filter_scene_mode (MMHandleType handle, int attr_idx, c
 {
        GstCameraControl *control = NULL;
        int mslVal = value->value.i_val;
-       int newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_FILTER_SCENE_MODE, mslVal );
-       int cur_program_mode = MM_CAMCORDER_SCENE_MODE_NORMAL;
+       int newVal = _mmcamcorder_convert_msl_to_sensor( handle, MM_CAM_FILTER_SCENE_MODE, mslVal );
        _MMCamcorderSubContext *sc = NULL;
        int current_state = MM_CAMCORDER_STATE_NONE;
 
@@ -2758,59 +2971,56 @@ bool _mmcamcorder_commit_filter_scene_mode (MMHandleType handle, int attr_idx, c
        if (!sc)
                return TRUE;
 
-       current_state = _mmcamcorder_get_state( handle);
-       
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
+
+       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;
        }
        
        if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
+               int ret = 0;
+
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                        _mmcam_dbg_log("Can't cast Video source into camera control.");
                        return TRUE;
                }
 
                control = GST_CAMERA_CONTROL (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
-               if( gst_camera_control_get_exposure( control, GST_CAMERA_CONTROL_PROGRAM_MODE, &cur_program_mode, NULL ) )
-               {
-                       if( newVal != cur_program_mode )
-                       {
-                               int ret = 0;
-                               __ta__("                gst_camera_control_set_exposure:GST_CAMERA_CONTROL_PROGRAM_MODE",  
-                               ret = gst_camera_control_set_exposure(control, GST_CAMERA_CONTROL_PROGRAM_MODE, newVal, 0);
-                               );
-                               if (ret) {
-                                       _mmcam_dbg_log("Succeed in setting program mode[%d].", mslVal);
-
-                                       if (mslVal == MM_CAMCORDER_SCENE_MODE_NORMAL) {
-                                               int i = 0;
-                                               int attr_idxs[] = {
-                                                       MM_CAM_CAMERA_ISO
-                                                       , MM_CAM_FILTER_BRIGHTNESS
-                                                       , MM_CAM_FILTER_WB
-                                                       , MM_CAM_FILTER_SATURATION
-                                                       , MM_CAM_FILTER_SHARPNESS
-                                               };
-                                               mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
-
-                                               for (i = 0 ; i < ARRAY_SIZE(attr_idxs) ; i++) {
-                                                       if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs[i])) {
-                                                               mmf_attribute_set_modified(&(attr->items[attr_idxs[i]]));
-                                                       }
-                                               }
+               __ta__("                gst_camera_control_set_exposure:GST_CAMERA_CONTROL_PROGRAM_MODE",
+               ret = gst_camera_control_set_exposure(control, GST_CAMERA_CONTROL_PROGRAM_MODE, newVal, 0);
+               );
+               if (ret) {
+                       _mmcam_dbg_log("Succeed in setting program mode[%d].", mslVal);
+
+                       if (mslVal == MM_CAMCORDER_SCENE_MODE_NORMAL) {
+                               int i = 0;
+                               int attr_idxs[] = {
+                                       MM_CAM_CAMERA_ISO
+                                       , MM_CAM_FILTER_BRIGHTNESS
+                                       , MM_CAM_FILTER_WB
+                                       , MM_CAM_FILTER_SATURATION
+                                       , MM_CAM_FILTER_SHARPNESS
+                                       , MM_CAM_FILTER_COLOR_TONE
+                                       , MM_CAM_CAMERA_EXPOSURE_MODE
+                               };
+                               mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
+
+                               for (i = 0 ; i < ARRAY_SIZE(attr_idxs) ; i++) {
+                                       if (__mmcamcorder_attrs_is_supported((MMHandleType)attr, attr_idxs[i])) {
+                                               mmf_attribute_set_modified(&(attr->items[attr_idxs[i]]));
                                        }
-
-                                       return TRUE;
-                               } else {
-                                       _mmcam_dbg_log( "Failed to set program mode[%d].", mslVal );
                                }
-                       } else {
-                               _mmcam_dbg_log( "No need to set program mode. Current[%d]", mslVal );
-                               return TRUE;
                        }
+
+                       return TRUE;
                } else {
-                       _mmcam_dbg_warn( "Failed to get program mode, so do not set new program mode[%d]", mslVal );
+                       _mmcam_dbg_log( "Failed to set program mode[%d].", mslVal );
                }
        } else {
                _mmcam_dbg_warn("pointer of video src is null");
@@ -2827,21 +3037,111 @@ bool _mmcamcorder_commit_filter_flip (MMHandleType handle, int attr_idx, const m
 }
 
 
-bool _mmcamcorder_commit_camcorder_rotate(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_camera_face_zoom(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
+       int ret = 0;
        int current_state = MM_CAMCORDER_STATE_NONE;
-       gboolean bstate_changing = FALSE;
 
-       _mmcam_dbg_log("camcorder-rotation(%d)", value->value.i_val);
-       current_state = _mmcamcorder_get_state( handle);
-       bstate_changing = _mmcamcorder_is_state_changing( handle);
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       GstCameraControl *control = NULL;
+       _MMCamcorderSubContext *sc = NULL;
 
-       if ((current_state > MM_CAMCORDER_STATE_PREPARE) || bstate_changing ) {
-               _mmcam_dbg_err("camcorder-rotation setting failed.(state=%d, is_state_changing(%d))", current_state, bstate_changing);
-               return FALSE;
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, TRUE);
+
+       /* these are only available after camera preview is started */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state >= MM_CAMCORDER_STATE_PREPARE &&
+           hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int x = 0;
+               int y = 0;
+               int zoom_level = 0;
+               int preview_width = 0;
+               int preview_height = 0;
+
+               switch (attr_idx) {
+               case MM_CAM_CAMERA_FACE_ZOOM_X:
+                       /* check x coordinate of face zoom */
+                       mm_camcorder_get_attributes(handle, NULL,
+                                                   MMCAM_CAMERA_WIDTH, &preview_width,
+                                                   NULL);
+                       /* x coordinate should be smaller than width of preview */
+                       if (value->value.i_val < preview_width) {
+                               _mmcam_dbg_log("set face zoom x %d done", value->value.i_val);
+                               ret = TRUE;
+                       } else {
+                               _mmcam_dbg_err("invalid face zoom x %d", value->value.i_val);
+                               ret = FALSE;
+                       }
+                       break;
+               case MM_CAM_CAMERA_FACE_ZOOM_Y:
+                       /* check y coordinate of face zoom */
+                       mm_camcorder_get_attributes(handle, NULL,
+                                                   MMCAM_CAMERA_WIDTH, &preview_height,
+                                                   NULL);
+                       /* y coordinate should be smaller than height of preview */
+                       if (value->value.i_val < preview_height) {
+                               _mmcam_dbg_log("set face zoom y %d done", value->value.i_val);
+                               ret = TRUE;
+                       } else {
+                               _mmcam_dbg_err("invalid face zoom y %d", value->value.i_val);
+                               ret = FALSE;
+                       }
+                       break;
+               case MM_CAM_CAMERA_FACE_ZOOM_MODE:
+                       if (value->value.i_val == MM_CAMCORDER_FACE_ZOOM_MODE_ON) {
+                               int face_detect_mode = MM_CAMCORDER_DETECT_MODE_OFF;
+
+                               /* start face zoom */
+                               /* get x,y coordinate and zoom level */
+                               mm_camcorder_get_attributes(handle, NULL,
+                                                           MMCAM_CAMERA_FACE_ZOOM_X, &x,
+                                                           MMCAM_CAMERA_FACE_ZOOM_Y, &y,
+                                                           MMCAM_CAMERA_FACE_ZOOM_LEVEL, &zoom_level,
+                                                           MMCAM_DETECT_MODE, &face_detect_mode,
+                                                           NULL);
+
+                               if (face_detect_mode == MM_CAMCORDER_DETECT_MODE_ON) {
+                                       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
+                                       __ta__("                gst_camera_control_start_face_zoom",
+                                       ret = gst_camera_control_start_face_zoom(control, x, y, zoom_level);
+                                       );
+                               } else {
+                                       _mmcam_dbg_err("face detect is OFF... could not start face zoom");
+                                       ret = FALSE;
+                               }
+                       } else if (value->value.i_val == MM_CAMCORDER_FACE_ZOOM_MODE_OFF) {
+                               /* stop face zoom */
+                               control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
+                               __ta__("                gst_camera_control_stop_face_zoom",
+                               ret = gst_camera_control_stop_face_zoom(control);
+                               );
+                       } else {
+                               /* should not be reached here */
+                               _mmcam_dbg_err("unknown command [%d]", value->value.i_val);
+                               ret = FALSE;
+                       }
+
+                       if (!ret) {
+                               _mmcam_dbg_err("face zoom[%d] failed", value->value.i_val);
+                               ret = FALSE;
+                       } else {
+                               _mmcam_dbg_log("");
+                               ret = TRUE;
+                       }
+                       break;
+               default:
+                       _mmcam_dbg_warn("should not be reached here. attr_idx %d", attr_idx);
+                       break;
+               }
        } else {
-               return TRUE;
+               _mmcam_dbg_err("invalid state[%d] or mode[%d]", current_state, hcamcorder->type);
+               ret = FALSE;
        }
+
+       return ret;
 }
 
 
@@ -2853,411 +3153,441 @@ bool _mmcamcorder_commit_audio_input_route (MMHandleType handle, int attr_idx, c
 }
 
 
-bool _mmcamcorder_commit_display_handle (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_audio_disable(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       _MMCamcorderSubContext *sc = NULL;
-
-       char* videosink_name = NULL;
+       int current_state = MM_CAMCORDER_STATE_NONE;
 
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state > MM_CAMCORDER_STATE_PREPARE) {
+               _mmcam_dbg_warn("Can NOT Disable AUDIO. invalid state %d", current_state);
+               return FALSE;
+       } else {
+               _mmcam_dbg_log("Disable AUDIO when Recording");
                return TRUE;
-
-       if( sc )
-       {
-               _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
-               _mmcam_dbg_log( "Commit : videosinkname[%s]", videosink_name );
-               
-               if( !strcmp( videosink_name, "xvimagesink" ) || !strcmp( videosink_name, "xvimagesink" ) )
-               {
-                       if( sc->element )
-                       {
-                               if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
-                               {
-                                       _mmcam_dbg_log( "Commit : Set XID[%x]", *(int*)(value->value.p_val) );
-                                       gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), *(int*)(value->value.p_val) );
-                               }
-                       }
-               }
-               else
-               {
-                       _mmcam_dbg_log( "Commit : Nothing to commit with this element[%s]", videosink_name );
-               }
        }
-       else
-       {
-               _mmcam_dbg_log( "Commit : Nothing to commit with this attribute(MM_CAMCORDER_DISPLAY_HANDLE)" );
-       }
-       
-       return TRUE;
-
 }
 
 
-bool _mmcamcorder_commit_display_rotation (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_display_handle(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder =  NULL;
-       _MMCamcorderSubContext *sc  = NULL;
        int current_state = MM_CAMCORDER_STATE_NONE;
+       char *videosink_name = NULL;
+       void *p_handle = NULL;
 
-       hcamcorder = MMF_CAMCORDER(handle);
-       if(!hcamcorder)
-               return TRUE;
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
                return TRUE;
+       }
 
-       current_state = _mmcamcorder_get_state( handle);
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
-       if( current_state > MM_CAMCORDER_STATE_NULL ) {
-               if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO ) {
-                       return _mmcamcorder_set_display_rotation( handle, value->value.i_val );
+       p_handle = value->value.p_val;
+       if (p_handle) {
+               /* get videosink name */
+               _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+               _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name);
+
+               if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "ximagesink")) {
+                       _mmcam_dbg_log("Commit : Set XID[%x]", *(int*)(p_handle));
+                       gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst), *(int*)(p_handle));
+               } 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);
                } else {
-                       _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
+                       _mmcam_dbg_warn("Commit : Nothing to commit with this element[%s]", videosink_name);
                        return FALSE;
                }
        } else {
-               _mmcam_dbg_err("display rotation change failed.(state=%d)", current_state);
+               _mmcam_dbg_warn("Display handle is NULL");
                return FALSE;
        }
+
+       return TRUE;
 }
 
 
-bool _mmcamcorder_commit_display_visible (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_display_mode(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       char *videosink_name = NULL;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
 
-       int is_visible = 0;
-       int current_state = MM_CAMCORDER_STATE_NONE;
-       int bret = 0;
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
 
-       char *videosink_name = NULL;
-       
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       _mmcam_dbg_log("Commit : videosinkname[%s]", videosink_name);
+
+       if (!strcmp(videosink_name, "xvimagesink")) {
+               _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;
-       current_state = _mmcamcorder_get_state( handle);
+       } else {
+               _mmcam_dbg_warn("Commit : This element [%s] does not support display mode", videosink_name);
+               return FALSE;
+       }
+}
 
-       if( current_state > MM_CAMCORDER_STATE_NULL )
-       {
-               if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO )
-               {
-                       if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
-                       {
-                               // Get videosink name
-                               _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
 
-                               is_visible = value->value.i_val;
+bool _mmcamcorder_commit_display_rotation(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
 
-                               if( !strcmp( videosink_name, "xvimagesink" )
-                                || !strcmp( videosink_name, "avsysvideosink" ) )
-                               {
-                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, 
-                                               "visible", is_visible);
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
-                                       _mmcam_dbg_log( "Set visible [%d] done.", is_visible );
-                                       bret = TRUE;
-                               }
-                               else
-                               {
-                                       _mmcam_dbg_warn( "videosink[%s] does not support VISIBLE.", videosink_name );
-                                       bret = FALSE;
-                               }
-                       }
-                       else
-                       {
-                               _mmcam_dbg_warn( "Videosink element is null, but current state is [%d]", current_state );
-                               bret = FALSE;
-                       }
-               }
-               else
-               {
-                       _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
-                       bret = FALSE;
-               }                               
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
        }
-       else
-       {
-               _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
-               bret = TRUE;
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
        }
-       return bret;
+
+       return _mmcamcorder_set_display_rotation(handle, value->value.i_val);
 }
 
 
-bool _mmcamcorder_commit_display_geometry_method (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_display_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
-       _MMCamcorderSubContext *sc = NULL;
+       int current_state = MM_CAMCORDER_STATE_NONE;
 
-       int newattrs = 0;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
+
+       return _mmcamcorder_set_display_flip(handle, value->value.i_val);
+}
+
+
+bool _mmcamcorder_commit_display_visible(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
        int current_state = MM_CAMCORDER_STATE_NONE;
-       int bret = 0;
-       
        char *videosink_name = NULL;
-       
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
-               return TRUE;
-       current_state = _mmcamcorder_get_state( handle);
 
-       if (current_state > MM_CAMCORDER_STATE_NULL)
-       {
-               if (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)
-               {                       
-                       // Get videosink name
-                       _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
 
-                       if(strcmp(videosink_name, "xvimagesink") == 0) //only for xvimagesink
-                       {
-                               if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO)
-                               {
-                                       newattrs = value->value.i_val;
-                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "display-geometry-method", newattrs);
-                               }
-                       }
-                       bret = TRUE;
-               }
-               else
-               {
-                       _mmcam_dbg_log("Videosink element is null");
-                       bret = FALSE;
-               }
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
        }
-       else
-       {
-               _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
-               bret = TRUE;
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+
+       /* Get videosink name */
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       if (!strcmp(videosink_name, "xvimagesink") ||
+           !strcmp(videosink_name, "evaspixmapsink")) {
+               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;
        }
-       
-       return bret;
 }
 
 
-bool _mmcamcorder_commit_display_rect (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_display_geometry_method (MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
+       int method = 0;
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       char *videosink_name = NULL;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
 
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+
+       /* Get videosink name */
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       if (!strcmp(videosink_name, "xvimagesink") ||
+           !strcmp(videosink_name, "evaspixmapsink")) {
+               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;
+       }
+}
+
+
+bool _mmcamcorder_commit_display_rect(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
        int current_state = MM_CAMCORDER_STATE_NONE;
-       int bret = 0;
-       
+       int method = 0;
        char *videosink_name = NULL;
-       
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
                return TRUE;
-       current_state = _mmcamcorder_get_state( handle);
+       }
 
-       if (current_state > MM_CAMCORDER_STATE_NULL)
-       {
-               if (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)
-               {
-                       // Get videosink name
-                       _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
-       
-                       if(strcmp(videosink_name, "xvimagesink") == 0) //only for xvimagesink
-                       {
-                               if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO)
-                               {
-                                       int err = 0;
-                                       int rectx, recty, rectw, recth;
-                                       int display_geometry_method = 0;
-
-                                       err = mm_camcorder_get_attributes(handle, NULL,
-                                                                                                       MMCAM_DISPLAY_RECT_X, &rectx,
-                                                                                                       MMCAM_DISPLAY_RECT_Y, &recty,
-                                                                                                       MMCAM_DISPLAY_RECT_WIDTH, &rectw,
-                                                                                                       MMCAM_DISPLAY_RECT_HEIGHT, &recth,
-                                                                                                       MMCAM_DISPLAY_GEOMETRY_METHOD, &display_geometry_method,
-                                                                                                       NULL);
-                                       if (err < 0) 
-                                       {
-                                               _mmcam_dbg_warn("Get display-geometry-method attrs fail. (%x)", err);
-                                               return FALSE;
-                                       }
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
-                                       if (display_geometry_method == MM_DISPLAY_METHOD_CUSTOM_ROI)
-                                       {
-                                               int flags = MM_ATTRS_FLAG_NONE;
-                                               MMCamAttrsInfo info;
-                                               _mmcam_dbg_log("FRECT(x,y,w,h) = (%d,%d,%d,%d)", rectx, recty, rectw, recth);
-                                               switch(attr_idx)
-                                               {
-                                                       case MM_CAM_DISPLAY_RECT_X:
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_Y, &info);
-                                                               flags |= info.flag;
-                                                               memset(&info, 0x00, sizeof(info));
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
-                                                               flags |= info.flag;
-                                                               memset(&info, 0x00, sizeof(info));
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
-                                                               flags |= info.flag;
-
-                                                               rectx = value->value.i_val;
-                                                       break;
-                                                       case MM_CAM_DISPLAY_RECT_Y:
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
-                                                               flags |= info.flag;
-                                                               memset(&info, 0x00, sizeof(info));
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
-                                                               flags |= info.flag;
-
-                                                               recty = value->value.i_val;
-                                                       break;
-                                                       case MM_CAM_DISPLAY_RECT_WIDTH:
-                                                               mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
-                                                               flags |= info.flag;
+       /* check current method */
+       mm_camcorder_get_attributes(handle, NULL,
+                                   MMCAM_DISPLAY_GEOMETRY_METHOD, &method,
+                                   NULL);
+       if (method != MM_DISPLAY_METHOD_CUSTOM_ROI) {
+               _mmcam_dbg_log("current method[%d] is not supported rect", method);
+               return FALSE;
+       }
 
-                                                               rectw = value->value.i_val;
-                                                       break;
-                                                       case MM_CAM_DISPLAY_RECT_HEIGHT:
-                                                               recth = value->value.i_val;
-                                                       break;
-                                                       default:
-                                                               _mmcam_dbg_err("Wrong attr_idx!");
-                                                               return FALSE;
-                                               }
+       /* Get videosink name */
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       if (!strcmp(videosink_name, "xvimagesink") ||
+           !strcmp(videosink_name, "evaspixmapsink")) {
+               int rect_x = 0;
+               int rect_y = 0;
+               int rect_width = 0;
+               int rect_height = 0;
+               int flags = MM_ATTRS_FLAG_NONE;
+               MMCamAttrsInfo info;
 
-                                               if (!(flags & MM_ATTRS_FLAG_MODIFIED))
-                                               {
-                                                       _mmcam_dbg_log("RECT(x,y,w,h) = (%d,%d,%d,%d)", rectx, recty, rectw, recth);
-
-                                                       //Do we need to check all?
-                                                       if(g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst)), "dst-roi-x"))
-                                                       {
-                                                               g_object_set (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
-                                                                       "dst-roi-x", rectx,
-                                                                       "dst-roi-y", recty,
-                                                                       "dst-roi-w", rectw,
-                                                                       "dst-roi-h", recth,
-                                                                       NULL);
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       bret = TRUE;
+               mm_camcorder_get_attributes(handle, NULL,
+                                           MMCAM_DISPLAY_RECT_X, &rect_x,
+                                           MMCAM_DISPLAY_RECT_Y, &rect_y,
+                                           MMCAM_DISPLAY_RECT_WIDTH, &rect_width,
+                                           MMCAM_DISPLAY_RECT_HEIGHT, &rect_height,
+                                           NULL);
+               switch (attr_idx) {
+               case MM_CAM_DISPLAY_RECT_X:
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_Y, &info);
+                       flags |= info.flag;
+                       memset(&info, 0x00, sizeof(info));
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
+                       flags |= info.flag;
+                       memset(&info, 0x00, sizeof(info));
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
+                       flags |= info.flag;
+
+                       rect_x = value->value.i_val;
+                       break;
+               case MM_CAM_DISPLAY_RECT_Y:
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_WIDTH, &info);
+                       flags |= info.flag;
+                       memset(&info, 0x00, sizeof(info));
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
+                       flags |= info.flag;
+
+                       rect_y = value->value.i_val;
+                       break;
+               case MM_CAM_DISPLAY_RECT_WIDTH:
+                       mm_camcorder_get_attribute_info(handle, MMCAM_DISPLAY_RECT_HEIGHT, &info);
+                       flags |= info.flag;
+
+                       rect_width = value->value.i_val;
+                       break;
+               case MM_CAM_DISPLAY_RECT_HEIGHT:
+                       rect_height = value->value.i_val;
+                       break;
+               default:
+                       _mmcam_dbg_err("Wrong attr_idx!");
+                       return FALSE;
                }
-               else
-               {
-                       _mmcam_dbg_log("Videosink element is null");
-                       bret = FALSE;
+
+               if (!(flags & MM_ATTRS_FLAG_MODIFIED)) {
+                       _mmcam_dbg_log("RECT(x,y,w,h) = (%d,%d,%d,%d)",
+                                      rect_x, rect_y, rect_width, rect_height);
+                       g_object_set(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
+                                    "dst-roi-x", rect_x,
+                                    "dst-roi-y", rect_y,
+                                    "dst-roi-w", rect_width,
+                                    "dst-roi-h", rect_height,
+                                    NULL);
                }
+
+               return TRUE;
+       } else {
+               _mmcam_dbg_warn("videosink[%s] does not support display rect.", videosink_name);
+               return FALSE;
        }
-       else
-       {
-               _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
-               bret = TRUE;
-       }
-       
-       return bret;
 }
 
 
-bool _mmcamcorder_commit_display_scale (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_display_scale(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
-       _MMCamcorderSubContext *sc = NULL;
-
        int zoom = 0;
        int current_state = MM_CAMCORDER_STATE_NONE;
-       int bret = 0;
-
        char *videosink_name = NULL;
+       GstElement *vs_element = NULL;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
+       }
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
+       }
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
+
+       /* Get videosink name */
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       zoom = value->value.i_val;
+       if (!strcmp(videosink_name, "xvimagesink")) {
+               vs_element = sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst;
+
+               MMCAMCORDER_G_OBJECT_SET(vs_element, "zoom", zoom + 1);
+               _mmcam_dbg_log("Set display zoom to %d", zoom + 1);
+
                return TRUE;
-       current_state = _mmcamcorder_get_state( handle);
+       } else {
+               _mmcam_dbg_warn("videosink[%s] does not support scale", videosink_name);
+               return FALSE;
+       }
+}
 
-       if( current_state > MM_CAMCORDER_STATE_NULL )
-       {
-               if( hcamcorder->type != MM_CAMCORDER_MODE_AUDIO )
-               {
-                       if( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst )
-                       {
-                               // Get videosink name
-                               _mmcamcorder_conf_get_value_element_name( sc->VideosinkElement, &videosink_name );
-                       
-                               zoom = value->value.i_val;
 
-                               if( !strcmp( videosink_name, "xvimagesink" ))
-                               {
-                                       //xvimagesink
-                                       switch (zoom)
-                                       {
-                                               case MM_DISPLAY_SCALE_DEFAULT:
-                                               {
-                                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 1);
+bool _mmcamcorder_commit_display_evas_do_scaling(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       int do_scaling = 0;
+       char *videosink_name = NULL;
 
-                                                       _mmcam_dbg_log( "Set display zoom to default.");
-                                                       break;
-                                               }
-                                               case MM_DISPLAY_SCALE_DOUBLE_LENGTH:
-                                               {
-                                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 2);
+       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER( handle);
+       _MMCamcorderSubContext *sc = NULL;
 
-                                                       _mmcam_dbg_log( "Set display zoom to double.");
-                                                       break;
-                                               }
-                                               case MM_DISPLAY_SCALE_TRIPLE_LENGTH:
-                                               {
-                                                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "zoom", 3);
+       mmf_return_val_if_fail(handle, FALSE);
 
-                                                       _mmcam_dbg_log( "Set display zoom to triple.");
-                                                       break;
-                                               }
-                                               default:
-                                               {
-                                                       _mmcam_dbg_warn( "Unsupported value.");
-                                               }
-                                       }
-                                       
-                                       bret = TRUE;
-                               }
-                               else if (!strcmp( videosink_name, "avsysvideosink" ) )
-                               {
-                                       //avsysvideosink
-                                       bret = TRUE;
-                               }
-                               else
-                               {
-                                       _mmcam_dbg_warn( "videosink[%s] does not support 'zoom'.", videosink_name );
-                                       bret = FALSE;
-                               }
-                       }
-                       else
-                       {
-                               _mmcam_dbg_warn( "Videosink element is null, but current state is [%d]", current_state );
-                               bret = FALSE;
-                       }
-               }
-               else
-               {
-                       _mmcam_dbg_warn( "Current Mode is AUDIO only mode." );
-                       bret = FALSE;
-               }                               
+       /* check type */
+       if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
+               _mmcam_dbg_err("invalid mode %d", hcamcorder->type);
+               return FALSE;
        }
-       else
-       {
-               _mmcam_dbg_log("It doesn't need to change dynamically.(state=%d)", current_state);
-               bret = TRUE;
+
+       /* check current state */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("NOT initialized. this will be applied later");
+               return TRUE;
        }
 
-       return bret;
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+
+       do_scaling = value->value.i_val;
+
+       /* Get videosink name */
+       _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+       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));
+               return TRUE;
+       } else {
+               _mmcam_dbg_warn("videosink[%s] does not support scale", videosink_name);
+               return FALSE;
+       }
 }
 
 
 bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       bool                            bret            = FALSE;
-       _MMCamcorderSubContext* sc              = NULL;
-       int                                     strobe_type, mslVal, newVal, cur_value;
-       int                             current_state = MM_CAMCORDER_STATE_NONE;
+       bool bret = FALSE;
+       _MMCamcorderSubContext *sc = NULL;
+       int strobe_type, mslVal, newVal, cur_value;
+       int current_state = MM_CAMCORDER_STATE_NONE;
 
-       sc              = MMF_CAMCORDER_SUBCONTEXT( handle );
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        if (!sc)
                return TRUE;
 
@@ -3274,61 +3604,52 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va
 
        mslVal = value->value.i_val;
 
-       switch( attr_idx )
-       {
-               case MM_CAM_STROBE_CONTROL:
-                       strobe_type = GST_CAMERA_CONTROL_STROBE_CONTROL;
-                       newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_STROBE_CONTROL, mslVal);
-                       break;
-               case MM_CAM_STROBE_CAPABILITIES:
-                       strobe_type = GST_CAMERA_CONTROL_STROBE_CAPABILITIES;
-                       newVal = mslVal;
-                       break;
-               case MM_CAM_STROBE_MODE:
-                       strobe_type = GST_CAMERA_CONTROL_STROBE_MODE;
-                       newVal = _mmcamcorder_convert_msl_to_sensor( MM_CAM_STROBE_MODE, mslVal);
-                       break;
-               default:
-               {
-                       _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
-                       return FALSE;
+       switch (attr_idx) {
+       case MM_CAM_STROBE_CONTROL:
+               strobe_type = GST_CAMERA_CONTROL_STROBE_CONTROL;
+               newVal = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_STROBE_CONTROL, mslVal);
+               break;
+       case MM_CAM_STROBE_CAPABILITIES:
+               strobe_type = GST_CAMERA_CONTROL_STROBE_CAPABILITIES;
+               newVal = mslVal;
+               break;
+       case MM_CAM_STROBE_MODE:
+               /* check whether set or not */
+               if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+                       _mmcam_dbg_log("skip set value %d", mslVal);
+                       return TRUE;
                }
+
+               strobe_type = GST_CAMERA_CONTROL_STROBE_MODE;
+               newVal = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_STROBE_MODE, mslVal);
+               break;
+       default:
+               _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
+               return FALSE;
        }
 
        GstCameraControl *control = NULL;
-       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
-       {
+       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                _mmcam_dbg_err("Can't cast Video source into camera control.");
-               bret = FALSE; 
-       }
-       else
-       {
-               control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
+               bret = FALSE;
+       } else {
+               control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
-               if( gst_camera_control_get_strobe( control, strobe_type, &cur_value ) )
-               {
-                       if( newVal != cur_value )
-                       {
-                               if( gst_camera_control_set_strobe( control, strobe_type, newVal ) )
-                               {
-                                       _mmcam_dbg_log( "Succeed in setting strobe. Type[%d],value[%d]", strobe_type, mslVal );
+               if (gst_camera_control_get_strobe(control, strobe_type, &cur_value)) {
+                       if (newVal != cur_value) {
+                               if (gst_camera_control_set_strobe(control, strobe_type, newVal)) {
+                                       _mmcam_dbg_log("Succeed in setting strobe. Type[%d],value[%d]", strobe_type, mslVal);
                                        bret = TRUE;
-                               }
-                               else
-                               {       
-                                       _mmcam_dbg_warn( "Set strobe failed. Type[%d],value[%d]", strobe_type, mslVal );
+                               } else {
+                                       _mmcam_dbg_warn("Set strobe failed. Type[%d],value[%d]", strobe_type, mslVal);
                                        bret = FALSE;
                                }
-                       }
-                       else
-                       {       
-                               _mmcam_dbg_log( "No need to set strobe. Type[%d],value[%d]", strobe_type, mslVal );
+                       } else {
+                               _mmcam_dbg_log("No need to set strobe. Type[%d],value[%d]", strobe_type, mslVal);
                                bret = TRUE;
                        }
-               }
-               else
-               {
-                       _mmcam_dbg_warn( "Failed to get strobe. Type[%d]", strobe_type );
+               } else {
+                       _mmcam_dbg_warn("Failed to get strobe. Type[%d]", strobe_type);
                        bret = FALSE;
                }
        }
@@ -3337,90 +3658,145 @@ bool _mmcamcorder_commit_strobe (MMHandleType handle, int attr_idx, const mmf_va
 }
 
 
-bool _mmcamcorder_commit_detect (MMHandleType handle, int attr_idx, const mmf_value_t *value)
+bool _mmcamcorder_commit_camera_flip(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int ret = 0;
+       int current_state = MM_CAMCORDER_STATE_NONE;
+
+       if ((void *)handle == NULL) {
+               _mmcam_dbg_warn("handle is NULL");
+               return FALSE;
+       }
+
+       _mmcam_dbg_log("Commit : flip %d", value->value.i_val);
+
+       /* state check */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state > MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_err("Can not set camera FLIP horizontal at state %d", current_state);
+               return FALSE;
+       } else if (current_state < MM_CAMCORDER_STATE_READY) {
+               _mmcam_dbg_log("Pipeline is not created yet. This will be set when create pipeline.");
+               return TRUE;
+       }
+
+       ret = _mmcamcorder_set_videosrc_flip(handle, value->value.i_val);
+
+       _mmcam_dbg_log("ret %d", ret);
+
+       return ret;
+}
+
+
+bool _mmcamcorder_commit_camera_hdr_capture(MMHandleType handle, int attr_idx, const mmf_value_t *value)
+{
+       int current_state = MM_CAMCORDER_STATE_NONE;
+
+       if ((void *)handle == NULL) {
+               _mmcam_dbg_warn("handle is NULL");
+               return FALSE;
+       }
+
+       _mmcam_dbg_log("Commit : HDR Capture %d", value->value.i_val);
+
+       /* check whether set or not */
+       if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+               _mmcam_dbg_log("skip set value %d", value->value.i_val);
+               return TRUE;
+       }
+
+       /* state check */
+       current_state = _mmcamcorder_get_state(handle);
+       if (current_state > MM_CAMCORDER_STATE_PREPARE) {
+               _mmcam_dbg_err("can NOT set HDR capture at state %d", current_state);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+
+bool _mmcamcorder_commit_detect(MMHandleType handle, int attr_idx, const mmf_value_t *value)
 {
-       bool                            bret            = FALSE;
-       _MMCamcorderSubContext* sc              = NULL;
-       int                                     detect_type, mslVal, newVal, curVal;
+       bool bret = FALSE;
+       _MMCamcorderSubContext *sc = NULL;
+       int detect_type = GST_CAMERA_CONTROL_FACE_DETECT_MODE;
+       int set_value = 0;
+       int current_value = 0;
+       int current_state = MM_CAMCORDER_STATE_NONE;
        GstCameraControl *control = NULL;
-       int                             current_state = MM_CAMCORDER_STATE_NONE;
 
-       sc              = MMF_CAMCORDER_SUBCONTEXT( handle );
-       if (!sc)
+       if ((void *)handle == NULL) {
+               _mmcam_dbg_warn("handle is NULL");
+               return FALSE;
+       }
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       if (!sc) {
                return TRUE;
+       }
 
-       _mmcam_dbg_log( "Commit : detect attribute(%d)", attr_idx);
+       _mmcam_dbg_log("Commit : detect attribute(%d)", attr_idx);
 
-       //status check
+       /* state check */
        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);
                return TRUE;
        }
-       
-       switch( attr_idx )
-       {
-               case MM_CAM_DETECT_MODE:
-                       detect_type = GST_CAMERA_CONTROL_FACE_DETECT_MODE;
-                       break;
-               case MM_CAM_DETECT_NUMBER:
-                       detect_type = GST_CAMERA_CONTROL_FACE_DETECT_NUMBER;
-                       break;
-               case MM_CAM_DETECT_FOCUS_SELECT:
-                       detect_type = GST_CAMERA_CONTROL_FACE_FOCUS_SELECT;
-                       break;
-               case MM_CAM_DETECT_SELECT_NUMBER:
-                       detect_type = GST_CAMERA_CONTROL_FACE_SELECT_NUMBER;
-                       break;
-               case MM_CAM_DETECT_STATUS:
-                       detect_type = GST_CAMERA_CONTROL_FACE_DETECT_STATUS;
-                       break;
-               default:
-               {
-                       _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
-                       bret = FALSE;
-                       return bret;
+
+       set_value = value->value.i_val;
+
+       switch (attr_idx) {
+       case MM_CAM_DETECT_MODE:
+               /* check whether set or not */
+               if (!_mmcamcorder_check_supported_attribute(handle, attr_idx)) {
+                       _mmcam_dbg_log("skip set value %d", set_value);
+                       return TRUE;
                }
-       }
 
-       mslVal = value->value.i_val;
-       newVal = _mmcamcorder_convert_msl_to_sensor( attr_idx, mslVal );
-       
+               detect_type = GST_CAMERA_CONTROL_FACE_DETECT_MODE;
+               break;
+       case MM_CAM_DETECT_NUMBER:
+               detect_type = GST_CAMERA_CONTROL_FACE_DETECT_NUMBER;
+               break;
+       case MM_CAM_DETECT_FOCUS_SELECT:
+               detect_type = GST_CAMERA_CONTROL_FACE_FOCUS_SELECT;
+               break;
+       case MM_CAM_DETECT_SELECT_NUMBER:
+               detect_type = GST_CAMERA_CONTROL_FACE_SELECT_NUMBER;
+               break;
+       case MM_CAM_DETECT_STATUS:
+               detect_type = GST_CAMERA_CONTROL_FACE_DETECT_STATUS;
+               break;
+       default:
+               _mmcam_dbg_err("Commit : strobe attribute(attr_idx(%d) is out of range)", attr_idx);
+               return FALSE;
+       }
 
-       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst))
-       {
+       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                _mmcam_dbg_err("Can't cast Video source into camera control.");
                bret = FALSE;
-       }
-       else
-       {
-               control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
+       } else {
+               control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
-               if( gst_camera_control_get_detect( control, detect_type, &curVal ) )
-               {
-                       if( curVal == newVal )
-                       {
-                               _mmcam_dbg_log( "No need to set detect. Type[%d],value[%d]", detect_type, mslVal );
+               if (gst_camera_control_get_detect(control, detect_type, &current_value)) {
+                       if (current_value == set_value) {
+                               _mmcam_dbg_log("No need to set detect(same). Type[%d],value[%d]", detect_type, set_value);
                                bret = TRUE;
-                       }
-                       else
-                       {
-                               if( !gst_camera_control_set_detect( control, detect_type, newVal ) )
-                               {
-                                       _mmcam_dbg_warn( "Set detect failed. Type[%d],value[%d]", detect_type, mslVal );
+                       } else {
+                               if (!gst_camera_control_set_detect(control, detect_type, set_value)) {
+                                       _mmcam_dbg_warn("Set detect failed. Type[%d],value[%d]",
+                                                       detect_type, set_value);
                                        bret = FALSE;
-                               }
-                               else
-                               {       
-                                       _mmcam_dbg_log( "Set detect success. Type[%d],value[%d]", detect_type, mslVal );
+                               } else {
+                                       _mmcam_dbg_log("Set detect success. Type[%d],value[%d]",
+                                                      detect_type, set_value);
                                        bret = TRUE;
                                }
                        }
-               }
-               else
-               {
-                       _mmcam_dbg_warn( "Get detect failed. Type[%d]", detect_type );
+               } else {
+                       _mmcam_dbg_warn("Get detect failed. Type[%d]", detect_type);
                        bret = FALSE;
                }
        }
@@ -3475,29 +3851,12 @@ _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
        int attr_idxs_default[] = {
                MM_CAM_CAMERA_DIGITAL_ZOOM
                , MM_CAM_CAMERA_OPTICAL_ZOOM
-               , MM_CAM_CAMERA_FOCUS_MODE
-               , MM_CAM_CAMERA_AF_SCAN_RANGE
-               , MM_CAM_CAMERA_EXPOSURE_MODE
-               , MM_CAM_CAMERA_EXPOSURE_VALUE
-               , MM_CAM_CAMERA_F_NUMBER
-               , MM_CAM_CAMERA_SHUTTER_SPEED
                , MM_CAM_CAMERA_WDR
-               , MM_CAM_CAMERA_ANTI_HANDSHAKE
-               , MM_CAM_CAMERA_FPS_AUTO
                , MM_CAM_CAMERA_HOLD_AF_AFTER_CAPTURING
                , MM_CAM_FILTER_CONTRAST
-               , MM_CAM_FILTER_COLOR_TONE
                , MM_CAM_FILTER_HUE
-               , MM_CAM_STROBE_CONTROL
                , MM_CAM_STROBE_MODE
                , MM_CAM_DETECT_MODE
-               , MM_CAM_DETECT_NUMBER
-               , MM_CAM_DETECT_FOCUS_SELECT
-               , MM_CAM_DETECT_SELECT_NUMBER
-               , MM_CAM_CAMERA_AF_TOUCH_X
-               , MM_CAM_CAMERA_AF_TOUCH_Y
-               , MM_CAM_CAMERA_AF_TOUCH_WIDTH
-               , MM_CAM_CAMERA_AF_TOUCH_HEIGHT
        };
 
        int attr_idxs_extra[] = {
@@ -3506,6 +3865,8 @@ _mmcamcorder_set_attribute_to_camsensor(MMHandleType handle)
                , MM_CAM_FILTER_WB
                , MM_CAM_FILTER_SATURATION
                , MM_CAM_FILTER_SHARPNESS
+               , MM_CAM_FILTER_COLOR_TONE
+               , MM_CAM_CAMERA_EXPOSURE_MODE
        };
 
        mmf_return_val_if_fail(hcamcorder, FALSE);
@@ -3605,10 +3966,10 @@ int _mmcamcorder_set_disabled_attributes(MMHandleType handle)
        _mmcam_dbg_log("");
 
        /* add gst_param */
-       _mmcamcorder_conf_get_value_string_array( hcamcorder->conf_main,
-               CONFIGURE_CATEGORY_MAIN_GENERAL, 
-               "DisabledAttributes", 
-               &disabled_attr );
+       _mmcamcorder_conf_get_value_string_array(hcamcorder->conf_main,
+                                                CONFIGURE_CATEGORY_MAIN_GENERAL,
+                                                "DisabledAttributes",
+                                                &disabled_attr);
        if (disabled_attr != NULL && disabled_attr->value) {
                cnt_str = disabled_attr->count;
                for (i = 0; i < cnt_str; i++) {
@@ -3639,7 +4000,7 @@ static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width,
        mmf_return_val_if_fail(hcamcorder, FALSE);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info, TRUE);
+       mmf_return_val_if_fail(sc, TRUE);
 
        current_state = _mmcamcorder_get_state(handle);
 
@@ -3662,44 +4023,38 @@ static bool __mmcamcorder_set_capture_resolution(MMHandleType handle, int width,
 
 static bool __mmcamcorder_set_camera_resolution(MMHandleType handle, int width, int height)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
-       int fps, slow_fps;
+       int fps = 0;
+       double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
        GstCaps *caps = NULL;
-       int set_width, set_height;
-       
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       if (!sc)
-               return TRUE;
+       mmf_return_val_if_fail(sc, TRUE);
 
-       mm_camcorder_get_attributes(handle, NULL, 
-                                                               MMCAM_CAMERA_FPS, &fps,
-                                                               "camera-slow-motion-fps", &slow_fps,
-                                                               NULL);
+       mm_camcorder_get_attributes(handle, NULL,
+                                   MMCAM_CAMERA_FPS, &fps,
+                                   MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
+                                   NULL);
 
-       if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
-               if(slow_fps > 0) {
-                       sc->is_slow = TRUE;
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               if(motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps);
                } else {
-                       sc->is_slow = FALSE;
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", 0);
                }
-       } else {
-               sc->is_slow = FALSE;
        }
 
-       set_width = width;
-       set_height = height;
-
-       caps = gst_caps_new_simple(     "video/x-raw-yuv",
-                                                               "format", GST_TYPE_FOURCC, sc->fourcc,
-                                                               "width", G_TYPE_INT, set_width,
-                                                               "height", G_TYPE_INT, set_height,
-                                                               "framerate", GST_TYPE_FRACTION, (sc->is_slow ? slow_fps : fps), 1,
-                                                               NULL
-                                                               );
-       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
+       caps = gst_caps_new_simple("video/x-raw-yuv",
+                                  "format", GST_TYPE_FOURCC, sc->fourcc,
+                                  "width", G_TYPE_INT, width,
+                                  "height", G_TYPE_INT, height,
+                                  "framerate", GST_TYPE_FRACTION, fps, 1,
+                                  NULL);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
        gst_caps_unref(caps);
 
        return TRUE;
@@ -3803,14 +4158,6 @@ __mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const
                                va_arg ((var_args), void*); /* data */
                                va_arg ((var_args), int);   /* size */
                                break;
-                       case MM_ATTRS_TYPE_ARRAY:
-                               va_arg ((var_args), void*); /* array */
-                               va_arg ((var_args), int);   /* length */
-                               break;
-                       case MM_ATTRS_TYPE_RANGE:
-                               va_arg ((var_args), int);   /* min */
-                               va_arg ((var_args), int);   /* max */
-                               break;
                        case MM_ATTRS_TYPE_INVALID:
                        default:
                                _mmcam_dbg_err( "Not supported attribute type(%d, name:%s)", attr_type, name);
@@ -3873,6 +4220,11 @@ __mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const
 
                                return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
                        }
+
+                       if (err_name) {
+                               free(err_name);
+                               err_name = NULL;
+                       }
                }
        }
 
@@ -3880,3 +4232,50 @@ __mmcamcorder_check_valid_pair( MMHandleType handle, char **err_attr_name, const
 
        return MM_ERROR_NONE;
 }
+
+
+bool _mmcamcorder_check_supported_attribute(MMHandleType handle, int attr_index)
+{
+       MMAttrsInfo info;
+
+       if ((void *)handle == NULL) {
+               _mmcam_dbg_warn("handle %p is NULL", handle);
+               return FALSE;
+       }
+
+       memset(&info, 0x0, sizeof(MMAttrsInfo));
+
+       mm_attrs_get_info(MMF_CAMCORDER_ATTRS(handle), attr_index, &info);
+
+       switch (info.validity_type) {
+       case MM_ATTRS_VALID_TYPE_INT_ARRAY:
+               _mmcam_dbg_log("int array count %d", info.int_array.count)
+               if (info.int_array.count <= 1) {
+                       return FALSE;
+               }
+               break;
+       case MM_ATTRS_VALID_TYPE_INT_RANGE:
+               _mmcam_dbg_log("int range min %d, max %d",info.int_range.min, info.int_range.max);
+               if (info.int_range.min >= info.int_range.max) {
+                       return FALSE;
+               }
+               break;
+       case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
+               _mmcam_dbg_log("double array count %d", info.double_array.count)
+               if (info.double_array.count <= 1) {
+                       return FALSE;
+               }
+               break;
+       case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
+               _mmcam_dbg_log("double range min %lf, max %lf",info.int_range.min, info.int_range.max);
+               if (info.double_range.min >= info.double_range.max) {
+                       return FALSE;
+               }
+               break;
+       default:
+               _mmcam_dbg_warn("invalid type %d", info.validity_type);
+               return FALSE;
+       }
+
+       return TRUE;
+}
index b810fe7..754a72e 100644 (file)
@@ -57,7 +57,6 @@ static void __mmcamcorder_audiorec_pad_added_cb(GstElement *element, GstPad *pad
 |    GLOBAL FUNCTION DEFINITIONS:                                                      |
 ---------------------------------------------------------------------------------------*/
 
-
 static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
 {
        int err = MM_ERROR_NONE;
@@ -80,9 +79,9 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
 
        mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        mmf_return_val_if_fail(sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       mmf_return_val_if_fail(sc->info, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc->info_audio, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       info = (_MMCamcorderAudioInfo *)sc->info;
+       info = (_MMCamcorderAudioInfo *)sc->info_audio;
        
        _mmcam_dbg_log("");
 
@@ -117,7 +116,7 @@ static int __mmcamcorder_create_audiop_with_encodebin(MMHandleType handle)
        if (info->bMuxing) {
                /* Muxing. can use encodebin. */
                __ta__("        _mmcamcorder_create_encodesink_bin",
-               err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder);
+               err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder, MM_CAMCORDER_ENCBIN_PROFILE_AUDIO);
                );
                if (err != MM_ERROR_NONE ) {
                        return err;
@@ -294,16 +293,16 @@ _mmcamcorder_create_audio_pipeline(MMHandleType handle)
 void
 _mmcamcorder_destroy_audio_pipeline(MMHandleType handle)
 {
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
-       _MMCamcorderAudioInfoinfo = NULL;
+       _MMCamcorderAudioInfo *info = NULL;
        mmf_return_if_fail(hcamcorder);
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
-       mmf_return_if_fail(sc);
+       mmf_return_if_fail(sc && sc->info_audio);
        mmf_return_if_fail(sc->element);
 
-       info = sc->info;
+       info = sc->info_audio;
        
        _mmcam_dbg_log("");
 
@@ -373,27 +372,29 @@ int
 _mmcamcorder_audio_command(MMHandleType handle, int command)
 {
        int cmd = command;
-       GstElement *pipeline = NULL;
-       GstElement *audioSrc = NULL;
        int ret = MM_ERROR_NONE;
        int err = 0;
-       char *dir_name = NULL;  
        int size=0;
        guint64 free_space = 0;
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
-       _MMCamcorderSubContext *sc = NULL;
-       _MMCamcorderAudioInfo   *info   = NULL;
+       char *dir_name = NULL;
        char *err_attr_name = NULL;
-       
+
+       GstElement *pipeline = NULL;
+       GstElement *audioSrc = NULL;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+       _MMCamcorderAudioInfo *info = NULL;
+
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
        mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        mmf_return_val_if_fail(sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       mmf_return_val_if_fail(sc->info, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc->info_audio, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-       info = sc->info;
-       
+       info = sc->info_audio;
+
        _mmcam_dbg_log("");
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
@@ -404,6 +405,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                        //check status for resume case
                        if (_mmcamcorder_get_state((MMHandleType)hcamcorder) != MM_CAMCORDER_STATE_PAUSED) 
                        {
+                               guint imax_size = 0;
                                guint imax_time = 0;
                                char *temp_filename = NULL;
 
@@ -413,6 +415,7 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                                sc->pipeline_time = RESET_PAUSE_TIME;
 
                                ret = mm_camcorder_get_attributes(handle, &err_attr_name,
+                                                                 MMCAM_TARGET_MAX_SIZE, &imax_size,
                                                                  MMCAM_TARGET_TIME_LIMIT, &imax_time,
                                                                  MMCAM_FILE_FORMAT, &(info->fileformat),
                                                                  MMCAM_TARGET_FILENAME, &temp_filename, &size,
@@ -439,6 +442,13 @@ _mmcamcorder_audio_command(MMHandleType handle, int command)
                                sc->bget_eos = FALSE;
                                info->filesize =0;
 
+                               /* set max size */
+                               if (imax_size <= 0) {
+                                       info->max_size = 0; /* do not check */
+                               } else {
+                                       info->max_size = ((guint64)imax_size) << 10; /* to byte */
+                               }
+
                                /* set max time */
                                if (imax_time <= 0) {
                                        info->max_time = 0; /* do not check */
@@ -684,11 +694,11 @@ _mmcamcorder_audio_handle_eos(MMHandleType handle)
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
        mmf_return_val_if_fail(sc, FALSE);
-       mmf_return_val_if_fail(sc->info, FALSE);
+       mmf_return_val_if_fail(sc->info_audio, FALSE);
        
        _mmcam_dbg_err("");
 
-       info    = sc->info;
+       info = sc->info_audio;
 
        //changing pipeline for display
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
@@ -708,8 +718,8 @@ _mmcamcorder_audio_handle_eos(MMHandleType handle)
 //     )       
 
        //Send message  
-       //Send recording report to application                          
-       msg.id = MM_MESSAGE_CAMCORDER_CAPTURED;
+       //Send recording report to application
+       msg.id = MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED;
 
        report = (MMCamRecordingReport*) malloc(sizeof(MMCamRecordingReport));  //who free this?
        if (!report)
@@ -911,6 +921,7 @@ static gboolean __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstBuffer *buf
        guint64 buffer_size = 0;
        guint64 trailer_size = 0;
        char *filename = NULL;
+       unsigned long long remained_time = 0;
 
        _MMCamcorderSubContext *sc = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
@@ -921,8 +932,8 @@ static gboolean __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstBuffer *buf
        mmf_return_val_if_fail(buffer, FALSE);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc && sc->info, FALSE);
-       info = sc->info;
+       mmf_return_val_if_fail(sc && sc->info_audio, FALSE);
+       info = sc->info_audio;
 
        if (sc->isMaxtimePausing || sc->isMaxsizePausing) {
                _mmcam_dbg_warn("isMaxtimePausing[%d],isMaxsizePausing[%d]",
@@ -949,7 +960,9 @@ static gboolean __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstBuffer *buf
        }
 
        /* get trailer size */
-       if (info->fileformat == MM_FILE_FORMAT_3GP || info->fileformat == MM_FILE_FORMAT_MP4) {
+       if (info->fileformat == MM_FILE_FORMAT_3GP ||
+           info->fileformat == MM_FILE_FORMAT_MP4 ||
+           info->fileformat == MM_FILE_FORMAT_AAC) {
                MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_MUX].gst, "expected-trailer-size", &trailer_size);
                /*_mmcam_dbg_log("trailer_size %d", trailer_size);*/
        } else {
@@ -1014,6 +1027,48 @@ static gboolean __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstBuffer *buf
 
        rec_pipe_time = GST_TIME_AS_MSECONDS(GST_BUFFER_TIMESTAMP(buffer));
 
+       /* calculate remained time can be recorded */
+       if (info->max_time > 0 && info->max_time < (remained_time + rec_pipe_time)) {
+               remained_time = info->max_time - rec_pipe_time;
+       } else if (info->max_size > 0) {
+               long double max_size = (long double)info->max_size;
+               long double current_size = (long double)(info->filesize + buffer_size + trailer_size);
+
+               remained_time = (unsigned long long)((long double)rec_pipe_time * (max_size/current_size)) - rec_pipe_time;
+       }
+
+       /*_mmcam_dbg_log("remained time : %u", remained_time);*/
+
+       /* check max size of recorded file */
+       if (info->max_size > 0 &&
+           info->max_size < info->filesize + buffer_size + trailer_size + _MMCAMCORDER_MMS_MARGIN_SPACE) {
+               _mmcam_dbg_warn("Max size!!! Recording is paused.");
+               _mmcam_dbg_warn("Max [%" G_GUINT64_FORMAT "], file [%" G_GUINT64_FORMAT "], trailer : [%" G_GUINT64_FORMAT "]", \
+                               info->max_size, info->filesize, trailer_size);
+
+               /* just same as pause status. After blocking two queue, this function will not call again. */
+               if (info->bMuxing) {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
+               } else {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AQUE].gst, "empty-buffers", TRUE);
+               }
+
+               msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
+               msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+               msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+               msg.param.recording_status.remained_time = 0;
+               _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+
+               _mmcam_dbg_log("Last filesize sent by message : %d", info->filesize + trailer_size);
+
+               sc->isMaxsizePausing = TRUE;
+               msg.id = MM_MESSAGE_CAMCORDER_MAX_SIZE;
+               _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+
+               /* skip this buffer */
+               return FALSE;
+       }
+
        /* check recording time limit and send recording status message */
        if (info->max_time > 0 && rec_pipe_time > info->max_time) {
                _mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \
@@ -1038,8 +1093,9 @@ static gboolean __mmcamcorder_audio_dataprobe_record(GstPad *pad, GstBuffer *buf
                info->filesize += buffer_size;
 
                msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
-               msg.param.recording_status.elapsed = (unsigned int)rec_pipe_time;
-               msg.param.recording_status.filesize = (unsigned int)((info->filesize + trailer_size) >> 10);
+               msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+               msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+               msg.param.recording_status.remained_time = remained_time;
                _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
 
                return TRUE;
index ae4e205..ac05b02 100644 (file)
  *
  */
 
-/*===========================================================================================
-|                                                                                                                                                                                      |
-|  INCLUDE FILES                                                                                                                                                       |
-|                                                                                                                                                                                      |
-========================================================================================== */
+/*=======================================================================================
+|  INCLUDE FILES                                                                       |
+=======================================================================================*/
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_configure.h"
 
-/*---------------------------------------------------------------------------
-|    MACRO DEFINITIONS:                                                                                                                |
----------------------------------------------------------------------------*/
-#define CONFIGURE_PATH          "/opt/etc"
-#define CONFIGURE_PATH_RETRY    "/usr/etc"
+/*-----------------------------------------------------------------------
+|    MACRO DEFINITIONS:                                                        |
+-----------------------------------------------------------------------*/
+#define CONFIGURE_PATH          "/usr/etc"
+#define CONFIGURE_PATH_RETRY    "/opt/etc"
 
-/*---------------------------------------------------------------------------
-|    GLOBAL VARIABLE DEFINITIONS                                                                                       |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    GLOBAL VARIABLE DEFINITIONS                                       |
+-----------------------------------------------------------------------*/
 
-/*---------------------------------------------------------------------------
-|    LOCAL VARIABLE DEFINITIONS                                                                                                |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL VARIABLE DEFINITIONS                                                |
+-----------------------------------------------------------------------*/
 static int conf_main_category_size[CONFIGURE_CATEGORY_MAIN_NUM] = { 0, };
 static int conf_ctrl_category_size[CONFIGURE_CATEGORY_CTRL_NUM] = { 0, };
 
@@ -668,9 +666,9 @@ static type_element _matroska_element_default = {
  */
 static conf_info_table conf_main_general_table[] = {
        { "SyncStateChange", CONFIGURE_VALUE_INT,           {1} },
-       { "GSTInitOption",   CONFIGURE_VALUE_STRING_ARRAY,  {NULL} },
-       { "ModelName",       CONFIGURE_VALUE_STRING,        {(char*)"Samsung Camera"} },
-       { "DisabledAttributes", CONFIGURE_VALUE_STRING_ARRAY,  {NULL} },
+       { "GSTInitOption",   CONFIGURE_VALUE_STRING_ARRAY,  {(int)NULL} },
+       { "ModelName",       CONFIGURE_VALUE_STRING,        {(int)"Samsung Camera"} },
+       { "DisabledAttributes", CONFIGURE_VALUE_STRING_ARRAY,  {(int)NULL} },
 };
 
 /*
@@ -678,34 +676,36 @@ static conf_info_table conf_main_general_table[] = {
  */
 static conf_info_table conf_main_video_input_table[] = {
        { "UseConfCtrl",        CONFIGURE_VALUE_INT,            {1} },
-       { "ConfCtrlFile0",      CONFIGURE_VALUE_STRING,         {(char*)"mmfw_camcorder_dev_video_pri.ini"} },
-       { "ConfCtrlFile1",      CONFIGURE_VALUE_STRING,         {(char*)"mmfw_camcorder_dev_video_sec.ini"} },
-       { "VideosrcElement",    CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_videosrc_element_default} },
+       { "ConfCtrlFile0",      CONFIGURE_VALUE_STRING,         {(int)"mmfw_camcorder_dev_video_pri.ini"} },
+       { "ConfCtrlFile1",      CONFIGURE_VALUE_STRING,         {(int)"mmfw_camcorder_dev_video_sec.ini"} },
+       { "VideosrcElement",    CONFIGURE_VALUE_ELEMENT,        {(int)&_videosrc_element_default} },
        { "UseVideoscale",      CONFIGURE_VALUE_INT,            {0} },
-       { "VideoscaleElement",  CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_videoscale_element_default} },
+       { "VideoscaleElement",  CONFIGURE_VALUE_ELEMENT,        {(int)&_videoscale_element_default} },
        { "UseZeroCopyFormat",  CONFIGURE_VALUE_INT,            {0} },
+       { "DeviceCount",        CONFIGURE_VALUE_INT,            {MM_VIDEO_DEVICE_NUM} },
 };
 
 /*
  * [AudioInput] matching table
  */
 static conf_info_table conf_main_audio_input_table[] = {
-       { "AudiosrcElement",    CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_audiosrc_element_default} },
-       { "AudiomodemsrcElement",       CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_audiomodemsrc_element_default} },
+       { "AudiosrcElement",      CONFIGURE_VALUE_ELEMENT, {(int)&_audiosrc_element_default} },
+       { "AudiomodemsrcElement", CONFIGURE_VALUE_ELEMENT, {(int)&_audiomodemsrc_element_default} },
 };
 
 /*
  * [VideoOutput] matching table
  */
 static conf_info_table conf_main_video_output_table[] = {
-       { "DisplayDevice",         CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "Videosink",             CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "VideosinkElementX",     CONFIGURE_VALUE_ELEMENT,   {(type_element*)&_videosink_element_x_default} },
-       { "VideosinkElementEvas",  CONFIGURE_VALUE_ELEMENT,   {(type_element*)&_videosink_element_evas_default} },
-       { "VideosinkElementGL",    CONFIGURE_VALUE_ELEMENT,   {(type_element*)&_videosink_element_gl_default} },
-       { "VideosinkElementNull",  CONFIGURE_VALUE_ELEMENT,   {(type_element*)&_videosink_element_null_default} },
+       { "DisplayDevice",         CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "DisplayMode",           CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "Videosink",             CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "VideosinkElementX",     CONFIGURE_VALUE_ELEMENT,   {(int)&_videosink_element_x_default} },
+       { "VideosinkElementEvas",  CONFIGURE_VALUE_ELEMENT,   {(int)&_videosink_element_evas_default} },
+       { "VideosinkElementGL",    CONFIGURE_VALUE_ELEMENT,   {(int)&_videosink_element_gl_default} },
+       { "VideosinkElementNull",  CONFIGURE_VALUE_ELEMENT,   {(int)&_videosink_element_null_default} },
        { "UseVideoscale",         CONFIGURE_VALUE_INT,       {0} },
-       { "VideoscaleElement",     CONFIGURE_VALUE_ELEMENT,   {(type_element*)&_videoscale_element_default} },
+       { "VideoscaleElement",     CONFIGURE_VALUE_ELEMENT,   {(int)&_videoscale_element_default} },
 };
 
 /*
@@ -714,15 +714,16 @@ static conf_info_table conf_main_video_output_table[] = {
 static conf_info_table conf_main_capture_table[] = {
        { "UseEncodebin",           CONFIGURE_VALUE_INT,     {0} },
        { "UseCaptureMode",         CONFIGURE_VALUE_INT,     {0} },
-       { "VideoscaleElement",      CONFIGURE_VALUE_ELEMENT, {(type_element*)&_videoscale_element_default} },
+       { "VideoscaleElement",      CONFIGURE_VALUE_ELEMENT, {(int)&_videoscale_element_default} },
+       { "PlayCaptureSound",       CONFIGURE_VALUE_INT,     {1} },
 };
 
 /*
  * [Record] matching table
  */
 static conf_info_table conf_main_record_table[] = {
-       { "UseAudioEncoderQueue",   CONFIGURE_VALUE_INT,     {1} },     
-       { "UseVideoEncoderQueue",   CONFIGURE_VALUE_INT,     {1} },     
+       { "UseAudioEncoderQueue",   CONFIGURE_VALUE_INT,     {1} },
+       { "UseVideoEncoderQueue",   CONFIGURE_VALUE_INT,     {1} },
        { "VideoProfile",           CONFIGURE_VALUE_INT,     {0} },
        { "VideoAutoAudioConvert",  CONFIGURE_VALUE_INT,     {0} },
        { "VideoAutoAudioResample", CONFIGURE_VALUE_INT,     {0} },
@@ -735,7 +736,7 @@ static conf_info_table conf_main_record_table[] = {
        { "ImageAutoAudioConvert",  CONFIGURE_VALUE_INT,     {0} },
        { "ImageAutoAudioResample", CONFIGURE_VALUE_INT,     {0} },
        { "ImageAutoColorSpace",    CONFIGURE_VALUE_INT,     {0} },
-       { "RecordsinkElement",      CONFIGURE_VALUE_ELEMENT, {(type_element*)&_recordsink_element_default} },
+       { "RecordsinkElement",      CONFIGURE_VALUE_ELEMENT, {(int)&_recordsink_element_default} },
        { "UseNoiseSuppressor",     CONFIGURE_VALUE_INT,     {0} },
        { "DropVideoFrame",         CONFIGURE_VALUE_INT,     {0} },
        { "PassFirstVideoFrame",    CONFIGURE_VALUE_INT,     {0} },
@@ -745,65 +746,65 @@ static conf_info_table conf_main_record_table[] = {
  * [VideoEncoder] matching table
  */
 static conf_info_table conf_main_video_encoder_table[] = {
-       { "H263",                               CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_h263_element_default} },
-       { "H264",                               CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_h264_element_default} },
-       { "H26L",                               CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_h26l_element_default} },
-       { "MPEG4",                              CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_mpeg4_element_default} },
-       { "MPEG1",                              CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_mpeg1_element_default} },
-       { "THEORA",                             CONFIGURE_VALUE_ELEMENT,        {(type_element*)&_theora_element_default} },
+       { "H263",    CONFIGURE_VALUE_ELEMENT, {(int)&_h263_element_default} },
+       { "H264",    CONFIGURE_VALUE_ELEMENT, {(int)&_h264_element_default} },
+       { "H26L",    CONFIGURE_VALUE_ELEMENT, {(int)&_h26l_element_default} },
+       { "MPEG4",   CONFIGURE_VALUE_ELEMENT, {(int)&_mpeg4_element_default} },
+       { "MPEG1",   CONFIGURE_VALUE_ELEMENT, {(int)&_mpeg1_element_default} },
+       { "THEORA",  CONFIGURE_VALUE_ELEMENT, {(int)&_theora_element_default} },
 };
 
 /*
  * [AudioEncoder] matching table
  */
 static conf_info_table conf_main_audio_encoder_table[] = {
-       { "AMR",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_amr_element_default} },
-       { "G723_1",                             CONFIGURE_VALUE_ELEMENT, {(type_element*)&_g723_1_element_default} },
-       { "MP3",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mp3_element_default} },
-       { "AAC",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_aac_element_default} },
-       { "MMF",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mmf_element_default} },
-       { "ADPCM",                              CONFIGURE_VALUE_ELEMENT, {(type_element*)&_adpcm_element_default} },
-       { "WAVE",                               CONFIGURE_VALUE_ELEMENT, {(type_element*)&_wave_element_default} },
-       { "MIDI",                               CONFIGURE_VALUE_ELEMENT, {(type_element*)&_midi_element_default} },
-       { "IMELODY",                    CONFIGURE_VALUE_ELEMENT, {(type_element*)&_imelody_element_default} },
-       { "VORBIS",                     CONFIGURE_VALUE_ELEMENT, {(type_element*)&_vorbis_element_default} },
+       { "AMR",     CONFIGURE_VALUE_ELEMENT, {(int)&_amr_element_default} },
+       { "G723_1",  CONFIGURE_VALUE_ELEMENT, {(int)&_g723_1_element_default} },
+       { "MP3",     CONFIGURE_VALUE_ELEMENT, {(int)&_mp3_element_default} },
+       { "AAC",     CONFIGURE_VALUE_ELEMENT, {(int)&_aac_element_default} },
+       { "MMF",     CONFIGURE_VALUE_ELEMENT, {(int)&_mmf_element_default} },
+       { "ADPCM",   CONFIGURE_VALUE_ELEMENT, {(int)&_adpcm_element_default} },
+       { "WAVE",    CONFIGURE_VALUE_ELEMENT, {(int)&_wave_element_default} },
+       { "MIDI",    CONFIGURE_VALUE_ELEMENT, {(int)&_midi_element_default} },
+       { "IMELODY", CONFIGURE_VALUE_ELEMENT, {(int)&_imelody_element_default} },
+       { "VORBIS",  CONFIGURE_VALUE_ELEMENT, {(int)&_vorbis_element_default} },
 };
 
 /*
  * [ImageEncoder] matching table
  */
 static conf_info_table conf_main_image_encoder_table[] = {
-       { "JPEG",                               CONFIGURE_VALUE_ELEMENT, {(type_element*)&_jpeg_element_default} },
-       { "PNG",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_png_element_default} },
-       { "BMP",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_bmp_element_default} },
-       { "WBMP",                               CONFIGURE_VALUE_ELEMENT, {(type_element*)&_wbmp_element_default} },
-       { "TIFF",                               CONFIGURE_VALUE_ELEMENT, {(type_element*)&_tiff_element_default} },
-       { "PCX",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_pcx_element_default} },
-       { "GIF",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_gif_element_default} },
-       { "ICO",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_ico_element_default} },
-       { "RAS",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_ras_element_default} },
-       { "TGA",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_tga_element_default} },
-       { "XBM",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_xbm_element_default} },
-       { "XPM",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_xpm_element_default} },
+       { "JPEG", CONFIGURE_VALUE_ELEMENT, {(int)&_jpeg_element_default} },
+       { "PNG",  CONFIGURE_VALUE_ELEMENT, {(int)&_png_element_default} },
+       { "BMP",  CONFIGURE_VALUE_ELEMENT, {(int)&_bmp_element_default} },
+       { "WBMP", CONFIGURE_VALUE_ELEMENT, {(int)&_wbmp_element_default} },
+       { "TIFF", CONFIGURE_VALUE_ELEMENT, {(int)&_tiff_element_default} },
+       { "PCX",  CONFIGURE_VALUE_ELEMENT, {(int)&_pcx_element_default} },
+       { "GIF",  CONFIGURE_VALUE_ELEMENT, {(int)&_gif_element_default} },
+       { "ICO",  CONFIGURE_VALUE_ELEMENT, {(int)&_ico_element_default} },
+       { "RAS",  CONFIGURE_VALUE_ELEMENT, {(int)&_ras_element_default} },
+       { "TGA",  CONFIGURE_VALUE_ELEMENT, {(int)&_tga_element_default} },
+       { "XBM",  CONFIGURE_VALUE_ELEMENT, {(int)&_xbm_element_default} },
+       { "XPM",  CONFIGURE_VALUE_ELEMENT, {(int)&_xpm_element_default} },
 };
 
 /*
  * [Mux] matching table
  */
 static conf_info_table conf_main_mux_table[] = {
-       { "3GP",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_3gp_element_default} },
-       { "AMR",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_amrmux_element_default} },
-       { "MP4",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mp4_element_default} },
-       { "AAC",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_aacmux_element_default} },
-       { "MP3",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mp3mux_element_default} },
-       { "OGG",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_ogg_element_default} },
-       { "WAV",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_wav_element_default} },
-       { "AVI",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_avi_element_default} },
-       { "WMA",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_wma_element_default} },
-       { "WMV",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_wmv_element_default} },
-       { "MID",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mid_element_default} },
-       { "MMF",                                CONFIGURE_VALUE_ELEMENT, {(type_element*)&_mmfmux_element_default} },
-       { "MATROSKA",                   CONFIGURE_VALUE_ELEMENT, {(type_element*)&_matroska_element_default} },
+       { "3GP",      CONFIGURE_VALUE_ELEMENT, {(int)&_3gp_element_default} },
+       { "AMR",      CONFIGURE_VALUE_ELEMENT, {(int)&_amrmux_element_default} },
+       { "MP4",      CONFIGURE_VALUE_ELEMENT, {(int)&_mp4_element_default} },
+       { "AAC",      CONFIGURE_VALUE_ELEMENT, {(int)&_aacmux_element_default} },
+       { "MP3",      CONFIGURE_VALUE_ELEMENT, {(int)&_mp3mux_element_default} },
+       { "OGG",      CONFIGURE_VALUE_ELEMENT, {(int)&_ogg_element_default} },
+       { "WAV",      CONFIGURE_VALUE_ELEMENT, {(int)&_wav_element_default} },
+       { "AVI",      CONFIGURE_VALUE_ELEMENT, {(int)&_avi_element_default} },
+       { "WMA",      CONFIGURE_VALUE_ELEMENT, {(int)&_wma_element_default} },
+       { "WMV",      CONFIGURE_VALUE_ELEMENT, {(int)&_wmv_element_default} },
+       { "MID",      CONFIGURE_VALUE_ELEMENT, {(int)&_mid_element_default} },
+       { "MMF",      CONFIGURE_VALUE_ELEMENT, {(int)&_mmfmux_element_default} },
+       { "MATROSKA", CONFIGURE_VALUE_ELEMENT, {(int)&_matroska_element_default} },
 };
 
 
@@ -815,79 +816,85 @@ static conf_info_table conf_main_mux_table[] = {
  * [Camera] matching table
  */
 static conf_info_table conf_ctrl_camera_table[] = {
-       { "InputIndex",        CONFIGURE_VALUE_INT_ARRAY,      {NULL} },
-       { "DeviceName",        CONFIGURE_VALUE_STRING,         {NULL} },
-       { "PreviewResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {NULL} },
-       { "CaptureResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {NULL} },
-       { "FPS",               CONFIGURE_VALUE_INT_ARRAY,      {NULL} },
-       { "PictureFormat",     CONFIGURE_VALUE_INT_ARRAY,      {NULL} },
-       { "Overlay",           CONFIGURE_VALUE_INT_RANGE,      {NULL} },
+       { "InputIndex",        CONFIGURE_VALUE_INT_ARRAY,      {(int)NULL} },
+       { "DeviceName",        CONFIGURE_VALUE_STRING,         {(int)NULL} },
+       { "PreviewResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {(int)NULL} },
+       { "CaptureResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {(int)NULL} },
+       { "FPS",               CONFIGURE_VALUE_INT_ARRAY,      {(int)NULL} },
+       { "PictureFormat",     CONFIGURE_VALUE_INT_ARRAY,      {(int)NULL} },
+       { "Overlay",           CONFIGURE_VALUE_INT_RANGE,      {(int)NULL} },
        { "RecommendDisplayRotation", CONFIGURE_VALUE_INT,     {3}    },
        { "RecommendPreviewFormatCapture", CONFIGURE_VALUE_INT, {MM_PIXEL_FORMAT_YUYV} },
        { "RecommendPreviewFormatRecord",  CONFIGURE_VALUE_INT, {MM_PIXEL_FORMAT_NV12} },
+       { "RecommendPreviewResolution", CONFIGURE_VALUE_INT_PAIR_ARRAY, {(int)NULL} },
+       { "FacingDirection", CONFIGURE_VALUE_INT, {MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR} },
 };
 
 /*
  * [Strobe] matching table
  */
 static conf_info_table conf_ctrl_strobe_table[] = {
-       { "StrobeControl",        CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "StrobeMode",           CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "StrobeEV",             CONFIGURE_VALUE_INT_RANGE, {NULL} },
+       { "StrobeControl",        CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "StrobeMode",           CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "StrobeEV",             CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
 };
 
 /*
  * [Effect] matching table
  */
 static conf_info_table conf_ctrl_effect_table[] = {
-       { "Brightness",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "Contrast",             CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "Saturation",           CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "Sharpness",            CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "WhiteBalance",         CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "ColorTone",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "Flip",                 CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "WDR",                  CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "PartColorMode",        CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "PartColor",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+       { "Brightness",           CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "Contrast",             CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "Saturation",           CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "Sharpness",            CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "WhiteBalance",         CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "ColorTone",            CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "Flip",                 CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "WDR",                  CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "PartColorMode",        CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "PartColor",            CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
 };
 
 /*
  * [Photograph] matching table
  */
 static conf_info_table conf_ctrl_photograph_table[] = {
-       { "LensInit",             CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "DigitalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "OpticalZoom",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "FocusMode",            CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "AFType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "AEType",               CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "ExposureValue",        CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "FNumber",              CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "ShutterSpeed",         CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "ISO",                  CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "ProgramMode",          CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "AntiHandshake",        CONFIGURE_VALUE_INT_ARRAY, {NULL} },
+       { "LensInit",             CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "DigitalZoom",          CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "OpticalZoom",          CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "FocusMode",            CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "AFType",               CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "AEType",               CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "ExposureValue",        CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "FNumber",              CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "ShutterSpeed",         CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "ISO",                  CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "ProgramMode",          CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "AntiHandshake",        CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "VideoStabilization",   CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "FaceZoomMode",         CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "FaceZoomLevel",        CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
 };
 
 /*
  * [Capture] matching table
  */
 static conf_info_table conf_ctrl_capture_table[] = {
-       { "OutputMode",           CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "JpegQuality",          CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "MultishotNumber",      CONFIGURE_VALUE_INT_RANGE, {NULL} },
+       { "OutputMode",           CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "JpegQuality",          CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "MultishotNumber",      CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
        { "SensorEncodedCapture", CONFIGURE_VALUE_INT,       {1} },
+       { "SupportHDR",           CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
 };
 
 /*
  * [Detect] matching table
  */
 static conf_info_table conf_ctrl_detect_table[] = {
-       { "DetectMode",         CONFIGURE_VALUE_INT_ARRAY, {NULL} },
-       { "DetectNumber",       CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "DetectSelect",       CONFIGURE_VALUE_INT_RANGE, {NULL} },
-       { "DetectSelectNumber", CONFIGURE_VALUE_INT_RANGE, {NULL} },
+       { "DetectMode",         CONFIGURE_VALUE_INT_ARRAY, {(int)NULL} },
+       { "DetectNumber",       CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "DetectSelect",       CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
+       { "DetectSelectNumber", CONFIGURE_VALUE_INT_RANGE, {(int)NULL} },
 };
 
 
@@ -898,16 +905,14 @@ get_new_string( char* src_string )
        return strdup(src_string);
 }
 
-void
-_mmcamcorder_conf_init( int type, camera_conf** configure_info )
+void _mmcamcorder_conf_init(int type, camera_conf** configure_info)
 {
        int i = 0;
-       int info_table_size = sizeof( conf_info_table );
-       
-       _mmcam_dbg_log( "Entered..." );
+       int info_table_size = sizeof(conf_info_table);
 
-       if( type == CONFIGURE_TYPE_MAIN )
-       {
+       _mmcam_dbg_log("Entered...");
+
+       if (type == CONFIGURE_TYPE_MAIN) {
                conf_main_info_table[CONFIGURE_CATEGORY_MAIN_GENERAL]       = conf_main_general_table;
                conf_main_info_table[CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT]   = conf_main_video_input_table;
                conf_main_info_table[CONFIGURE_CATEGORY_MAIN_AUDIO_INPUT]   = conf_main_audio_input_table;
@@ -932,13 +937,10 @@ _mmcamcorder_conf_init( int type, camera_conf** configure_info )
 
                (*configure_info)->info = (conf_info**)g_malloc0( sizeof( conf_info* ) * CONFIGURE_CATEGORY_MAIN_NUM );
 
-               for( i = 0 ; i < CONFIGURE_CATEGORY_MAIN_NUM ; i++ )
-               {
+               for (i = 0 ; i < CONFIGURE_CATEGORY_MAIN_NUM ; i++) {
                        (*configure_info)->info[i]      = NULL;
                }
-       }
-       else
-       {
+       } else {
                conf_ctrl_info_table[CONFIGURE_CATEGORY_CTRL_CAMERA]     = conf_ctrl_camera_table;
                conf_ctrl_info_table[CONFIGURE_CATEGORY_CTRL_STROBE]     = conf_ctrl_strobe_table;
                conf_ctrl_info_table[CONFIGURE_CATEGORY_CTRL_EFFECT]     = conf_ctrl_effect_table;
@@ -955,14 +957,14 @@ _mmcamcorder_conf_init( int type, camera_conf** configure_info )
 
                (*configure_info)->info = (conf_info**)g_malloc0( sizeof( conf_info* ) * CONFIGURE_CATEGORY_CTRL_NUM );
 
-               for( i = 0 ; i < CONFIGURE_CATEGORY_CTRL_NUM ; i++ )
-               {
-                       (*configure_info)->info[i]      = NULL;
+               for (i = 0 ; i < CONFIGURE_CATEGORY_CTRL_NUM ; i++) {
+                       (*configure_info)->info[i] = NULL;
                }
        }
-       
-       _mmcam_dbg_log( "Done." );
 
+       _mmcam_dbg_log("Done.");
+
+       return;
 }
 
 
@@ -1146,6 +1148,7 @@ _mmcamcorder_conf_parse_info( int type, FILE* fd, camera_conf** configure_info )
                        if( count_details == 0 )
                        {
                                _mmcam_dbg_warn( "category %s has no detail value... skip this category...", category_name );
+                               SAFE_FREE(category_name);
                                continue;
                        }
 
@@ -1244,10 +1247,7 @@ _mmcamcorder_conf_parse_info( int type, FILE* fd, camera_conf** configure_info )
                        }
                }
 
-               if( category_name )
-               {
-                       SAFE_FREE( category_name );
-               }
+               SAFE_FREE(category_name);
        }
 
        //(*configure_info) = new_conf;
@@ -2993,203 +2993,155 @@ _mmcamcorder_get_type_element(MMHandleType handle, int type)
 }
 
 
-int
-_mmcamcorder_get_audio_codec_format(MMHandleType handle, char * name)
+int _mmcamcorder_get_audio_codec_format(MMHandleType handle, char *name)
 {
-       int i = 0;
-       char* audio_fmt_type[] =        {
-               "AMR",              /**< AMR codec*/
-               "G723_1",           /**< G723.1 codec*/
-               "MP3",              /**< MP3 codec*/
-               "OGG",              /**< OGG codec*/
-               "AAC",              /**< AAC codec*/
-               "WMA",              /**< WMA codec*/
-               "MMF",              /**< MMF codec*/
-               "ADPCM",            /**< ADPCM codec */
-               "WAVE",             /**< WAVE codec */
-               "WAVE_NEW",         /**< WAVE codec */
-               "MIDI",             /**< MIDI codec */
-               "IMELODY",          /**< IMELODY codec */
-               "MXMF",             
-               "MPA",              /**< MPEG1-Layer1 codec */
-               "MP2",              /**< MPEG1-Layer2 codec */
-               "G711",             /**< G711 codec */
-               "G722",             /**< G722 wideband speech codec */
-               "G722_1",           /**< G722.1 codec */
-               "G722_2",           /**< G722.2  (AMR-WB) codec */
-               "G723",             /**< G723 wideband speech codec */
-               "G726",             /**< G726 (ADPCM) codec */
-               "G728",             /**< G728 speech codec */
-               "G729",             /**< G729 codec */
-               "G729A",            /**< G729a codec */
-               "G729_1",           /**< G729.1 codec */
-               "REAL",             /**< Real audio */
-               "AAC_LC",           /**< AAC-Low complexity codec */
-               "AAC_MAIN",         /**< AAC-Main profile codec */
-               "AAC_SRS",          /**< AAC-Scalable sample rate codec */
-               "AAC_LTP",          /**< AAC-Long term prediction codec */
-               "AAC_HE_V1",        /**< AAC-High Efficiency v1 codec */
-               "AAC_HE_V2",        /**< AAC-High efficiency v2 codec */
-               "AC3",              /**< DolbyDigital codec */
-               "ALAC",             /**< Apple Lossless audio codec */
-               "ATRAC",            /**< Sony audio codec */
-               "SPEEX",            /**< SPEEX audio codec */
-               "VORBIS",           /**< Vor*/
-               "AIFF",             /**< AIFF codec*/
-               "AU",               /**< AU codec*/
-               "NONE",             /**< None (will be deprecated) */
-               "PCM",              /**< PCM codec */
-               "ALAW",             /**< ALAW codec */
-               "MULAW",            /**< MULAW codec */
-               "MS_ADPCM"          /**< MS ADPCM codec */
-       };
-
-       for (i = 0; i < MM_AUDIO_CODEC_NUM; i++)
-       {
-               if (!strcmp(name, audio_fmt_type[i]))
-               {
-//                     _mmcam_dbg_log( "Audio codec[%d]", i);
-                       return i;
-               }
+       int codec_index = MM_AUDIO_CODEC_INVALID;
+
+       if (!name) {
+               _mmcam_dbg_err("name is NULL");
+               return MM_AUDIO_CODEC_INVALID;
+       }
+
+       if (!strcmp(name, "AMR")) {
+               codec_index = MM_AUDIO_CODEC_AMR;
+       } else if (!strcmp(name, "G723_1")) {
+               codec_index = MM_AUDIO_CODEC_G723_1;
+       } else if (!strcmp(name, "MP3")) {
+               codec_index = MM_AUDIO_CODEC_MP3;
+       } else if (!strcmp(name, "AAC")) {
+               codec_index = MM_AUDIO_CODEC_AAC;
+       } else if (!strcmp(name, "MMF")) {
+               codec_index = MM_AUDIO_CODEC_MMF;
+       } else if (!strcmp(name, "ADPCM")) {
+               codec_index = MM_AUDIO_CODEC_ADPCM;
+       } else if (!strcmp(name, "WAVE")) {
+               codec_index = MM_AUDIO_CODEC_WAVE;
+       } else if (!strcmp(name, "MIDI")) {
+               codec_index = MM_AUDIO_CODEC_MIDI;
+       } else if (!strcmp(name, "IMELODY")) {
+               codec_index = MM_AUDIO_CODEC_IMELODY;
+       } else if (!strcmp(name, "VORBIS")) {
+               codec_index = MM_AUDIO_CODEC_VORBIS;
        }
 
-       _mmcam_dbg_err( "Not supported audio codec[%s]", name);
-       return -1;
+       _mmcam_dbg_log("audio codec index %d", codec_index);
 
+       return codec_index;
 }
 
 
 
-int
-_mmcamcorder_get_video_codec_format(MMHandleType handle, char * name)
+int _mmcamcorder_get_video_codec_format(MMHandleType handle, char *name)
 {
-       int i = 0;
-       char* video_fmt_type[] =        {
-               "NONE",            /**< None (will be deprecated) */
-               "H263",            /**< H263 codec*/
-               "H264",            /**< H264 codec*/
-               "H26L",            /**< H26L codec*/
-               "MPEG4",           /**< MPEG4 codec*/
-               "MPEG1",           /**< MPEG1 codec*/
-               "WMV",             /**< WMV codec*/
-               "DIVX",            /**< DIVX codec*/
-               "XVID",            /**< XVID codec*/
-               "H261",            /**< H261 codec*/
-               "H262",            /**< H262/MPEG2-part2 codec*/
-               "H263V2",          /**< H263v2 codec*/
-               "H263V3",          /**< H263v3 codec*/
-               "MJPEG",           /**< Motion JPEG Video codec*/
-               "MPEG2",           /**< MPEG2 codec*/
-               "MPEG4_SIMPLE",    /**< MPEG4 part-2 Simple profile codec*/
-               "MPEG4_ADV_SIMPLE",/**< MPEG4 part-2 Advanced Simple profile codec*/
-               "MPEG4_MAIN",      /**< MPEG4 part-2 Main profile codec*/
-               "MPEG4_CORE",      /**< MPEG4 part-2 Core profile codec*/
-               "MPEG4_ACE",       /**< MPEG4 part-2 Adv Coding Eff profile codec*/
-               "MPEG4_ARTS",      /**< MPEG4 part-2 Adv RealTime Simple profile codec*/
-               "MPEG4_AVC",       /**< MPEG4 part-10 (h.264) codec*/
-               "REAL",            /**< Real video*/
-               "VC1",             /**< VC-1 video*/
-               "AVS",             /**< AVS video*/
-               "CINEPAK",         /**< Cinepak videocodec */
-               "INDEO",           /**< Indeo videocodec */
-               "THEORA"           /**< Theora videocodec */
-       };
-
-       for (i = 0; i < MM_VIDEO_CODEC_NUM; i++)
-       {
-               if (!strcmp(name, video_fmt_type[i]))
-               {
-//                     _mmcam_dbg_log( "Video codec[%d]", i);
-                       return i;
-               }
+       int codec_index = MM_VIDEO_CODEC_INVALID;
+
+       if (!name) {
+               _mmcam_dbg_err("name is NULL");
+               return MM_VIDEO_CODEC_INVALID;
+       }
+
+       if (!strcmp(name, "H263")) {
+               codec_index = MM_VIDEO_CODEC_H263;
+       } else if (!strcmp(name, "H264")) {
+               codec_index = MM_VIDEO_CODEC_H264;
+       } else if (!strcmp(name, "H26L")) {
+               codec_index = MM_VIDEO_CODEC_H26L;
+       } else if (!strcmp(name, "MPEG4")) {
+               codec_index = MM_VIDEO_CODEC_MPEG4;
+       } else if (!strcmp(name, "MPEG1")) {
+               codec_index = MM_VIDEO_CODEC_MPEG1;
+       } else if (!strcmp(name, "THEORA")) {
+               codec_index = MM_VIDEO_CODEC_THEORA;
        }
 
-       _mmcam_dbg_err( "Not supported Video codec[%s]", name);
-       return -1;
+       _mmcam_dbg_log("video codec index %d", codec_index);
 
+       return codec_index;
 }
 
 
 
-int
-_mmcamcorder_get_image_codec_format(MMHandleType handle, char * name)
+int _mmcamcorder_get_image_codec_format(MMHandleType handle, char *name)
 {
-       int i = 0;
-       char* image_fmt_type[] =        {
-               "JPEG",            /**< JPEG codec */
-               "PNG",             /**< PNG codec */
-               "BMP",             /**< BMP codec */
-               "WBMP",            /**< WBMP codec */
-               "TIFF",            /**< TIFF codec */
-               "PCX",             /**< PCX codec */
-               "GIF",             /**< GIF codec */
-               "ICO",             /**< ICO codec */
-               "RAS",             /**< RAS codec */
-               "TGA",             /**< TGA codec */
-               "XBM",             /**< XBM codec */
-               "XPM"              /**< XPM codec */
-               "SRW"              /**< SRW (Samsung standard RAW) */
-               "JPEG_SRW"         /**< JPEG + SRW */
-       };
-
-       for (i = 0; i < MM_IMAGE_CODEC_NUM; i++)
-       {
-               if (!strcmp(name, image_fmt_type[i]))
-               {
-//                     _mmcam_dbg_log( "Image codec[%d]", i);
-                       return i;
-               }
+       int codec_index = MM_IMAGE_CODEC_INVALID;
+
+       if (!name) {
+               _mmcam_dbg_err("name is NULL");
+               return MM_IMAGE_CODEC_INVALID;
+       }
+
+       if (!strcmp(name, "JPEG")) {
+               codec_index = MM_IMAGE_CODEC_JPEG;
+       } else if (!strcmp(name, "PNG")) {
+               codec_index = MM_IMAGE_CODEC_PNG;
+       } else if (!strcmp(name, "BMP")) {
+               codec_index = MM_IMAGE_CODEC_BMP;
+       } else if (!strcmp(name, "WBMP")) {
+               codec_index = MM_IMAGE_CODEC_WBMP;
+       } else if (!strcmp(name, "TIFF")) {
+               codec_index = MM_IMAGE_CODEC_TIFF;
+       } else if (!strcmp(name, "PCX")) {
+               codec_index = MM_IMAGE_CODEC_PCX;
+       } else if (!strcmp(name, "GIF")) {
+               codec_index = MM_IMAGE_CODEC_GIF;
+       } else if (!strcmp(name, "ICO")) {
+               codec_index = MM_IMAGE_CODEC_ICO;
+       } else if (!strcmp(name, "RAS")) {
+               codec_index = MM_IMAGE_CODEC_RAS;
+       } else if (!strcmp(name, "TGA")) {
+               codec_index = MM_IMAGE_CODEC_TGA;
+       } else if (!strcmp(name, "XBM")) {
+               codec_index = MM_IMAGE_CODEC_XBM;
+       } else if (!strcmp(name, "XPM")) {
+               codec_index = MM_IMAGE_CODEC_XPM;
        }
 
-       _mmcam_dbg_err( "Not supported Image codec[%s]", name);
-       return -1;
+       _mmcam_dbg_log("image codec index %d", codec_index);
 
+       return codec_index;
 }
 
 
-int
-_mmcamcorder_get_mux_format(MMHandleType handle, char * name)
+int _mmcamcorder_get_mux_format(MMHandleType handle, char *name)
 {
-       int i = 0;
-       char* mux_fmt_type[] =  {
-               "3GP",             /**< 3GP file format */
-               "ASF",             /**< Advanced Systems File file format */
-               "AVI",             /**< Audio Video Interleaved file format */
-               "MATROSKA",        /**< MATROSAK file format */
-               "MP4",             /**< MP4 file format */
-               "OGG",             /**< OGG file format */
-               "NUT",             /**< NUT file format */
-               "QT",              /**< MOV file format */
-               "REAL",            /**< RealMedia file format */
-               "AMR",             /**< AMR file format */
-               "AAC",             /**< AAC file format */
-               "MP3",             /**< MP3 file format */
-               "AIFF",            /**< AIFF file format */
-               "AU",              /**< Audio file format */
-               "WAV",             /**< WAV file format */
-               "MID",             /**< MID file format */
-               "MMF",             /**< MMF file format */
-               "DIVX",            /**< DivX file format */
-               "FLV",             /**< Flash video file format */
-               "VOB",             /**< DVD-Video Object file format */
-               "IMELODY",         /**< IMelody file format */
-               "WMA",             /**< WMA file format */
-               "WMV",             /**< WMV file format */
-               "JPG"              /**< JPEG file format */
-       };
-
-       for (i = 0; i < MM_FILE_FORMAT_NUM; i++)
-       {
-               if (!strcmp(name, mux_fmt_type[i]))
-               {
-//                     _mmcam_dbg_log( "Mux[%d]", i);
-                       return i;
-               }
+       int mux_index = MM_FILE_FORMAT_INVALID;
+
+       if (!name) {
+               _mmcam_dbg_err("name is NULL");
+               return MM_FILE_FORMAT_INVALID;
+       }
+
+       if (!strcmp(name, "3GP")) {
+               mux_index = MM_FILE_FORMAT_3GP;
+       } else if (!strcmp(name, "AMR")) {
+               mux_index = MM_FILE_FORMAT_AMR;
+       } else if (!strcmp(name, "MP4")) {
+               mux_index = MM_FILE_FORMAT_MP4;
+       } else if (!strcmp(name, "AAC")) {
+               mux_index = MM_FILE_FORMAT_AAC;
+       } else if (!strcmp(name, "MP3")) {
+               mux_index = MM_FILE_FORMAT_MP3;
+       } else if (!strcmp(name, "OGG")) {
+               mux_index = MM_FILE_FORMAT_OGG;
+       } else if (!strcmp(name, "WAV")) {
+               mux_index = MM_FILE_FORMAT_WAV;
+       } else if (!strcmp(name, "AVI")) {
+               mux_index = MM_FILE_FORMAT_AVI;
+       } else if (!strcmp(name, "WMA")) {
+               mux_index = MM_FILE_FORMAT_WMA;
+       } else if (!strcmp(name, "WMV")) {
+               mux_index = MM_FILE_FORMAT_WMV;
+       } else if (!strcmp(name, "MID")) {
+               mux_index = MM_FILE_FORMAT_MID;
+       } else if (!strcmp(name, "MMF")) {
+               mux_index = MM_FILE_FORMAT_MMF;
+       } else if (!strcmp(name, "MATROSKA")) {
+               mux_index = MM_FILE_FORMAT_MATROSKA;
        }
 
-       _mmcam_dbg_err( "Not supported Mux[%s]", name);
-       return -1;
+       _mmcam_dbg_log("mux index %d", mux_index);
 
+       return mux_index;
 }
 
 
@@ -3235,42 +3187,37 @@ _mmcamcorder_get_available_format(MMHandleType handle, int conf_category, int **
 
        configure_info = hcamcorder->conf_main;
 
-       if( configure_info->info[conf_category] )
-       {
-               int count = configure_info->info[conf_category]->count;
-               conf_info* info = configure_info->info[conf_category];
+       if (configure_info->info[conf_category]) {
                int i = 0;
                int fmt = 0;
-               char* name = NULL;
+               char *name = NULL;
+               int count = configure_info->info[conf_category]->count;
+               conf_info *info = configure_info->info[conf_category];
 
                _mmcam_dbg_log("count[%d], info[%p]", count, info);
 
-               if ((count <= 0) || (!info))
-               {
+               if (count <= 0 || !info) {
                        return total_count;
                }
 
                arr = (int*) g_malloc0(count * sizeof(int));
 
-               for( i = 0 ; i < count ; i++ )
-               {
-                       if( info->detail_info[i] == NULL )
-                       {
+               for (i = 0 ; i < count ; i++) {
+                       if (info->detail_info[i] == NULL) {
                                continue;
                        }
-                       
+
                        name = ((type_element*)(info->detail_info[i]))->name;
-                       
-                       if ((fmt = _mmcamcorder_get_format(handle, conf_category, name)) >= 0)
-                       {
+                       fmt = _mmcamcorder_get_format(handle, conf_category, name);
+                       if (fmt >= 0) {
                                arr[total_count++] = fmt;
                        }
+
                        _mmcam_dbg_log("name:%s, fmt:%d", name, fmt);
                }
        }
-               
+
        *format = arr;
 
        return total_count;
 }
-
index a1a2f2e..1c03789 100644 (file)
 #include <mm_error.h>
 #include <glib.h>
 
-#define MM_EXIFINFO_USE_BINARY_EXIFDATA                1
-#define JPEG_MAX_SIZE 20000000
-#define JPEG_THUMBNAIL_MAX_SIZE        (128*1024)
+#define MM_EXIFINFO_USE_BINARY_EXIFDATA         1
+#define JPEG_MAX_SIZE                           20000000
+#define JPEG_THUMBNAIL_MAX_SIZE                 (128*1024)
+#define JPEG_DATA_OFFSET                        2
+#define EXIF_MARKER_SOI_LENGTH                  2
+#define EXIF_MARKER_APP1_LENGTH                 2
+#define EXIF_APP1_LENGTH                        2
+
 #if MM_EXIFINFO_USE_BINARY_EXIFDATA
 /**
  * Exif Binary Data.
@@ -86,6 +91,7 @@ _exif_set_uint16 (int is_motorola, void * out, unsigned short in)
 }
 
 
+#ifdef _MMCAMCORDER_EXIF_GET_JPEG_MARKER_OFFSET
 static unsigned long
 _exif_get_jpeg_marker_offset (void *jpeg, int jpeg_size, unsigned short marker)
 {
@@ -129,6 +135,7 @@ _exif_get_jpeg_marker_offset (void *jpeg, int jpeg_size, unsigned short marker)
        mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]Marker not found.\n", __LINE__, __func__);
        return 0UL;
 }
+#endif /* _MMCAMCORDER_EXIF_GET_JPEG_MARKER_OFFSET */
 
 
 ExifData*
@@ -210,45 +217,48 @@ mm_exif_set_exif_to_info (mm_exif_info_t *info, ExifData *exif)
 int
 mm_exif_set_add_entry (ExifData *exif, ExifIfd ifd, ExifTag tag,ExifFormat format,unsigned long components,unsigned char* data)
 {
-//     mmf_debug (MMF_DEBUG_LOG, "%s()\n", __func__);
-       ExifData                *ed = (ExifData *)exif;
-       ExifEntry               *e = NULL;
+       /*mmf_debug (MMF_DEBUG_LOG, "%s()\n", __func__);*/
+       ExifData *ed = (ExifData *)exif;
+       ExifEntry *e = NULL;
 
-       if(exif==NULL || format<=0 || components<=0 || data==NULL)
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s] invalid argument exif=%p format=%d, components=%lu data=%p!\n", __LINE__, __func__,exif,format,components,data);
+       if (exif == NULL || format <= 0 || components <= 0 || data == NULL) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s] invalid argument exif=%p format=%d, components=%lu data=%p!\n",
+                                         __LINE__, __func__,exif,format,components,data);
                return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
        }
+
        /*remove same tag in EXIF*/
-       exif_content_remove_entry (ed->ifd[ifd], exif_content_get_entry(ed->ifd[ifd], tag));
+       exif_content_remove_entry(ed->ifd[ifd], exif_content_get_entry(ed->ifd[ifd], tag));
+
        /*create new tag*/
-       e = exif_entry_new ();
-       if(e==NULL)
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s] entry create error!\n", __LINE__, __func__);
+       e = exif_entry_new();
+       if (e == NULL) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s] entry create error!\n", __LINE__, __func__);
                return MM_ERROR_CAMCORDER_LOW_MEMORY;
        }
-       exif_entry_initialize (e, tag);
 
-       e->tag                  = tag;
-       e->format               = format;
-       e->components   = components;
+       exif_entry_initialize(e, tag);
 
-       if(e->size==0)
-       {
-               e->data=NULL;
-               e->data=malloc(exif_format_get_size(format)*e->components);
-               if(!e->data)
-               {
+       e->tag = tag;
+       e->format = format;
+       e->components = components;
+
+       if (e->size == 0) {
+               e->data = NULL;
+               e->data = malloc(exif_format_get_size(format) * e->components);
+               if (!e->data) {
                        exif_entry_unref(e);
                        return MM_ERROR_CAMCORDER_LOW_MEMORY;
                }
-               if(format==EXIF_FORMAT_ASCII)
-                       memset (e->data, '\0', exif_format_get_size(format)*e->components);
+
+               if (format == EXIF_FORMAT_ASCII) {
+                       memset(e->data, '\0', exif_format_get_size(format) * e->components);
+               }
        }
-       e->size                 = exif_format_get_size(format)*e->components;
+
+       e->size = exif_format_get_size(format) * e->components;
        memcpy(e->data,data,e->size);
-       exif_content_add_entry (ed->ifd[ifd], e);
+       exif_content_add_entry(ed->ifd[ifd], e);
        exif_entry_unref(e);
 
        return MM_ERROR_NONE;
@@ -265,64 +275,63 @@ mm_exif_set_add_entry (ExifData *exif, ExifIfd ifd, ExifTag tag,ExifFormat forma
 int
 mm_exif_create_exif_info (mm_exif_info_t **info)
 {
-       mm_exif_info_t  *x = NULL;
+       mm_exif_info_t *x = NULL;
 #if (MM_EXIFINFO_USE_BINARY_EXIFDATA == 0)
-       ExifData                        *ed = NULL;
-       unsigned char           *eb = NULL;
-       unsigned int            ebs;
+       ExifData *ed = NULL;
+       unsigned char *eb = NULL;
+       unsigned int ebs;
 #endif
-
        mmf_debug (MMF_DEBUG_LOG,"[%05d][%s]\n", __LINE__, __func__);
 
-       x = malloc (sizeof (mm_exif_info_t));
-       if(!x)
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]malloc error\n", __LINE__, __func__);
+       if (!info) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s] NULL pointer\n", __LINE__, __func__);
+               return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
+       }
+
+       x = malloc(sizeof(mm_exif_info_t));
+       if (!x) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s]malloc error\n", __LINE__, __func__);
                return MM_ERROR_CAMCORDER_LOW_MEMORY;
-       }
+       }
 #if MM_EXIFINFO_USE_BINARY_EXIFDATA
-       x->data=NULL; 
-       x->data = malloc (_EXIF_BIN_SIZE_);
-       if(!x->data)
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]malloc error\n", __LINE__, __func__);
+       x->data = NULL;
+       x->data = malloc(_EXIF_BIN_SIZE_);
+       if (!x->data) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s]malloc error\n", __LINE__, __func__);
                free(x);
                return MM_ERROR_CAMCORDER_LOW_MEMORY;
-       }
-       memcpy (x->data, g_exif_bin, _EXIF_BIN_SIZE_);
+       }
+       memcpy(x->data, g_exif_bin, _EXIF_BIN_SIZE_);
        x->size = _EXIF_BIN_SIZE_;
 #else
-       ed = exif_data_new ();
-       if(!ed )
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]exif data new error\n", __LINE__, __func__);
+       ed = exif_data_new();
+       if (!ed) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s]exif data new error\n", __LINE__, __func__);
                return MM_ERROR_CAMCORDER_LOW_MEMORY;
-       }
-               
-       exif_data_set_byte_order        (ed, EXIF_BYTE_ORDER_INTEL);
-       exif_data_set_data_type         (ed, EXIF_DATA_TYPE_COMPRESSED);
-       exif_data_set_option            (ed, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
-
-       exif_data_fix (ed);
-
-       exif_data_save_data (ed, &eb, &ebs);
-       if(eb==NULL)
-       {
-               mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]exif_data_save_data error\n", __LINE__, __func__);
+       }
+
+       exif_data_set_byte_order(ed, EXIF_BYTE_ORDER_INTEL);
+       exif_data_set_data_type(ed, EXIF_DATA_TYPE_COMPRESSED);
+       exif_data_set_option(ed, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
+
+       exif_data_fix(ed);
+
+       exif_data_save_data(ed, &eb, &ebs);
+       if (eb == NULL) {
+               mmf_debug(MMF_DEBUG_ERROR,"[%05d][%s]exif_data_save_data error\n", __LINE__, __func__);
                free(x->data);
                free(x);
-               exif_data_unref (ed);
+               exif_data_unref(ed);
                return MM_ERROR_CAMCORDER_INTERNAL;
-       }       
-       exif_data_unref (ed);
+       }
+       exif_data_unref(ed);
 
        x->data = eb;
        x->size = ebs;
 #endif
-
        *info = x;
 
-       //mmf_debug (MMF_DEBUG_LOG, "%s() Data:%p Size:%d\n", __func__, x->data, x->size); 
+       mmf_debug(MMF_DEBUG_LOG, "%s() Data:%p Size:%d\n", __func__, x->data, x->size);
 
        return MM_ERROR_NONE;
 }
@@ -368,7 +377,7 @@ mm_exif_add_thumbnail_info (mm_exif_info_t *info, void *thumbnail, int width, in
 
        /* get ExifData from info*/
        ed = mm_exif_get_exif_from_info(info);
-       ed->data=thumbnail;
+       ed->data = thumbnail;
        ed->size = len;
 
        /* set thumbnail data */
@@ -400,7 +409,7 @@ mm_exif_add_thumbnail_info (mm_exif_info_t *info, void *thumbnail, int width, in
        if (ret != MM_ERROR_NONE) {
                goto exit;
        }
-       
+
        ed->data = NULL;
        ed->size = 0;
        exif_data_unref (ed);   
@@ -524,24 +533,17 @@ int mm_exif_mnote_set_add_entry (ExifData *exif, MnoteSamsungTag tag, int index,
 int
 mm_exif_write_exif_jpeg_to_file (char *filename, mm_exif_info_t *info,  void *jpeg, int jpeg_len)
 {
-       FILE                    *fp = NULL;
-       unsigned long   offset_jpeg_start;
-       unsigned short  head[2]={0,};
-       unsigned short  head_len=0;
-       unsigned char   *eb = NULL;
-       unsigned int    ebs;
+       FILE *fp = NULL;
+       unsigned short head[2] = {0,};
+       unsigned short head_len = 0;
+       unsigned char *eb = NULL;
+       unsigned int ebs;
 
        mmf_debug (MMF_DEBUG_LOG,"[%05d][%s]\n", __LINE__, __func__);
 
        eb = info->data;
        ebs = info->size;
 
-       /*get DQT*/
-       offset_jpeg_start = _exif_get_jpeg_marker_offset (jpeg, jpeg_len, 0xffdb);
-       if (offset_jpeg_start == 0) {
-               return -1;
-       }
-
        /*create file*/
        fp = fopen (filename, "wb");
        if (!fp) {
@@ -554,19 +556,19 @@ mm_exif_write_exif_jpeg_to_file (char *filename, mm_exif_info_t *info,  void *jp
        _exif_set_uint16 (0, &head[1], 0xffe1);
        /*set header length*/
        _exif_set_uint16 (0, &head_len, (unsigned short)(ebs + 2));
-       
+
        if(head[0]==0 || head[1]==0 || head_len==0)
        {
                mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]setting error\n", __LINE__, __func__);
                fclose (fp);
                return -1;
        }
-       
-       fwrite (&head[0], 1, 2, fp);                    /*SOI marker*/
-       fwrite (&head[1], 1, 2, fp);                    /*APP1 marker*/
-       fwrite (&head_len, 1, 2, fp);                   /*length of APP1*/
-       fwrite (eb, 1, ebs, fp);                                /*EXIF*/
-       fwrite (jpeg + offset_jpeg_start, 1, jpeg_len - offset_jpeg_start, fp); /*IMAGE*/
+
+       fwrite (&head[0], 1, EXIF_MARKER_SOI_LENGTH, fp);       /*SOI marker*/
+       fwrite (&head[1], 1, EXIF_MARKER_APP1_LENGTH, fp);      /*APP1 marker*/
+       fwrite (&head_len, 1, EXIF_APP1_LENGTH, fp);            /*length of APP1*/
+       fwrite (eb, 1, ebs, fp);                                /*EXIF*/
+       fwrite (jpeg + JPEG_DATA_OFFSET, 1, jpeg_len - JPEG_DATA_OFFSET, fp);   /*IMAGE*/
 
        fclose (fp);
 
@@ -576,15 +578,15 @@ mm_exif_write_exif_jpeg_to_file (char *filename, mm_exif_info_t *info,  void *jp
 int
 mm_exif_write_exif_jpeg_to_memory (void **mem, unsigned int *length, mm_exif_info_t *info,  void *jpeg, unsigned int jpeg_len)
 {
+       unsigned short head[2] = {0,};
+       unsigned short head_len = 0;
+       unsigned char *eb = NULL;
+       unsigned int ebs;
+
        /*output*/
-       unsigned char   *m = NULL;
-       int                             m_len = 0;      
-       /**/
-       unsigned long   offset_jpeg_start;
-       unsigned short  head[2]={0,};
-       unsigned short  head_len=0;
-       unsigned char   *eb = NULL;
-       unsigned int    ebs;
+       unsigned char *m = NULL;
+       int m_len = 0;
+
        mmf_debug (MMF_DEBUG_LOG,"[%05d][%s]\n", __LINE__, __func__);
 
        if(info==NULL || jpeg==NULL)
@@ -601,15 +603,10 @@ mm_exif_write_exif_jpeg_to_memory (void **mem, unsigned int *length, mm_exif_inf
 
        eb = info->data;
        ebs = info->size;
-       /*get DQT*/
-       offset_jpeg_start = _exif_get_jpeg_marker_offset (jpeg, (int)jpeg_len, 0xffdb);
-       if (offset_jpeg_start == 0) {
-               return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
-       }
 
        /*length of output image*/
        /*SOI + APP1 + length of APP1 + length of EXIF + IMAGE*/
-       m_len = 2 + 2 + 2 + ebs + (jpeg_len - offset_jpeg_start);
+       m_len = EXIF_MARKER_SOI_LENGTH + EXIF_MARKER_APP1_LENGTH + EXIF_APP1_LENGTH + ebs + (jpeg_len - JPEG_DATA_OFFSET);
        /*alloc output image*/
        m = malloc (m_len);
        if (!m) {
@@ -622,17 +619,30 @@ mm_exif_write_exif_jpeg_to_memory (void **mem, unsigned int *length, mm_exif_inf
        _exif_set_uint16 (0, &head[1], 0xffe1);
        /*set header length*/
        _exif_set_uint16 (0, &head_len, (unsigned short)(ebs + 2));
-       if(head[0]==0 || head[1]==0 || head_len==0)
-       {
+       if (head[0] == 0 || head[1] == 0 || head_len == 0) {
                mmf_debug (MMF_DEBUG_ERROR,"[%05d][%s]setting error\n", __LINE__, __func__);
                free(m);
                return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
-       }       
-       memcpy (m,                                              &head[0],                                       2);     /*SOI marker*/
-       memcpy (m + 2,                                  &head[1],                                       2);     /*APP1 marker*/
-       memcpy (m + 2 + 2,                              &head_len,                                      2);     /*length of APP1*/
-       memcpy (m + 2 + 2 + 2,                  eb,                                                     ebs);   /*EXIF*/
-       memcpy (m + 2 + 2 + 2 + ebs,    jpeg + offset_jpeg_start,       jpeg_len - offset_jpeg_start);  /*IMAGE*/
+       }
+
+       /* Complete JPEG+EXIF */
+       /*SOI marker*/
+       memcpy(m, &head[0], EXIF_MARKER_SOI_LENGTH);
+       /*APP1 marker*/
+       memcpy(m + EXIF_MARKER_SOI_LENGTH,
+              &head[1], EXIF_MARKER_APP1_LENGTH);
+       /*length of APP1*/
+       memcpy(m + EXIF_MARKER_SOI_LENGTH + EXIF_MARKER_APP1_LENGTH,
+              &head_len, EXIF_APP1_LENGTH);
+       /*EXIF*/
+       memcpy(m + EXIF_MARKER_SOI_LENGTH + EXIF_MARKER_APP1_LENGTH + EXIF_APP1_LENGTH,
+              eb, ebs);
+       /*IMAGE*/
+       memcpy(m + EXIF_MARKER_SOI_LENGTH + EXIF_MARKER_APP1_LENGTH + EXIF_APP1_LENGTH + ebs,
+              jpeg + JPEG_DATA_OFFSET, jpeg_len - JPEG_DATA_OFFSET);
+
+       mmf_debug(MMF_DEBUG_LOG,"[%05d][%s] JPEG+EXIF Copy DONE(original:%d, copied:%d)\n",
+                               __LINE__, __func__, jpeg_len, jpeg_len - JPEG_DATA_OFFSET);
 
        /*set ouput param*/
        *mem    = m;
index b631caf..7998bc2 100644 (file)
@@ -40,7 +40,7 @@ gboolean      audiocodec_fileformat_compatibility_table[MM_AUDIO_CODEC_NUM][MM_FILE_F
 /*G723.1*/    { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
 /*MP3*/       { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
 /*OGG*/       { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
-/*AAC*/       { 1,  0,  1,       1,  1,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
+/*AAC*/       { 1,  0,  1,       1,  1,  0,  0, 0,   0,  0,  1,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
 /*WMA*/       { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
 /*MMF*/       { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
 /*ADPCM*/     { 0,  0,  0,       0,  0,  0,  0, 0,   0,  0,  0,  0,   0, 0,  0,  0,  0,   0,  0,  0,      0,  0,  0,  0,  },
@@ -121,7 +121,6 @@ gboolean    videocodec_fileformat_compatibility_table[MM_VIDEO_CODEC_NUM][MM_FILE_F
 -----------------------------------------------------------------------*/
 #define USE_AUDIO_CLOCK_TUNE
 #define _MMCAMCORDER_WAIT_EOS_TIME     5.0             //sec
-#define _DPRAM_RAW_PCM_LOCATION                "/dev/rawPCM0"
 
 /*-----------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                |
@@ -140,8 +139,6 @@ gboolean    videocodec_fileformat_compatibility_table[MM_VIDEO_CODEC_NUM][MM_FILE_F
  * @see                __mmcamcorder_create_preview_pipeline()
  */
 static gboolean __mmcamcorder_video_dataprobe_preview(GstPad *pad, GstBuffer *buffer, gpointer u_data);
-static gboolean __mmcamcorder_video_dataprobe_vsink(GstPad *pad, GstBuffer *buffer, gpointer u_data);
-static gboolean __mmcamcorder_video_dataprobe_vsink_drop_by_time(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 
 static int __mmcamcorder_get_amrnb_bitrate_mode(int bitrate);
 
@@ -155,14 +152,16 @@ int _mmcamcorder_create_videosrc_bin(MMHandleType handle)
 {
        int err = MM_ERROR_NONE;
        int rotate = 0;
+       int flip = 0;
        int fps = 0;
-       int slow_fps = 0;
        int hold_af = 0;
        int UseVideoscale = 0;
-       int PictureFormat = 0;
        int codectype = 0;
        int capture_width = 0;
        int capture_height = 0;
+       int capture_jpg_quality = 100;
+       int video_stabilization = 0;
+       int anti_shake = 0;
        char *videosrc_name = NULL;
        char *err_name = NULL;
 
@@ -203,13 +202,16 @@ int _mmcamcorder_create_videosrc_bin(MMHandleType handle)
        }
 
        err = mm_camcorder_get_attributes(handle, &err_name,
-                                         MMCAM_CAMERA_FORMAT, &PictureFormat,
+                                         MMCAM_CAMERA_FORMAT, &sc->info_image->preview_format,
                                          MMCAM_CAMERA_FPS, &fps,
-                                         "camera-slow-motion-fps", &slow_fps,
                                          MMCAM_CAMERA_ROTATION, &rotate,
+                                         MMCAM_CAMERA_FLIP, &flip,
+                                         MMCAM_CAMERA_VIDEO_STABILIZATION, &video_stabilization,
+                                         MMCAM_CAMERA_ANTI_HANDSHAKE, &anti_shake,
                                          MMCAM_CAPTURE_WIDTH, &capture_width,
                                          MMCAM_CAPTURE_HEIGHT, &capture_height,
                                          MMCAM_IMAGE_ENCODER, &codectype,
+                                         MMCAM_IMAGE_ENCODER_QUALITY, &capture_jpg_quality,
                                          "camera-hold-af-after-capturing", &hold_af,
                                          NULL);
        if (err != MM_ERROR_NONE) {
@@ -219,7 +221,7 @@ int _mmcamcorder_create_videosrc_bin(MMHandleType handle)
        }
 
        /* Get fourcc from picture format */
-       sc->fourcc = _mmcamcorder_get_fourcc(PictureFormat, codectype, hcamcorder->use_zero_copy_format);
+       sc->fourcc = _mmcamcorder_get_fourcc(sc->info_image->preview_format, codectype, hcamcorder->use_zero_copy_format);
 
        /* Get videosrc element and its name from configure */
        _mmcamcorder_conf_get_element(hcamcorder->conf_main,
@@ -240,69 +242,86 @@ int _mmcamcorder_create_videosrc_bin(MMHandleType handle)
        __ta__("                videosrc_capsfilter",
        _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_FILT, "capsfilter", "videosrc_filter", element_list, err);
        );
+       __ta__("                videosrc_queue",
+       _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_QUE, "queue", "videosrc_queue", element_list, err);
+       );
 
-       sc->is_slow = FALSE;
+       /* init high-speed-fps */
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", 0);
+
+       /* set capture size, quality and flip setting which were set before mm_camcorder_realize */
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-width", capture_width);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-height", capture_height);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-jpg-quality", capture_jpg_quality);
 
-       if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
-               _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
-                                               CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
-                                               "UseVideoscale",
-                                               &UseVideoscale);
-               if (UseVideoscale) {
-                       int set_width = 0;
-                       int set_height = 0;
-                       int scale_width = 0;
-                       int scale_height = 0;
-                       int scale_method = 0;
-                       char *videoscale_name = NULL;
-                       type_element *VideoscaleElement = NULL;
-
-                       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
-                                                     CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
-                                                     "VideoscaleElement",
-                                                     &VideoscaleElement);
-                       _mmcamcorder_conf_get_value_element_name(VideoscaleElement, &videoscale_name);
-                       __ta__("                videosrc_scale",
-                       _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_SCALE, videoscale_name, "videosrc_scale", element_list, err);
-                       );
-                       __ta__("                videoscale_capsfilter",
-                       _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_VSFLT, "capsfilter", "videosrc_scalefilter", element_list, err);
-                       );
+       /* set camera flip */
+       _mmcamcorder_set_videosrc_flip(handle, flip);
 
-                       _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "width", &scale_width);
-                       _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "height", &scale_height);
-                       _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "method", &scale_method);
+       /* set flush cache as FALSE */
+       if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "flush-cache", FALSE);
+       }
 
-                       if (rotate == MM_VIDEO_INPUT_ROTATION_90 ||
-                           rotate == MM_VIDEO_INPUT_ROTATION_270) {
-                               set_width = scale_height;
-                               set_height = scale_width;
-                       } else {
-                               set_width = scale_width;
-                               set_height = scale_height;
-                       }
+       /* set video stabilization mode */
+       _mmcamcorder_set_videosrc_stabilization(handle, video_stabilization);
 
-                       _mmcam_dbg_log("VideoSRC Scale[%dx%d], Method[%d]", set_width, set_height, scale_method);
+       /* set anti handshake mode */
+       _mmcamcorder_set_videosrc_anti_shake(handle, anti_shake);
 
-                       caps = gst_caps_new_simple("video/x-raw-yuv",
-                                                  "format", GST_TYPE_FOURCC, sc->fourcc,
-                                                  "width", G_TYPE_INT, set_width,
-                                                  "height", G_TYPE_INT, set_height,
-                                                  NULL);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_VSFLT].gst, "caps", caps);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SCALE].gst, "method", scale_method);
+       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                       CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
+                                       "UseVideoscale",
+                                       &UseVideoscale);
+       if (UseVideoscale) {
+               int set_width = 0;
+               int set_height = 0;
+               int scale_width = 0;
+               int scale_height = 0;
+               int scale_method = 0;
+               char *videoscale_name = NULL;
+               type_element *VideoscaleElement = NULL;
 
-                       gst_caps_unref(caps);
-                       caps = NULL;
-               }
+               _mmcamcorder_conf_get_element(hcamcorder->conf_main,
+                                             CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
+                                             "VideoscaleElement",
+                                             &VideoscaleElement);
+               _mmcamcorder_conf_get_value_element_name(VideoscaleElement, &videoscale_name);
+               __ta__("                videosrc_scale",
+               _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_SCALE, videoscale_name, "videosrc_scale", element_list, err);
+               );
+               __ta__("                videoscale_capsfilter",
+               _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSRC_VSFLT, "capsfilter", "videosrc_scalefilter", element_list, err);
+               );
 
-               if (slow_fps > 0) {
-                       sc->is_slow = TRUE;
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps);
+               _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "width", &scale_width);
+               _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "height", &scale_height);
+               _mmcamcorder_conf_get_value_element_int(VideoscaleElement, "method", &scale_method);
+
+               if (rotate == MM_VIDEO_INPUT_ROTATION_90 ||
+                       rotate == MM_VIDEO_INPUT_ROTATION_270) {
+                       set_width = scale_height;
+                       set_height = scale_width;
+               } else {
+                       set_width = scale_width;
+                       set_height = scale_height;
                }
+
+               _mmcam_dbg_log("VideoSRC Scale[%dx%d], Method[%d]", set_width, set_height, scale_method);
+
+               caps = gst_caps_new_simple("video/x-raw-yuv",
+                                          "format", GST_TYPE_FOURCC, sc->fourcc,
+                                          "width", G_TYPE_INT, set_width,
+                                          "height", G_TYPE_INT, set_height,
+                                          NULL);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_VSFLT].gst, "caps", caps);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SCALE].gst, "method", scale_method);
+
+               gst_caps_unref(caps);
+               caps = NULL;
+       }
+
+       if (sc->is_modified_rate) {
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "high-speed-fps", fps);
        }
 
        __ta__("                tee",
@@ -603,7 +622,7 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle)
        int camera_width = 0;
        int camera_height = 0;
        int rotate = 0;
-       int camera_format = MM_PIXEL_FORMAT_NV12;
+       int flip = 0;
        int UseVideoscale = 0, EnableConvertedSC = 0;
        int scale_method = 0;
        char* videosink_name = NULL;
@@ -631,10 +650,10 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle)
        err = mm_camcorder_get_attributes(handle, &err_name,
                                          MMCAM_CAMERA_WIDTH, &camera_width,
                                          MMCAM_CAMERA_HEIGHT, &camera_height,
-                                         MMCAM_CAMERA_FORMAT, &camera_format,
                                          MMCAM_DISPLAY_RECT_WIDTH, &rect_width,
                                          MMCAM_DISPLAY_RECT_HEIGHT, &rect_height,
                                          MMCAM_DISPLAY_ROTATION, &rotate,
+                                         MMCAM_DISPLAY_FLIP, &flip,
                                          "enable-converted-stream-callback", &EnableConvertedSC,
                                          NULL);
        if (err != MM_ERROR_NONE) {
@@ -668,15 +687,26 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle)
        if (EnableConvertedSC ||
            !strcmp(videosink_name, "evasimagesink") ||
            !strcmp(videosink_name, "ximagesink")) {
-               if (camera_format == MM_PIXEL_FORMAT_NV12 ||
-                   camera_format == MM_PIXEL_FORMAT_NV12T) {
+               GstElementFactory *factory = gst_element_factory_find("fimcconvert");
+
+               if ((sc->fourcc == GST_MAKE_FOURCC('S','N','2','1') ||
+                    sc->fourcc == GST_MAKE_FOURCC('S','N','1','2') ||
+                    sc->fourcc == GST_MAKE_FOURCC('S','T','1','2') ||
+                    sc->fourcc == GST_MAKE_FOURCC('S','4','2','0')) &&
+                   factory) {
                        int set_rotate = 0;
+                       int set_flip = 0;
+
+                       gst_object_unref(factory);
+                       factory = NULL;
 
                        __ta__("                videosink_fimcconvert",
                        _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSINK_CLS, "fimcconvert", NULL, element_list, err);
                        );
 
-                       if (rotate < MM_DISPLAY_ROTATION_FLIP_HORZ) {
+                       /* set rotate */
+                       if (rotate > MM_VIDEO_INPUT_ROTATION_NONE &&
+                           rotate < MM_VIDEO_INPUT_ROTATION_NUM) {
                                set_rotate = rotate * 90;
                        } else {
                                set_rotate = 0;
@@ -695,11 +725,35 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle)
                                }
                        }
 
-                       _mmcam_dbg_log("Fimcconvert set values - %dx%d, rotate: %d", rect_width, rect_height, set_rotate);
+                       /* set flip */
+                       switch (flip) {
+                       case MM_FLIP_HORIZONTAL:
+                               set_flip = FIMCCONVERT_FLIP_HORIZONTAL;
+                               break;
+                       case MM_FLIP_VERTICAL:
+                               set_flip = FIMCCONVERT_FLIP_VERTICAL;
+                               break;
+                       case MM_FLIP_BOTH: /* both flip has same effect with 180 rotation */
+                               set_rotate = (set_rotate + 180) % 360;
+                       case MM_FLIP_NONE:
+                       default:
+                               set_flip = FIMCCONVERT_FLIP_NONE;
+                               break;
+                       }
+
+                       _mmcam_dbg_log("Fimcconvert set values - %dx%d, rotate: %d, flip: %d",
+                                      rect_width, rect_height, set_rotate, set_flip);
+
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_CLS].gst, "src-width", rect_width);
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_CLS].gst, "src-height", rect_height);
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_CLS].gst, "rotate", set_rotate);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_CLS].gst, "flip", set_flip);
                } else {
+                       if (factory) {
+                               gst_object_unref(factory);
+                               factory = NULL;
+                       }
+
                        __ta__("                videosink_ffmpegcolorspace",
                        _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSINK_CLS, "ffmpegcolorspace", NULL, element_list, err);
                        );
@@ -752,9 +806,8 @@ int _mmcamcorder_create_videosink_bin(MMHandleType handle)
        _MMCAMCORDER_ELEMENT_MAKE(sc, _MMCAMCORDER_VIDEOSINK_SINK, videosink_name, NULL, element_list, err);
        );
 
-       if (!strcmp(videosink_name, "xvimagesink") ||
-            !strcmp(videosink_name, "ximagesink") ||
-            !strcmp(videosink_name, "evasimagesink")) {
+       if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "ximagesink") ||
+            !strcmp(videosink_name, "evasimagesink") || !strcmp(videosink_name, "evaspixmapsink")) {
                if (_mmcamcorder_videosink_window_set(handle, sc->VideosinkElement) != MM_ERROR_NONE) {
                        _mmcam_dbg_err("_mmcamcorder_videosink_window_set error");
                        err = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
@@ -816,12 +869,11 @@ pipeline_creation_error:
 }
 
 
-int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
+int _mmcamcorder_create_encodesink_bin(MMHandleType handle, MMCamcorderEncodebinProfile profile)
 {
        int err = MM_ERROR_NONE;
        int result = 0;
        int channel = 0;
-       int profile = 0;
        int audio_enc = 0;
        int v_bitrate = 0;
        int a_bitrate = 0;
@@ -879,33 +931,27 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
        );
 
        /* check element availability */
-       err = mm_camcorder_get_attributes(handle, &err_name,
-                                         MMCAM_MODE, &profile,
-                                         MMCAM_AUDIO_ENCODER, &audio_enc,
-                                         MMCAM_AUDIO_CHANNEL, &channel,
-                                         MMCAM_VIDEO_ENCODER_BITRATE, &v_bitrate,
-                                         MMCAM_AUDIO_ENCODER_BITRATE, &a_bitrate,
-                                         NULL);
-       if (err != MM_ERROR_NONE) {
-               _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, err);
-               SAFE_FREE (err_name);
-               return err;
-       }
+       mm_camcorder_get_attributes(handle, &err_name,
+                                   MMCAM_AUDIO_ENCODER, &audio_enc,
+                                   MMCAM_AUDIO_CHANNEL, &channel,
+                                   MMCAM_VIDEO_ENCODER_BITRATE, &v_bitrate,
+                                   MMCAM_AUDIO_ENCODER_BITRATE, &a_bitrate,
+                                   NULL);
 
        _mmcam_dbg_log("Profile[%d]", profile);
 
        /* Set information */
-       if (profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
                str_profile = "VideoProfile";
                str_aac = "VideoAutoAudioConvert";
                str_aar = "VideoAutoAudioResample";
                str_acs = "VideoAutoColorSpace";
-       } else if (profile == MM_CAMCORDER_MODE_AUDIO) {
+       } else if (profile == MM_CAMCORDER_ENCBIN_PROFILE_AUDIO) {
                str_profile = "AudioProfile";
                str_aac = "AudioAutoAudioConvert";
                str_aar = "AudioAutoAudioResample";
                str_acs = "AudioAutoColorSpace";
-       } else if (profile == MM_CAMCORDER_MODE_IMAGE) {
+       } else if (profile == MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
                str_profile = "ImageProfile";
                str_aac = "ImageAutoAudioConvert";
                str_aar = "ImageAutoAudioResample";
@@ -927,7 +973,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "use-video-toggle", FALSE);
 
        /* Codec */
-       if (profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
                int use_venc_queue = 0;
 
                VideoencElement = _mmcamcorder_get_type_element(handle, MM_CAM_VIDEO_ENCODER);
@@ -950,59 +996,54 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
                if (use_venc_queue) {
                        _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_VENC_QUE, "use-venc-queue", err);
                }
-
-               if (!strcmp(gst_element_venc_name, "ari_h263enc")) {
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "auto-colorspace", TRUE);
-               }
        }
 
-       if (sc->is_slow == FALSE) {
-               if (profile == MM_CAMCORDER_MODE_AUDIO || profile == MM_CAMCORDER_MODE_VIDEO) {
-                       int use_aenc_queue =0;
+       if (sc->audio_disable == FALSE &&
+           profile != MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
+               int use_aenc_queue =0;
 
-                       AudioencElement = _mmcamcorder_get_type_element(handle, MM_CAM_AUDIO_ENCODER);
-                       if (!AudioencElement) {
-                               _mmcam_dbg_err("Fail to get type element");
-                               err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
-                               goto pipeline_creation_error;
-                       }
+               AudioencElement = _mmcamcorder_get_type_element(handle, MM_CAM_AUDIO_ENCODER);
+               if (!AudioencElement) {
+                       _mmcam_dbg_err("Fail to get type element");
+                       err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
+                       goto pipeline_creation_error;
+               }
 
-                       _mmcamcorder_conf_get_value_element_name(AudioencElement, &gst_element_aenc_name);
+               _mmcamcorder_conf_get_value_element_name(AudioencElement, &gst_element_aenc_name);
 
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "aenc-name", gst_element_aenc_name);
-                       _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_AENC, "audio-encode", err);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "aenc-name", gst_element_aenc_name);
+               _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_AENC, "audio-encode", err);
 
-                       if (audio_enc == MM_AUDIO_CODEC_AMR && channel == 2) {
-                               caps = gst_caps_new_simple("audio/x-raw-int",
-                                                          "channels", G_TYPE_INT, 1,
-                                                          NULL);
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "auto-audio-convert", TRUE);
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "acaps", caps);
-                               gst_caps_unref (caps);
-                               caps = NULL;
-                       }
+               if (audio_enc == MM_AUDIO_CODEC_AMR && channel == 2) {
+                       caps = gst_caps_new_simple("audio/x-raw-int",
+                                                  "channels", G_TYPE_INT, 1,
+                                                  NULL);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "auto-audio-convert", TRUE);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "acaps", caps);
+                       gst_caps_unref (caps);
+                       caps = NULL;
+               }
 
-                       if (audio_enc == MM_AUDIO_CODEC_OGG) {
-                               caps = gst_caps_new_simple("audio/x-raw-int",
-                                                          NULL);
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "auto-audio-convert", TRUE);
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "acaps", caps);
-                               gst_caps_unref (caps);
-                               caps = NULL;
-                               _mmcam_dbg_log("***** MM_AUDIO_CODEC_OGG : setting audio/x-raw-int ");
-                       }
+               if (audio_enc == MM_AUDIO_CODEC_OGG) {
+                       caps = gst_caps_new_simple("audio/x-raw-int",
+                                                  NULL);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "auto-audio-convert", TRUE);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "acaps", caps);
+                       gst_caps_unref (caps);
+                       caps = NULL;
+                       _mmcam_dbg_log("***** MM_AUDIO_CODEC_OGG : setting audio/x-raw-int ");
+               }
 
-                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
-                                                       CONFIGURE_CATEGORY_MAIN_RECORD,
-                                                       "UseAudioEncoderQueue",
-                                                       &use_aenc_queue);
-                       if (use_aenc_queue) {
-                               _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_AENC_QUE, "use-aenc-queue", err);
-                       }
+               _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                               CONFIGURE_CATEGORY_MAIN_RECORD,
+                                               "UseAudioEncoderQueue",
+                                               &use_aenc_queue);
+               if (use_aenc_queue) {
+                       _MMCAMCORDER_ENCODEBIN_ELMGET(sc, _MMCAMCORDER_ENCSINK_AENC_QUE, "use-aenc-queue", err);
                }
        }
 
-       if (profile == MM_CAMCORDER_MODE_IMAGE) {
+       if (profile == MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
                ImageencElement = _mmcamcorder_get_type_element(handle, MM_CAM_IMAGE_ENCODER);
                if (!ImageencElement) {
                        _mmcam_dbg_err("Fail to get type element");
@@ -1017,7 +1058,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
        }
 
        /* Mux */
-       if (profile == MM_CAMCORDER_MODE_AUDIO || profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile != MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
                MuxElement = _mmcamcorder_get_type_element(handle, MM_CAM_FILE_FORMAT);
                if (!MuxElement) {
                        _mmcam_dbg_err("Fail to get type element");
@@ -1036,7 +1077,8 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
        }
 
        /* Sink */
-       if (profile == MM_CAMCORDER_MODE_AUDIO || profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile != MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
+               /* for recording */
                _mmcamcorder_conf_get_element(hcamcorder->conf_main,
                                              CONFIGURE_CATEGORY_MAIN_RECORD,
                                              "RecordsinkElement",
@@ -1055,7 +1097,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
                );
        }
 
-       if (profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
                /* video encoder attribute setting */
                if (v_bitrate > 0) {
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst, "bitrate", v_bitrate);
@@ -1066,35 +1108,29 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
                _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst, VideoencElement);
        }
 
-       if (sc->is_slow == FALSE) {
-               if (profile == MM_CAMCORDER_MODE_AUDIO || profile == MM_CAMCORDER_MODE_VIDEO) {
-                       /* audio encoder attribute setting */
-                       if (a_bitrate > 0) {
-                               switch (audio_enc) {
-                               case MM_AUDIO_CODEC_AMR:
-                                       result = __mmcamcorder_get_amrnb_bitrate_mode(a_bitrate);
-
-                                       _mmcam_dbg_log("Set AMR encoder[%s] mode [%d]", gst_element_aenc_name, result);
-
-                                       if(!strcmp(gst_element_aenc_name, "ari_amrnbenc")) {
-                                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "mode", result);
-                                       } else {
-                                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "band-mode", result);
-                                       }
-                                       break;
-                               case MM_AUDIO_CODEC_AAC:
-                                       _mmcam_dbg_log("Set AAC encoder[%s] bitrate [%d]", gst_element_aenc_name, a_bitrate);
-                                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "bitrate", a_bitrate);
-                                       break;
-                               default:
-                                       _mmcam_dbg_log("Audio codec is not AMR or AAC... you need to implement setting function for audio encoder bit-rate");
-                                       break;
-                               }
-                       } else {
-                               _mmcam_dbg_warn("Setting bitrate is too small, so skip setting. Use DEFAULT value.");
+       if (sc->audio_disable == FALSE &&
+           profile != MM_CAMCORDER_ENCBIN_PROFILE_IMAGE) {
+               /* audio encoder attribute setting */
+               if (a_bitrate > 0) {
+                       switch (audio_enc) {
+                       case MM_AUDIO_CODEC_AMR:
+                               result = __mmcamcorder_get_amrnb_bitrate_mode(a_bitrate);
+                               _mmcam_dbg_log("Set AMR encoder[%s] mode [%d]", gst_element_aenc_name, result);
+                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "band-mode", result);
+                               break;
+                       case MM_AUDIO_CODEC_AAC:
+                               _mmcam_dbg_log("Set AAC encoder[%s] bitrate [%d]", gst_element_aenc_name, a_bitrate);
+                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "bitrate", a_bitrate);
+                               break;
+                       default:
+                               _mmcam_dbg_log("Audio codec is not AMR or AAC... you need to implement setting function for audio encoder bit-rate");
+                               break;
                        }
-                       _mmcamcorder_conf_set_value_element_property( sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, AudioencElement );
+               } else {
+                       _mmcam_dbg_warn("Setting bitrate is too small, so skip setting. Use DEFAULT value.");
                }
+
+               _mmcamcorder_conf_set_value_element_property(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, AudioencElement);
        }
 
        _mmcam_dbg_log("Element creation complete");
@@ -1108,7 +1144,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
 
        _mmcam_dbg_log("Element add complete");
 
-       if (profile == MM_CAMCORDER_MODE_VIDEO) {
+       if (profile == MM_CAMCORDER_ENCBIN_PROFILE_VIDEO) {
                pad = gst_element_get_request_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "video");
                if (gst_element_add_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, gst_ghost_pad_new("video_sink0", pad)) < 0) {
                        gst_object_unref(pad);
@@ -1120,7 +1156,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
                gst_object_unref(pad);
                pad = NULL;
 
-               if (sc->is_slow == FALSE) {
+               if (sc->audio_disable == FALSE) {
                        pad = gst_element_get_request_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "audio");
                        if (gst_element_add_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, gst_ghost_pad_new("audio_sink0", pad)) < 0) {
                                gst_object_unref(pad);
@@ -1132,7 +1168,7 @@ int _mmcamcorder_create_encodesink_bin(MMHandleType handle)
                        gst_object_unref(pad);
                        pad = NULL;
                }
-       } else if (profile == MM_CAMCORDER_MODE_AUDIO) {
+       } else if (profile == MM_CAMCORDER_ENCBIN_PROFILE_AUDIO) {
                pad = gst_element_get_request_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "audio");
                if (gst_element_add_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, gst_ghost_pad_new("audio_sink0", pad)) < 0) {
                        gst_object_unref(pad);
@@ -1396,27 +1432,20 @@ int _mmcamcorder_create_preview_pipeline(MMHandleType handle)
        _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
 
        /* Set data probe function */
-       srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "src");
+       srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_QUE].gst, "src");
        MMCAMCORDER_ADD_BUFFER_PROBE(srcpad, _MMCAMCORDER_HANDLER_PREVIEW,
                                     __mmcamcorder_video_dataprobe_preview, hcamcorder);
        gst_object_unref(srcpad);
        srcpad = NULL;
 
-       if (hcamcorder->type == MM_CAMCORDER_MODE_IMAGE) {
-               sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "sink");
-               MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_PREVIEW,
-                                            __mmcamcorder_video_dataprobe_vsink, hcamcorder);
-       } else if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
-               sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "sink");
-               MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_PREVIEW,
-                                            __mmcamcorder_video_dataprobe_vsink_drop_by_time, hcamcorder);
-       }
-       gst_object_unref(sinkpad);
-       sinkpad = NULL;
+       bus = gst_pipeline_get_bus(GST_PIPELINE(sc->element[_MMCAMCORDER_MAIN_PIPE].gst));
 
        /* Register message callback */
-       bus = gst_pipeline_get_bus(GST_PIPELINE(sc->element[_MMCAMCORDER_MAIN_PIPE].gst));
-       hcamcorder->pipeline_cb_event_id = gst_bus_add_watch(bus, _mmcamcorder_pipeline_cb_message, hcamcorder);
+       hcamcorder->pipeline_cb_event_id = gst_bus_add_watch(bus, _mmcamcorder_pipeline_cb_message, (gpointer)hcamcorder);
+
+       /* set sync handler */
+       gst_bus_set_sync_handler(bus, _mmcamcorder_pipeline_bus_sync_callback, (gpointer)hcamcorder);
+
        gst_object_unref(bus);
        bus = NULL;
 
@@ -1455,9 +1484,9 @@ void _mmcamcorder_negosig_handler(GstElement *videosrc, MMHandleType handle)
                sc->cam_stability_count = _MMCAMCORDER_CAMSTABLE_COUNT;
        }
 
-       if (hcamcorder->type == MM_CAMCORDER_MODE_IMAGE) {
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
                _MMCamcorderImageInfo *info = NULL;
-               info = sc->info;
+               info = sc->info_image;
                if (info->resolution_change == TRUE) {
                        _mmcam_dbg_log("open toggle of stillshot sink.");
                        MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
@@ -1478,12 +1507,13 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
        int visible = 0;
        int rotation = MM_DISPLAY_ROTATION_NONE;
        int rotation_degree = 0;
-       int display_device = MM_DISPLAY_DEVICE_MAINLCD;
-       int display_mode = 0;
+       int flip = MM_FLIP_NONE;
+       int display_mode = MM_DISPLAY_MODE_DEFAULT;
        int display_geometry_method = MM_DISPLAY_METHOD_LETTER_BOX;
        int origin_size = 0;
        int zoom_attr = 0;
        int zoom_level = 0;
+       int do_scaling = FALSE;
        int *overlay = NULL;
        gulong xid;
        char *err_name = NULL;
@@ -1513,41 +1543,42 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
                                          MMCAM_DISPLAY_RECT_WIDTH, &retwidth,
                                          MMCAM_DISPLAY_RECT_HEIGHT, &retheight,
                                          MMCAM_DISPLAY_ROTATION, &rotation,
+                                         MMCAM_DISPLAY_FLIP, &flip,
                                          MMCAM_DISPLAY_VISIBLE, &visible,
                                          MMCAM_DISPLAY_HANDLE, (void**)&overlay, &size,
-                                         MMCAM_DISPLAY_DEVICE, &display_device,
+                                         MMCAM_DISPLAY_MODE, &display_mode,
                                          MMCAM_DISPLAY_GEOMETRY_METHOD, &display_geometry_method,
                                          MMCAM_DISPLAY_SCALE, &zoom_attr,
+                                         MMCAM_DISPLAY_EVAS_DO_SCALING, &do_scaling,
                                          NULL);
        );
-       if (err != MM_ERROR_NONE) {
-               _mmcam_dbg_warn("Get display attrs fail. (%s:%x)", err_name, err);
-               SAFE_FREE(err_name);
-               return err;
-       }
 
        _mmcam_dbg_log("(overlay=%p, size=%d)", overlay, size);
 
        _mmcamcorder_conf_get_value_element_name(VideosinkElement, &videosink_name);
 
-       /* Set xid */
-       if (!strcmp(videosink_name, "xvimagesink") || !strcmp(videosink_name, "ximagesink")) {
+       /* Set display handle */
+       if (!strcmp(videosink_name, "xvimagesink") ||
+           !strcmp(videosink_name, "ximagesink")) {
                if (overlay) {
                        xid = *overlay;
                        _mmcam_dbg_log("xid = %lu )", xid);
                        gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(vsink), xid);
                } else {
-                       _mmcam_dbg_warn( "Set xid as 0.. but, it's not recommended." );
+                       _mmcam_dbg_warn("Handle is NULL. Set xid as 0.. but, it's not recommended.");
                        gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(vsink), 0);
                }
 
                _mmcam_dbg_log("%s set: display_geometry_method[%d],origin-size[%d],visible[%d],rotate[enum:%d]",
                               videosink_name, display_geometry_method, origin_size, visible, rotation);
-       } else if (!strcmp(videosink_name, "evasimagesink")) {
+       } else if (!strcmp(videosink_name, "evasimagesink") ||
+                  !strcmp(videosink_name, "evaspixmapsink")) {
+               _mmcam_dbg_log("videosink : %s, handle : %p", videosink_name, overlay);
                if (overlay) {
-                       MMCAMCORDER_G_OBJECT_SET( vsink, "evas-object", overlay );
+                       MMCAMCORDER_G_OBJECT_SET(vsink, "evas-object", overlay);
+                       MMCAMCORDER_G_OBJECT_SET(vsink, "origin-size", !do_scaling);
                } else {
-                       _mmcam_dbg_err("Evas Object pointer is NULL");
+                       _mmcam_dbg_err("display handle(eavs object) is NULL");
                        return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
                }
        } else {
@@ -1555,24 +1586,36 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
        }
 
        /* Set attribute */
-       if (!strcmp(videosink_name, "xvimagesink")) {
-               switch (rotation) {
-               case MM_DISPLAY_ROTATION_NONE :
-                       rotation_degree = 0;
-                       break;
-               case MM_DISPLAY_ROTATION_90 :
-                       rotation_degree = 1;
-                       break;
-               case MM_DISPLAY_ROTATION_180 :
-                       rotation_degree = 2;
-                       break;
-               case MM_DISPLAY_ROTATION_270 :
-                       rotation_degree = 3;
-                       break;
-               default:
-                       _mmcam_dbg_warn("Unsupported rotation value. set as default(0).");
-                       rotation_degree = 0;
-                       break;
+       if (!strcmp(videosink_name, "xvimagesink") ||
+           !strcmp(videosink_name, "evaspixmapsink")) {
+
+               if (!strcmp(videosink_name, "xvimagesink")) {
+                       /* set rotation */
+                       switch (rotation) {
+                       case MM_DISPLAY_ROTATION_NONE :
+                               rotation_degree = 0;
+                               break;
+                       case MM_DISPLAY_ROTATION_90 :
+                               rotation_degree = 1;
+                               break;
+                       case MM_DISPLAY_ROTATION_180 :
+                               rotation_degree = 2;
+                               break;
+                       case MM_DISPLAY_ROTATION_270 :
+                               rotation_degree = 3;
+                               break;
+                       default:
+                               _mmcam_dbg_warn("Unsupported rotation value. set as default(0).");
+                               rotation_degree = 0;
+                               break;
+                       }
+                       MMCAMCORDER_G_OBJECT_SET(vsink, "rotate", rotation_degree);
+
+                       /* set flip */
+                       MMCAMCORDER_G_OBJECT_SET(vsink, "flip", flip);
+
+                       _mmcam_dbg_log("set videosink[%s] rotate %d, flip %d",
+                                      videosink_name, rotation_degree, flip);
                }
 
                switch (zoom_attr) {
@@ -1591,25 +1634,9 @@ int _mmcamcorder_videosink_window_set(MMHandleType handle, type_element* Videosi
                        break;
                }
 
-               switch (display_device) {
-               case MM_DISPLAY_DEVICE_TVOUT:
-                       display_mode = 2;
-                       break;
-               case MM_DISPLAY_DEVICE_MAINLCD_AND_TVOUT:
-                       display_mode = 1;
-                       break;
-               case MM_DISPLAY_DEVICE_MAINLCD:
-               case MM_DISPLAY_DEVICE_SUBLCD:
-               case MM_DISPLAY_DEVICE_MAINLCD_AND_SUBLCD:
-               default:
-                       display_mode = 3;
-                       break;
-               }
-
                MMCAMCORDER_G_OBJECT_SET(vsink, "display-geometry-method", display_geometry_method);
                MMCAMCORDER_G_OBJECT_SET(vsink, "display-mode", display_mode);
                MMCAMCORDER_G_OBJECT_SET(vsink, "visible", visible);
-               MMCAMCORDER_G_OBJECT_SET(vsink, "rotate", rotation_degree);
                MMCAMCORDER_G_OBJECT_SET(vsink, "zoom", zoom_level);
 
                if (display_geometry_method == MM_DISPLAY_METHOD_CUSTOM_ROI) {
@@ -1704,6 +1731,8 @@ static gboolean __mmcamcorder_video_dataprobe_preview(GstPad *pad, GstBuffer *bu
        _MMCamcorderSubContext *sc = NULL;
        _MMCamcorderKPIMeasure *kpi = NULL;
 
+       mmf_return_val_if_fail(buffer, FALSE);
+       mmf_return_val_if_fail(GST_BUFFER_DATA(buffer), FALSE);
        mmf_return_val_if_fail(hcamcorder, TRUE);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(u_data);
@@ -1760,21 +1789,7 @@ static gboolean __mmcamcorder_video_dataprobe_preview(GstPad *pad, GstBuffer *bu
                }
        }
 
-       return TRUE;
-}
-
-
-static gboolean __mmcamcorder_video_dataprobe_vsink(GstPad *pad, GstBuffer *buffer, gpointer u_data)
-{
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
-
-       mmf_return_val_if_fail(hcamcorder, FALSE);
-
-       if (buffer == NULL || GST_BUFFER_DATA(buffer) == NULL) {
-               _mmcam_dbg_err("Null buffer!!");
-               return FALSE;
-       }
-
+       /* video stream callback */
        if (hcamcorder->vstream_cb && buffer) {
                GstCaps *caps = NULL;
                GstStructure *structure = NULL;
@@ -1794,6 +1809,9 @@ static gboolean __mmcamcorder_video_dataprobe_vsink(GstPad *pad, GstBuffer *buff
                        return TRUE;
                }
 
+               /* clear stream data structure */
+               memset(&stream, 0x0, sizeof(MMCamcorderVideoStreamDataType));
+
                structure = gst_caps_get_structure( caps, 0 );
                gst_structure_get_int(structure, "width", &(stream.width));
                gst_structure_get_int(structure, "height", &(stream.height));
@@ -1812,10 +1830,95 @@ static gboolean __mmcamcorder_video_dataprobe_vsink(GstPad *pad, GstBuffer *buff
                        return TRUE;
                }
 
-               stream.data = (void *)GST_BUFFER_DATA(buffer);
-               stream.length = GST_BUFFER_SIZE(buffer);
+               /* set size and timestamp */
+               stream.length_total = GST_BUFFER_SIZE(buffer);
                stream.timestamp = (unsigned int)(GST_BUFFER_TIMESTAMP(buffer)/1000000); /* nano sec -> mili sec */
 
+               /* set data pointers */
+               if (stream.format == MM_PIXEL_FORMAT_NV12 || stream.format == MM_PIXEL_FORMAT_I420) {
+                       if (hcamcorder->use_zero_copy_format && GST_BUFFER_MALLOCDATA(buffer)) {
+                               SCMN_IMGB *scmn_imgb = (SCMN_IMGB *)GST_BUFFER_MALLOCDATA(buffer);
+
+                               if (stream.format == MM_PIXEL_FORMAT_NV12) {
+                                       stream.data_type = MM_CAM_STREAM_DATA_YUV420SP;
+                                       stream.num_planes = 2;
+                                       stream.data.yuv420sp.y = scmn_imgb->a[0];
+                                       stream.data.yuv420sp.length_y = stream.width * stream.height;
+                                       stream.data.yuv420sp.uv = scmn_imgb->a[1];
+                                       stream.data.yuv420sp.length_uv = stream.data.yuv420sp.length_y >> 1;
+
+                                       _mmcam_dbg_log("SN12[num_planes:%d] [Y]p:0x%x,size:%d [UV]p:0x%x,size:%d",
+                                                      stream.num_planes,
+                                                      stream.data.yuv420sp.y, stream.data.yuv420sp.length_y,
+                                                      stream.data.yuv420sp.uv, stream.data.yuv420sp.length_uv);
+                               } else {
+                                       stream.data_type = MM_CAM_STREAM_DATA_YUV420P;
+                                       stream.num_planes = 3;
+                                       stream.data.yuv420p.y = scmn_imgb->a[0];
+                                       stream.data.yuv420p.length_y = stream.width * stream.height;
+                                       stream.data.yuv420p.u = scmn_imgb->a[1];
+                                       stream.data.yuv420p.length_u = stream.data.yuv420p.length_y >> 2;
+                                       stream.data.yuv420p.v = scmn_imgb->a[2];
+                                       stream.data.yuv420p.length_v = stream.data.yuv420p.length_u;
+
+                                       _mmcam_dbg_log("S420[num_planes:%d] [Y]p:0x%x,size:%d [U]p:0x%x,size:%d [V]p:0x%x,size:%d",
+                                                       stream.num_planes,
+                                                       stream.data.yuv420p.y, stream.data.yuv420p.length_y,
+                                                       stream.data.yuv420p.u, stream.data.yuv420p.length_u,
+                                                       stream.data.yuv420p.v, stream.data.yuv420p.length_v);
+                               }
+                       } else {
+                               if (stream.format == MM_PIXEL_FORMAT_NV12) {
+                                       stream.data_type = MM_CAM_STREAM_DATA_YUV420SP;
+                                       stream.num_planes = 2;
+                                       stream.data.yuv420sp.y = GST_BUFFER_DATA(buffer);
+                                       stream.data.yuv420sp.length_y = stream.width * stream.height;
+                                       stream.data.yuv420sp.uv = stream.data.yuv420sp.y + stream.data.yuv420sp.length_y;
+                                       stream.data.yuv420sp.length_uv = stream.data.yuv420sp.length_y >> 1;
+
+                                       _mmcam_dbg_log("NV12[num_planes:%d] [Y]p:0x%x,size:%d [UV]p:0x%x,size:%d",
+                                                      stream.num_planes,
+                                                      stream.data.yuv420sp.y, stream.data.yuv420sp.length_y,
+                                                      stream.data.yuv420sp.uv, stream.data.yuv420sp.length_uv);
+                               } else {
+                                       stream.data_type = MM_CAM_STREAM_DATA_YUV420P;
+                                       stream.num_planes = 3;
+                                       stream.data.yuv420p.y = GST_BUFFER_DATA(buffer);
+                                       stream.data.yuv420p.length_y = stream.width * stream.height;
+                                       stream.data.yuv420p.u = stream.data.yuv420p.y + stream.data.yuv420p.length_y;
+                                       stream.data.yuv420p.length_u = stream.data.yuv420p.length_y >> 2;
+                                       stream.data.yuv420p.v = stream.data.yuv420p.u + stream.data.yuv420p.length_u;
+                                       stream.data.yuv420p.length_v = stream.data.yuv420p.length_u;
+
+                                       _mmcam_dbg_log("I420[num_planes:%d] [Y]p:0x%x,size:%d [U]p:0x%x,size:%d [V]p:0x%x,size:%d",
+                                                       stream.num_planes,
+                                                       stream.data.yuv420p.y, stream.data.yuv420p.length_y,
+                                                       stream.data.yuv420p.u, stream.data.yuv420p.length_u,
+                                                       stream.data.yuv420p.v, stream.data.yuv420p.length_v);
+                               }
+                       }
+               } else {
+                       if (stream.format == MM_PIXEL_FORMAT_YUYV ||
+                           stream.format == MM_PIXEL_FORMAT_UYVY ||
+                           stream.format == MM_PIXEL_FORMAT_422P ||
+                           stream.format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                               stream.data_type = MM_CAM_STREAM_DATA_YUV422;
+                               stream.data.yuv422.yuv = GST_BUFFER_DATA(buffer);
+                               stream.data.yuv422.length_yuv = stream.length_total;
+                       } else {
+                               stream.data_type = MM_CAM_STREAM_DATA_YUV420;
+                               stream.data.yuv420.yuv = GST_BUFFER_DATA(buffer);
+                               stream.data.yuv420.length_yuv = stream.length_total;
+                       }
+
+                       stream.num_planes = 1;
+
+                       _mmcam_dbg_log("%c%c%c%c[num_planes:%d] [0]p:0x%x,size:%d",
+                                      fourcc, fourcc>>8, fourcc>>16, fourcc>>24,
+                                      stream.num_planes, stream.data.yuv420.yuv, stream.data.yuv420.length_yuv);
+               }
+
+               /* call application callback */
                _MMCAMCORDER_LOCK_VSTREAM_CALLBACK(hcamcorder);
                if (hcamcorder->vstream_cb) {
                        hcamcorder->vstream_cb(&stream, hcamcorder->vstream_cb_param);
@@ -1823,49 +1926,12 @@ static gboolean __mmcamcorder_video_dataprobe_vsink(GstPad *pad, GstBuffer *buff
                _MMCAMCORDER_UNLOCK_VSTREAM_CALLBACK(hcamcorder);
        }
 
-       return TRUE;
-}
-
-
-static gboolean __mmcamcorder_video_dataprobe_vsink_drop_by_time(GstPad *pad, GstBuffer *buffer, gpointer u_data)
-{
-       static GstClockTime next_time = 0;
-       static GstClockTime current_time = 0;
-       GstClockTime interval = 30 * GST_MSECOND; //30ms(about 33 fps)
-
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
-       _MMCamcorderSubContext *sc = NULL;
-
-       mmf_return_val_if_fail(hcamcorder, TRUE);
-
-       sc = MMF_CAMCORDER_SUBCONTEXT(u_data);
-       mmf_return_val_if_fail(sc, TRUE);
-
-/*
-       _mmcam_dbg_log("VIDEO SRC time stamp : [%" GST_TIME_FORMAT "]", GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));
-*/
-
-       /* Call video stream callback */
-       if (__mmcamcorder_video_dataprobe_vsink(pad, buffer, u_data) == FALSE) {
-               _mmcam_dbg_warn( "__mmcamcorder_video_dataprobe_vsink failed." );
-               return FALSE;
+       /* Do force flush cache */
+       if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "force-flush-cache", FALSE);
        }
 
-       if (sc->is_slow) {
-               if (GST_BUFFER_TIMESTAMP(buffer) < current_time) {
-                       next_time = 0;
-               }
-               current_time = GST_BUFFER_TIMESTAMP(buffer);
-
-               if (current_time >= next_time) {
-                       next_time = current_time + interval;
-                       return TRUE;
-               } else {
-                       return FALSE;
-               }
-       } else {
-               return TRUE;
-       }
+       return TRUE;
 }
 
 
@@ -2075,11 +2141,6 @@ bool _mmcamcorder_set_display_rotation(MMHandleType handle, int display_rotate)
                /* Get videosink name */
                _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
                if (!strcmp(videosink_name, "xvimagesink")) {
-                       if (display_rotate < MM_DISPLAY_ROTATION_NONE ||
-                           display_rotate > MM_DISPLAY_ROTATION_270) {
-                               display_rotate = 0;
-                               _mmcam_dbg_log( "Rotate: Out of range. set as default(0)...");
-                       }
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
                                                 "rotate", display_rotate);
                        _mmcam_dbg_log("Set display-rotate [%d] done.", display_rotate);
@@ -2095,6 +2156,39 @@ bool _mmcamcorder_set_display_rotation(MMHandleType handle, int display_rotate)
 }
 
 
+bool _mmcamcorder_set_display_flip(MMHandleType handle, int display_flip)
+{
+       char* videosink_name = NULL;
+
+       mmf_camcorder_t *hcamcorder = NULL;
+       _MMCamcorderSubContext *sc = NULL;
+
+       hcamcorder = MMF_CAMCORDER(handle);
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       if (sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst) {
+               /* Get videosink name */
+               _mmcamcorder_conf_get_value_element_name(sc->VideosinkElement, &videosink_name);
+               if (!strcmp(videosink_name, "xvimagesink")) {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst,
+                                                "flip", display_flip);
+                       _mmcam_dbg_log("Set display flip [%d] done.", display_flip);
+                       return TRUE;
+               } else {
+                       _mmcam_dbg_warn("videosink[%s] does not support DISPLAY_FLIP", videosink_name);
+                       return FALSE;
+               }
+       } else {
+               _mmcam_dbg_err("Videosink element is null");
+               return FALSE;
+       }
+}
+
+
 bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate)
 {
        int width = 0;
@@ -2103,8 +2197,6 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
        int set_height = 0;
        int set_rotate = 0;
        int fps = 0;
-       int slow_fps = 0;
-       int set_fps = 0;
        gboolean do_set_caps = FALSE;
 
        GstCaps *caps = NULL;
@@ -2134,7 +2226,6 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
                                    MMCAM_CAMERA_WIDTH, &width,
                                    MMCAM_CAMERA_HEIGHT, &height,
                                    MMCAM_CAMERA_FPS, &fps,
-                                   "camera-slow-motion-fps", &slow_fps,
                                    NULL);
 
        _mmcamcorder_conf_get_value_int_array(hcamcorder->conf_ctrl,
@@ -2146,48 +2237,53 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
                return FALSE;
        }
 
-       /* Define width, height, rotate and flip in caps */
-       if (input_index->default_value == MM_VIDEO_DEVICE_CAMERA1) {
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "vflip", 1);
-       } else {
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "vflip", 0);
-       }
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hflip", 0);
+       /* Interleaved format does not support rotation */
+       if (sc->info_image->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+               /* store videosrc rotation */
+               sc->videosrc_rotate = videosrc_rotate;
 
-       /* This will be applied when rotate is 0, 90, 180, 270 if rear camera.
-       This will be applied when rotate is 0, 180 if front camera. */
-       set_rotate = videosrc_rotate * 90;
+               /* Define width, height and rotate in caps */
 
-       if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_90 ||
-           videosrc_rotate == MM_VIDEO_INPUT_ROTATION_270) {
-               set_width = height;
-               set_height = width;
+               /* This will be applied when rotate is 0, 90, 180, 270 if rear camera.
+               This will be applied when rotate is 0, 180 if front camera. */
+               set_rotate = videosrc_rotate * 90;
 
-               if (input_index->default_value == MM_VIDEO_DEVICE_CAMERA1) {
-                       if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_90) {
-                               set_rotate = 270;
-                       } else {
-                               set_rotate = 90;
+               if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_90 ||
+                   videosrc_rotate == MM_VIDEO_INPUT_ROTATION_270) {
+                       set_width = height;
+                       set_height = width;
+                       if (input_index->default_value == MM_VIDEO_DEVICE_CAMERA1) {
+                               if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_90) {
+                                       set_rotate = 270;
+                               } else {
+                                       set_rotate = 90;
+                               }
                        }
+               } else {
+                       set_width = width;
+                       set_height = height;
                }
        } else {
+               sc->videosrc_rotate = MM_VIDEO_INPUT_ROTATION_NONE;
+               set_rotate = 0;
                set_width = width;
                set_height = height;
 
-               if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_FLIP_HORZ) {
-                       set_rotate = 0;
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hflip", 1);
-               } else if (videosrc_rotate == MM_VIDEO_INPUT_ROTATION_FLIP_VERT) {
-                       set_rotate = 0;
-                       if (input_index->default_value == MM_VIDEO_DEVICE_CAMERA1) {
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "vflip", 0);
-                       } else {
-                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "vflip", 1);
-                       }
-               }
+               _mmcam_dbg_warn("ITLV format doe snot support INPUT ROTATE. Ignore ROTATE[%d]",
+                               videosrc_rotate);
        }
 
-       set_fps = sc->is_slow ? slow_fps : fps;
+       /* correct size because ITLV does not support QCIF */
+       if (input_index->default_value == MM_VIDEO_DEVICE_CAMERA0 &&
+           sc->fourcc == GST_MAKE_FOURCC('I','T','L','V')) {
+               if ((set_width == 176 && set_height == 144) ||
+                   (set_width == 144 && set_height == 176)) {
+                       set_width = set_width << 1;
+                       set_height = set_height << 1;
+                       _mmcam_dbg_log("ITLV format is not supported QCIF, so we set CIF(%dx%d)",
+                                      set_width, set_height);
+               }
+       }
 
        MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", &caps);
        if (caps) {
@@ -2205,7 +2301,7 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
                        gst_structure_get_int(structure, "fps", &caps_fps);
                        gst_structure_get_int(structure, "rotate", &caps_rotate);
                        if (set_width == caps_width && set_height == caps_height &&
-                           set_rotate == caps_rotate && set_fps == caps_fps) {
+                           set_rotate == caps_rotate && fps == caps_fps) {
                                _mmcam_dbg_log("No need to replace caps.");
                        } else {
                                _mmcam_dbg_log("something is different. set new one...");
@@ -2228,7 +2324,7 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
                                           "format", GST_TYPE_FOURCC, sc->fourcc,
                                           "width", G_TYPE_INT, set_width,
                                           "height", G_TYPE_INT, set_height,
-                                          "framerate", GST_TYPE_FRACTION, set_fps, 1,
+                                          "framerate", GST_TYPE_FRACTION, fps, 1,
                                           "rotate", G_TYPE_INT, set_rotate,
                                           NULL);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
@@ -2236,8 +2332,158 @@ bool _mmcamcorder_set_videosrc_rotation(MMHandleType handle, int videosrc_rotate
                caps = NULL;
                _mmcam_dbg_log("vidoesrc new caps set. format[%c%c%c%c],width[%d],height[%d],fps[%d],rotate[%d]",
                               (sc->fourcc), (sc->fourcc)>>8, (sc->fourcc)>>16, (sc->fourcc)>>24,
-                              set_width, set_height, set_fps, set_rotate);
+                              set_width, set_height, fps, set_rotate);
        }
 
        return TRUE;
 }
+
+
+bool _mmcamcorder_set_videosrc_flip(MMHandleType handle, int videosrc_flip)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+       type_int_array *input_index = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, TRUE);
+
+       _mmcam_dbg_log("Set FLIP %d", videosrc_flip);
+
+       if (sc->element && sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
+               int hflip = 0;
+               int vflip = 0;
+
+               /* Interleaved format does not support FLIP */
+               if (sc->info_image->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                       _mmcamcorder_conf_get_value_int_array(hcamcorder->conf_ctrl,
+                                                             CONFIGURE_CATEGORY_CTRL_CAMERA,
+                                                             "InputIndex",
+                                                             &input_index );
+
+                       hflip = (videosrc_flip & MM_FLIP_HORIZONTAL) == MM_FLIP_HORIZONTAL;
+                       vflip = (videosrc_flip & MM_FLIP_VERTICAL) == MM_FLIP_VERTICAL;
+
+                       _mmcam_dbg_log("videosrc flip H:%d, V:%d", hflip, vflip);
+
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hflip", hflip);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "vflip", vflip);
+               } else {
+                       _mmcam_dbg_warn("ITLV format does not support FLIP. Ignore FLIP[%d]",
+                                       videosrc_flip);
+               }
+       } else {
+               _mmcam_dbg_warn("element is NULL");
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+
+bool _mmcamcorder_set_videosrc_anti_shake(MMHandleType handle, int anti_shake)
+{
+       GstCameraControl *control = NULL;
+       _MMCamcorderSubContext *sc = NULL;
+       GstElement *v_src = NULL;
+
+       int set_value = 0;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, TRUE);
+
+       v_src = sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst;
+
+       if (!v_src) {
+               _mmcam_dbg_warn("videosrc element is NULL");
+               return FALSE;
+       }
+
+       set_value = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_ANTI_HANDSHAKE, anti_shake);
+
+       /* set anti-shake with camera control */
+       if (!GST_IS_CAMERA_CONTROL(v_src)) {
+               _mmcam_dbg_warn("Can't cast Video source into camera control.");
+               return FALSE;
+       }
+
+       control = GST_CAMERA_CONTROL(v_src);
+       if (gst_camera_control_set_ahs(control, set_value)) {
+               _mmcam_dbg_log("Succeed in operating anti-handshake. value[%d]", set_value);
+               return TRUE;
+       } else {
+               _mmcam_dbg_warn("Failed to operate anti-handshake. value[%d]", set_value);
+       }
+
+       return FALSE;
+}
+
+
+bool _mmcamcorder_set_videosrc_stabilization(MMHandleType handle, int stabilization)
+{
+       _MMCamcorderSubContext *sc = NULL;
+       GstElement *v_src = NULL;
+
+       mmf_return_val_if_fail(handle, FALSE);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc, TRUE);
+
+       v_src = sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst;
+
+       if (!v_src) {
+               _mmcam_dbg_warn("videosrc element is NULL");
+               return FALSE;
+       }
+
+       /* check property of videosrc element - support VDIS */
+       if(g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(v_src)), "enable-vdis-mode")) {
+               int camera_format =MM_PIXEL_FORMAT_INVALID;
+               int camera_width = 0;
+               int camera_height = 0;
+
+               if (stabilization == MM_CAMCORDER_VIDEO_STABILIZATION_ON) {
+                       _mmcam_dbg_log("ENABLE video stabilization");
+
+                       /* VDIS mode only supports NV12 and [720p or 1080p] */
+                       mm_camcorder_get_attributes(handle, NULL,
+                                                   MMCAM_CAMERA_FORMAT, &camera_format,
+                                                   MMCAM_CAMERA_WIDTH, &camera_width,
+                                                   MMCAM_CAMERA_HEIGHT, &camera_height,
+                                                   NULL);
+                       if (camera_format == MM_PIXEL_FORMAT_NV12 &&
+                           camera_width >= 1280 &&
+                           camera_height >= 720) {
+                               _mmcam_dbg_log("preview format %d, size %dx%d, ENABLE video stabilization",
+                                              camera_format, camera_width, camera_height, stabilization);
+                               /* set vdis mode */
+                               g_object_set(G_OBJECT(v_src),
+                                            "enable-vdis-mode", TRUE,
+                                            NULL);
+                       } else {
+                               _mmcam_dbg_warn("invalid preview format %d or size %dx%d",
+                                               camera_format, camera_width, camera_height);
+                               return FALSE;
+                       }
+               } else {
+                       /* set vdis mode */
+                       g_object_set(G_OBJECT(v_src),
+                                    "enable-vdis-mode", FALSE,
+                                    NULL);
+
+                       _mmcam_dbg_log("DISABLE video stabilization");
+               }
+       } else if (stabilization == MM_CAMCORDER_VIDEO_STABILIZATION_ON) {
+               _mmcam_dbg_err("no property for video stabilization, so can not set ON");
+               return FALSE;
+       } else {
+               _mmcam_dbg_warn("no property for video stabilization");
+       }
+
+       return TRUE;
+}
+
index 50528e9..bc1b1f1 100644 (file)
@@ -47,9 +47,9 @@
 /*---------------------------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS for internal                                           |
 ---------------------------------------------------------------------------------------*/
-
-//#define _MMCAM_USING_CAPTUREMODE
-#define __MMCAMCORDER_CMD_ITERATE_MAX  3
+#define __MMCAMCORDER_CMD_ITERATE_MAX           3
+#define __MMCAMCORDER_SECURITY_HANDLE_DEFAULT   -1
+#define __MMCAMCORDER_SET_GST_STATE_TIMEOUT     5
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                |
@@ -68,12 +68,16 @@ static gboolean __mmcamcorder_handle_gst_warning(MMHandleType handle, GstMessage
 static int      __mmcamcorder_asm_get_event_type(int sessionType);
 static void     __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder);
 static void     __mmcamcorder_force_resume(mmf_camcorder_t *hcamcorder);
-ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
-                                          ASM_sound_commands_t command,
-                                          unsigned int sound_status, void *cb_data);
-
+ASM_cb_result_t _mmcamcorder_asm_callback_sh(int handle, ASM_event_sources_t event_src,
+                                             ASM_sound_commands_t command,
+                                             unsigned int sound_status, void *cb_data);
+ASM_cb_result_t _mmcamcorder_asm_callback_ex(int handle, ASM_event_sources_t event_src,
+                                             ASM_sound_commands_t command,
+                                             unsigned int sound_status, void *cb_data);
+
+#ifdef _MMCAMCORDER_USE_SET_ATTR_CB
 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data);
-
+#endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
 
 /*=======================================================================================
 |  FUNCTION DEFINITIONS                                                                        |
@@ -87,19 +91,24 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
 {
        int ret = MM_ERROR_NONE;
        int UseConfCtrl = 0;
-       int sessionType = MM_SESSION_TYPE_EXCLUSIVE;
+       int sessionType = MM_SESSION_TYPE_SHARE;
        int errorcode = MM_ERROR_NONE;
        int rcmd_fmt_capture = MM_PIXEL_FORMAT_YUYV;
        int rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
        int rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
+       int play_capture_sound = TRUE;
+       int camera_device_count = MM_VIDEO_DEVICE_NUM;
+       int camera_facing_direction = MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR;
        char *err_attr_name = NULL;
        char *ConfCtrlFile = NULL;
        mmf_camcorder_t *hcamcorder = NULL;
        ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
+       type_element *EvasSurfaceElement = NULL;
 
        _mmcam_dbg_log("Entered");
 
-       mmf_return_val_if_fail( handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT );
+       mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+       mmf_return_val_if_fail(info, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
 
        /* Create mmf_camcorder_t handle and initialize every variable */
        hcamcorder = (mmf_camcorder_t *)malloc(sizeof(mmf_camcorder_t));
@@ -107,10 +116,10 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
        memset(hcamcorder, 0x00, sizeof(mmf_camcorder_t));
 
        /* init values */
-       hcamcorder->type=0;
-       hcamcorder->state=MM_CAMCORDER_STATE_NULL;
-       hcamcorder->sub_context=NULL;
-       hcamcorder->target_state=MM_CAMCORDER_STATE_NULL;
+       hcamcorder->type = 0;
+       hcamcorder->state = MM_CAMCORDER_STATE_NONE;
+       hcamcorder->sub_context = NULL;
+       hcamcorder->target_state = MM_CAMCORDER_STATE_NULL;
 
        /* thread - for g_mutex_new() */
        if (!g_thread_supported()) {
@@ -144,29 +153,34 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
 
        /* Check and register ASM */
        if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
-               _mmcam_dbg_warn("Read _mm_session_util_read_type failed. use default \"exclusive\" type");
-               sessionType = MM_SESSION_TYPE_EXCLUSIVE;
-               if (MM_ERROR_NONE != mm_session_init(sessionType)) {
-                       _mmcam_dbg_err("mm_session_init() failed");
-                       ret = MM_ERROR_POLICY_INTERNAL;
-                       goto _ERR_DEFAULT_VALUE_INIT;
-               }
+               _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+               sessionType = MM_SESSION_TYPE_SHARE;
        }
+
+       /* Call will not be interrupted. so does not need callback function */
        if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
-               int asm_session_type = ASM_EVENT_NONE;
-               int asm_handle;
                int pid = -1; /* process id of itself */
 
-               asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
-               /* Call will not be interrupted. so does not need callback function */
-               if (!ASM_register_sound(pid, &asm_handle, asm_session_type, ASM_STATE_NONE,
-                                       (ASM_sound_cb_t)_mmcamcorder_asm_callback,
+               /* set SHARE session */
+               if (!ASM_register_sound(pid, &(hcamcorder->asm_handle_sh), ASM_EVENT_SHARE_MMCAMCORDER, ASM_STATE_NONE,
+                                       (ASM_sound_cb_t)_mmcamcorder_asm_callback_sh,
                                        (void*)hcamcorder, mm_resource, &errorcode)) {
-                       _mmcam_dbg_err("ASM_register_sound() failed[%x]", errorcode);
+                       _mmcam_dbg_err("SHARE ASM_register_sound() failed[%x]", errorcode);
                        ret = MM_ERROR_POLICY_INTERNAL;
                        goto _ERR_DEFAULT_VALUE_INIT;
                }
-               hcamcorder->asm_handle = asm_handle;
+
+               /* set EXCLUSIVE session */
+               if (!ASM_register_sound(pid, &(hcamcorder->asm_handle_ex), ASM_EVENT_EXCLUSIVE_MMCAMCORDER, ASM_STATE_NONE,
+                                       (ASM_sound_cb_t)_mmcamcorder_asm_callback_ex,
+                                       (void*)hcamcorder, mm_resource, &errorcode)) {
+                       _mmcam_dbg_err("EXCLUSIVE ASM_register_sound() failed[%x]", errorcode);
+                       ret = MM_ERROR_POLICY_INTERNAL;
+                       goto _ERR_DEFAULT_VALUE_INIT;
+               }
+
+               _mmcam_dbg_log("ASM handle - SHARE %d, EXCLUSIVE %d",
+                              hcamcorder->asm_handle_sh, hcamcorder->asm_handle_ex);
        }
 
        /* Get Camera Configure information from Camcorder INI file */
@@ -181,8 +195,8 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
                goto _ERR_AUDIO_BLOCKED;
        }
 
-       __ta__("    _mmcamcorder_alloc_attribute",   
-       hcamcorder->attributes= _mmcamcorder_alloc_attribute((MMHandleType)hcamcorder, info);
+       __ta__("    _mmcamcorder_alloc_attribute",
+       hcamcorder->attributes = _mmcamcorder_alloc_attribute((MMHandleType)hcamcorder, info);
        );
        if (!(hcamcorder->attributes)) {
                _mmcam_dbg_err("_mmcamcorder_create::alloc attribute error.");
@@ -247,6 +261,62 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
                        if (ret != MM_ERROR_NONE) {
                                _mmcam_dbg_warn("converting table initialize error!!");
                        }
+
+                       /* Get device info, recommend preview fmt and display rotation from INI */
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
+                                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
+                                                       "RecommendPreviewFormatCapture",
+                                                       &rcmd_fmt_capture);
+
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
+                                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
+                                                       "RecommendPreviewFormatRecord",
+                                                       &rcmd_fmt_recording);
+
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
+                                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
+                                                       "RecommendDisplayRotation",
+                                                       &rcmd_dpy_rotation);
+
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                                       CONFIGURE_CATEGORY_MAIN_CAPTURE,
+                                                       "PlayCaptureSound",
+                                                       &play_capture_sound);
+
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                                       CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
+                                                       "DeviceCount",
+                                                       &camera_device_count);
+
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
+                                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
+                                                       "FacingDirection",
+                                                       &camera_facing_direction);
+
+                       _mmcam_dbg_log("Recommend fmt[cap:%d,rec:%d], dpy rot[%d], cap snd[%d], dev cnt[%d], cam facing dir[%d]",
+                                      rcmd_fmt_capture, rcmd_fmt_recording, rcmd_dpy_rotation,
+                                      play_capture_sound, camera_device_count, camera_facing_direction);
+
+                       mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
+                                                   MMCAM_CAMERA_DEVICE_COUNT, camera_device_count,
+                                                   MMCAM_CAMERA_FACING_DIRECTION, camera_facing_direction,
+                                                   MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, rcmd_fmt_capture,
+                                                   MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, rcmd_fmt_recording,
+                                                   MMCAM_RECOMMEND_DISPLAY_ROTATION, rcmd_dpy_rotation,
+                                                   "capture-sound-enable", play_capture_sound,
+                                                   NULL);
+                       if (err_attr_name) {
+                               _mmcam_dbg_err("Set %s FAILED.", err_attr_name);
+                               free(err_attr_name);
+                               err_attr_name = NULL;
+                       }
+
+                       /* Get UseZeroCopyFormat value from INI */
+                       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                                       CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
+                                                       "UseZeroCopyFormat",
+                                                       &(hcamcorder->use_zero_copy_format));
+                       _mmcam_dbg_log("UseZeroCopyFormat : %d", hcamcorder->use_zero_copy_format);
                }
                else
                {
@@ -264,53 +334,6 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
                goto _ERR_ALLOC_ATTRIBUTE;
        }
 
-       /* Get recommend preview format and display rotation from INI */
-       rcmd_fmt_capture   = MM_PIXEL_FORMAT_YUYV;
-       rcmd_fmt_recording = MM_PIXEL_FORMAT_NV12;
-       rcmd_dpy_rotation = MM_DISPLAY_ROTATION_270;
-       err_attr_name = NULL;
-
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
-                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
-                                       "RecommendPreviewFormatCapture",
-                                       &rcmd_fmt_capture);
-
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
-                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
-                                       "RecommendPreviewFormatRecord",
-                                       &rcmd_fmt_recording);
-
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
-                                       CONFIGURE_CATEGORY_CTRL_CAMERA,
-                                       "RecommendDisplayRotation",
-                                       &rcmd_dpy_rotation);
-
-       _mmcam_dbg_log("Recommend prv[capture:%d,recording:%d], rot[%d]",
-                       rcmd_fmt_capture, rcmd_fmt_recording, rcmd_dpy_rotation);
-
-       ret = mm_camcorder_set_attributes((MMHandleType)hcamcorder, &err_attr_name,
-                                         MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, rcmd_fmt_capture,
-                                         MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, rcmd_fmt_recording,
-                                         MMCAM_RECOMMEND_DISPLAY_ROTATION, rcmd_dpy_rotation,
-                                         NULL);
-       if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_err( "Set %s FAILED.", err_attr_name );
-               if (err_attr_name != NULL) {
-                       free( err_attr_name );
-                       err_attr_name = NULL;
-               }
-
-               goto _ERR_ALLOC_ATTRIBUTE;
-       }
-
-       /* Get UseZeroCopyFormat value from INI */
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
-                                       CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
-                                       "UseZeroCopyFormat",
-                                       &(hcamcorder->use_zero_copy_format));
-       _mmcam_dbg_log("UseZeroCopyFormat : %d", hcamcorder->use_zero_copy_format);
-       
-
        /* Make some attributes as read-only type */
        __ta__( "    _mmcamcorder_lock_readonly_attributes",
        _mmcamcorder_lock_readonly_attributes((MMHandleType)hcamcorder);
@@ -330,6 +353,30 @@ int _mmcamcorder_create(MMHandleType *handle, MMCamPreset *info)
                _mmcamcorder_create_command_loop((MMHandleType)hcamcorder);
        }
 
+       /* Get videosink name for evas surface */
+       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
+                                     CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+                                     "VideosinkElementEvas",
+                                     &EvasSurfaceElement);
+       if (EvasSurfaceElement) {
+               int attr_index = 0;
+               char *evassink_name = NULL;
+               mmf_attribute_t *item_evassink_name = NULL;
+               mmf_attrs_t *attrs = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(hcamcorder);
+
+               _mmcamcorder_conf_get_value_element_name(EvasSurfaceElement, &evassink_name);
+               mm_attrs_get_index((MMHandleType)attrs, MMCAM_DISPLAY_EVAS_SURFACE_SINK, &attr_index);
+               item_evassink_name = &attrs->items[attr_index];
+               mmf_attribute_set_string(item_evassink_name, evassink_name, strlen(evassink_name));
+               mmf_attribute_commit(item_evassink_name);
+
+               _mmcam_dbg_log("Evassink name : %s", evassink_name);
+       }
+
+       /* get shutter sound policy */
+       vconf_get_int(VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY, &hcamcorder->shutter_sound_policy);
+       _mmcam_dbg_log("current shutter sound policy : %d", hcamcorder->shutter_sound_policy);
+
        /* Set initial state */
        _mmcamcorder_set_state((MMHandleType)hcamcorder, MM_CAMCORDER_STATE_NULL);
        _mmcam_dbg_log("_mmcamcorder_set_state");
@@ -342,17 +389,22 @@ _ERR_ALLOC_ATTRIBUTE:
 _ERR_AUDIO_BLOCKED:
        /* unregister audio session manager */
        {
-               sessionType = MM_SESSION_TYPE_EXCLUSIVE;
                errorcode = MM_ERROR_NONE;
                if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
-                       sessionType = MM_SESSION_TYPE_EXCLUSIVE;
+                       _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+                       sessionType = MM_SESSION_TYPE_SHARE;
                }
 
                if((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
-                       int asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
-                       if (!ASM_unregister_sound(hcamcorder->asm_handle, asm_session_type, &errorcode)) {
-                               _mmcam_dbg_err("ASM_unregister_sound() failed(hdl:%p, stype:%d, err:%x)",
-                                              (void*)hcamcorder->asm_handle, sessionType, errorcode);
+                       /* unregister SHARE session */
+                       if (!ASM_unregister_sound(hcamcorder->asm_handle_sh, ASM_EVENT_SHARE_MMCAMCORDER, &errorcode)) {
+                               _mmcam_dbg_err("ASM_unregister_sound() SHARE failed(hdl:%p, stype:%d, err:%x)",
+                                              (void*)hcamcorder->asm_handle_sh, sessionType, errorcode);
+                       }
+                       /* unregister EXCLUSIVE session */
+                       if (!ASM_unregister_sound(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER, &errorcode)) {
+                               _mmcam_dbg_err("ASM_unregister_sound() EXCLUSIVE failed(hdl:%p, stype:%d, err:%x)",
+                                              (void*)hcamcorder->asm_handle_ex, sessionType, errorcode);
                        }
                }
        }
@@ -382,11 +434,10 @@ int _mmcamcorder_destroy(MMHandleType handle)
        int state = MM_CAMCORDER_STATE_NONE;
        int state_FROM = MM_CAMCORDER_STATE_NULL;
        int state_TO = MM_CAMCORDER_STATE_NONE;
-       int asm_session_type = ASM_EVENT_EXCLUSIVE_MMCAMCORDER;
        int sessionType = MM_SESSION_TYPE_SHARE;
        int errorcode = MM_ERROR_NONE;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _MMCamcorderMsgItem msg;
 
        _mmcam_dbg_log("");
 
@@ -416,12 +467,6 @@ int _mmcamcorder_destroy(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
-       /* Release sound handle */
-       __ta__("_mmcamcorder_sound_finalize",
-       ret = _mmcamcorder_sound_finalize(handle);
-       );
-       _mmcam_dbg_log("sound finalize [%d]", ret);
-
        /* Release SubContext and pipeline */
        if (hcamcorder->sub_context) {
                if (hcamcorder->sub_context->element) {
@@ -472,13 +517,20 @@ int _mmcamcorder_destroy(MMHandleType handle)
 
        /* Unregister ASM */
        if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
-               _mmcam_dbg_err("_mm_session_util_read_type Fail");
+               _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+               sessionType = MM_SESSION_TYPE_SHARE;
        }
        if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
-               asm_session_type = __mmcamcorder_asm_get_event_type(sessionType);
-               if (!ASM_unregister_sound(hcamcorder->asm_handle, asm_session_type, &errorcode)) {
-                       _mmcam_dbg_err("ASM_unregister_sound() failed(hdl:%p, stype:%d, err:%x)",
-                                      (void*)hcamcorder->asm_handle, sessionType, errorcode);
+               /* unregister SHARE session */
+               if (!ASM_unregister_sound(hcamcorder->asm_handle_sh, ASM_EVENT_SHARE_MMCAMCORDER, &errorcode)) {
+                       _mmcam_dbg_err("SHARE ASM_unregister_sound() failed(hdl:%p, err:%x)",
+                                      (void*)hcamcorder->asm_handle_sh, errorcode);
+               }
+
+               /* unregister EXCLUSIVE session */
+               if (!ASM_unregister_sound(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER, &errorcode)) {
+                       _mmcam_dbg_err("EXCLUSIVE ASM_unregister_sound() failed(hdl:%p, err:%x)",
+                                      (void*)hcamcorder->asm_handle_ex, errorcode);
                }
        }
 
@@ -537,18 +589,12 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
 _ERR_CAMCORDER_CMD_PRECON:
-       /*send message*/
        if (hcamcorder) {
-               _mmcam_dbg_err("Destroy fail (%d, %d)", hcamcorder->type, state);
-               msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-               msg.param.state.previous = state;
-               msg.param.state.current  = state;
-               msg.param.state.code = ret;
-               _mmcamcroder_send_message(handle, &msg);
-       } else {
-               _mmcam_dbg_err("Destroy fail (%d)", state);
+               _mmcam_dbg_err("Destroy fail (type %d, state %d)", hcamcorder->type, state);
        }
 
+       _mmcam_dbg_err("Destroy fail (ret %x)", ret);
+
        return ret;
 }
 
@@ -559,12 +605,13 @@ int _mmcamcorder_realize(MMHandleType handle)
        int state = MM_CAMCORDER_STATE_NONE;
        int state_FROM = MM_CAMCORDER_STATE_NULL;
        int state_TO = MM_CAMCORDER_STATE_READY;
-       int sessionType = MM_SESSION_TYPE_EXCLUSIVE;
+       int sessionType = MM_SESSION_TYPE_SHARE;
        int errorcode = MM_ERROR_NONE;
        int display_surface_type = MM_DISPLAY_SURFACE_X;
+       double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
        char *videosink_element_type = NULL;
        char *videosink_name = NULL;
-       _MMCamcorderMsgItem msg;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -595,6 +642,18 @@ int _mmcamcorder_realize(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN);
+       }
+
        /* Set async state */
        ret = _mmcamcorder_set_async_state(handle, state_TO);
        if (ret < 0) {
@@ -602,37 +661,37 @@ int _mmcamcorder_realize(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
+       mm_camcorder_get_attributes(handle, NULL,
+                                   MMCAM_MODE, &hcamcorder->type,
+                                   MMCAM_DISPLAY_SURFACE, &display_surface_type,
+                                   MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
+                                   NULL);
+
        /* Get profile mode */
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_MODE, &hcamcorder->type, NULL);
        _mmcam_dbg_log("Profile mode set is (%d)", hcamcorder->type);
 
-       /* Check and register ASM */
+       /* Check and make SHARE session as PLAYING */
        if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
-               _mmcam_dbg_warn("Read _mm_session_util_read_type failed. use default \"exclusive\" type");
-               sessionType = MM_SESSION_TYPE_EXCLUSIVE;
+               _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+               sessionType = MM_SESSION_TYPE_SHARE;
        }
        if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
-               int asm_session_type = ASM_EVENT_NONE;
                ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
                
-               asm_session_type = __mmcamcorder_asm_get_event_type(sessionType);
                switch (hcamcorder->type) {
-               case MM_CAMCORDER_MODE_VIDEO:
-                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
-                       break;
                case MM_CAMCORDER_MODE_AUDIO:
                        mm_resource = ASM_RESOURCE_NONE;
                        break;
-               case MM_CAMCORDER_MODE_IMAGE:
+               case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
                default:
-                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY;
+                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
                        break;
                }
 
-               if (!ASM_set_sound_state(hcamcorder->asm_handle, asm_session_type,
+               if (!ASM_set_sound_state(hcamcorder->asm_handle_sh, ASM_EVENT_SHARE_MMCAMCORDER,
                                         ASM_STATE_PLAYING, mm_resource, &errorcode)) {
-                       debug_error("Set state to playing failed 0x%X\n", errorcode);
-                       ret =  MM_ERROR_POLICY_BLOCKED;
+                       _mmcam_dbg_err("Set state to playing failed 0x%x", errorcode);
+                       ret = MM_ERROR_POLICY_BLOCKED;
                        goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
                }
        }
@@ -645,7 +704,15 @@ int _mmcamcorder_realize(MMHandleType handle)
        }
 
        /* Set basic configure information */
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_DISPLAY_SURFACE, &display_surface_type, NULL);
+       if (motion_rate != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
+               hcamcorder->sub_context->is_modified_rate = TRUE;
+       }
+
+       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
+                                       CONFIGURE_CATEGORY_MAIN_CAPTURE,
+                                       "UseEncodebin",
+                                       &(hcamcorder->sub_context->bencbin_capture));
+
        switch (display_surface_type) {
        case MM_DISPLAY_SURFACE_X:
                videosink_element_type = strdup("VideosinkElementX");
@@ -663,18 +730,28 @@ int _mmcamcorder_realize(MMHandleType handle)
                videosink_element_type = strdup("VideosinkElementX");
                break;
        }
-       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
-                                     CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
-                                     videosink_element_type,
-                                     &hcamcorder->sub_context->VideosinkElement );
-       _mmcamcorder_conf_get_value_element_name( hcamcorder->sub_context->VideosinkElement, &videosink_name );
-       _mmcam_dbg_log( "Videosink name : %s", videosink_name );
 
+       /* check string of videosink element */
        if (videosink_element_type) {
+               _mmcamcorder_conf_get_element(hcamcorder->conf_main,
+                                             CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+                                             videosink_element_type,
+                                             &hcamcorder->sub_context->VideosinkElement);
                free(videosink_element_type);
                videosink_element_type = NULL;
+       } else {
+               _mmcam_dbg_warn("strdup failed(display_surface_type %d). Use default X type",
+                               display_surface_type);
+
+               _mmcamcorder_conf_get_element(hcamcorder->conf_main,
+                                             CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+                                             _MMCAMCORDER_DEFAULT_VIDEOSINK_TYPE,
+                                             &hcamcorder->sub_context->VideosinkElement );
        }
 
+       _mmcamcorder_conf_get_value_element_name(hcamcorder->sub_context->VideosinkElement, &videosink_name);
+       _mmcam_dbg_log("Videosink name : %s", videosink_name);
+
        _mmcamcorder_conf_get_value_int(hcamcorder->conf_ctrl,
                                        CONFIGURE_CATEGORY_CTRL_CAPTURE,
                                        "SensorEncodedCapture",
@@ -685,7 +762,14 @@ int _mmcamcorder_realize(MMHandleType handle)
        __ta__("    _mmcamcorder_create_pipeline",
        ret = _mmcamcorder_create_pipeline(handle, hcamcorder->type);
        );
-       if(ret<0) {
+       if (ret != MM_ERROR_NONE) {
+               /* check internal error of gstreamer */
+               if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
+                       ret = hcamcorder->sub_context->error_code;
+                       _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
+               }
+
+               /* release sub context */
                _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
                hcamcorder->sub_context = NULL;
                goto _ERR_CAMCORDER_CMD;
@@ -693,8 +777,7 @@ int _mmcamcorder_realize(MMHandleType handle)
 
        /* set command function */
        ret = _mmcamcorder_set_functions(handle, hcamcorder->type);
-
-       if(ret<0) {
+       if (ret != MM_ERROR_NONE) {
                _mmcamcorder_destroy_pipeline(handle, hcamcorder->type);
                _mmcamcorder_dealloc_subcontext(hcamcorder->sub_context);
                hcamcorder->sub_context = NULL;
@@ -702,6 +785,7 @@ int _mmcamcorder_realize(MMHandleType handle)
        }
 
        _mmcamcorder_set_state(handle, state_TO);
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -714,14 +798,20 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
        
 _ERR_CAMCORDER_CMD_PRECON:
-       /* send message */
-       _mmcam_dbg_err("Realize fail (%d, %d, %x)", hcamcorder->type, state, ret);
+       _mmcam_dbg_err("Realize fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       /* rollback camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL);
+       }
 
        return ret;
 }
@@ -734,9 +824,8 @@ int _mmcamcorder_unrealize(MMHandleType handle)
        int state_FROM = MM_CAMCORDER_STATE_READY;
        int state_TO = MM_CAMCORDER_STATE_NULL;
        int sessionType = MM_SESSION_TYPE_SHARE;
-       int asm_session_type = ASM_EVENT_NONE;
        ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
-       _MMCamcorderMsgItem msg;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -767,12 +856,6 @@ int _mmcamcorder_unrealize(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
-       /* Release sound handle */
-       __ta__("_mmcamcorder_sound_finalize",
-       ret = _mmcamcorder_sound_finalize(handle);
-       );
-       _mmcam_dbg_log("sound finalize [%d]", ret);
-
        /* Release SubContext */
        if (hcamcorder->sub_context) {
                /* destroy pipeline */
@@ -786,36 +869,49 @@ int _mmcamcorder_unrealize(MMHandleType handle)
 
        hcamcorder->command = NULL;
 
-       if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
-               _mmcam_dbg_err("_mm_session_util_read_type Fail\n");
-       }
-
-       if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
-               asm_session_type = ASM_EVENT_NONE;
-               mm_resource = ASM_RESOURCE_NONE;
-               asm_session_type = __mmcamcorder_asm_get_event_type( sessionType );
-
-               switch (hcamcorder->type) {
-               case MM_CAMCORDER_MODE_VIDEO:
-                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
-                       break;
-               case MM_CAMCORDER_MODE_AUDIO:
-                       mm_resource = ASM_RESOURCE_NONE;
-                       break;
-               case MM_CAMCORDER_MODE_IMAGE:
-               default:
-                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY;
-                       break;
+       /* check who calls unrealize. it's no need to set ASM state if caller is ASM */
+       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
+               if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
+                       _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+                       sessionType = MM_SESSION_TYPE_SHARE;
                }
 
                /* Call session is not ended here */
-               if (!ASM_set_sound_state(hcamcorder->asm_handle, asm_session_type,
-                                        ASM_STATE_STOP, mm_resource, &ret)) {
-                       _mmcam_dbg_err("Set state to playing failed 0x%X\n", ret);
+               if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
+                       mm_resource = ASM_RESOURCE_NONE;
+
+                       switch (hcamcorder->type) {
+                       case MM_CAMCORDER_MODE_AUDIO:
+                               mm_resource = ASM_RESOURCE_NONE;
+                               break;
+                       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+                       default:
+                               mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+                               break;
+                       }
+
+                       /* STOP SHARE session */
+                       if (!ASM_set_sound_state(hcamcorder->asm_handle_sh, ASM_EVENT_SHARE_MMCAMCORDER,
+                                                ASM_STATE_STOP, mm_resource, &ret)) {
+                               _mmcam_dbg_err("SHARE Set state to STOP failed 0x%x", ret);
+                       }
                }
        }
 
        _mmcamcorder_set_state(handle, state_TO);
+
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_NULL);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_NULL);
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -825,13 +921,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Unrealize fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Unrealize fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -842,7 +933,7 @@ int _mmcamcorder_start(MMHandleType handle)
        int state = MM_CAMCORDER_STATE_NONE;
        int state_FROM = MM_CAMCORDER_STATE_READY;
        int state_TO =MM_CAMCORDER_STATE_PREPARE;
-       _MMCamcorderMsgItem msg;
+
        _MMCamcorderSubContext *sc = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
@@ -877,6 +968,9 @@ int _mmcamcorder_start(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
+       /* initialize error code */
+       hcamcorder->sub_context->error_code = MM_ERROR_NONE;
+
        /* set async state */
        ret = _mmcamcorder_set_async_state(handle, state_TO);
        if (ret != MM_ERROR_NONE) {
@@ -892,7 +986,18 @@ int _mmcamcorder_start(MMHandleType handle)
        _mmcamcorder_set_state(handle, state_TO);
 
        if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
                _mmcamcorder_set_attribute_to_camsensor(handle);
+
+               /* check camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+
+               /* set camera state to vconf key */
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
        }
 
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
@@ -907,14 +1012,16 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
 _ERR_CAMCORDER_CMD_PRECON:
-       /* send message */
-       _mmcam_dbg_err("Start fail (%d, %d)", hcamcorder->type, state);
+       /* check internal error of gstreamer */
+       if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
+               ret = hcamcorder->sub_context->error_code;
+               hcamcorder->sub_context->error_code = MM_ERROR_NONE;
 
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+               _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
+       }
+
+       _mmcam_dbg_err("Start fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -926,7 +1033,7 @@ int _mmcamcorder_stop(MMHandleType handle)
        int state_FROM = MM_CAMCORDER_STATE_PREPARE;
        int state_TO = MM_CAMCORDER_STATE_READY;
        int frame_rate = 0;
-       _MMCamcorderMsgItem msg;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -967,6 +1074,20 @@ int _mmcamcorder_stop(MMHandleType handle)
        __ta__(__tafmt__("MM_CAM_006:: Frame per sec : %d", frame_rate), ;);
 
        _mmcamcorder_set_state(handle, state_TO);
+
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* check camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+
+               /* set camera state to vconf key */
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_OPEN);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_OPEN);
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -980,13 +1101,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Stop fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Stop fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -996,11 +1112,12 @@ int _mmcamcorder_capture_start(MMHandleType handle)
 {
        int ret = MM_ERROR_NONE;
        int state = MM_CAMCORDER_STATE_NONE;
-       int state_FROM = MM_CAMCORDER_STATE_PREPARE;
+       int state_FROM_0 = MM_CAMCORDER_STATE_PREPARE;
+       int state_FROM_1 = MM_CAMCORDER_STATE_RECORDING;
+       int state_FROM_2 = MM_CAMCORDER_STATE_PAUSED;
        int state_TO = MM_CAMCORDER_STATE_CAPTURING;
        char *err_name = NULL;
 
-       _MMCamcorderMsgItem msg;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -1018,7 +1135,9 @@ int _mmcamcorder_capture_start(MMHandleType handle)
        }
 
        state = _mmcamcorder_get_state(handle);
-       if (state != state_FROM) {
+       if (state != state_FROM_0 &&
+           state != state_FROM_1 &&
+           state != state_FROM_2) {
                _mmcam_dbg_err("Wrong state(%d)", state);
                ret = MM_ERROR_CAMCORDER_INVALID_STATE;
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
@@ -1036,7 +1155,10 @@ int _mmcamcorder_capture_start(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD;
        }
 
-       _mmcamcorder_set_state(handle, state_TO);
+       /* Do not change state when recording snapshot capture */
+       if (state == state_FROM_0) {
+               _mmcamcorder_set_state(handle, state_TO);
+       }
 
        /* Init break continuous shot attr */
        mm_camcorder_set_attributes(handle, &err_name, "capture-break-cont-shot", 0, NULL);
@@ -1054,13 +1176,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Capture start fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Capture start fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1071,7 +1188,6 @@ int _mmcamcorder_capture_stop(MMHandleType handle)
        int state = MM_CAMCORDER_STATE_NONE;
        int state_FROM = MM_CAMCORDER_STATE_CAPTURING;
        int state_TO = MM_CAMCORDER_STATE_PREPARE;
-       _MMCamcorderMsgItem msg;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -1109,21 +1225,10 @@ int _mmcamcorder_capture_stop(MMHandleType handle)
 
        _mmcamcorder_set_state(handle, state_TO);
 
-       /* Set strobe mode - strobe mode can not be set to driver while captuing */
-{
-       __ta__("Set strobe mode after capture",
-       mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
-       if (attr) {
-               mmf_attribute_set_modified(&(attr->items[MM_CAM_STROBE_MODE]));
-               if (mmf_attrs_commit((MMHandleType) attr) == -1) {
-                       _mmcam_dbg_warn("Failed to set strobe mode");
-               }
-       }
-       );
-}
-
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
+       MMTA_ACUM_ITEM_END("Real First Capture Start", FALSE);
+
        return MM_ERROR_NONE;
 
 _ERR_CAMCORDER_CMD:
@@ -1135,13 +1240,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Capture stop fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Capture stop fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1153,7 +1253,8 @@ int _mmcamcorder_record(MMHandleType handle)
        int state_FROM1 = MM_CAMCORDER_STATE_PREPARE;
        int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
        int state_TO = MM_CAMCORDER_STATE_RECORDING;
-       _MMCamcorderMsgItem msg;
+       int sessionType = MM_SESSION_TYPE_SHARE;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -1177,6 +1278,36 @@ int _mmcamcorder_record(MMHandleType handle)
                goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
        }
 
+       /* initialize error code */
+       hcamcorder->sub_context->error_code = MM_ERROR_NONE;
+
+       /* Check and register EXCLUSIVE ASM */
+       if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
+               _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+               sessionType = MM_SESSION_TYPE_SHARE;
+       }
+       if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
+               int errorcode;
+               ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
+
+               switch (hcamcorder->type) {
+               case MM_CAMCORDER_MODE_AUDIO:
+                       mm_resource = ASM_RESOURCE_NONE;
+                       break;
+               case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+               default:
+                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+                       break;
+               }
+
+               if (!ASM_set_sound_state(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER,
+                                        ASM_STATE_PLAYING, mm_resource, &errorcode)) {
+                       _mmcam_dbg_err("Set state to playing failed 0x%x", errorcode);
+                       ret = MM_ERROR_POLICY_BLOCKED;
+                       goto _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK;
+               }
+       }
+
        /* set async state */
        ret = _mmcamcorder_set_async_state(handle, state_TO);
        if (ret != MM_ERROR_NONE) {
@@ -1190,6 +1321,19 @@ int _mmcamcorder_record(MMHandleType handle)
        }
 
        _mmcamcorder_set_state(handle, state_TO);
+
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING);
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -1202,14 +1346,16 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
 _ERR_CAMCORDER_CMD_PRECON:
-       /* send message */
-       _mmcam_dbg_err("Record fail (%d, %d)", hcamcorder->type, state);
+       /* check internal error of gstreamer */
+       if (hcamcorder->sub_context->error_code != MM_ERROR_NONE) {
+               ret = hcamcorder->sub_context->error_code;
+               hcamcorder->sub_context->error_code = MM_ERROR_NONE;
 
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+               _mmcam_dbg_log("gstreamer error is occurred. return it %x", ret);
+       }
+
+       _mmcam_dbg_err("Record fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1221,7 +1367,7 @@ int _mmcamcorder_pause(MMHandleType handle)
        int state = MM_CAMCORDER_STATE_NONE;
        int state_FROM = MM_CAMCORDER_STATE_RECORDING;
        int state_TO = MM_CAMCORDER_STATE_PAUSED;
-       _MMCamcorderMsgItem msg;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        _mmcam_dbg_log("");
@@ -1258,6 +1404,19 @@ int _mmcamcorder_pause(MMHandleType handle)
        }
 
        _mmcamcorder_set_state(handle, state_TO);
+
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_RECORDING_PAUSE);
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -1271,13 +1430,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Pause fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Pause fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1290,7 +1444,7 @@ int _mmcamcorder_commit(MMHandleType handle)
        int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
        int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
        int state_TO = MM_CAMCORDER_STATE_PREPARE;
-       _MMCamcorderMsgItem msg;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        
        _mmcam_dbg_log("");
@@ -1327,6 +1481,49 @@ int _mmcamcorder_commit(MMHandleType handle)
        }
 
        _mmcamcorder_set_state(handle,state_TO);
+
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
+       }
+
+       /* check who calls unrealize. it's no need to set ASM state if caller is ASM */
+       if (hcamcorder->state_change_by_system != _MMCAMCORDER_STATE_CHANGE_BY_ASM) {
+               int sessionType = MM_SESSION_TYPE_SHARE;
+               ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
+
+               if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
+                       _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+                       sessionType = MM_SESSION_TYPE_SHARE;
+               }
+
+               /* Call session is not ended here */
+               if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
+                       switch (hcamcorder->type) {
+                       case MM_CAMCORDER_MODE_AUDIO:
+                               mm_resource = ASM_RESOURCE_NONE;
+                               break;
+                       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+                       default:
+                               mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+                               break;
+                       }
+
+                       /* STOP EXCLUSIVE session */
+                       if (!ASM_set_sound_state(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER,
+                                                ASM_STATE_STOP, mm_resource, &ret)) {
+                               _mmcam_dbg_err("EXCLUSIVE Set state to STOP failed 0x%x", ret);
+                       }
+               }
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -1340,13 +1537,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Commit fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Commit fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1359,7 +1551,8 @@ int _mmcamcorder_cancel(MMHandleType handle)
        int state_FROM1 = MM_CAMCORDER_STATE_RECORDING;
        int state_FROM2 = MM_CAMCORDER_STATE_PAUSED;
        int state_TO = MM_CAMCORDER_STATE_PREPARE;
-       _MMCamcorderMsgItem msg;
+       int sessionType = MM_SESSION_TYPE_SHARE;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        
        _mmcam_dbg_log("");
@@ -1396,6 +1589,46 @@ int _mmcamcorder_cancel(MMHandleType handle)
        }
 
        _mmcamcorder_set_state(handle, state_TO);
+
+       /* read session type */
+       if (MM_ERROR_NONE != _mm_session_util_read_type(-1, &sessionType)) {
+               _mmcam_dbg_log("_mm_session_util_read_type Fail. but keep going...");
+               sessionType = MM_SESSION_TYPE_SHARE;
+       }
+
+       /* Call session is not ended here */
+       if ((sessionType != MM_SESSION_TYPE_CALL) && (sessionType != MM_SESSION_TYPE_VIDEOCALL)) {
+               ASM_resource_t mm_resource = ASM_RESOURCE_NONE;
+
+               switch (hcamcorder->type) {
+               case MM_CAMCORDER_MODE_AUDIO:
+                       mm_resource = ASM_RESOURCE_NONE;
+                       break;
+               case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+               default:
+                       mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+                       break;
+               }
+
+               /* STOP EXCLUSIVE session */
+               if (!ASM_set_sound_state(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER,
+                                        ASM_STATE_STOP, mm_resource, &ret)) {
+                       _mmcam_dbg_err("EXCLUSIVE Set state to STOP failed 0x%x", ret);
+               }
+       }
+
+       /* set camera state to vconf key */
+       if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+               int vconf_camera_state = 0;
+
+               /* get current camera state of vconf key */
+               vconf_get_int(VCONFKEY_CAMERA_STATE, &vconf_camera_state);
+               vconf_set_int(VCONFKEY_CAMERA_STATE, VCONFKEY_CAMERA_STATE_PREVIEW);
+
+               _mmcam_dbg_log("VCONFKEY_CAMERA_STATE prev %d -> cur %d",
+                              vconf_camera_state, VCONFKEY_CAMERA_STATE_PREVIEW);
+       }
+
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
        return MM_ERROR_NONE;
@@ -1409,13 +1642,8 @@ _ERR_CAMCORDER_CMD_PRECON_AFTER_LOCK:
 
 _ERR_CAMCORDER_CMD_PRECON:
        /* send message */
-       _mmcam_dbg_err("Cancel fail (%d, %d)", hcamcorder->type, state);
-
-       msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
-       msg.param.state.previous = state;
-       msg.param.state.current  = state;
-       msg.param.state.code = ret;
-       _mmcamcroder_send_message(handle, &msg);
+       _mmcam_dbg_err("Cancel fail (type %d, state %d, ret %x)",
+                      hcamcorder->type, state, ret);
 
        return ret;
 }
@@ -1550,12 +1778,14 @@ int _mmcamcorder_get_current_state(MMHandleType handle)
 
 int _mmcamcorder_init_focusing(MMHandleType handle)
 {
-       int ret = 0;
+       int ret = TRUE;
        int state = MM_CAMCORDER_STATE_NONE;
        int focus_mode = MM_CAMCORDER_FOCUS_MODE_NONE;
        int af_range = MM_CAMCORDER_AUTO_FOCUS_NORMAL;
        int sensor_focus_mode = 0;
        int sensor_af_range = 0;
+       int current_focus_mode = 0;
+       int current_af_range = 0;
        mmf_camcorder_t *hcamcorder = NULL;
        _MMCamcorderSubContext *sc = NULL;
        mmf_attrs_t *attr = NULL;
@@ -1603,10 +1833,18 @@ int _mmcamcorder_init_focusing(MMHandleType handle)
                                    MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
                                    MMCAM_CAMERA_AF_SCAN_RANGE, &af_range,
                                    NULL);
-       sensor_af_range = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_AF_SCAN_RANGE, af_range);
-       sensor_focus_mode = _mmcamcorder_convert_msl_to_sensor(MM_CAM_CAMERA_FOCUS_MODE, focus_mode);
+       sensor_af_range = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_AF_SCAN_RANGE, af_range);
+       sensor_focus_mode = _mmcamcorder_convert_msl_to_sensor(handle, MM_CAM_CAMERA_FOCUS_MODE, focus_mode);
 
-       ret = gst_camera_control_set_focus(control, sensor_focus_mode, sensor_af_range);
+       gst_camera_control_get_focus(control, &current_focus_mode, &current_af_range);
+
+       if (current_focus_mode != sensor_focus_mode ||
+           current_af_range != sensor_af_range) {
+               ret = gst_camera_control_set_focus(control, sensor_focus_mode, sensor_af_range);
+       } else {
+               _mmcam_dbg_log("No need to init FOCUS [mode:%d, range:%d]", focus_mode, af_range );
+               ret = TRUE;
+       }
 
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
@@ -1724,7 +1962,6 @@ int _mmcamcorder_adjust_manual_focus(MMHandleType handle, int direction)
 
 int _mmcamcorder_adjust_auto_focus(MMHandleType handle)
 {
-       int af_mode = MM_CAMCORDER_FOCUS_MODE_AUTO;
        gboolean ret;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        GstCameraControl *control = NULL;
@@ -1745,11 +1982,6 @@ int _mmcamcorder_adjust_auto_focus(MMHandleType handle)
        /* Start AF */
        ret = gst_camera_control_start_auto_focus(control);
        if (ret) {
-               mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FOCUS_MODE, &af_mode, NULL);
-               if (af_mode == MM_CAMCORDER_FOCUS_MODE_CONTINUOUS) {
-                       sc->now_continuous_af = TRUE;
-                       _mmcam_dbg_log("Set now_continuous_af as TRUE");
-               }
                _mmcam_dbg_log("Auto focusing start success.");
                return MM_ERROR_NONE;
        } else {
@@ -1793,8 +2025,6 @@ int _mmcamcorder_stop_focusing(MMHandleType handle)
        control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
 
        ret = gst_camera_control_stop_auto_focus(control);
-       sc->now_continuous_af = FALSE;
-       _mmcam_dbg_log("Set now_continuous_af as FALSE");
 
        _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
 
@@ -1866,7 +2096,7 @@ __mmcamcorder_gstreamer_init(camera_conf * conf)
        );
 
        if (!ret) {
-               _mmcam_dbg_err("Could not initialize GStreamer: %s\n",
+               _mmcam_dbg_err("Could not initialize GStreamer: %s ",
                               err ? err->message : "unknown error occurred");
                if (err) {
                        g_error_free (err);
@@ -1953,6 +2183,7 @@ void _mmcamcorder_set_state(MMHandleType handle, int state)
                        msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_ASM;
                        msg.param.state.code = hcamcorder->asm_event_code;
                        break;
+               case _MMCAMCORDER_STATE_CHANGE_NORMAL:
                default:
                        msg.id = MM_MESSAGE_CAMCORDER_STATE_CHANGED;
                        msg.param.state.code = MM_ERROR_NONE;
@@ -2096,44 +2327,49 @@ _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type)
 
        /* alloc info for each mode */
        switch (type) {
-       case MM_CAMCORDER_MODE_IMAGE:
-               sc->info = malloc( sizeof(_MMCamcorderImageInfo));
-               if(sc->info == NULL) {
+       case MM_CAMCORDER_MODE_AUDIO:
+               sc->info_audio = malloc( sizeof(_MMCamcorderAudioInfo));
+               if(sc->info_audio == NULL) {
                        _mmcam_dbg_err("Failed to alloc info structure");
                        free(sc);
                        return NULL;
                }
-               memset(sc->info, 0x00, sizeof(_MMCamcorderImageInfo));
+               memset(sc->info_audio, 0x00, sizeof(_MMCamcorderAudioInfo));
                break;
-       case MM_CAMCORDER_MODE_AUDIO:
-               sc->info = malloc( sizeof(_MMCamcorderAudioInfo));
-               if(sc->info == NULL) {
+       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+       default:
+               sc->info_image = malloc( sizeof(_MMCamcorderImageInfo));
+               if(sc->info_image == NULL) {
                        _mmcam_dbg_err("Failed to alloc info structure");
                        free(sc);
                        return NULL;
                }
-               memset(sc->info, 0x00, sizeof(_MMCamcorderAudioInfo));
-               break;
-       case MM_CAMCORDER_MODE_VIDEO:
-               sc->info = malloc( sizeof(_MMCamcorderVideoInfo));
-               if(sc->info == NULL) {
+               memset(sc->info_image, 0x00, sizeof(_MMCamcorderImageInfo));
+
+               /* init sound status */
+               sc->info_image->sound_status = _SOUND_STATUS_INIT;
+
+               sc->info_video = malloc( sizeof(_MMCamcorderVideoInfo));
+               if(sc->info_video == NULL) {
                        _mmcam_dbg_err("Failed to alloc info structure");
+                       free(sc->info_image);
                        free(sc);
                        return NULL;
                }
-               memset(sc->info, 0x00, sizeof(_MMCamcorderVideoInfo));
+               memset(sc->info_video, 0x00, sizeof(_MMCamcorderVideoInfo));
                break;
-       default:
-               _mmcam_dbg_err("unknown type[%d]", type);
-               free(sc);
-               return NULL;
        }
 
        /* alloc element array */
        sc->element = (_MMCamcorderGstElement *)malloc(sizeof(_MMCamcorderGstElement) * sc->element_num);
        if(!sc->element) {
                _mmcam_dbg_err("Failed to alloc element structure");
-               free(sc->info);
+               if (type == MM_CAMCORDER_MODE_AUDIO) {
+                       free(sc->info_audio);
+               } else {
+                       free(sc->info_image);
+                       free(sc->info_video);
+               }
                free(sc);
                return NULL;
        }
@@ -2144,10 +2380,10 @@ _MMCamcorderSubContext *_mmcamcorder_alloc_subcontext(int type)
        }
 
        sc->fourcc = 0x80000000;
-
        sc->cam_stability_count = 0;
-       sc->drop_vframe         = 0;
-       sc->pass_first_vframe   = 0;
+       sc->drop_vframe = 0;
+       sc->pass_first_vframe = 0;
+       sc->is_modified_rate = FALSE;
 
        return sc;
 }
@@ -2163,9 +2399,22 @@ void _mmcamcorder_dealloc_subcontext(_MMCamcorderSubContext *sc)
                        sc->element = NULL;
                }
 
-               if (sc->info) {
-                       free(sc->info);
-                       sc->info = NULL;
+               if (sc->info_image) {
+                       _mmcam_dbg_log("release info_image");
+                       free(sc->info_image);
+                       sc->info_image = NULL;
+               }
+
+               if (sc->info_video) {
+                       _mmcam_dbg_log("release info_video");
+                       free(sc->info_video);
+                       sc->info_video = NULL;
+               }
+
+               if (sc->info_audio) {
+                       _mmcam_dbg_log("release info_audio");
+                       free(sc->info_audio);
+                       sc->info_audio = NULL;
                }
 
                free(sc);
@@ -2183,17 +2432,12 @@ int _mmcamcorder_set_functions(MMHandleType handle, int type)
        _mmcam_dbg_log("");
 
        switch (type) {
-       case MM_CAMCORDER_MODE_VIDEO:
-               hcamcorder->command = _mmcamcorder_video_command;
-               break;
        case MM_CAMCORDER_MODE_AUDIO:
                hcamcorder->command = _mmcamcorder_audio_command;
                break;
-       case MM_CAMCORDER_MODE_IMAGE:
-               hcamcorder->command = _mmcamcorder_image_command;
-               break;
+       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
        default:
-               return MM_ERROR_CAMCORDER_INTERNAL;
+               hcamcorder->command = _mmcamcorder_video_capture_command;
                break;
        }
 
@@ -2222,16 +2466,15 @@ gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpoi
 
                sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
                mmf_return_val_if_fail(sc, TRUE);
-               mmf_return_val_if_fail(sc->info, TRUE);
 
-               if (hcamcorder->type == MM_CAMCORDER_MODE_VIDEO) {
-                       _MMCamcorderVideoInfo *info = sc->info;
-                       if (info->b_commiting) {
+               if (hcamcorder->type != MM_CAMCORDER_MODE_AUDIO) {
+                       mmf_return_val_if_fail(sc->info_video, TRUE);
+                       if (sc->info_video->b_commiting) {
                                _mmcamcorder_video_handle_eos((MMHandleType)hcamcorder);
                        }
-               } else if (hcamcorder->type == MM_CAMCORDER_MODE_AUDIO) {
-                       _MMCamcorderAudioInfo *info = sc->info;
-                       if (info->b_commiting) {
+               } else {
+                       mmf_return_val_if_fail(sc->info_audio, TRUE);
+                       if (sc->info_audio->b_commiting) {
                                _mmcamcorder_audio_handle_eos((MMHandleType)hcamcorder);
                        }
                }
@@ -2338,6 +2581,90 @@ gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpoi
                        msg.id = MM_MESSAGE_CAMCORDER_FOCUS_CHANGED;
                        msg.param.code = focus_state;
                        _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+               } else if (gst_structure_has_name(message->structure, "camerasrc-HDR")) {
+                       int progress = 0;
+                       int status = 0;
+
+                       gst_structure_get_int(message->structure, "progress", &progress);
+                       gst_structure_get_int(message->structure, "status", &status);
+                       _mmcam_dbg_log("HDR progress %d percent, status %d", progress, status);
+
+                       msg.id = MM_MESSAGE_CAMCORDER_HDR_PROGRESS;
+                       msg.param.code = progress;
+                       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+               } else if (gst_structure_has_name(message->structure, "camerasrc-FD")) {
+                       int i = 0;
+                       const GValue *g_value = gst_structure_get_value(message->structure, "face-info");;
+                       GstCameraControlFaceDetectInfo *fd_info = NULL;
+                       MMCamFaceDetectInfo *cam_fd_info = NULL;
+
+                       if (g_value) {
+                               fd_info = (GstCameraControlFaceDetectInfo *)g_value_get_pointer(g_value);
+                       }
+
+                       if (fd_info == NULL) {
+                               _mmcam_dbg_warn("fd_info is NULL");
+                               return TRUE;
+                       }
+
+                       cam_fd_info = (MMCamFaceDetectInfo *)malloc(sizeof(MMCamFaceDetectInfo));
+                       if (cam_fd_info == NULL) {
+                               _mmcam_dbg_warn("cam_fd_info alloc failed");
+
+                               free(fd_info);
+                               fd_info = NULL;
+
+                               return TRUE;
+                       }
+
+                       /* set total face count */
+                       cam_fd_info->num_of_faces = fd_info->num_of_faces;
+
+                       if (cam_fd_info->num_of_faces > 0) {
+                               cam_fd_info->face_info = (MMCamFaceInfo *)malloc(sizeof(MMCamFaceInfo) * cam_fd_info->num_of_faces);
+                               if (cam_fd_info->face_info) {
+                                       /* set information of each face */
+                                       for (i = 0 ; i < fd_info->num_of_faces ; i++) {
+                                               cam_fd_info->face_info[i].id = fd_info->face_info[i].id;
+                                               cam_fd_info->face_info[i].score = fd_info->face_info[i].score;
+                                               cam_fd_info->face_info[i].rect.x = fd_info->face_info[i].rect.x;
+                                               cam_fd_info->face_info[i].rect.y = fd_info->face_info[i].rect.y;
+                                               cam_fd_info->face_info[i].rect.width = fd_info->face_info[i].rect.width;
+                                               cam_fd_info->face_info[i].rect.height = fd_info->face_info[i].rect.height;
+                                               /*
+                                               _mmcam_dbg_log("id %d, score %d, [%d,%d,%dx%d]",
+                                                              fd_info->face_info[i].id,
+                                                              fd_info->face_info[i].score,
+                                                              fd_info->face_info[i].rect.x,
+                                                              fd_info->face_info[i].rect.y,
+                                                              fd_info->face_info[i].rect.width,
+                                                              fd_info->face_info[i].rect.height);
+                                               */
+                                       }
+                               } else {
+                                       _mmcam_dbg_warn("MMCamFaceInfo alloc failed");
+
+                                       /* free allocated memory that is not sent */
+                                       free(cam_fd_info);
+                                       cam_fd_info = NULL;
+                               }
+                       } else {
+                               cam_fd_info->face_info = NULL;
+                       }
+
+                       if (cam_fd_info) {
+                               /* send message  - cam_fd_info should be freed by application */
+                               msg.id = MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO;
+                               msg.param.data = cam_fd_info;
+                               msg.param.size = sizeof(MMCamFaceDetectInfo);
+                               msg.param.code = 0;
+
+                               _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+                       }
+
+                       /* free fd_info allocated by plugin */
+                       free(fd_info);
+                       fd_info = NULL;
                }
                break;
        case GST_MESSAGE_SEGMENT_START:
@@ -2370,6 +2697,101 @@ gboolean _mmcamcorder_pipeline_cb_message(GstBus *bus, GstMessage *message, gpoi
 }
 
 
+GstBusSyncReply _mmcamcorder_pipeline_bus_sync_callback(GstBus *bus, GstMessage *message, gpointer data)
+{
+       GstElement *element = NULL;
+       GError *err = NULL;
+       gchar *debug_info = NULL;
+
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, GST_BUS_PASS);
+       mmf_return_val_if_fail(message, GST_BUS_PASS);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
+       mmf_return_val_if_fail(sc, GST_BUS_PASS);
+
+       sc->error_code = MM_ERROR_NONE;
+
+       if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) {
+               /* parse error message */
+               gst_message_parse_error(message, &err, &debug_info);
+
+               if (!err) {
+                       _mmcam_dbg_warn("failed to parse error message");
+                       return GST_BUS_PASS;
+               }
+
+               if (debug_info) {
+                       _mmcam_dbg_err("GST ERROR : %s", debug_info);
+                       g_free(debug_info);
+                       debug_info = NULL;
+               }
+
+               /* set videosrc element to compare */
+               element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+
+               /* check domain[RESOURCE] and element[VIDEOSRC] */
+               if (err->domain == GST_RESOURCE_ERROR &&
+                   GST_ELEMENT_CAST(message->src) == element) {
+                       switch (err->code) {
+                       case GST_RESOURCE_ERROR_BUSY:
+                               _mmcam_dbg_err("Camera device [busy]");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_BUSY;
+                               break;
+                       case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
+                       case GST_RESOURCE_ERROR_OPEN_WRITE:
+                               _mmcam_dbg_err("Camera device [open failed]");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_OPEN;
+                               break;
+                       case GST_RESOURCE_ERROR_OPEN_READ:
+                               _mmcam_dbg_err("Camera device [register trouble]");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE;
+                               break;
+                       case GST_RESOURCE_ERROR_NOT_FOUND:
+                               _mmcam_dbg_err("Camera device [device not found]");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_NOT_FOUND;
+                               break;
+                       case GST_RESOURCE_ERROR_TOO_LAZY:
+                               _mmcam_dbg_err("Camera device [timeout]");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_TIMEOUT;
+                               break;
+                       case GST_RESOURCE_ERROR_SETTINGS:
+                               _mmcam_dbg_err("Camera device [not supported]");
+                               sc->error_code = MM_ERROR_CAMCORDER_NOT_SUPPORTED;
+                               break;
+                       case GST_RESOURCE_ERROR_FAILED:
+                               _mmcam_dbg_err("Camera device [working failed].");
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE_IO;
+                               break;
+                       default:
+                               _mmcam_dbg_err("Camera device [General(%d)]", err->code);
+                               sc->error_code = MM_ERROR_CAMCORDER_DEVICE;
+                               break;
+                       }
+
+                       sc->error_occurs = TRUE;
+               }
+
+               g_error_free(err);
+
+               /* store error code and drop this message if cmd is running */
+               if (sc->error_code != MM_ERROR_NONE) {
+                       if (!_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
+                               _mmcam_dbg_err("cmd is running and will be returned with this error %x",
+                                              sc->error_code);
+                               return GST_BUS_DROP;
+                       }
+
+                       _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
+               }
+       }
+
+       return GST_BUS_PASS;
+}
+
+
 static int __mmcamcorder_asm_get_event_type(int sessionType)
 {
        switch (sessionType) {
@@ -2390,9 +2812,9 @@ static int __mmcamcorder_asm_get_event_type(int sessionType)
        }
 }
 
-ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_src,
-                                          ASM_sound_commands_t command,
-                                          unsigned int sound_status, void* cb_data)
+ASM_cb_result_t _mmcamcorder_asm_callback_sh(int handle, ASM_event_sources_t event_src,
+                                             ASM_sound_commands_t command,
+                                             unsigned int sound_status, void* cb_data)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(cb_data);
        int current_state = MM_CAMCORDER_STATE_NONE;
@@ -2411,6 +2833,8 @@ ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_
        /* set ASM event code for sending it to application */
        hcamcorder->asm_event_code = event_src;
 
+       _mmcam_dbg_log("ASM SHARE callback : event code 0x%x, command 0x%x", event_src, command);
+
        switch (command) {
        case ASM_COMMAND_STOP:
        case ASM_COMMAND_PAUSE:
@@ -2426,10 +2850,80 @@ ASM_cb_result_t _mmcamcorder_asm_callback(int handle, ASM_event_sources_t event_
 
                if (current_state >= MM_CAMCORDER_STATE_PREPARE) {
                        _mmcam_dbg_log("Already start previewing");
-                       return ASM_CB_RES_PLAYING;
+               } else {
+                       __mmcamcorder_force_resume(hcamcorder);
+               }
+
+               cb_res = ASM_CB_RES_PLAYING;
+
+               _mmcam_dbg_log("Finish opeartion. Preview is started.(%d)", cb_res);
+               break;
+       case ASM_COMMAND_RESUME:
+       {
+               _MMCamcorderMsgItem msg;
+
+               _mmcam_dbg_log("Got msg from asm to Resume(%d, %d)", command, current_state);
+
+               msg.id = MM_MESSAGE_READY_TO_RESUME;
+               _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+               cb_res = ASM_CB_RES_PLAYING;
+
+               _mmcam_dbg_log("Finish opeartion.(%d)", cb_res);
+               break;
+       }
+       default: /* should not be reached here */
+               cb_res = ASM_CB_RES_PLAYING;
+               _mmcam_dbg_err("Command err.");
+               break;
+       }
+
+       /* restore value */
+       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_NORMAL;
+
+       return cb_res;
+}
+
+
+ASM_cb_result_t _mmcamcorder_asm_callback_ex(int handle, ASM_event_sources_t event_src,
+                                             ASM_sound_commands_t command,
+                                             unsigned int sound_status, void* cb_data)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(cb_data);
+       int current_state = MM_CAMCORDER_STATE_NONE;
+       ASM_cb_result_t cb_res = ASM_CB_RES_NONE;
+
+       mmf_return_val_if_fail((MMHandleType)hcamcorder, ASM_CB_RES_NONE);
+
+       current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
+
+       _mmcam_dbg_log("ASM EXCLUSIVE callback : event code 0x%x, command 0x%x, current state %d",
+                      event_src, command, current_state);
+
+       /* set value to inform a status is changed by asm */
+       hcamcorder->state_change_by_system = _MMCAMCORDER_STATE_CHANGE_BY_ASM;
+
+       /* set ASM event code for sending it to application */
+       hcamcorder->asm_event_code = event_src;
+
+       switch (command) {
+       case ASM_COMMAND_STOP:
+       case ASM_COMMAND_PAUSE:
+               _mmcam_dbg_log("Got msg from asm to Stop or Pause(%d, %d)", command, current_state);
+
+               __mmcamcorder_force_stop(hcamcorder);
+               cb_res = ASM_CB_RES_STOP;
+
+               _mmcam_dbg_log("Finish opeartion. Camera is released.(%d)", cb_res);
+               break;
+       case ASM_COMMAND_PLAY:
+               _mmcam_dbg_log("Got msg from asm to Play(%d, %d)", command, current_state);
+
+               if (current_state >= MM_CAMCORDER_STATE_PREPARE) {
+                       _mmcam_dbg_log("Already start previewing");
+               } else {
+                       __mmcamcorder_force_resume(hcamcorder);
                }
 
-               __mmcamcorder_force_resume(hcamcorder);
                cb_res = ASM_CB_RES_PLAYING;
 
                _mmcam_dbg_log("Finish opeartion. Preview is started.(%d)", cb_res);
@@ -2475,21 +2969,6 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
        mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        switch (type) {
-       case MM_CAMCORDER_MODE_IMAGE:
-               __ta__("        _mmcamcorder_create_preview_pipeline",
-               ret = _mmcamcorder_create_preview_pipeline(handle);
-               );
-               if (ret != MM_ERROR_NONE) {
-                       return ret;
-               }
-
-               __ta__("        _mmcamcorder_add_stillshot_pipeline",
-               ret = _mmcamcorder_add_stillshot_pipeline(handle);
-               );
-               if (ret != MM_ERROR_NONE) {
-                       return ret;
-               }
-               break;
        case MM_CAMCORDER_MODE_AUDIO:
                __ta__("        _mmcamcorder_create_audio_pipeline",
                ret = _mmcamcorder_create_audio_pipeline(handle);
@@ -2498,16 +2977,25 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
                        return ret;
                }
                break;
-       case MM_CAMCORDER_MODE_VIDEO:
+       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+       default:
                __ta__("        _mmcamcorder_create_preview_pipeline",
                ret = _mmcamcorder_create_preview_pipeline(handle);
                );
                if (ret != MM_ERROR_NONE) {
                        return ret;
                }
+
+               /* connect capture signal */
+               if (!sc->bencbin_capture) {
+                       __ta__("        _mmcamcorder_connect_capture_signal",
+                       ret = _mmcamcorder_connect_capture_signal(handle);
+                       );
+                       if (ret != MM_ERROR_NONE) {
+                               return ret;
+                       }
+               }
                break;
-       default:
-               return MM_ERROR_CAMCORDER_INTERNAL;
        }
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
@@ -2521,11 +3009,11 @@ int _mmcamcorder_create_pipeline(MMHandleType handle, int type)
                        }
                }
        }
-
+#ifdef _MMCAMCORDER_GET_DEVICE_INFO
        if (!_mmcamcorder_get_device_info(handle)) {
                _mmcam_dbg_err("Getting device information error!!");
        }
-
+#endif
        _mmcam_dbg_log("ret[%x]", ret);
        return ret;
 }
@@ -2549,16 +3037,14 @@ void _mmcamcorder_destroy_pipeline(MMHandleType handle, int type)
 
        /* Inside each pipeline destroy function, Set GST_STATE_NULL to Main pipeline */
        switch (type) {
-       case MM_CAMCORDER_MODE_IMAGE:
-               _mmcamcorder_destroy_image_pipeline(handle);
+       case MM_CAMCORDER_MODE_VIDEO_CAPTURE:
+               _mmcamcorder_destroy_video_capture_pipeline(handle);
                break;
        case MM_CAMCORDER_MODE_AUDIO:
                _mmcamcorder_destroy_audio_pipeline(handle);
                break;
-       case MM_CAMCORDER_MODE_VIDEO:
-               _mmcamcorder_destroy_video_pipeline(handle);
-               break;
        default:
+               _mmcam_dbg_err("unknown type %d", type);
                break;
        }
 
@@ -2612,6 +3098,7 @@ int _mmcamcorder_gst_set_state_async(MMHandleType handle, GstElement *pipeline,
 }
 
 
+#ifdef _MMCAMCORDER_USE_SET_ATTR_CB
 static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
@@ -2630,6 +3117,7 @@ static gboolean __mmcamcorder_set_attr_to_camsensor_cb(gpointer data)
        /* once */
        return FALSE;
 }
+#endif /* _MMCAMCORDER_USE_SET_ATTR_CB */
 
 
 int _mmcamcorder_gst_set_state (MMHandleType handle, GstElement *pipeline, GstState target_state)
@@ -2638,7 +3126,7 @@ int _mmcamcorder_gst_set_state (MMHandleType handle, GstElement *pipeline, GstSt
        GstState pipeline_state = GST_STATE_VOID_PENDING;
        GstStateChangeReturn setChangeReturn = GST_STATE_CHANGE_FAILURE;
        GstStateChangeReturn getChangeReturn = GST_STATE_CHANGE_FAILURE;
-       GstClockTime get_timeout = 3 * GST_SECOND;
+       GstClockTime get_timeout = __MMCAMCORDER_SET_GST_STATE_TIMEOUT * GST_SECOND;
 
        mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
@@ -2648,6 +3136,8 @@ int _mmcamcorder_gst_set_state (MMHandleType handle, GstElement *pipeline, GstSt
 
        for (k = 0; k < _MMCAMCORDER_STATE_SET_COUNT; k++) {
                setChangeReturn = gst_element_set_state(pipeline, target_state);
+               _mmcam_dbg_log("gst_element_set_state[%d] return %d",
+                              target_state, setChangeReturn);
                if (setChangeReturn != GST_STATE_CHANGE_FAILURE) {
                        getChangeReturn = gst_element_get_state(pipeline, &pipeline_state, NULL, get_timeout);
                        switch (getChangeReturn) {
@@ -2663,7 +3153,7 @@ int _mmcamcorder_gst_set_state (MMHandleType handle, GstElement *pipeline, GstSt
                        case GST_STATE_CHANGE_ASYNC:
                                _mmcam_dbg_log("status=GST_STATE_CHANGE_ASYNC.");
                                break;
-                       default :
+                       default:
                                _MMCAMCORDER_UNLOCK_GST_STATE(handle);
                                _mmcam_dbg_log("status=GST_STATE_CHANGE_FAILURE.");
                                return MM_ERROR_CAMCORDER_GST_STATECHANGE;
@@ -2759,7 +3249,7 @@ static void __mmcamcorder_force_stop(mmf_camcorder_t *hcamcorder)
                        _MMCamcorderImageInfo *info = NULL;
 
                        mmf_return_if_fail(sc);
-                       mmf_return_if_fail((info = sc->info));
+                       mmf_return_if_fail((info = sc->info_image));
 
                        _mmcam_dbg_log("Stop capturing.");
 
@@ -3069,7 +3559,7 @@ static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderMsgItem msg;
        gchar *msg_src_element;
-       _MMCamcorderSubContext *sc = NULL;      
+       _MMCamcorderSubContext *sc = NULL;
        
        return_val_if_fail(hcamcorder, FALSE);
        return_val_if_fail(error, FALSE);
@@ -3100,7 +3590,7 @@ static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *
        } else if (error->domain == GST_STREAM_ERROR) {
                msg.param.code = __mmcamcorder_gst_handle_stream_error(handle, error->code, message);
        } else {
-               debug_warning("This error domain is not defined.\n");
+               _mmcam_dbg_warn("This error domain is not defined.");
 
                /* we treat system error as an internal error */
                msg.param.code = MM_ERROR_CAMCORDER_INTERNAL;
@@ -3108,18 +3598,20 @@ static gboolean __mmcamcorder_handle_gst_error(MMHandleType handle, GstMessage *
 
        if (message->src) {
                msg_src_element = GST_ELEMENT_NAME(GST_ELEMENT_CAST(message->src));
-               debug_error("-Msg src : [%s]    Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]\n",
-                           msg_src_element, g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
+               _mmcam_dbg_err("-Msg src : [%s] Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]",
+                              msg_src_element, g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
        } else {
-               debug_error("Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]\n",
-                           g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
+               _mmcam_dbg_err("Domain : [%s]   Error : [%s]  Code : [%d] is tranlated to error code : [0x%x]",
+                              g_quark_to_string (error->domain), error->message, error->code, msg.param.code);
        }
 
+#ifdef _MMCAMCORDER_SKIP_GST_FLOW_ERROR
        /* Check whether send this error to application */
        if (msg.param.code == MM_ERROR_CAMCORDER_GST_FLOW_ERROR) {
                _mmcam_dbg_log("We got the error. But skip it.");
                return TRUE;
        }
+#endif /* _MMCAMCORDER_SKIP_GST_FLOW_ERROR */
 
        /* post error to application */
        sc->error_occurs = TRUE;
@@ -3207,7 +3699,7 @@ static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int cod
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
-       GstElement *element =NULL;
+       GstElement *element = NULL;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
@@ -3217,34 +3709,6 @@ static gint __mmcamcorder_gst_handle_resource_error(MMHandleType handle, int cod
        _mmcam_dbg_log("");
 
        /* Specific plugin */
-       /* video source */
-       element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
-       if (GST_ELEMENT_CAST(message->src) == element) {
-               switch (code) {
-               case GST_RESOURCE_ERROR_BUSY:
-                       _mmcam_dbg_err("Video device [busy]");
-                       return MM_ERROR_CAMCORDER_DEVICE_BUSY;
-               case GST_RESOURCE_ERROR_FAILED:
-                       _mmcam_dbg_err("Video device [working failed].");
-                       return MM_ERROR_CAMCORDER_DEVICE_IO;
-               case GST_RESOURCE_ERROR_TOO_LAZY:
-                       _mmcam_dbg_err("Video device [timeout]");
-                       return MM_ERROR_CAMCORDER_DEVICE_TIMEOUT;
-               case GST_RESOURCE_ERROR_OPEN_READ:
-                       _mmcam_dbg_err("Video device [open failed]");
-                       return MM_ERROR_CAMCORDER_DEVICE_OPEN;
-               case GST_RESOURCE_ERROR_SETTINGS:
-                       _mmcam_dbg_err("Video device [Not supported]");
-                       return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
-               case GST_RESOURCE_ERROR_NOT_FOUND:
-                       _mmcam_dbg_err("Video device [Register trouble]");
-                       return MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE;
-               default:
-                       _mmcam_dbg_err("Video device [General(%d)]", code);
-                       return MM_ERROR_CAMCORDER_DEVICE;
-               }
-       }
-
        /* video sink */
        element = GST_ELEMENT_CAST(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst);
        if (GST_ELEMENT_CAST(message->src) == element) {
index 3497ab5..87f8bf8 100644 (file)
@@ -162,29 +162,36 @@ _MMCamcorderEnumConvert _mmcamcorder_enum_conv_ahs =
        "AntiHandshake"
 };
 
-static int __enum_conv_picture_format[MM_PIXEL_FORMAT_NUM];
 
-_MMCamcorderEnumConvert _mmcamcorder_enum_conv_picture_format =
+static int __enum_conv_video_stabilization[MM_CAMCORDER_VIDEO_STABILIZATION_NUM];
+
+_MMCamcorderEnumConvert _mmcamcorder_enum_conv_video_stabilization =
 {
-       MM_PIXEL_FORMAT_NUM,
-       __enum_conv_picture_format,
-       CONFIGURE_CATEGORY_CTRL_CAMERA,
-       "PictureFormat"
+       MM_CAMCORDER_VIDEO_STABILIZATION_NUM,
+       __enum_conv_video_stabilization,
+       CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
+       "VideoStabilization"
 };
 
-static int __enum_conv_vid_dev[MM_VIDEO_DEVICE_NUM] =
+
+static int __enum_conv_hdr_capture[MM_CAMCORDER_HDR_CAPTURE_NUM];
+
+_MMCamcorderEnumConvert _mmcamcorder_enum_conv_hdr_capture =
 {
-       //{Enum of (Plugin or Kernel) , Enum of MSL Camcorder}
-       2,      //MM_VIDEO_DEVICE_CAMERA0
-       1,      //MM_VIDEO_DEVICE_CAMERA1
+       MM_CAMCORDER_HDR_CAPTURE_NUM,
+       __enum_conv_hdr_capture,
+       CONFIGURE_CATEGORY_CTRL_CAPTURE,
+       "SupportHDR"
 };
 
-_MMCamcorderEnumConvert _mmcamcorder_enum_conv_vid_dev =
+static int __enum_conv_detect_mode[MM_CAMCORDER_DETECT_MODE_NUM];
+
+_MMCamcorderEnumConvert _mmcamcorder_enum_conv_detect_mode =
 {
-       MM_VIDEO_DEVICE_NUM,
-       __enum_conv_vid_dev,
-       0,
-       NULL
+       MM_CAMCORDER_DETECT_MODE_NUM,
+       __enum_conv_detect_mode,
+       CONFIGURE_CATEGORY_CTRL_DETECT,
+       "DetectMode"
 };
 
 
@@ -207,24 +214,24 @@ static _MMCamcorderInfoConverting g_display_info[] = {
        {
                CONFIGURE_TYPE_MAIN,
                CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
-               MM_CAM_DISPLAY_SURFACE,
+               MM_CAM_DISPLAY_MODE,
                MM_CAMCORDER_ATTR_NONE,
-               "Videosink",
+               "DisplayMode",
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                NULL,
        },
-};
-
-static _MMCamcorderInfoConverting      g_caminfo_convert[] = {
        {
-               CONFIGURE_TYPE_CTRL,
-               CONFIGURE_CATEGORY_CTRL_CAMERA,
-               MM_CAM_CAMERA_DEVICE,
+               CONFIGURE_TYPE_MAIN,
+               CONFIGURE_CATEGORY_MAIN_VIDEO_OUTPUT,
+               MM_CAM_DISPLAY_SURFACE,
                MM_CAMCORDER_ATTR_NONE,
-               "InputIndex",
+               "Videosink",
                MM_CAMCONVERT_TYPE_INT_ARRAY,
-               &_mmcamcorder_enum_conv_vid_dev, 
+               NULL,
        },
+};
+
+static _MMCamcorderInfoConverting      g_caminfo_convert[CAMINFO_CONVERT_NUM] = {
        {
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_CAMERA,
@@ -261,7 +268,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                NULL,
        },
-       {
+       { /* 5 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_CAMERA,
                MM_CAM_CAMERA_FORMAT,
@@ -306,7 +313,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_RANGE,
                NULL,
        },
-       {
+       { /* 10 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_EFFECT,
                MM_CAM_FILTER_CONTRAST,
@@ -351,7 +358,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                &_mmcamcorder_enum_conv_whitebalance,
        },
-       {
+       { /* 15 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_EFFECT,
                MM_CAM_FILTER_COLOR_TONE,
@@ -396,7 +403,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                &_mmcamcorder_enum_conv_focus_mode,
        },
-       {
+       { /* 20 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
                MM_CAM_CAMERA_AF_SCAN_RANGE,
@@ -441,7 +448,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                NULL,
        },
-       {
+       { /* 25 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
                MM_CAM_CAMERA_ISO,
@@ -486,7 +493,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_RANGE,
                NULL,
        },
-       {
+       { /* 30 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_CAPTURE,
                MM_CAM_CAPTURE_COUNT,
@@ -497,12 +504,21 @@ static _MMCamcorderInfoConverting g_caminfo_convert[] = {
        },
        {
                CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_CAPTURE,
+               MM_CAM_CAMERA_HDR_CAPTURE,
+               MM_CAMCORDER_ATTR_NONE,
+               "SupportHDR",
+               MM_CAMCONVERT_TYPE_INT_ARRAY,
+               &_mmcamcorder_enum_conv_hdr_capture,
+       },
+       {
+               CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_DETECT,
                MM_CAM_DETECT_MODE,
                MM_CAMCORDER_ATTR_NONE,
                "DetectMode",
                MM_CAMCONVERT_TYPE_INT_ARRAY,
-               NULL,
+               &_mmcamcorder_enum_conv_detect_mode,
        },
        {
                CONFIGURE_TYPE_CTRL,
@@ -522,7 +538,7 @@ static _MMCamcorderInfoConverting   g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_RANGE,
                NULL,
        },
-       {
+       { /* 35 */
                CONFIGURE_TYPE_CTRL,
                CONFIGURE_CATEGORY_CTRL_DETECT,
                MM_CAM_DETECT_SELECT_NUMBER,
@@ -540,6 +556,42 @@ static _MMCamcorderInfoConverting  g_caminfo_convert[] = {
                MM_CAMCONVERT_TYPE_INT_ARRAY,
                NULL,
        },
+       {
+               CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
+               MM_CAM_CAMERA_FACE_ZOOM_MODE,
+               MM_CAMCORDER_ATTR_NONE,
+               "FaceZoomMode",
+               MM_CAMCONVERT_TYPE_INT_ARRAY,
+               NULL,
+       },
+       {
+               CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
+               MM_CAM_CAMERA_FACE_ZOOM_LEVEL,
+               MM_CAMCORDER_ATTR_NONE,
+               "FaceZoomLevel",
+               MM_CAMCONVERT_TYPE_INT_RANGE,
+               NULL,
+       },
+       {
+               CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_CAMERA,
+               MM_CAM_RECOMMEND_CAMERA_WIDTH,
+               MM_CAM_RECOMMEND_CAMERA_HEIGHT,
+               "RecommendPreviewResolution",
+               MM_CAMCONVERT_TYPE_INT_PAIR_ARRAY,
+               NULL,
+       },
+       { /* 40 */
+               CONFIGURE_TYPE_CTRL,
+               CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH,
+               MM_CAM_CAMERA_VIDEO_STABILIZATION,
+               MM_CAMCORDER_ATTR_NONE,
+               "VideoStabilization",
+               MM_CAMCONVERT_TYPE_INT_ARRAY,
+               &_mmcamcorder_enum_conv_video_stabilization,
+       }
 };
 
 /*---------------------------------------------------------------------------
@@ -558,16 +610,19 @@ static int  __mmcamcorder_get_valid_array(int * original_array, int original_cou
 |    GLOBAL FUNCTION DEFINITIONS:                                                                                      |
 ---------------------------------------------------------------------------*/
 //convert MSL value to sensor value
-int _mmcamcorder_convert_msl_to_sensor( int attr_idx, int mslval )
+int _mmcamcorder_convert_msl_to_sensor(MMHandleType handle, int attr_idx, int mslval)
 {
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderInfoConverting *info = NULL;
        int i =0;
        int size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
 
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
        //_mmcam_dbg_log("attr_idx(%d), mslval(%d)", attr_idx, mslval);
 
-       info = g_caminfo_convert;
-       
+       info = hcamcorder->caminfo_convert;
+
        for (i = 0; i < size; i++)
        {
                if (info[i].attr_idx == attr_idx)
@@ -601,18 +656,21 @@ int _mmcamcorder_convert_msl_to_sensor( int attr_idx, int mslval )
        }
 
        _mmcam_dbg_warn("There is no category to match. Just return the original value.");
+
        return mslval;
 }
 
 //convert sensor value to MSL value
-int _mmcamcorder_convert_sensor_to_msl(int attr_idx, int sensval)
+int _mmcamcorder_convert_sensor_to_msl(MMHandleType handle, int attr_idx, int sensval)
 {
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderInfoConverting *info = NULL;
        int i = 0, j = 0;
        int size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
-       
-       _MMCamcorderInfoConverting *info = NULL;
 
-       info = g_caminfo_convert;
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       info = hcamcorder->caminfo_convert;
        
        for( i = 0 ; i < size ; i++ )
        {
@@ -697,15 +755,18 @@ __mmcamcorder_get_valid_array(int * original_array, int original_count, int ** v
 
 int _mmcamcorder_init_attr_from_configure(MMHandleType handle)
 {
-       _MMCamcorderInfoConverting *info       = NULL;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderInfoConverting *info = NULL;
 
        int table_size = 0;
        int ret = MM_ERROR_NONE;
 
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
        _mmcam_dbg_log("");
 
        /* Initialize attribute related to camera control */
-       info = g_caminfo_convert;
+       info = hcamcorder->caminfo_convert;
        table_size = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
        ret = __mmcamcorder_set_info_to_attr( handle, info, table_size );
        if( ret != MM_ERROR_NONE )
@@ -814,8 +875,8 @@ __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting
                                                                info[i].main_key, info[i].sub_key1, iarray, iarray_size, idefault);
                                                */
                                                
-                                               mmf_attrs_set_valid_type (attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
-                                               mmf_attrs_set_valid_array (attrs,  info[i].attr_idx, iarray, iarray_size);
+                                               mmf_attrs_set_valid_type(attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
+                                               mmf_attrs_set_valid_array(attrs,  info[i].attr_idx, iarray, iarray_size, idefault);
                                        }
 
                                        ret = mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, idefault);
@@ -841,7 +902,7 @@ __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting
                                        //_mmcam_dbg_log("INT Range. m:%d, s:%d, min=%d, max=%d", info[i].main_key, info[i].sub_key1, irange->min, irange->max);
                                
                                        mmf_attrs_set_valid_type (attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_RANGE);
-                                       mmf_attrs_set_valid_range(attrs, info[i].attr_idx, irange->min, irange->max);
+                                       mmf_attrs_set_valid_range(attrs, info[i].attr_idx, irange->min, irange->max, irange->default_value);
 
                                        ret = mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, irange->default_value);
                                }
@@ -883,10 +944,16 @@ __mmcamcorder_set_info_to_attr( MMHandleType handle, _MMCamcorderInfoConverting
 
                                if( pair_array && pair_array->count > 0 )
                                {
-                                       mmf_attrs_set_valid_type (attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
-                                       mmf_attrs_set_valid_array (attrs, info[i].attr_idx, pair_array->value[0], pair_array->count);
-                                       mmf_attrs_set_valid_type (attrs, info[i].attr_idx_pair, MM_ATTRS_VALID_TYPE_INT_ARRAY);
-                                       mmf_attrs_set_valid_array (attrs, info[i].attr_idx_pair, pair_array->value[1], pair_array->count);
+                                       mmf_attrs_set_valid_type(attrs, info[i].attr_idx, MM_ATTRS_VALID_TYPE_INT_ARRAY);
+                                       mmf_attrs_set_valid_array(attrs, info[i].attr_idx,
+                                                                 pair_array->value[0],
+                                                                 pair_array->count,
+                                                                 pair_array->default_value[0]);
+                                       mmf_attrs_set_valid_type(attrs, info[i].attr_idx_pair, MM_ATTRS_VALID_TYPE_INT_ARRAY);
+                                       mmf_attrs_set_valid_array(attrs, info[i].attr_idx_pair,
+                                                                 pair_array->value[1],
+                                                                 pair_array->count,
+                                                                 pair_array->default_value[1]);
 
                                        mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx, pair_array->default_value[0]);
                                        mm_attrs_set_int(MMF_CAMCORDER_ATTRS(hcamcorder), info[i].attr_idx_pair, pair_array->default_value[1]);
@@ -933,22 +1000,81 @@ int _mmcamcorder_set_converted_value(MMHandleType handle, _MMCamcorderEnumConver
 
 int _mmcamcorder_init_convert_table(MMHandleType handle)
 {
-       mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_whitebalance);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_colortone);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_iso);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_prgrm);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_focus_mode);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_focus_type);   
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_ae_type);
-//     _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_pcolor_mode);
-//     _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_flip);
-//     _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_pcolor);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_strobe_mode);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_wdr_ctrl);
-       _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_ahs);
-//     _mmcamcorder_set_converted_value(handle, &_mmcamcorder_enum_conv_picture_format);
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       int enum_conv_size = sizeof(_MMCamcorderEnumConvert);
+       int caminfo_conv_size = sizeof(g_caminfo_convert);
+       int caminfo_conv_length = sizeof(g_caminfo_convert) / sizeof(_MMCamcorderInfoConverting);
+       int i = 0;
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       /* copy default conv data into memory of handle */
+       memcpy(&(hcamcorder->caminfo_convert), &g_caminfo_convert, caminfo_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]), &_mmcamcorder_enum_conv_whitebalance, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]), &_mmcamcorder_enum_conv_colortone, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_ISO]), &_mmcamcorder_enum_conv_iso, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]), &_mmcamcorder_enum_conv_prgrm, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]), &_mmcamcorder_enum_conv_focus_mode, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]), &_mmcamcorder_enum_conv_focus_type, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]), &_mmcamcorder_enum_conv_ae_type, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]), &_mmcamcorder_enum_conv_strobe_mode, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_WDR]), &_mmcamcorder_enum_conv_wdr_ctrl, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]), &_mmcamcorder_enum_conv_ahs, enum_conv_size);
+       memcpy(&(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]), &_mmcamcorder_enum_conv_video_stabilization, enum_conv_size);
+
+       /* set ini info to conv data */
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_ISO]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_WDR]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]));
+       _mmcamcorder_set_converted_value(handle, &(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]));
+
+       /* set modified conv data to handle */
+       for (i = 0 ; i < caminfo_conv_length ; i++) {
+               if (hcamcorder->caminfo_convert[i].type == CONFIGURE_TYPE_CTRL) {
+                       switch (hcamcorder->caminfo_convert[i].category) {
+                       case CONFIGURE_CATEGORY_CTRL_STROBE:
+                               if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "StrobeMode")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_STROBE_MODE]);
+                               }
+                               break;
+                       case CONFIGURE_CATEGORY_CTRL_EFFECT:
+                               if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "WhiteBalance")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_WHITE_BALANCE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ColorTone")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_COLOR_TONE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "WDR")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_WDR]);
+                               }
+                               break;
+                       case CONFIGURE_CATEGORY_CTRL_PHOTOGRAPH:
+                               if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "FocusMode")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_FOCUS_MODE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AFType")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_AF_RANGE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AEType")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_EXPOSURE_MODE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ISO")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_ISO]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "ProgramMode")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_PROGRAM_MODE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "AntiHandshake")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_ANTI_HAND_SHAKE]);
+                               } else if (!strcmp(hcamcorder->caminfo_convert[i].keyword, "VideoStabilization")) {
+                                       hcamcorder->caminfo_convert[i].enum_convert = &(hcamcorder->enum_conv[ENUM_CONVERT_VIDEO_STABILIZATION]);
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
 
        return MM_ERROR_NONE;
 }
index c582349..28dc21f 100644 (file)
@@ -24,6 +24,7 @@
 =======================================================================================*/
 #include <mm_sound.h>
 #include <mm_sound_private.h>
+#include <avsystem.h>
 #include <audio-session-manager.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_sound.h"
 /*---------------------------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS for internal                                           |
 ---------------------------------------------------------------------------------------*/
-#define BLOCK_SIZE 2048
+#define SAMPLE_SOUND_NAME       "camera-shutter"
+#define SAMPLE_SOUND_RATE       44100
+#define DEFAULT_ACTIVE_DEVICE   -1
+
+enum {
+       SOUND_DEVICE_TYPE_SPEAKER,              /* AVSYS_AUDIO_LVOL_DEV_TYPE_SPK */
+       SOUND_DEVICE_TYPE_HEADSET,              /* AVSYS_AUDIO_LVOL_DEV_TYPE_HEADSET */
+       SOUND_DEVICE_TYPE_BTHEADSET,    /* AVSYS_AUDIO_LVOL_DEV_TYPE_BTHEADSET */
+       SOUND_DEVICE_TYPE_NUM                   /* AVSYS_AUDIO_LVOL_DEV_TYPE_MAX */
+};
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                |
 ---------------------------------------------------------------------------------------*/
-static gboolean __prepare_buffer(SOUND_INFO *info, char *filename);
-static gboolean __cleanup_buffer(SOUND_INFO *info);
-static void *__sound_open_thread_func(void *data);
-static void *__sound_write_thread_func(void *data);
 static void __solo_sound_callback(void *data);
 
-static gboolean __prepare_buffer(SOUND_INFO *info, char *filename)
+
+static void __pulseaudio_context_state_cb(pa_context *pulse_context, void *user_data)
 {
-       mmf_return_val_if_fail(info, FALSE);
-       mmf_return_val_if_fail(filename, FALSE);
+       int state = 0;
+       SOUND_INFO *info = NULL;
 
-       info->infile = sf_open(filename, SFM_READ, &info->sfinfo);
-       if (!(info->infile)) {
-               _mmcam_dbg_err("failed to open file [%s]", filename);
-               return FALSE;
-       }
+       mmf_return_if_fail(user_data);
 
-       _mmcam_dbg_log("SOUND: frame       = %lld", info->sfinfo.frames);
-       _mmcam_dbg_log("SOUND: sameplerate = %d", info->sfinfo.samplerate);
-       _mmcam_dbg_log("SOUND: channel     = %d", info->sfinfo.channels);
-       _mmcam_dbg_log("SOUND: format      = 0x%x", info->sfinfo.format);
-
-       info->pcm_size = info->sfinfo.frames * info->sfinfo.channels * 2;
-       info->pcm_buf = (short *)malloc(info->pcm_size);
-       if (info->pcm_buf == NULL) {
-               _mmcam_dbg_err("pcm_buf malloc failed");
-               sf_close(info->infile);
-               info->infile = NULL;
-               return FALSE;
+       info = (SOUND_INFO *)user_data;
+
+       state = pa_context_get_state(pulse_context);
+       switch (state) {
+       case PA_CONTEXT_READY:
+               _mmcam_dbg_log("pulseaudio context READY");
+               if (info->pulse_context == pulse_context) {
+                       /* Signal */
+                       _mmcam_dbg_log("pulseaudio send signal");
+                       pa_threaded_mainloop_signal(info->pulse_mainloop, 0);
+               }
+               break;
+       case PA_CONTEXT_TERMINATED:
+               if (info->pulse_context == pulse_context) {
+                       /* Signal */
+                       _mmcam_dbg_log("Context terminated : pulseaudio send signal");
+                       pa_threaded_mainloop_signal(info->pulse_mainloop, 0);
+               }
+               break;
+       case PA_CONTEXT_UNCONNECTED:
+       case PA_CONTEXT_CONNECTING:
+       case PA_CONTEXT_AUTHORIZING:
+       case PA_CONTEXT_SETTING_NAME:
+       case PA_CONTEXT_FAILED:
+       default:
+               _mmcam_dbg_log("pulseaudio context %p, state %d",
+                              pulse_context, state);
+               break;
        }
-       sf_read_short(info->infile, info->pcm_buf, info->pcm_size);
 
-       return TRUE;
+       return;
 }
 
-
-static gboolean __cleanup_buffer(SOUND_INFO *info)
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+static void __pulseaudio_stream_write_cb(pa_stream *stream, size_t length, void *user_data)
 {
-       mmf_return_val_if_fail(info, FALSE);
+       sf_count_t read_length;
+       short *data;
+       SOUND_INFO *info = NULL;
 
-       if (info->infile) {
-               sf_close(info->infile);
-               info->infile = NULL;
-       }
+       mmf_return_if_fail(user_data);
+
+       info = (SOUND_INFO *)user_data;
+
+       _mmcam_dbg_log("START");
 
-       if (info->pcm_buf) {
-               free(info->pcm_buf);
-               info->pcm_buf = NULL;
+       data = pa_xmalloc(length);
+
+       read_length = (sf_count_t)(length/pa_frame_size(&(info->sample_spec)));
+
+       if ((sf_readf_short(info->infile, data, read_length)) != read_length) {
+               pa_xfree(data);
+               return;
        }
 
-       _mmcam_dbg_log("Done");
+       pa_stream_write(stream, data, length, pa_xfree, 0, PA_SEEK_RELATIVE);
 
-       return TRUE;
+       info->sample_length -= length;
+
+       if (info->sample_length <= 0) {
+               pa_stream_set_write_callback(info->sample_stream, NULL, NULL);
+               pa_stream_finish_upload(info->sample_stream);
+
+               pa_threaded_mainloop_signal(info->pulse_mainloop, 0);
+               _mmcam_dbg_log("send signal DONE");
+       }
+
+       _mmcam_dbg_log("DONE read_length %d", read_length);
 }
 
 
-static void *__sound_open_thread_func(void *data)
+static void __pulseaudio_remove_sample_finish_cb(pa_context *pulse_context, int success, void *user_data)
+{
+       SOUND_INFO *info = NULL;
+
+       mmf_return_if_fail(user_data);
+
+       info = (SOUND_INFO *)user_data;
+
+       _mmcam_dbg_log("START");
+
+       pa_threaded_mainloop_signal(info->pulse_mainloop, 0);
+
+       _mmcam_dbg_log("DONE");
+}
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+gboolean _mmcamcorder_sound_init(MMHandleType handle, char *filename)
+#else /* _MMCAMCORDER_UPLOAD_SAMPLE */
+gboolean _mmcamcorder_sound_init(MMHandleType handle)
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 {
        int ret = 0;
-       system_audio_route_t route = SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY;
+       int sound_enable = TRUE;
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        SOUND_INFO *info = NULL;
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
+       mm_sound_device_in device_in;
+       mm_sound_device_out device_out;
+       pa_mainloop_api *api = NULL;
 
-       mmf_return_val_if_fail(hcamcorder, NULL);
+       mmf_return_val_if_fail(hcamcorder, FALSE);
 
-       MMTA_ACUM_ITEM_BEGIN("    __sound_open_thread_func", FALSE);
+       /* check sound play enable */
+       ret = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+                                         "capture-sound-enable", &sound_enable,
+                                         NULL);
+       _mmcam_dbg_log("Capture sound enable %d", sound_enable);
+       if (!sound_enable) {
+               return TRUE;
+       }
 
        info = &(hcamcorder->snd_info);
 
-       __ta__("        __prepare_buffer",
-       ret = __prepare_buffer(info, info->filename);
-       );
-       if (ret == FALSE) {
-               goto EXIT_FUNC;
+       pthread_mutex_lock(&(info->open_mutex));
+
+       if (info->state > _MMCAMCORDER_SOUND_STATE_NONE) {
+               _mmcam_dbg_warn("already initialized [%d]", info->state);
+               pthread_mutex_unlock(&(info->open_mutex));
+               return TRUE;
        }
 
-       __ta__("        mm_sound_pcm_play_open",
-       ret = mm_sound_pcm_play_open_ex(&(info->handle), info->sfinfo.samplerate,
-                                       (info->sfinfo.channels == 1) ? MMSOUND_PCM_MONO : MMSOUND_PCM_STEREO,
-                                       MMSOUND_PCM_S16_LE, VOLUME_TYPE_FIXED, ASM_EVENT_EXCLUSIVE_MMSOUND);
-       );
-       if (ret < 0) {
-               /* error */
-               _mmcam_dbg_err("mm_sound_pcm_play_open failed [%x]", ret);
-               __cleanup_buffer(info);
-               goto EXIT_FUNC;
-       } else {
-               /* success */
-               info->state = _MMCAMCORDER_SOUND_STATE_PREPARE;
-               _mmcam_dbg_log("mm_sound_pcm_play_open succeeded. state [%d]", info->state);
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       if (info->filename) {
+               free(info->filename);
+               info->filename = NULL;
        }
 
-       ret = mm_sound_route_get_system_policy(&route);
-       if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_err("mm_sound_route_get_system_policy failed [%x]", ret);
-               goto POLICY_ERROR;
+       info->filename = strdup(filename);
+       if (info->filename == NULL) {
+               _mmcam_dbg_err("strdup failed");
+               return FALSE;
        }
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 
-       _mmcam_dbg_log("current policy [%d]", route);
+       pthread_mutex_init(&(info->play_mutex), NULL);
+       pthread_cond_init(&(info->play_cond), NULL);
 
-       if (route != SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY) {
-               ret = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_err("mm_sound_route_set_system_policy failed [%x]", ret);
-                       goto POLICY_ERROR;
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       /* read sample */
+       memset (&(info->sfinfo), 0, sizeof(SF_INFO));
+       info->infile = sf_open(info->filename, SFM_READ, &(info->sfinfo));
+       if (!(info->infile)) {
+               _mmcam_dbg_err("Failed to open sound file");
+               goto SOUND_INIT_ERROR;
+       }
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               int errorcode;
+               ASM_resource_t mm_resource = mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+
+               /* set EXCLUSIVE session as PLAYING to pause other session */
+               if (!ASM_set_sound_state(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER,
+                                        ASM_STATE_PLAYING, mm_resource, &errorcode)) {
+                       _mmcam_dbg_err("Set state to playing failed 0x%x", errorcode);
+                       ret = MM_ERROR_POLICY_BLOCKED;
+                       goto SOUND_INIT_ERROR;
                }
 
-               info->route_policy_backup = route;
+               _mmcam_dbg_log("EXCLUSIVE session PLAYING done.");
+       } else {
+               _mmcam_dbg_log("do not register session to pause another playing session");
        }
 
-EXIT_FUNC:
-       pthread_cond_signal(&(info->open_cond));
-       pthread_mutex_unlock(&(info->open_mutex));
+       /**
+        * Init Pulseaudio thread
+        */
+       /* create pulseaudio mainloop */
+       info->pulse_mainloop = pa_threaded_mainloop_new();
+       ret = pa_threaded_mainloop_start(info->pulse_mainloop);
+
+       /* lock pulseaudio thread */
+       pa_threaded_mainloop_lock(info->pulse_mainloop);
+       /* get pulseaudio api */
+       api = pa_threaded_mainloop_get_api(info->pulse_mainloop);
+       /* create pulseaudio context */
+       info->pulse_context = pa_context_new(api, NULL);
+       /* set pulseaudio context callback */
+       pa_context_set_state_callback(info->pulse_context, __pulseaudio_context_state_cb, info);
+
+       if (pa_context_connect(info->pulse_context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) < 0) {
+               _mmcam_dbg_err("pa_context_connect error");
+       }
 
-       _mmcam_dbg_log("Done");
+       /* wait READY state of pulse context */
+       while (TRUE) {
+               pa_context_state_t state = pa_context_get_state(info->pulse_context);
 
-       MMTA_ACUM_ITEM_END("    __sound_open_thread_func", FALSE);
+               _mmcam_dbg_log("pa context state is now %d", state);
 
-       return NULL;
+               if (!PA_CONTEXT_IS_GOOD (state)) {
+                       _mmcam_dbg_log("connection failed");
+                       break;
+               }
 
-POLICY_ERROR:
-       pthread_mutex_unlock(&(info->open_mutex));
-       _mmcamcorder_sound_finalize((MMHandleType)hcamcorder);
+               if (state == PA_CONTEXT_READY) {
+                       _mmcam_dbg_log("pa context READY");
+                       break;
+               }
 
-       return NULL;
-}
+               /* Wait until the context is ready */
+               _mmcam_dbg_log("waiting..................");
+               pa_threaded_mainloop_wait(info->pulse_mainloop);
+               _mmcam_dbg_log("waiting DONE. check again...");
+       }
 
+       /* unlock pulseaudio thread */
+       pa_threaded_mainloop_unlock(info->pulse_mainloop);
 
-static void *__sound_write_thread_func(void *data)
-{
-       int ret = 0;
-       int bytes_to_write = 0;
-       int remain_bytes = 0;
-       system_audio_route_t route = SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY;
-       char *buffer_to_write = NULL;
-       SOUND_INFO *info = NULL;
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       /**
+        * Upload sample
+        */
+       if (pa_sndfile_read_sample_spec(info->infile, &(info->sample_spec)) < 0) {
+               _mmcam_dbg_err("Failed to determine sample specification from file");
+               goto SOUND_INIT_ERROR;
+       }
 
-       mmf_return_val_if_fail(hcamcorder, NULL);
+       info->sample_spec.format = PA_SAMPLE_S16LE;
 
-       info = &(hcamcorder->snd_info);
+       if (pa_sndfile_read_channel_map(info->infile, &(info->channel_map)) < 0) {
+               pa_channel_map_init_extend(&(info->channel_map), info->sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
 
-       _mmcam_dbg_log("RUN sound write thread");
+               if (info->sample_spec.channels > 2) {
+                       _mmcam_dbg_warn("Failed to determine sample specification from file");
+               }
+       }
 
-       pthread_mutex_lock(&(info->play_mutex));
+       info->sample_length = (size_t)info->sfinfo.frames * pa_frame_size(&(info->sample_spec));
 
-       do {
-               pthread_cond_wait(&(info->play_cond), &(info->play_mutex));
+       pa_threaded_mainloop_lock(info->pulse_mainloop);
 
-               _mmcam_dbg_log("Signal received. Play sound.");
+       /* prepare uploading */
+       info->sample_stream = pa_stream_new(info->pulse_context, SAMPLE_SOUND_NAME, &(info->sample_spec), NULL);
+       /* set stream write callback */
+       pa_stream_set_write_callback(info->sample_stream, __pulseaudio_stream_write_cb, info);
+       /* upload sample (ASYNC) */
+       pa_stream_connect_upload(info->sample_stream, info->sample_length);
+       /* wait for upload completion */
+       pa_threaded_mainloop_wait(info->pulse_mainloop);
 
-               if (info->thread_run == FALSE) {
-                       _mmcam_dbg_log("Exit thread command is detected");
-                       break;
-               }
+       pa_threaded_mainloop_unlock (info->pulse_mainloop);
 
-               ret = mm_sound_route_get_system_policy(&route);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_err("get_system_policy failed [%x]. skip sound play.", ret);
-                       break;
-               }
-
-               _mmcam_dbg_log("current policy [%d]", route);
+       /* close sndfile */
+       sf_close(info->infile);
+       info->infile = NULL;
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 
-               if (route != SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY) {
-                       ret = mm_sound_route_set_system_policy(SYSTEM_AUDIO_ROUTE_POLICY_HANDSET_ONLY);
-                       if (ret != MM_ERROR_NONE) {
-                               _mmcam_dbg_err("set_system_policy failed. skip sound play.");
-                               break;
-                       }
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               /* backup current route */
+               info->active_out_backup = DEFAULT_ACTIVE_DEVICE;
 
-                       info->route_policy_backup = route;
+               __ta__("        mm_sound_get_active_device",
+               ret = mm_sound_get_active_device(&device_in, &device_out);
+               );
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_err("mm_sound_get_active_device failed [%x]. skip sound play.", ret);
+                       goto SOUND_INIT_ERROR;
                }
 
-               buffer_to_write = (char *)info->pcm_buf;
-               remain_bytes = info->pcm_size;
-               bytes_to_write = 0;
+               _mmcam_dbg_log("current out [%x]", device_out);
 
-               while (remain_bytes) {
-                       bytes_to_write = (remain_bytes >= BLOCK_SIZE) ? BLOCK_SIZE : remain_bytes;
-                       ret = mm_sound_pcm_play_write(info->handle, buffer_to_write, bytes_to_write);
-                       if (ret != bytes_to_write) {
-                               _mmcam_dbg_err("pcm write error [%x]", ret);
+               if (device_out != MM_SOUND_DEVICE_OUT_SPEAKER) {
+                       ret = mm_sound_set_active_route (MM_SOUND_ROUTE_OUT_SPEAKER);
+                       if (ret != MM_ERROR_NONE) {
+                               _mmcam_dbg_err("mm_sound_set_active_route failed [%x]. skip sound play.", ret);
+                               goto SOUND_INIT_ERROR;
                        }
-                       remain_bytes -= bytes_to_write;
-                       buffer_to_write += bytes_to_write;
+                       info->active_out_backup = device_out;
                }
-       } while (TRUE);
-
-       pthread_mutex_unlock(&(info->play_mutex));
-
-       _mmcam_dbg_log("END sound write thread");
-
-       return NULL;
-}
+       }
 
+       info->state = _MMCAMCORDER_SOUND_STATE_INIT;
 
-gboolean _mmcamcorder_sound_init(MMHandleType handle, char *filename)
-{
-       int ret = 0;
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       SOUND_INFO *info = NULL;
-
-       mmf_return_val_if_fail(hcamcorder, FALSE);
+       _mmcam_dbg_log("init DONE");
 
-       info = &(hcamcorder->snd_info);
+       pthread_mutex_unlock(&(info->open_mutex));
 
-       pthread_mutex_lock(&(info->open_mutex));
+       return TRUE;
 
-       if (info->state > _MMCAMCORDER_SOUND_STATE_NONE) {
-               _mmcam_dbg_warn("already initialized [%d]", info->state);
-               pthread_mutex_unlock(&(info->open_mutex));
-               return FALSE;
-       }
+SOUND_INIT_ERROR:
 
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       /**
+        * Release allocated resources
+        */
        if (info->filename) {
                free(info->filename);
                info->filename = NULL;
        }
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+
+       /* remove pulse mainloop */
+       if (info->pulse_mainloop) {
+               /* remove pulse context */
+               if (info->pulse_context) {
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+                       /* remove uploaded sample */
+                       if (info->sample_stream) {
+                               pa_threaded_mainloop_lock(info->pulse_mainloop);
+
+                               /* Remove sample (ASYNC) */
+                               pa_operation_unref(pa_context_remove_sample(info->pulse_context, SAMPLE_SOUND_NAME, __pulseaudio_remove_sample_finish_cb, info));
+
+                               /* Wait for async operation */
+                               pa_threaded_mainloop_wait(info->pulse_mainloop);
+                       }
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 
-       info->filename = strdup(filename);
-       if (info->filename == NULL) {
-               _mmcam_dbg_err("strdup failed");
-               ret = FALSE;
-       } else {
-               pthread_mutex_init(&(info->play_mutex), NULL);
-               pthread_cond_init(&(info->play_cond), NULL);
-               if (pthread_create(&(info->thread), NULL, __sound_write_thread_func, (void *)handle) == 0) {
-                       info->thread_run = TRUE;
-                       info->state = _MMCAMCORDER_SOUND_STATE_INIT;
-                       info->route_policy_backup = -1;
-                       _mmcam_dbg_log("write thread created");
-                       ret = TRUE;
-               } else {
-                       _mmcam_dbg_err("failed to create write thread");
-                       free(info->filename);
-                       info->filename = NULL;
-                       ret = FALSE;
+                       /* Make sure we don't get any further callbacks */
+                       pa_context_set_state_callback(info->pulse_context, NULL, NULL);
+
+                       pa_context_disconnect(info->pulse_context);
+                       pa_context_unref(info->pulse_context);
+                       info->pulse_context = NULL;
                }
+
+               pa_threaded_mainloop_stop(info->pulse_mainloop);
+               pa_threaded_mainloop_free(info->pulse_mainloop);
+               info->pulse_mainloop = NULL;
        }
 
+       /* remove mutex and cond */
+       pthread_mutex_destroy(&(info->play_mutex));
+       pthread_cond_destroy(&(info->play_cond));
+
        pthread_mutex_unlock(&(info->open_mutex));
 
-       return ret;
+       return FALSE;
 }
 
 
-gboolean _mmcamcorder_sound_prepare(MMHandleType handle)
+gboolean _mmcamcorder_sound_play(MMHandleType handle)
 {
-       int ret = FALSE;
-       pthread_t open_thread;
+       int ret = 0;
+       int sound_enable = TRUE;
+       int volume_type = AVSYS_AUDIO_VOLUME_TYPE_FIXED;
+       int device_type = SOUND_DEVICE_TYPE_SPEAKER;
+       int left_volume = 0, right_volume = 0;
+       float left_gain = 1.0f, right_gain = 1.0f;
+       int set_volume = 0;
+       int max_level = 0;
+       unsigned int volume_level;
+
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        SOUND_INFO *info = NULL;
+       pa_operation *pulse_op = NULL;
 
        mmf_return_val_if_fail(hcamcorder, FALSE);
 
+       /* check sound play enable */
+       ret = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+                                         "capture-sound-enable", &sound_enable,
+                                         NULL);
+       _mmcam_dbg_log("Capture sound enable %d", sound_enable);
+       if (!sound_enable) {
+               return TRUE;
+       }
+
        info = &(hcamcorder->snd_info);
 
        pthread_mutex_lock(&(info->open_mutex));
 
-       if (info->state == _MMCAMCORDER_SOUND_STATE_INIT) {
-               if (pthread_create(&open_thread, NULL, __sound_open_thread_func, (void *)handle) == 0) {
-                       _mmcam_dbg_log("open thread created");
-                       ret = TRUE;
-               } else {
-                       _mmcam_dbg_err("failed to create open thread");
-                       ret = FALSE;
-                       pthread_mutex_unlock(&(info->open_mutex));
-               }
-       } else {
-               _mmcam_dbg_warn("Wrong state [%d]", info->state);
-               ret = FALSE;
+       if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
+               _mmcam_dbg_log("not initialized state:[%d]", info->state);
                pthread_mutex_unlock(&(info->open_mutex));
+               return FALSE;
        }
 
-       return ret;
-}
+       /* get volume level and set volume */
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF) {
+               gboolean sound_status = hcamcorder->sub_context->info_image->sound_status;
+               mm_sound_device_in device_in = MM_SOUND_DEVICE_IN_NONE;
+               mm_sound_device_out device_out = MM_SOUND_DEVICE_OUT_NONE;
 
+               volume_type = AVSYS_AUDIO_VOLUME_TYPE_MEDIA;
+               avsys_audio_get_volume_max_ex(volume_type, &max_level);
 
-gboolean _mmcamcorder_sound_play(MMHandleType handle)
-{
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       SOUND_INFO *info = NULL;
+               /* get sound path */
+               __ta__("                    mm_sound_get_active_device",
+               mm_sound_get_active_device(&device_in, &device_out);
+               );
 
-       mmf_return_val_if_fail(hcamcorder, FALSE);
+               _mmcam_dbg_log("sound status %d, device out %x", sound_status, device_out);
 
-       info = &(hcamcorder->snd_info);
+               if (device_out == MM_SOUND_DEVICE_OUT_WIRED_ACCESSORY) {
+                       device_type = SOUND_DEVICE_TYPE_HEADSET;
+               } else if (device_out == MM_SOUND_DEVICE_OUT_BT_A2DP) {
+                       device_type = SOUND_DEVICE_TYPE_BTHEADSET;
+               }
 
-       pthread_mutex_lock(&(info->open_mutex));
+               if (sound_status || device_out != MM_SOUND_DEVICE_OUT_SPEAKER) {
+                       volume_level = hcamcorder->sub_context->info_image->volume_level;
+                       _mmcam_dbg_log("current volume level %d", volume_level);
+               } else {
+                       volume_level = 0;
+                       _mmcam_dbg_log("current state is SILENT mode and SPEAKER output");
+               }
 
-       if (info->state < _MMCAMCORDER_SOUND_STATE_PREPARE) {
-               _mmcam_dbg_log("not initialized state:[%d]", info->state);
-               pthread_mutex_unlock(&(info->open_mutex));
-               return FALSE;
+               if (volume_level > (unsigned int)max_level) {
+                       _mmcam_dbg_warn("invalid volume level. set max");
+                       volume_level = (unsigned int)max_level;
+               }
+       } else {
+               avsys_audio_get_volume_max_ex(volume_type, &max_level);
+               volume_level = (unsigned int)max_level;
        }
 
+       avsys_audio_get_volume_table(volume_type, device_type, (int)volume_level, &left_volume, &right_volume);
+       avsys_audio_get_volume_gain_table(
+               AVSYS_AUDIO_VOLUME_GAIN_IDX(AVSYS_AUDIO_VOLUME_GAIN_SHUTTER2),
+               device_type, &left_gain, &right_gain);
+       set_volume = left_volume * left_gain;
+       _mmcam_dbg_log("volume type %d, device type %d, volume level %d, left volume %d left gain %.2f set_volume %d",
+                                       volume_type, device_type, volume_level, left_volume, left_gain, set_volume);
+
+       _mmcam_dbg_log("shutter sound policy %d, volume %d",
+                      hcamcorder->shutter_sound_policy, set_volume);
+
        _mmcam_dbg_log("Play start");
 
-       pthread_mutex_lock(&(info->play_mutex));
-       pthread_cond_signal(&(info->play_cond));
-       pthread_mutex_unlock(&(info->play_mutex));
+       __ta__("                    pa_context_play_sample",
+       pulse_op = pa_context_play_sample(info->pulse_context,
+                                         SAMPLE_SOUND_NAME,
+                                         NULL,
+                                         set_volume,
+                                         NULL,
+                                         NULL);
+       );
+       if (pulse_op) {
+               pa_operation_unref(pulse_op);
+               pulse_op = NULL;
+       }
 
        pthread_mutex_unlock(&(info->open_mutex));
 
@@ -354,80 +507,153 @@ gboolean _mmcamcorder_sound_finalize(MMHandleType handle)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        SOUND_INFO *info = NULL;
+       mm_sound_device_in device_in;
+       mm_sound_device_out device_out;
+       int ret = 0;
 
        mmf_return_val_if_fail(hcamcorder, FALSE);
 
        info = &(hcamcorder->snd_info);
 
+       _mmcam_dbg_err("START");
+
        pthread_mutex_lock(&(info->open_mutex));
 
        if (info->state < _MMCAMCORDER_SOUND_STATE_INIT) {
                _mmcam_dbg_warn("not initialized");
                pthread_mutex_unlock(&(info->open_mutex));
-               return FALSE;
+               return TRUE;
        }
 
-       info->thread_run = 0;
-       pthread_cond_signal(&(info->play_cond));
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               /**
+                * Restore route
+                */
+               _mmcam_dbg_log("restore route");
+               if (info->active_out_backup != DEFAULT_ACTIVE_DEVICE) {
+                       ret = mm_sound_get_active_device(&device_in, &device_out);
+                       if (ret != MM_ERROR_NONE) {
+                               _mmcam_dbg_err("mm_sound_get_active_device failed [%x]. skip sound play.", ret);
+                       }
+
+                       _mmcam_dbg_log("current out [%x]", device_out);
 
-       if (info->thread) {
-               _mmcam_dbg_log("wait for sound write thread join");
-               pthread_join(info->thread, NULL);
-               _mmcam_dbg_log("join done");
+                       if (device_out != info->active_out_backup) {
+                               ret = mm_sound_set_active_route (info->active_out_backup);
+                               if (ret != MM_ERROR_NONE) {
+                                       _mmcam_dbg_err("mm_sound_set_active_route failed [%x]. skip sound play.", ret);
+                               }
+                       }
+               }
        }
 
-       if (info->state == _MMCAMCORDER_SOUND_STATE_PREPARE) {
-               _mmcam_dbg_log("restore route policy [%d]", info->route_policy_backup);
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+       /**
+        * Remove sample
+        */
+       _mmcam_dbg_log("remove sample");
 
-               if (info->route_policy_backup != -1) {
-                       mm_sound_route_set_system_policy(info->route_policy_backup);
-               }
+       pa_threaded_mainloop_lock(info->pulse_mainloop);
 
-               mm_sound_pcm_play_close(info->handle);
-               __cleanup_buffer(info);
-       }
+       /* Remove sample (ASYNC) */
+       pa_operation_unref(pa_context_remove_sample(info->pulse_context, SAMPLE_SOUND_NAME, __pulseaudio_remove_sample_finish_cb, info));
+
+       /* Wait for async operation */
+       pa_threaded_mainloop_wait(info->pulse_mainloop);
 
+       pa_threaded_mainloop_unlock(info->pulse_mainloop);
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+
+       /**
+        * Release pulseaudio thread
+        */
+       _mmcam_dbg_log("release pulseaudio thread");
+
+       pa_threaded_mainloop_lock(info->pulse_mainloop);
+
+       pa_context_disconnect(info->pulse_context);
+
+       /* Make sure we don't get any further callbacks */
+       pa_context_set_state_callback(info->pulse_context, NULL, NULL);
+
+       pa_context_unref(info->pulse_context);
+       info->pulse_context = NULL;
+
+       pa_threaded_mainloop_unlock(info->pulse_mainloop);
+
+       pa_threaded_mainloop_stop(info->pulse_mainloop);
+       pa_threaded_mainloop_free(info->pulse_mainloop);
+       info->pulse_mainloop = NULL;
+
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
        if (info->filename) {
                free(info->filename);
                info->filename = NULL;
        }
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
 
        info->state = _MMCAMCORDER_SOUND_STATE_NONE;
-       info->route_policy_backup = -1;
+       info->active_out_backup = DEFAULT_ACTIVE_DEVICE;
 
+       /* release mutex and cond */
+       _mmcam_dbg_log("release play_mutex/cond");
        pthread_mutex_destroy(&(info->play_mutex));
        pthread_cond_destroy(&(info->play_cond));
 
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               int errorcode = 0;
+               ASM_resource_t mm_resource = ASM_RESOURCE_CAMERA | ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_ENCODER;
+
+               /* stop EXCLUSIVE session */
+               if (!ASM_set_sound_state(hcamcorder->asm_handle_ex, ASM_EVENT_EXCLUSIVE_MMCAMCORDER,
+                                        ASM_STATE_STOP, mm_resource, &errorcode)) {
+                       _mmcam_dbg_err("EXCLUSIVE Set state to STOP failed 0x%x", errorcode);
+               } else {
+                       _mmcam_dbg_log("EXCLUSIVE session STOP done.");
+               }
+       }
+
        pthread_mutex_unlock(&(info->open_mutex));
 
-       _mmcam_dbg_log("Done");
+       _mmcam_dbg_err("DONE");
 
        return TRUE;
 }
 
 
+gboolean _mmcamcorder_sound_capture_play_cb(gpointer data)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(data);
+
+       mmf_return_val_if_fail(hcamcorder, FALSE);
+
+       _mmcam_dbg_log("Capture sound PLAY in idle callback");
+
+       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+
+       return FALSE;
+}
+
+
 void _mmcamcorder_sound_solo_play(MMHandleType handle, const char* filepath, gboolean sync)
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
 
        int sound_handle = 0;
-       int ret = 0;
+       int ret = MM_ERROR_NONE;
        int sound_enable = TRUE;
+       int gain_type = VOLUME_GAIN_SHUTTER1;
 
-       mmf_return_if_fail( filepath );
+       mmf_return_if_fail(filepath && hcamcorder);
 
-       _mmcam_dbg_log( "START" );
+       _mmcam_dbg_log("START : %s", filepath);
 
        ret = mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
                                          "capture-sound-enable", &sound_enable,
                                          NULL);
-       if (ret == MM_ERROR_NONE) {
-               if (sound_enable == FALSE) {
-                       _mmcam_dbg_log("Capture sound DISABLED.");
-                       return;
-               }
-       } else {
-               _mmcam_dbg_warn("capture-sound-enable get FAILED.[%x]", ret);
+       _mmcam_dbg_log("Capture sound enable %d", sound_enable);
+       if (!sound_enable) {
+               return;
        }
 
        ret = pthread_mutex_trylock(&(hcamcorder->sound_lock));
@@ -436,10 +662,40 @@ void _mmcamcorder_sound_solo_play(MMHandleType handle, const char* filepath, gbo
                return;
        }
 
-       MMTA_ACUM_ITEM_BEGIN("CAPTURE SOUND:mm_sound_play_loud_solo_sound", FALSE);
+       /* check filename to set gain_type */
+       if (!strcmp(filepath, _MMCAMCORDER_FILEPATH_CAPTURE_SND)) {
+               gain_type = VOLUME_GAIN_SHUTTER1;
+       } else if (!strcmp(filepath, _MMCAMCORDER_FILEPATH_CAPTURE2_SND)) {
+               gain_type = VOLUME_GAIN_SHUTTER2;
+       } else if (!strcmp(filepath, _MMCAMCORDER_FILEPATH_REC_START_SND) ||
+                  !strcmp(filepath, _MMCAMCORDER_FILEPATH_REC_STOP_SND)) {
+               gain_type = VOLUME_GAIN_CAMCORDING;
+       }
+
+       _mmcam_dbg_log("gain type 0x%x", gain_type);
+
+       if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_ON) {
+               __ta__("CAPTURE SOUND:mm_sound_play_loud_solo_sound",
+               ret = mm_sound_play_loud_solo_sound(filepath, VOLUME_TYPE_FIXED | gain_type,
+                                                   __solo_sound_callback, (void*)hcamcorder, &sound_handle);
+               );
+       } else {
+               gboolean sound_status = hcamcorder->sub_context->info_image->sound_status;
+               mm_sound_device_in device_in;
+               mm_sound_device_out device_out;
+
+               /* get sound path */
+               mm_sound_get_active_device(&device_in, &device_out);
 
-       ret = mm_sound_play_loud_solo_sound(filepath, VOLUME_TYPE_FIXED, __solo_sound_callback,
-                                           (void*)hcamcorder, &sound_handle);
+               _mmcam_dbg_log("sound status %d, device out %x", sound_status, device_out);
+
+               if (sound_status || device_out != MM_SOUND_DEVICE_OUT_SPEAKER) {
+                       __ta__("CAPTURE SOUND:mm_sound_play_sound",
+                       ret = mm_sound_play_sound(filepath, VOLUME_TYPE_MEDIA | gain_type,
+                                                 __solo_sound_callback, (void*)hcamcorder, &sound_handle);
+                       );
+               }
+       }
        if (ret != MM_ERROR_NONE) {
                _mmcam_dbg_err( "Capture sound play FAILED.[%x]", ret );
        } else {
@@ -453,6 +709,8 @@ void _mmcamcorder_sound_solo_play(MMHandleType handle, const char* filepath, gbo
 
                        _mmcam_dbg_log("Wait for signal");
 
+                       MMTA_ACUM_ITEM_BEGIN("CAPTURE SOUND:wait sound play finish", FALSE);
+
                        if (!pthread_cond_timedwait(&(hcamcorder->sound_cond), &(hcamcorder->sound_lock), &timeout)) {
                                _mmcam_dbg_log("signal received.");
                        } else {
@@ -461,11 +719,11 @@ void _mmcamcorder_sound_solo_play(MMHandleType handle, const char* filepath, gbo
                                        mm_sound_stop_sound(sound_handle);
                                }
                        }
+
+                       MMTA_ACUM_ITEM_END("CAPTURE SOUND:wait sound play finish", FALSE);
                }
        }
 
-       MMTA_ACUM_ITEM_END("CAPTURE SOUND:mm_sound_play_loud_solo_sound", FALSE);
-
        pthread_mutex_unlock(&(hcamcorder->sound_lock));
 
        _mmcam_dbg_log("DONE");
index f6ef4fe..84c433d 100644 (file)
@@ -25,6 +25,7 @@
 #include <sys/time.h>
 #include <sys/times.h>
 #include <gst/interfaces/cameracontrol.h>
+#include <mm_sound.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_stillshot.h"
 #include "mm_camcorder_exifinfo.h"
 /*---------------------------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS for internal                                           |
 ---------------------------------------------------------------------------------------*/
+#define THUMBNAIL_WIDTH         320
+#define THUMBNAIL_HEIGHT        240
+#define THUMBNAIL_DEFAULT_RATIO 1.34
+#define THUMBNAIL_JPEG_QUALITY  50
+#define TRY_LOCK_MAX_COUNT      100
+#define TRY_LOCK_TIME           50000   /* ms */
 
 
 /*---------------------------------------------------------------------------------------
@@ -54,12 +61,13 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle);
 int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle);
 static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffer1, GstBuffer *buffer2, GstBuffer *buffer3, gpointer u_data);
 
-/* Functions for JPEG capture with Encode bin */
-int _mmcamcorder_image_cmd_capture_with_encbin(MMHandleType handle);
-int _mmcamcorder_image_cmd_preview_start_with_encbin(MMHandleType handle);
-int _mmcamcorder_image_cmd_preview_stop_with_encbin(MMHandleType handle);
+/* Function for JPEG capture with Encode bin */
 static gboolean        __mmcamcorder_encodesink_handoff_callback(GstElement *fakesink, GstBuffer *buffer, GstPad *pad, gpointer u_data);
 
+/* sound status changed callback */
+static void __sound_status_changed_cb(keynode_t* node, void *data);
+static void __volume_level_changed_cb(void* user_data);
+
 /*=======================================================================================
 |  FUNCTION DEFINITIONS                                                                        |
 =======================================================================================*/
@@ -76,97 +84,97 @@ int _mmcamcorder_add_stillshot_pipeline(MMHandleType handle)
        GstPad *srcpad = NULL;
        GstPad *sinkpad = NULL;
 
-       mmf_camcorder_t *hcamcorder= MMF_CAMCORDER(handle);
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
        _MMCamcorderImageInfo *info = NULL;
        
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc && sc->info_image && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       info = sc->info;
+       info = sc->info_image;
 
        _mmcam_dbg_log("");
 
-       //Create gstreamer element
-       //Check main pipeline
+       /* Check main pipeline */
        if (!sc->element[_MMCAMCORDER_MAIN_PIPE].gst) {
                _mmcam_dbg_err( "Main Pipeline is not existed." );
-               err = MM_ERROR_CAMCORDER_RESOURCE_CREATION;
-               goto pipeline_creation_error;
+               return MM_ERROR_CAMCORDER_RESOURCE_CREATION;
        }
 
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
-                                       CONFIGURE_CATEGORY_MAIN_CAPTURE,
-                                       "UseEncodebin",
-                                       &sc->bencbin_capture);
-
-       if (sc->bencbin_capture) {
-               _mmcam_dbg_log("Using Encodebin for capturing");
-               __ta__("        _mmcamcorder_create_encodesink_bin",
-               err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder);
-               );
-               if (err != MM_ERROR_NONE) {
-                       return err;
-               }
-
-               gst_bin_add_many(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst),
-                                sc->element[_MMCAMCORDER_ENCSINK_BIN].gst,
-                                NULL);
+       /* Create gstreamer element */
+       _mmcam_dbg_log("Using Encodebin for capturing");
 
-               /* Link each element */
-               srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_BIN].gst, "src1");
-               sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, "image_sink0");
-               _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, element_link_error)
+       __ta__("        _mmcamcorder_create_encodesink_bin",
+       err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder, MM_CAMCORDER_ENCBIN_PROFILE_IMAGE);
+       );
+       if (err != MM_ERROR_NONE) {
+               return err;
+       }
 
-               MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,
-                                          _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
-                                          G_CALLBACK(__mmcamcorder_encodesink_handoff_callback),
-                                          hcamcorder);
-       } else {
-               _mmcam_dbg_log("NOT using Encodebin for capturing");
+       gst_bin_add_many(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst),
+                        sc->element[_MMCAMCORDER_ENCSINK_BIN].gst,
+                        NULL);
 
-               /*set video source element*/
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "signal-still-capture", TRUE);
+       /* Link each element */
+       srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_BIN].gst, "src1");
+       sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, "image_sink0");
+       _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, element_link_error)
 
-               MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst,
-                                          _MMCAMCORDER_HANDLER_STILLSHOT, "still-capture",
-                                          G_CALLBACK(__mmcamcorder_image_capture_cb),
-                                          hcamcorder);
-       }
+       MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,
+                                  _MMCAMCORDER_HANDLER_STILLSHOT, "handoff",
+                                  G_CALLBACK(__mmcamcorder_encodesink_handoff_callback),
+                                  hcamcorder);
 
        return MM_ERROR_NONE;
 
 element_link_error:
-       if (sc->bencbin_capture) {
-               _mmcam_dbg_err("Link encodebin failed!");
+       _mmcam_dbg_err("Link encodebin failed!");
 
-               if (sc->element[_MMCAMCORDER_ENCSINK_BIN].gst != NULL) {
-                       int ret = MM_ERROR_NONE;
+       if (sc->element[_MMCAMCORDER_ENCSINK_BIN].gst != NULL) {
+               int ret = MM_ERROR_NONE;
 
-                       __ta__( "        EncodeBin Set NULL",
-                       ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, GST_STATE_NULL);
-                       );
-                       if (ret != MM_ERROR_NONE) {
-                               _mmcam_dbg_err("Faile to change encode bin state[%d]", ret);
-                               /* Can't return here. */
-                               /* return ret; */
-                       }
+               __ta__( "        EncodeBin Set NULL",
+               ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, GST_STATE_NULL);
+               );
+               _mmcam_dbg_log("encodebin _mmcamcorder_gst_set_state NULL ret[%d]", ret);
 
-                       gst_bin_remove(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst),
-                                      sc->element[_MMCAMCORDER_ENCSINK_BIN].gst);
+               gst_bin_remove(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst),
+                              sc->element[_MMCAMCORDER_ENCSINK_BIN].gst);
 
-                       _mmcamcorder_remove_element_handle(handle, _MMCAMCORDER_ENCSINK_BIN, _MMCAMCORDER_ENCSINK_SINK);
+               _mmcamcorder_remove_element_handle(handle, _MMCAMCORDER_ENCSINK_BIN, _MMCAMCORDER_ENCSINK_SINK);
 
-                       _mmcam_dbg_log("Encodebin removed");
-               }
+               _mmcam_dbg_log("Encodebin removed");
        }
 
        return MM_ERROR_CAMCORDER_GST_LINK;
+}
+
 
-pipeline_creation_error:
-       return err;
+int _mmcamcorder_connect_capture_signal(MMHandleType handle)
+{
+       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
+       _MMCamcorderSubContext *sc = NULL;
+
+       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
+       mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+
+       /*set video source element*/
+       if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "signal-still-capture", TRUE);
+
+               MMCAMCORDER_SIGNAL_CONNECT(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst,
+                                          _MMCAMCORDER_HANDLER_STILLSHOT, "still-capture",
+                                          G_CALLBACK(__mmcamcorder_image_capture_cb),
+                                          hcamcorder);
+               return MM_ERROR_NONE;
+       } else {
+               _mmcam_dbg_err("videosrc element is not created yet");
+               return MM_ERROR_CAMCORDER_NOT_INITIALIZED;
+       }
 }
 
 
@@ -179,9 +187,9 @@ int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle)
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc && sc->info_image && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       info = sc->info;
+       info = sc->info_image;
 
        _mmcam_dbg_log("");
 
@@ -213,7 +221,7 @@ int _mmcamcorder_remove_stillshot_pipeline(MMHandleType handle)
 }
 
 
-void _mmcamcorder_destroy_image_pipeline(MMHandleType handle)
+void _mmcamcorder_destroy_video_capture_pipeline(MMHandleType handle)
 {
        GstPad *reqpad1 = NULL;
        GstPad *reqpad2 = NULL;
@@ -225,7 +233,7 @@ void _mmcamcorder_destroy_image_pipeline(MMHandleType handle)
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        mmf_return_if_fail(sc && sc->element);
-       
+
        _mmcam_dbg_log("");
 
        if (sc->element[_MMCAMCORDER_MAIN_PIPE].gst) {
@@ -241,18 +249,8 @@ void _mmcamcorder_destroy_image_pipeline(MMHandleType handle)
                gst_object_unref(reqpad1);
                gst_object_unref(reqpad2);
 
-               if (sc->bencbin_capture) {
-                       if (sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst) {
-                               GstPad *reqpad0 = NULL;
-                               reqpad0 = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "image");
-                               gst_element_release_request_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, reqpad0);
-                               gst_object_unref(reqpad0);
-                       }
-               }
-
                gst_object_unref(sc->element[_MMCAMCORDER_MAIN_PIPE].gst);
-               /* Why is this commented? */
-               /* sc->element[_MMCAMCORDER_MAIN_PIPE].gst = NULL; */
+               /* NULL initialization will be done in _mmcamcorder_element_release_noti */
        }
 }
 
@@ -265,8 +263,8 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
        int height = 0;
        int fps = 0;
        int cap_format = MM_PIXEL_FORMAT_NV12;
-       int cap_jpeg_quality = 0;
        int image_encoder = MM_IMAGE_CODEC_JPEG;
+       int strobe_mode = MM_CAMCORDER_STROBE_MODE_OFF;
        unsigned int cap_fourcc = 0;
 
        char *err_name = NULL;
@@ -281,16 +279,17 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
        _MMCamcorderImageInfo *info = NULL;
        _MMCamcorderSubContext *sc = NULL;
        type_element *VideosrcElement = NULL;
+       MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE;
 
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc && sc->info_image && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        _mmcam_dbg_log("");
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-       info = sc->info;
+       info = sc->info_image;
 
        _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
                                        CONFIGURE_CATEGORY_MAIN_CAPTURE,
@@ -311,27 +310,32 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
 
        MMTA_ACUM_ITEM_BEGIN("Real First Capture Start",false);
 
+       /* get current state */
+       mm_camcorder_get_state(handle, &current_state);
+
        /* set capture flag */
        info->capturing = TRUE;
 
-       ret = mm_camcorder_get_attributes(handle, &err_name,
-                                         MMCAM_IMAGE_ENCODER_QUALITY, &cap_jpeg_quality,
-                                         MMCAM_IMAGE_ENCODER, &image_encoder,
-                                         MMCAM_CAMERA_WIDTH, &width,
-                                         MMCAM_CAMERA_HEIGHT, &height,
-                                         MMCAM_CAMERA_FPS, &fps,
-                                         MMCAM_CAPTURE_FORMAT, &cap_format,
-                                         MMCAM_CAPTURE_WIDTH, &info->width,
-                                         MMCAM_CAPTURE_HEIGHT, &info->height,
-                                         MMCAM_CAPTURE_COUNT, &info->count,
-                                         MMCAM_CAPTURE_INTERVAL, &info->interval,
-                                         NULL);
-       if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
-               SAFE_FREE (err_name);
-               goto cmd_error;
-       }
-
+       mm_camcorder_get_attributes(handle, &err_name,
+                                   MMCAM_IMAGE_ENCODER, &image_encoder,
+                                   MMCAM_CAMERA_WIDTH, &width,
+                                   MMCAM_CAMERA_HEIGHT, &height,
+                                   MMCAM_CAMERA_FPS, &fps,
+                                   MMCAM_CAMERA_HDR_CAPTURE, &info->hdr_capture_mode,
+                                   MMCAM_CAPTURE_FORMAT, &cap_format,
+                                   MMCAM_CAPTURE_WIDTH, &info->width,
+                                   MMCAM_CAPTURE_HEIGHT, &info->height,
+                                   MMCAM_CAPTURE_COUNT, &info->count,
+                                   MMCAM_CAPTURE_INTERVAL, &info->interval,
+                                   MMCAM_STROBE_MODE, &strobe_mode,
+                                   NULL);
+       if (err_name) {
+               _mmcam_dbg_warn("get_attributes err %s", err_name);
+               free(err_name);
+               err_name = NULL;
+       }
+
+       /* check capture count */
        if (info->count < 1) {
                _mmcam_dbg_err("capture count[%d] is invalid", info->count);
                ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
@@ -342,38 +346,54 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                info->type = _MMCamcorder_MULTI_SHOT;
                info->next_shot_time = 0;
                info->multi_shot_stop = FALSE;
+
+               /* sound init to pause other session */
+               __ta__("        _mmcamcorder_sound_init",
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+               _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
+#else /* _MMCAMCORDER_UPLOAD_SAMPLE */
+               _mmcamcorder_sound_init(handle);
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+               );
+       }
+
+       _mmcam_dbg_log("preview(%dx%d,fmt:%d), capture(%dx%d,fmt:%d), count(%d), hdr mode(%d)",
+                      width, height, info->preview_format,
+                      info->width, info->height, cap_format,
+                      info->count, info->hdr_capture_mode);
+
+       /* check state */
+       if (current_state >= MM_CAMCORDER_STATE_RECORDING) {
+               if (info->type == _MMCamcorder_MULTI_SHOT ||
+                   info->hdr_capture_mode != MM_CAMCORDER_HDR_OFF ||
+                   info->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                       _mmcam_dbg_err("not support multi/HDR capture while recording or NOT ITLV format");
+                       ret = MM_ERROR_CAMCORDER_INVALID_STATE;
+                       goto cmd_error;
+               }
        }
 
        info->capture_cur_count = 0;
        info->capture_send_count = 0;
 
-       _mmcam_dbg_log("videosource(%dx%d), capture(%dx%d), count(%d)",
-                      width, height, info->width, info->height, info->count);
-
        sc->internal_encode = FALSE;
 
-       if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
+       if (!sc->bencbin_capture) {
                /* Check encoding method */
                if (cap_format == MM_PIXEL_FORMAT_ENCODED) {
                        if (sc->SensorEncodedCapture && info->type == _MMCamcorder_SINGLE_SHOT) {
                                cap_fourcc = _mmcamcorder_get_fourcc(cap_format, image_encoder, hcamcorder->use_zero_copy_format);
                                _mmcam_dbg_log("Sensor JPEG Capture");
                        } else {
-                               int raw_capture_format = MM_PIXEL_FORMAT_I420;
-
-                               ret = mm_camcorder_get_attributes(handle, &err_name,
-                                                                 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, &raw_capture_format,
-                                                                 NULL );
-                               if (ret != MM_ERROR_NONE) {
-                                       _mmcam_dbg_warn("Get Recommend capture format failed.");
-                                       SAFE_FREE(err_name);
-                                       goto cmd_error;
+                               /* no need to encode internally if ITLV format */
+                               if (info->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                                       sc->internal_encode = TRUE;
                                }
 
-                               cap_fourcc = _mmcamcorder_get_fourcc(raw_capture_format, image_encoder, hcamcorder->use_zero_copy_format);
-                               sc->internal_encode = TRUE;
+                               cap_fourcc = _mmcamcorder_get_fourcc(info->preview_format, image_encoder, hcamcorder->use_zero_copy_format);
 
-                               _mmcam_dbg_log("MSL JPEG Capture");
+                               _mmcam_dbg_log("MSL JPEG Capture : capture fourcc %c%c%c%c",
+                                              cap_fourcc, cap_fourcc>>8, cap_fourcc>>16, cap_fourcc>>24);
                        }
                } else {
                        cap_fourcc = _mmcamcorder_get_fourcc(cap_format, MM_IMAGE_CODEC_INVALID, hcamcorder->use_zero_copy_format);
@@ -383,13 +403,13 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                        }
                }
 
-               _mmcam_dbg_log("capture format (%d), jpeg quality (%d)", cap_format, cap_jpeg_quality);
+               _mmcam_dbg_log("capture format (%d)", cap_format);
 
                /* Note: width/height of capture is set in commit function of attribute or in create function of pipeline */
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-fourcc", cap_fourcc);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-interval", info->interval);
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-count", info->count);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-jpg-quality", cap_jpeg_quality);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hdr-capture", info->hdr_capture_mode);
 
                if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                        _mmcam_dbg_err("Can't cast Video source into camera control.");
@@ -402,6 +422,13 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                int need_change = 0;
                int set_width = 0;
                int set_height = 0;
+               int cap_jpeg_quality = 0;
+
+               if (current_state >= MM_CAMCORDER_STATE_RECORDING) {
+                       _mmcam_dbg_err("could not capture in this target while recording");
+                       ret = MM_ERROR_CAMCORDER_INVALID_STATE;
+                       goto cmd_error;
+               }
 
                if (UseCaptureMode) {
                        if (width != MMFCAMCORDER_HIGHQUALITY_WIDTH || height != MMFCAMCORDER_HIGHQUALITY_HEIGHT) {
@@ -413,6 +440,26 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                        }
                }
 
+               /* make pipeline state as READY */
+               ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_READY);
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_err("failed to set state PAUSED %x", ret);
+                       return ret;
+               }
+
+               /* add encodesinkbin */
+               ret = _mmcamcorder_add_stillshot_pipeline((MMHandleType)hcamcorder);
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_err("failed to create encodesinkbin %x", ret);
+                       return ret;
+               }
+
+               /* set JPEG quality */
+               mm_camcorder_get_attributes(handle, &err_name,
+                                           MMCAM_IMAGE_ENCODER_QUALITY, &cap_jpeg_quality,
+                                           NULL);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_IENC].gst, "quality", cap_jpeg_quality);
+
                if (need_change) {
                        _mmcam_dbg_log("Need to change resolution");
 
@@ -452,16 +499,40 @@ int _mmcamcorder_image_cmd_capture(MMHandleType handle)
                        _mmcam_dbg_log("Change to target resolution(%d, %d)", set_width, set_height);
                } else {
                        _mmcam_dbg_log("No need to change resolution. Open toggle now.");
-                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
+               }
+
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs", TRUE);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
+
+               /* make pipeline state as PLAYING */
+               ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_PLAYING);
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_err("failed to set state PLAYING %x", ret);
+                       return ret;
                }
        }
 
        /* Play capture sound here if single capture */
-       if (info->type == _MMCamcorder_SINGLE_SHOT) {
-               _mmcamcorder_sound_solo_play(handle, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+       if ((info->type == _MMCamcorder_SINGLE_SHOT &&
+            (info->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY || strobe_mode == MM_CAMCORDER_STROBE_MODE_OFF)) ||
+           info->hdr_capture_mode) {
+               if (current_state < MM_CAMCORDER_STATE_RECORDING) {
+                       __ta__("        _mmcamcorder_sound_solo_play",
+                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+                       );
+               }
+
+               /* set flag */
+               info->played_capture_sound = TRUE;
+       } else {
+               /* set flag */
+               info->played_capture_sound = FALSE;
        }
 
+       return ret;
+
 cmd_error:
+       info->capturing = FALSE;
        return ret;
 }
 
@@ -475,11 +546,11 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
        int cap_width = 0;
        int cap_height = 0;
        int rotation = 0;
-       int input_index = 0;
        int set_width = 0;
        int set_height = 0;
        int set_rotate = 0;
        int current_framecount = 0;
+       int current_state = MM_CAMCORDER_STATE_NONE;
        gboolean fps_auto = FALSE;
        char *err_name = NULL;
        char *videosrc_name = NULL;
@@ -497,12 +568,12 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
        mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc && sc->info_image && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        _mmcam_dbg_log("");
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-       info = sc->info;
+       info = sc->info_image;
 
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
 
@@ -517,29 +588,20 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
        sc->previous_slot_time = 0;
 
        /* Image info */
-       info->capture_cur_count = 0;
-       info->capture_send_count = 0;
        info->next_shot_time = 0;
        info->multi_shot_stop = TRUE;
        info->capturing = FALSE;
 
        _mmcamcorder_vframe_stablize(handle);
 
-       if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
-               _mmcam_dbg_log("Capture Preview start : avsysvideosrc - No need to set new caps.");
-
-               ret = mm_camcorder_get_attributes(handle, &err_name,
-                                                 MMCAM_CAMERA_FPS_AUTO, &fps_auto,
-                                                 NULL);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
-                       SAFE_FREE (err_name);
-                       goto cmd_error;
-               }
+       current_state = _mmcamcorder_get_state(handle);
+       _mmcam_dbg_log("current state [%d]", current_state);
 
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "fps-auto", fps_auto);
+       if (!sc->bencbin_capture) {
+               _mmcam_dbg_log("Capture Preview start : avsysvideosrc - No need to set new caps.");
 
-               if (_mmcamcorder_get_state(handle) == MM_CAMCORDER_STATE_CAPTURING) {
+               /* just set capture stop command if current state is CAPTURING */
+               if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
                        if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
                                _mmcam_dbg_err("Can't cast Video source into camera control.");
                                return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
@@ -553,26 +615,39 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                        if (info->type == _MMCamcorder_SINGLE_SHOT) {
                                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
                        }
+               } else {
+                       int focus_mode = 0;
+
+                       /* This case is starting of preview */
+                       ret = mm_camcorder_get_attributes(handle, &err_name,
+                                                         MMCAM_CAMERA_FPS_AUTO, &fps_auto,
+                                                         MMCAM_CAMERA_FOCUS_MODE, &focus_mode,
+                                                         NULL);
+                       if (ret != MM_ERROR_NONE) {
+                               _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
+                               SAFE_FREE (err_name);
+                       }
+
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "fps-auto", fps_auto);
+
+                       /* set focus mode */
+                       mm_camcorder_set_attributes(handle, NULL,
+                                                   MMCAM_CAMERA_FOCUS_MODE, focus_mode,
+                                                   NULL);
                }
        } else {
                /* check if resolution need to rollback */
-               ret = mm_camcorder_get_attributes(handle, &err_name,
-                                                 MMCAM_CAMERA_DEVICE, &input_index,
-                                                 MMCAM_CAMERA_WIDTH, &width,
-                                                 MMCAM_CAMERA_HEIGHT, &height,
-                                                 MMCAM_CAMERA_FPS, &fps,
-                                                 MMCAM_CAMERA_FPS_AUTO, &fps_auto,
-                                                 MMCAM_CAMERA_ROTATION, &rotation,
-                                                 MMCAM_CAPTURE_WIDTH, &cap_width,
-                                                 MMCAM_CAPTURE_HEIGHT, &cap_height,
-                                                 NULL);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
-                       SAFE_FREE (err_name);
-                       goto cmd_error;
-               }
+               mm_camcorder_get_attributes(handle, &err_name,
+                                           MMCAM_CAMERA_WIDTH, &width,
+                                           MMCAM_CAMERA_HEIGHT, &height,
+                                           MMCAM_CAMERA_FPS, &fps,
+                                           MMCAM_CAMERA_FPS_AUTO, &fps_auto,
+                                           MMCAM_CAMERA_ROTATION, &rotation,
+                                           MMCAM_CAPTURE_WIDTH, &cap_width,
+                                           MMCAM_CAPTURE_HEIGHT, &cap_height,
+                                           NULL);
 
-               if (_mmcamcorder_get_state((MMHandleType)hcamcorder) == MM_CAMCORDER_STATE_CAPTURING) {
+               if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
                        switch (rotation) {
                        case MM_VIDEO_INPUT_ROTATION_90:
                                set_width = height;
@@ -622,12 +697,26 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
                        int try_count = 0;
 
-                       __ta__( "    Wait preview frame after capture",
-                       while (current_framecount >= sc->kpi.video_framecount &&
-                              try_count++ < _MMCAMCORDER_CAPTURE_STOP_CHECK_COUNT) {
-                               usleep(_MMCAMCORDER_CAPTURE_STOP_CHECK_INTERVAL);
+                       if (info->preview_format != MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                               mmf_attrs_t *attr = (mmf_attrs_t *)MMF_CAMCORDER_ATTRS(handle);
+
+                               /* Set strobe mode - strobe mode can not be set to driver while captuing */
+                               if (attr) {
+                                       __ta__("    Set strobe mode after capture",
+                                       mmf_attribute_set_modified(&(attr->items[MM_CAM_STROBE_MODE]));
+                                       if (mmf_attrs_commit((MMHandleType) attr) == -1) {
+                                               _mmcam_dbg_warn("Failed to set strobe mode");
+                                       }
+                                       );
+                               }
+
+                               __ta__("    Wait preview frame after capture",
+                               while (current_framecount >= sc->kpi.video_framecount &&
+                                      try_count++ < _MMCAMCORDER_CAPTURE_STOP_CHECK_COUNT) {
+                                       usleep(_MMCAMCORDER_CAPTURE_STOP_CHECK_INTERVAL);
+                               }
+                               );
                        }
-                       );
 
                        if (info->type == _MMCamcorder_MULTI_SHOT) {
                                MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
@@ -636,454 +725,111 @@ int _mmcamcorder_image_cmd_preview_start(MMHandleType handle)
                        _mmcam_dbg_log("Wait Frame Done. count before[%d],after[%d], try_count[%d]",
                                       current_framecount, sc->kpi.video_framecount, try_count);
                } else {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
                        ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
-
-                       if (ret != MM_ERROR_NONE) {
-                               goto cmd_error;
-                       }
-
-                       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
                        if (ret != MM_ERROR_NONE) {
                                goto cmd_error;
                        }
-               }
-       } else {
-               int cap_count = 0;
-               int sound_ret = FALSE;
-
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
-
-               __ta__("        _MMCamcorder_CMD_PREVIEW_START:GST_STATE_PLAYING",  
-               ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
-               );
-               if (ret != MM_ERROR_NONE) {
-                       goto cmd_error;
-               }
-
-               mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_COUNT, &cap_count, NULL);
-               if (cap_count > 1) {
-                       __ta__("_mmcamcorder_sound_init",
-                       sound_ret = _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
-                       );
-                       if (sound_ret) {
-                               __ta__("_mmcamcorder_sound_prepare",
-                               sound_ret = _mmcamcorder_sound_prepare(handle);
-                               );
-                               _mmcam_dbg_log("sound prepare [%d]", sound_ret);
-                       }
-               }
-       }
-
-cmd_error:
-       return ret;
-}
-
-
-int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
-{
-       int ret = MM_ERROR_NONE;
-
-       GstElement *pipeline = NULL;
-
-       _MMCamcorderSubContext *sc = NULL;
-
-       _mmcam_dbg_log("");
-
-       mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
-       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
-
-       return ret;
-}
-
-
-int _mmcamcorder_image_cmd_capture_with_encbin(MMHandleType handle)
-{
-       int ret = MM_ERROR_NONE;
-       int UseCaptureMode = 0;
-       int width = 0;
-       int height = 0;
-       int fps = 0;
-       int cap_format = MM_PIXEL_FORMAT_ENCODED;
-       int cap_jpeg_quality = 0;
-       int image_encoder = MM_IMAGE_CODEC_JPEG;
-       unsigned int cap_fourcc = GST_MAKE_FOURCC('J','P','E','G');
-       char *err_name = NULL;
-       char *videosrc_name = NULL;
-
-       GstCaps *caps = NULL;
-       GstClock *clock = NULL;
-       GstElement *pipeline = NULL;
-       GstCameraControl *control = NULL;
-
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _MMCamcorderImageInfo *info = NULL;
-       _MMCamcorderSubContext *sc = NULL;
-       type_element *VideosrcElement = NULL;
-
-       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       _mmcam_dbg_log("");
-
-       pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-       info = sc->info;
-
-       _mmcamcorder_conf_get_value_int(hcamcorder->conf_main,
-                                       CONFIGURE_CATEGORY_MAIN_CAPTURE,
-                                       "UseCaptureMode",
-                                       &UseCaptureMode);
-
-       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
-                                     CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
-                                     "VideosrcElement",
-                                     &VideosrcElement);
-
-       _mmcamcorder_conf_get_value_element_name(VideosrcElement, &videosrc_name);
-
-       if (info->capturing) {
-               ret = MM_ERROR_CAMCORDER_DEVICE_BUSY;
-               goto cmd_error;
-       }
-
-       MMTA_ACUM_ITEM_BEGIN("Real First Capture Start",false);
-
-       info->capturing = TRUE;
-
-       ret = mm_camcorder_get_attributes(handle, &err_name,
-                                         MMCAM_IMAGE_ENCODER_QUALITY, &cap_jpeg_quality,
-                                         MMCAM_IMAGE_ENCODER, &image_encoder,
-                                         MMCAM_CAMERA_WIDTH, &width,
-                                         MMCAM_CAMERA_HEIGHT, &height,
-                                         MMCAM_CAMERA_FPS, &fps,
-                                         MMCAM_CAPTURE_FORMAT, &cap_format,
-                                         MMCAM_CAPTURE_WIDTH, &info->width,
-                                         MMCAM_CAPTURE_HEIGHT, &info->height,
-                                         MMCAM_CAPTURE_COUNT, &info->count,
-                                         MMCAM_CAPTURE_INTERVAL, &info->interval,
-                                         NULL);
-       if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_err("Get attrs fail. (%s:%x)", err_name, ret);
-               SAFE_FREE (err_name);
-               goto cmd_error;
-       }
-
-       if (info->count < 1) {
-               _mmcam_dbg_err("capture count[%d] is invalid", info->count);
-               ret = MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
-               goto cmd_error;
-       } else if (info->count == 1) {
-               info->type = _MMCamcorder_SINGLE_SHOT;
-       } else {
-               info->type = _MMCamcorder_MULTI_SHOT;
-               info->capture_cur_count = 0;
-               info->capture_send_count = 0;
-               info->next_shot_time = 0;
-               info->multi_shot_stop = FALSE;
-       }
-
-       _mmcam_dbg_log("videosource(%dx%d), capture(%dx%d), count(%d)",
-                      width, height, info->width, info->height, info->count);
 
-       if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
-               cap_fourcc = _mmcamcorder_get_fourcc(cap_format, image_encoder, hcamcorder->use_zero_copy_format);
-               _mmcam_dbg_log("capture format (%d), jpeg quality (%d)", cap_format, cap_jpeg_quality);
+                       /* remove handoff signal handler */
+                       _mmcamcorder_remove_all_handlers(handle, _MMCAMCORDER_HANDLER_STILLSHOT);
 
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-fourcc", cap_fourcc);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-interval", info->interval);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-width", info->width);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-height", info->height);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-count", info->count);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "capture-jpg-quality", cap_jpeg_quality);
+                       /* remove encodesinkbin after capture */
+                       if (!sc->element[_MMCAMCORDER_ENCSINK_BIN].gst) {
+                               _mmcam_dbg_log("ENCSINK_BIN is already removed");
+                       } else {
+                               GstPad *reqpad0 = NULL;
+                               GstPad *srcpad = NULL;
+                               GstPad *sinkpad = NULL;
 
-               if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
-                       _mmcam_dbg_err("Can't cast Video source into camera control.");
-                       return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
-               }
+                               /* release requested pad */
+                               reqpad0 = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "image");
+                               gst_element_release_request_pad(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, reqpad0);
+                               gst_object_unref(reqpad0);
 
-               control = GST_CAMERA_CONTROL( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst );
-               gst_camera_control_set_capture_command( control, GST_CAMERA_CONTROL_CAPTURE_COMMAND_START );
-       } else {
-               int need_change = 0;
-               int set_width = 0;
-               int set_height = 0;
+                               /* Unlink each element */
+                               srcpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_BIN].gst, "src1");
+                               sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, "image_sink0");
+                               _MM_GST_PAD_UNLINK_UNREF(srcpad, sinkpad);
 
-               if (UseCaptureMode) {
-                       if (width != MMFCAMCORDER_HIGHQUALITY_WIDTH || height != MMFCAMCORDER_HIGHQUALITY_HEIGHT) {
-                               need_change = 1;
-                       }
-               } else {
-                       if (width != info->width || height != info->height) {
-                               need_change = 1;
-                       }
-               }
+                               /* make state of encodesinkbin as NULL */
+                               _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, GST_STATE_NULL);
 
-               if (need_change) {
-                       _mmcam_dbg_log("Need to change resolution");
+                               gst_bin_remove(GST_BIN(sc->element[_MMCAMCORDER_MAIN_PIPE].gst),
+                                              sc->element[_MMCAMCORDER_ENCSINK_BIN].gst);
 
-                       if (UseCaptureMode) {
-                               set_width = MMFCAMCORDER_HIGHQUALITY_WIDTH;
-                               set_height = MMFCAMCORDER_HIGHQUALITY_HEIGHT;
-                       } else {
-                               set_width = info->width;
-                               set_height = info->height;
+                               _mmcamcorder_remove_element_handle(handle, _MMCAMCORDER_ENCSINK_BIN, _MMCAMCORDER_ENCSINK_SINK);
                        }
 
-                       caps = gst_caps_new_simple("video/x-raw-yuv",
-                                                  "format", GST_TYPE_FOURCC, sc->fourcc,
-                                                  "width", G_TYPE_INT, set_width,
-                                                  "height", G_TYPE_INT, set_height,
-                                                  "framerate", GST_TYPE_FRACTION, fps, 1,
-                                                  "rotate", G_TYPE_INT, 0,
-                                                  NULL);
-                       if (caps == NULL) {
-                               _mmcam_dbg_err("failed to create caps");
-                               ret = MM_ERROR_CAMCORDER_LOW_MEMORY;
+                       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
+                       if (ret != MM_ERROR_NONE) {
                                goto cmd_error;
                        }
-
-                       info->resolution_change = TRUE;
-                       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
-                       gst_caps_unref(caps);
-                       
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "req-negotiation",TRUE);
-
-                       /* FIXME: consider delay */
-                       clock = gst_pipeline_get_clock(GST_PIPELINE(pipeline));
-                       sc->stillshot_time = gst_clock_get_time(clock) - gst_element_get_base_time(GST_ELEMENT(pipeline));
-                       _mmcam_dbg_log("Change to target resolution(%d, %d)", info->width, info->height);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs",TRUE);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-
-               } else {
-                       _mmcam_dbg_log("No need to change resolution. Open toggle now.");
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs",TRUE);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
                }
-       }
-
-       /* Play capture sound here if single capture */
-       if (info->type == _MMCamcorder_SINGLE_SHOT) {
-               _mmcamcorder_sound_solo_play(handle, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
-       }
 
-cmd_error:
-       return ret;
-}
-
-
-int _mmcamcorder_image_cmd_preview_start_with_encbin(MMHandleType handle)
-{
-       int ret = MM_ERROR_NONE;
-       int width = 0;
-       int height = 0;
-       int fps = 0;
-       int cap_width = 0;
-       int cap_height = 0;
-       int rotation = 0;
-       int input_index = 0;
-       int set_width = 0;
-       int set_height = 0;
-       int set_rotate = 0;
-       int current_framecount = 0;
-       int current_state = MM_CAMCORDER_STATE_NONE;
-       gboolean fps_auto = FALSE;
-       char *err_name = NULL;
-       char *videosrc_name = NULL;
-
-       GstState state = GST_STATE_NULL;
-       GstCaps *caps = NULL;
-       GstElement *pipeline = NULL;
-       GstCameraControl *control = NULL;
-
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _MMCamcorderImageInfo *info = NULL;
-       _MMCamcorderSubContext *sc = NULL;
-       type_element *VideosrcElement = NULL;
-
-       mmf_return_val_if_fail(hcamcorder, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-
-       _mmcam_dbg_log("");
-
-       info = sc->info;
-       pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
-
-       _mmcamcorder_conf_get_element(hcamcorder->conf_main,
-                                     CONFIGURE_CATEGORY_MAIN_VIDEO_INPUT,
-                                     "VideosrcElement",
-                                     &VideosrcElement);
-
-       _mmcamcorder_conf_get_value_element_name(VideosrcElement, &videosrc_name);
-
-       sc->display_interval = 0;
-       sc->previous_slot_time = 0;
-
-       /* init image info */
-       info->capture_cur_count = 0;
-       info->capture_send_count = 0;
-       info->next_shot_time = 0;
-       info->multi_shot_stop = TRUE;
-       info->capturing = FALSE;
-
-       _mmcamcorder_vframe_stablize(handle);
-
-       current_state = _mmcamcorder_get_state(handle);
-       _mmcam_dbg_log("current state [%d]", current_state);
-
-       if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
-               _mmcam_dbg_log("Capture Preview start : %s - No need to set new caps.", videosrc_name);
-
-               ret = mm_camcorder_get_attributes(handle, &err_name,
-                                                 MMCAM_CAMERA_FPS_AUTO, &fps_auto,
-                                                 NULL);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
-                       SAFE_FREE (err_name);
-                       goto cmd_error;
+               /* sound finalize */
+               if (info->type == _MMCamcorder_MULTI_SHOT) {
+                       __ta__("    _mmcamcorder_sound_finalize",
+                       _mmcamcorder_sound_finalize(handle);
+                       );
                }
+       } else {
+               int cap_count = 0;
+               int sound_ret = FALSE;
 
-               /* set fps-auto to videosrc */
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "fps-auto", fps_auto);
-
-               if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
-                       if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
-                               _mmcam_dbg_err("Can't cast Video source into camera control.");
-                               return MM_ERROR_CAMCORDER_NOT_SUPPORTED;
-                       }
-
-                       current_framecount = sc->kpi.video_framecount;
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
 
-                       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
-                       gst_camera_control_set_capture_command(control, GST_CAMERA_CONTROL_CAPTURE_COMMAND_STOP);
-               }
-       } else {
-               /* check if resolution need to roll back */
-               ret = mm_camcorder_get_attributes(handle, &err_name,
-                                                 MMCAM_CAMERA_DEVICE, &input_index,
-                                                 MMCAM_CAMERA_WIDTH, &width,
-                                                 MMCAM_CAMERA_HEIGHT, &height,
-                                                 MMCAM_CAMERA_FPS, &fps,
-                                                 MMCAM_CAMERA_FPS_AUTO, &fps_auto,
-                                                 MMCAM_CAMERA_ROTATION, &rotation,
-                                                 MMCAM_CAPTURE_WIDTH, &cap_width,
-                                                 MMCAM_CAPTURE_HEIGHT, &cap_height,
-                                                 NULL);
+               __ta__("        _MMCamcorder_CMD_PREVIEW_START:GST_STATE_PLAYING",
+               ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
+               );
                if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Get attrs fail. (%s:%x)", err_name, ret);
-                       SAFE_FREE (err_name);
                        goto cmd_error;
                }
 
-               if (current_state == MM_CAMCORDER_STATE_CAPTURING) {
-                       switch (rotation) {
-                       case MM_VIDEO_INPUT_ROTATION_90:
-                               set_width = height;
-                               set_height = width;
-                               set_rotate = 90;
-                               break;
-                       case MM_VIDEO_INPUT_ROTATION_180:
-                               set_width = width;
-                               set_height = height;
-                               set_rotate = 180;
-                               break;
-                       case MM_VIDEO_INPUT_ROTATION_270:
-                               set_width = height;
-                               set_height = width;
-                               set_rotate = 270;
-                               break;
-                       case MM_VIDEO_INPUT_ROTATION_NONE:
-                       default:
-                               set_width = width;
-                               set_height = height;
-                               set_rotate = 0;
-                               break;
-                       }
-
-                       caps = gst_caps_new_simple("video/x-raw-yuv",
-                                                  "format", GST_TYPE_FOURCC, sc->fourcc,
-                                                  "width", G_TYPE_INT, set_width,
-                                                  "height", G_TYPE_INT,set_height,
-                                                  "framerate", GST_TYPE_FRACTION, fps, 1,
-                                                  "rotate", G_TYPE_INT, set_rotate,
-                                                  NULL);
-                       if (caps == NULL) {
-                               _mmcam_dbg_err("failed to create caps");
-                               ret = MM_ERROR_CAMCORDER_LOW_MEMORY;
-                               goto cmd_error;
-                       }
-
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_FILT].gst, "caps", caps);
-                       gst_caps_unref(caps);
-                       caps = NULL;
-                       _mmcam_dbg_log("Rollback to original resolution(%d, %d)", width, height);
-               }
-       }
+               /* get sound status/volume level and register changed_cb */
+               if (hcamcorder->shutter_sound_policy == VCONFKEY_CAMERA_SHUTTER_SOUND_POLICY_OFF &&
+                   info->sound_status == _SOUND_STATUS_INIT) {
+                       _mmcam_dbg_log("get sound status/volume level and register vconf changed_cb");
 
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
+                       /* get sound status */
+                       __ta__("        GET:VCONFKEY_SETAPPL_SOUND_STATUS_BOOL",
+                       vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &(info->sound_status));
+                       );
 
-       gst_element_get_state(pipeline, &state, NULL, -1);
+                       _mmcam_dbg_log("sound status %d", info->sound_status);
 
-       if (state == GST_STATE_PLAYING) {
-               if (!strcmp(videosrc_name, "avsysvideosrc") || !strcmp(videosrc_name, "camerasrc")) {
-                       __ta__( "    Wait preview frame after capture",
-                       while (current_framecount == sc->kpi.video_framecount) {
-                               usleep(_MMCAMCORDER_CAPTURE_STOP_CHECK_INTERVAL);
-                       }
+                       /* get volume level */
+                       __ta__("        mm_sound_volume_get_value",
+                       mm_sound_volume_get_value(VOLUME_TYPE_MEDIA, &info->volume_level);
                        );
 
-                       _mmcam_dbg_log("Wait Frame Done. count before[%d],after[%d]",
-                                      current_framecount, sc->kpi.video_framecount);
-               } else {
-#if 1
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
-                       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-#else /* This code wasn't work. So rollback to previous code. Plz tell me why. It's weired. */
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
-                       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
-#endif
-                       if (ret != MM_ERROR_NONE) {
-                               goto cmd_error;
-                       }
+                       _mmcam_dbg_log("volume level %d", info->volume_level);
 
-                       ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
-                       if (ret != MM_ERROR_NONE) {
-                               goto cmd_error;
-                       }
-                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
+                       /* register changed_cb */
+                       vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb, hcamcorder);
+                       mm_sound_volume_add_callback(VOLUME_TYPE_MEDIA, __volume_level_changed_cb, hcamcorder);
                }
-       } else {
-               __ta__("        _MMCamcorder_CMD_PREVIEW_START:GST_STATE_PLAYING",  
-               ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
-               );
-               if (ret != MM_ERROR_NONE) {
-                       goto cmd_error;
+
+               mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_COUNT, &cap_count, NULL);
+               if (cap_count > 1) {
+                       __ta__("_mmcamcorder_sound_init",
+#ifdef _MMCAMCORDER_UPLOAD_SAMPLE
+                       sound_ret = _mmcamcorder_sound_init(handle, _MMCAMCORDER_FILEPATH_CAPTURE2_SND);
+#else /* _MMCAMCORDER_UPLOAD_SAMPLE */
+                       sound_ret = _mmcamcorder_sound_init(handle);
+#endif /* _MMCAMCORDER_UPLOAD_SAMPLE */
+                       );
                }
        }
 
 cmd_error:
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs",FALSE);
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
        return ret;
 }
 
 
-int _mmcamcorder_image_cmd_preview_stop_with_encbin(MMHandleType handle)
+int _mmcamcorder_image_cmd_preview_stop(MMHandleType handle)
 {
        int ret = MM_ERROR_NONE;
 
@@ -1096,26 +842,33 @@ int _mmcamcorder_image_cmd_preview_stop_with_encbin(MMHandleType handle)
        mmf_return_val_if_fail(handle, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
-       mmf_return_val_if_fail(sc && sc->info && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
 
-       /* set signal handler off */
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_SINK].gst,"signal-handoffs",FALSE);
-
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
-       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
        ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
-       if (ret != MM_ERROR_NONE) {
-               goto cmd_error;
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
+
+       /* deregister sound status callback */
+       if (sc->info_image->sound_status != _SOUND_STATUS_INIT) {
+               _mmcam_dbg_log("deregister sound status callback");
+
+               __ta__("    vconf_ignore_key_changed",
+               vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, __sound_status_changed_cb);
+               );
+               __ta__("    mm_sound_volume_remove_callback",
+               mm_sound_volume_remove_callback(VOLUME_TYPE_MEDIA);
+               );
+
+               sc->info_image->sound_status = _SOUND_STATUS_INIT;
        }
 
-cmd_error:
        return ret;
 }
 
 
-int _mmcamcorder_image_command(MMHandleType handle, int command)
+int _mmcamcorder_video_capture_command(MMHandleType handle, int command)
 {
        int ret = MM_ERROR_NONE;
 
@@ -1127,34 +880,27 @@ int _mmcamcorder_image_command(MMHandleType handle, int command)
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       _mmcam_dbg_log("command=%d", command);
+       _mmcam_dbg_log("command %d", command);
 
        switch (command) {
        case _MMCamcorder_CMD_CAPTURE:
-               if (!sc->bencbin_capture) {
-                       ret = _mmcamcorder_image_cmd_capture(handle);
-               } else {
-                       ret = _mmcamcorder_image_cmd_capture_with_encbin(handle);
-               }
-               break;
-       case _MMCamcorder_CMD_CAPTURE_CANCEL:
-               /* TODO: Is this needed? */
+               ret = _mmcamcorder_image_cmd_capture(handle);
                break;
        case _MMCamcorder_CMD_PREVIEW_START:
-               if (!sc->bencbin_capture) {
-                       ret = _mmcamcorder_image_cmd_preview_start(handle);
-               } else {
-                       ret = _mmcamcorder_image_cmd_preview_start_with_encbin(handle);
-               }
+               ret = _mmcamcorder_image_cmd_preview_start(handle);
+
                /* I place this function last because it miscalculates a buffer that sents in GST_STATE_PAUSED */
                _mmcamcorder_video_current_framerate_init(handle);
                break;
        case _MMCamcorder_CMD_PREVIEW_STOP:
-               if (!sc->bencbin_capture) {
-                       ret = _mmcamcorder_image_cmd_preview_stop(handle);
-               } else {
-                       ret = _mmcamcorder_image_cmd_preview_stop_with_encbin(handle);
-               }
+               ret = _mmcamcorder_image_cmd_preview_stop(handle);
+               break;
+       case _MMCamcorder_CMD_RECORD:
+       case _MMCamcorder_CMD_PAUSE:
+       case _MMCamcorder_CMD_CANCEL:
+       case _MMCamcorder_CMD_COMMIT:
+               /* video recording command */
+               ret = _mmcamcorder_video_command(handle, command);
                break;
        default:
                ret =  MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
@@ -1173,8 +919,6 @@ int _mmcamcorder_image_command(MMHandleType handle, int command)
 
 void __mmcamcorder_init_stillshot_info (MMHandleType handle)
 {
-       int type = _MMCamcorder_SINGLE_SHOT;
-
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
        _MMCamcorderImageInfo *info = NULL;
@@ -1182,30 +926,27 @@ void __mmcamcorder_init_stillshot_info (MMHandleType handle)
        mmf_return_if_fail(hcamcorder);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_if_fail(sc && sc->info);
+       mmf_return_if_fail(sc && sc->info_image);
 
-       info = sc->info;
-       type = info->type;
+       info = sc->info_image;
 
-       _mmcam_dbg_log("capture type[%d], capture send count[%d]", type, info->capture_send_count);
+       _mmcam_dbg_log("capture type[%d], capture send count[%d]", info->type, info->capture_send_count);
 
-       if (type ==_MMCamcorder_SINGLE_SHOT || info->capture_send_count == info->count) {
+       if (info->type ==_MMCamcorder_SINGLE_SHOT || info->capture_send_count == info->count) {
                info->capture_cur_count = 0;
                info->capture_send_count = 0;
                info->multi_shot_stop = TRUE;
                info->next_shot_time = 0;
-               info->type = _MMCamcorder_SINGLE_SHOT;
 
                /* capturing flag set to FALSE here */
                info->capturing = FALSE;
-               MMTA_ACUM_ITEM_END("Real First Capture Start", FALSE);
        }
 
        return;
 }
 
 
-gboolean __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail)
+int __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCaptureDataType *original, MMCamcorderCaptureDataType *thumbnail)
 {
        int ret = MM_ERROR_NONE;
        unsigned char *data = NULL;
@@ -1219,120 +960,45 @@ gboolean __mmcamcorder_capture_save_exifinfo(MMHandleType handle, MMCamcorderCap
 
        if (!original || original->data == NULL || original->length == 0) {
                _mmcam_dbg_err("original=%p, data=%p, length=%d", original, original->data, original->length);
-               return FALSE;
+               return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
        } else {
                /* original is input/output param. save original values to local var. */
                data = original->data;
                datalen = original->length;
        }
 
-       /* exif 090227 */
-       ret = mm_exif_create_exif_info(&(hcamcorder->exif_info));
-       if (hcamcorder->exif_info == NULL || ret != MM_ERROR_NONE) {
-               _MMCamcorderMsgItem msg;
-
-               msg.id = MM_MESSAGE_CAMCORDER_ERROR;
-               msg.param.code = ret;
-               _mmcamcroder_send_message(handle, &msg);
-
-               _mmcam_dbg_err("Failed to create exif_info [%x]", ret);
-               return FALSE;
-       }
-
-       /* add basic exif info */
-       _mmcam_dbg_log("add basic exif info");
-       __ta__("                __mmcamcorder_set_exif_basic_info",
-       ret = __mmcamcorder_set_exif_basic_info(handle);
-       );
-       if (ret != MM_ERROR_NONE) {
-               _MMCamcorderMsgItem msg;
-
-               msg.id = MM_MESSAGE_CAMCORDER_ERROR;
-               msg.param.code = ret;
-               _mmcamcroder_send_message(handle, &msg);
-
-               _mmcam_dbg_err("Failed to set_exif_basic_info [%x]", ret);
-       }
-
-       if (thumbnail != NULL) {
-               int bthumbnail = TRUE;
-
-               /* check whether thumbnail should be included */
-               mm_camcorder_get_attributes(handle, NULL, "capture-thumbnail", &bthumbnail, NULL);
-
-               if (thumbnail->data && thumbnail->length >0 && bthumbnail) {
+       if (thumbnail) {
+               if (thumbnail->data && thumbnail->length > 0) {
                        _mmcam_dbg_log("thumbnail is added!thumbnail->data=%p thumbnail->width=%d ,thumbnail->height=%d",
                                       thumbnail->data, thumbnail->width, thumbnail->height);
 
                        /* add thumbnail exif info */
-                       __ta__("            mm_exif_add_thumbnail_info",
-                       ret = mm_exif_add_thumbnail_info(hcamcorder->exif_info, thumbnail->data,thumbnail->width, thumbnail->height, thumbnail->length);
+                       __ta__("                    mm_exif_add_thumbnail_info",
+                       ret = mm_exif_add_thumbnail_info(hcamcorder->exif_info,
+                                                        thumbnail->data,
+                                                        thumbnail->width,
+                                                        thumbnail->height,
+                                                        thumbnail->length);
                        );
-                       if (ret != MM_ERROR_NONE) {
-                               _MMCamcorderMsgItem msg;
-
-                               msg.id = MM_MESSAGE_CAMCORDER_ERROR;
-                               msg.param.code = ret;
-                               _mmcamcroder_send_message(handle, &msg);
-
-                               _mmcam_dbg_err("Failed to set_exif_thumbnail [%x]",ret);
-                       }
                } else {
-                       _mmcam_dbg_err("Skip adding thumbnail (data=%p, length=%d, capture-thumbnail=%d)",
-                                      thumbnail->data, thumbnail->length , bthumbnail);
+                       _mmcam_dbg_err("Skip adding thumbnail (data=%p, length=%d)",
+                                      thumbnail->data, thumbnail->length);
                }
        }
 
-       /* write jpeg with exif */
-       ret = mm_exif_write_exif_jpeg_to_memory(&original->data, &original->length ,hcamcorder->exif_info,  data, datalen);
-
-       if (ret != MM_ERROR_NONE) {
-               _MMCamcorderMsgItem msg;
-       
-               msg.id = MM_MESSAGE_CAMCORDER_ERROR;
-               msg.param.code = ret;
-               _mmcamcroder_send_message(handle, &msg);
-
-               _mmcam_dbg_err("mm_exif_write_exif_jpeg_to_memory error! [%x]",ret);
-       }
-
-       /* destroy exif info */
-       mm_exif_destory_exif_info(hcamcorder->exif_info);
-       hcamcorder->exif_info = NULL;
-
-       _mmcam_dbg_log("END");
-
-       if (ret != MM_ERROR_NONE) {
-               return FALSE;
-       } else {
-               return TRUE;
+       if (ret == MM_ERROR_NONE) {
+               /* write jpeg with exif */
+               __ta__("                    mm_exif_write_exif_jpeg_to_memory",
+               ret = mm_exif_write_exif_jpeg_to_memory(&original->data, &original->length ,hcamcorder->exif_info,  data, datalen);
+               );
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_err("mm_exif_write_exif_jpeg_to_memory error! [0x%x]",ret);
+               }
        }
-}
 
+       _mmcam_dbg_log("END ret 0x%x", ret);
 
-gboolean __mmcamcorder_capture_send_msg(MMHandleType handle, int type, int count)
-{
-       mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
-       _MMCamcorderImageInfo *info = NULL;
-       _MMCamcorderSubContext *sc = NULL;
-       _MMCamcorderMsgItem msg;
-
-       mmf_return_val_if_fail(hcamcorder, FALSE);
-
-       sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc && sc->info, FALSE);
-
-       info = sc->info;
-
-       _mmcam_dbg_log("type [%d], capture count [%d]", type, count);
-
-       msg.id = MM_MESSAGE_CAMCORDER_CAPTURED;
-       msg.param.code = count;
-
-       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
-
-       _mmcam_dbg_log("END");
-       return TRUE;
+       return ret;
 }
 
 
@@ -1361,9 +1027,9 @@ void __mmcamcorder_get_capture_data_from_buffer(MMCamcorderCaptureDataType *capt
        gst_structure_get_int(structure, "height", &capture_data->height);
        capture_data->length = GST_BUFFER_SIZE(buffer);
 
-        _mmcam_dbg_err("buffer data[%p],size[%dx%d],length[%d],format[%d]",
-                       capture_data->data, capture_data->width, capture_data->height,
-                       capture_data->length, capture_data->format);
+        _mmcam_dbg_warn("buffer data[%p],size[%dx%d],length[%d],format[%d]",
+                        capture_data->data, capture_data->width, capture_data->height,
+                        capture_data->length, capture_data->format);
        gst_caps_unref(caps);
        caps = NULL;
 
@@ -1378,42 +1044,25 @@ GET_FAILED:
 }
 
 
-gboolean __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail)
+int __mmcamcorder_set_jpeg_data(MMHandleType handle, MMCamcorderCaptureDataType *dest, MMCamcorderCaptureDataType *thumbnail)
 {
-       int tag_enable = 0;
-       int provide_exif = FALSE;
-
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
 
-       mmf_return_val_if_fail(hcamcorder, FALSE);
-       mmf_return_val_if_fail(dest, FALSE);
+       mmf_return_val_if_fail(hcamcorder && dest, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc, FALSE);
+       mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        _mmcam_dbg_log("");
 
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_ENABLE, &tag_enable, NULL);
-       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
-
-       _mmcam_dbg_log("tag enable[%d], provide exif[%d]", tag_enable, provide_exif);
-
        /* if tag enable and doesn't provide exif, we make it */
-       if (tag_enable && !provide_exif) {
-               _mmcam_dbg_log("Add exif information if existed(thumbnail[%p])", thumbnail);
-               if (thumbnail && thumbnail->data) {
-                       if (!__mmcamcorder_capture_save_exifinfo(handle, dest, thumbnail)) {
-                               return FALSE;
-                       }
-               } else {
-                       if (!__mmcamcorder_capture_save_exifinfo(handle, dest, NULL)) {
-                               return FALSE;
-                       }
-               }
+       _mmcam_dbg_log("Add exif information if existed(thumbnail[%p])", thumbnail);
+       if (thumbnail && thumbnail->data) {
+               return __mmcamcorder_capture_save_exifinfo(handle, dest, thumbnail);
+       } else {
+               return __mmcamcorder_capture_save_exifinfo(handle, dest, NULL);
        }
-
-       return TRUE;
 }
 
 
@@ -1433,13 +1082,17 @@ void __mmcamcorder_release_jpeg_data(MMHandleType handle, MMCamcorderCaptureData
 
        _mmcam_dbg_log("");
 
+       __ta__( "                  Get:MMCAM_TAG_ENABLE and \"provide-exif\"",
        mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_ENABLE, &tag_enable, NULL);
-       MMCAMCORDER_G_OBJECT_GET (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
+       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
+       );
 
        /* if dest->data is allocated in MSL, release it */
        if (tag_enable && !provide_exif) {
                if (dest->data) {
+                       __ta__( "                  Free data",
                        free(dest->data);
+                       );
                        dest->length = 0;
                        dest->data = NULL;
                        _mmcam_dbg_log("Jpeg is released!");
@@ -1458,12 +1111,17 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
        int pixtype = MM_PIXEL_FORMAT_INVALID;
        int pixtype_sub = MM_PIXEL_FORMAT_INVALID;
        int codectype = MM_IMAGE_CODEC_JPEG;
-       int type = _MMCamcorder_SINGLE_SHOT;
        int attr_index = 0;
        int count = 0;
-       int stop_cont_shot = 0;
-       gboolean send_msg = FALSE;
+       int stop_cont_shot = FALSE;
+       int tag_enable = FALSE;
+       int provide_exif = FALSE;
+       int capture_quality = 0;
+       int try_lock_count = 0;
+       gboolean send_captured_message = FALSE;
+       unsigned char *exif_raw_data = NULL;
 
+       MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
        _MMCamcorderImageInfo *info = NULL;
        _MMCamcorderSubContext *sc = NULL;
@@ -1472,46 +1130,94 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
        MMCamcorderCaptureDataType scrnail = {0,};
 
        mmf_attrs_t *attrs = NULL;
-       mmf_attribute_t *item = NULL;
-
-       void *encoded_data = NULL;
-       char *err_attr_name = NULL;
+       mmf_attribute_t *item_screennail = NULL;
+       mmf_attribute_t *item_exif_raw_data = NULL;
 
        mmf_return_if_fail(hcamcorder);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_if_fail(sc && sc->info);
+       mmf_return_if_fail(sc && sc->info_image);
 
-       info = sc->info;
+       info = sc->info_image;
 
-       _mmcam_dbg_err("START");
+       /* get current state */
+       current_state = _mmcamcorder_get_state((MMHandleType)hcamcorder);
+
+       _mmcam_dbg_err("START - current state %d", current_state);
 
        MMTA_ACUM_ITEM_BEGIN("            MSL capture callback", FALSE);
 
        /* check capture state */
        if (info->type == _MMCamcorder_MULTI_SHOT && info->capture_send_count > 0) {
                mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL, "capture-break-cont-shot", &stop_cont_shot, NULL);
-               if (stop_cont_shot == TRUE) {
-                       _mmcam_dbg_warn("capture stop command already come. skip this...");
-                       MMTA_ACUM_ITEM_END( "            MSL capture callback", FALSE );
-                       goto error;
-               }
        }
 
-       if (!info->capturing) {
-               _mmcam_dbg_err("It's Not capturing now.");
-               goto error;
+       if (!info->capturing || stop_cont_shot) {
+               _mmcam_dbg_warn("stop command[%d] or not capturing state[%d]. skip this...",
+                               stop_cont_shot, info->capturing);
+
+               MMTA_ACUM_ITEM_END("            MSL capture callback", FALSE);
+
+               /*free GstBuffer*/
+               if (buffer1) {
+                       gst_buffer_unref(buffer1);
+               }
+               if (buffer2) {
+                       gst_buffer_unref(buffer2);
+               }
+               if (buffer3) {
+                       gst_buffer_unref(buffer3);
+               }
+
+               return;
        }
 
-       /* play capture sound here if multi capture */
-       if (info->type == _MMCamcorder_MULTI_SHOT) {
-               _mmcamcorder_sound_play((MMHandleType)hcamcorder);
+       /* check command lock to block capture callback if capture start API is not returned
+          wait for 2 seconds at worst case */
+       try_lock_count = 0;
+       do {
+               _mmcam_dbg_log("Try command LOCK");
+               if (_MMCAMCORDER_TRYLOCK_CMD(hcamcorder)) {
+                       _mmcam_dbg_log("command LOCK OK");
+                       _MMCAMCORDER_UNLOCK_CMD(hcamcorder);
+                       break;
+               }
+
+               if (try_lock_count++ < TRY_LOCK_MAX_COUNT) {
+                       _mmcam_dbg_warn("command LOCK Failed, retry...[count %d]", try_lock_count);
+                       usleep(TRY_LOCK_TIME);
+               } else {
+                       _mmcam_dbg_err("failed to lock command LOCK");
+                       break;
+               }
+       } while (TRUE);
+
+       if (current_state < MM_CAMCORDER_STATE_RECORDING) {
+               /* play capture sound here if multi capture
+                  or preview format is ITLV(because of AF and flash control in plugin) */
+               if (info->type == _MMCamcorder_MULTI_SHOT) {
+                       __ta__("                _mmcamcorder_sound_play",
+                       _mmcamcorder_sound_play((MMHandleType)hcamcorder);
+                       );
+               } else if (!info->played_capture_sound) {
+                       __ta__("                _mmcamcorder_sound_solo_play",
+                       _mmcamcorder_sound_solo_play((MMHandleType)hcamcorder, _MMCAMCORDER_FILEPATH_CAPTURE_SND, FALSE);
+                       );
+               }
        }
 
+       /* init capture data */
+       memset((void *)&dest, 0x0, sizeof(MMCamcorderCaptureDataType));
+       memset((void *)&thumb, 0x0, sizeof(MMCamcorderCaptureDataType));
+       memset((void *)&scrnail, 0x0, sizeof(MMCamcorderCaptureDataType));
+
        /* Prepare main, thumbnail buffer */
        pixtype = _mmcamcorder_get_pixel_format(buffer1);
        if (pixtype == MM_PIXEL_FORMAT_INVALID) {
                _mmcam_dbg_err("Unsupported pixel type");
+
+               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL);
+
                goto error;
        }
 
@@ -1520,47 +1226,114 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
                __mmcamcorder_get_capture_data_from_buffer(&dest, pixtype, buffer1);
        } else {
                _mmcam_dbg_err("buffer1 has wrong pointer. (buffer1=%p)",buffer1);
+               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL);
                goto error;
        }
 
        /* Encode JPEG */
        if (sc->internal_encode) {
-               int capture_quality = 0;
-               ret = mm_camcorder_get_attributes((MMHandleType)hcamcorder, &err_attr_name,
-                                                 MMCAM_IMAGE_ENCODER_QUALITY, &capture_quality,
-                                                 NULL);
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_err("Get attribute failed[%s][%x]", err_attr_name, ret);
-                       SAFE_FREE(err_attr_name);
-                       goto error;
-               }
-
-               __ta__("                _mmcamcorder_encode_jpeg",
+#ifdef _MMCAMCORDER_MAKE_THUMBNAIL_INTERNAL_ENCODE
+               int thumb_width = 0;
+               int thumb_height = 0;
+               int thumb_length = 0;
+               unsigned char *thumb_raw_data = NULL;
+#endif /* _MMCAMCORDER_MAKE_THUMBNAIL_INTERNAL_ENCODE */
+
+               mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+                                           MMCAM_IMAGE_ENCODER_QUALITY, &capture_quality,
+                                           NULL);
+               _mmcam_dbg_log("Start Internal Encode - capture_quality %d", capture_quality);
+
+               __ta__("                _mmcamcorder_encode_jpeg:MAIN",
                ret = _mmcamcorder_encode_jpeg(GST_BUFFER_DATA(buffer1), dest.width, dest.height,
                                               pixtype, dest.length, capture_quality, &(dest.data), &(dest.length));
                );
-               if (ret == FALSE) {
+               if (!ret) {
+                       _mmcam_dbg_err("_mmcamcorder_encode_jpeg failed");
+
+                       MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL);
+
                        goto error;
                }
 
-               encoded_data = dest.data;
+               /* set format */
                dest.format = MM_PIXEL_FORMAT_ENCODED;
-       }
 
-       /* Thumbnail image buffer */
-       if (buffer2 && GST_BUFFER_DATA(buffer2) && (GST_BUFFER_SIZE(buffer2) !=0)) {
-               pixtype_sub = _mmcamcorder_get_pixel_format(buffer2);
-               _mmcam_dbg_log("Thumnail (buffer2=%p)",buffer2);
+               _mmcam_dbg_log("Done Internal Encode - data %p, length %d", dest.data, dest.length);
+
+#ifdef _MMCAMCORDER_MAKE_THUMBNAIL_INTERNAL_ENCODE
+               /* make thumbnail image */
+               _mmcam_dbg_log("Make thumbnail image");
+
+               if (dest.width > THUMBNAIL_WIDTH) {
+                       float img_ratio = (float)dest.width / (float)dest.height;
+
+                       _mmcam_dbg_log("image ratio %f , default ratio %f", img_ratio, THUMBNAIL_DEFAULT_RATIO);
+
+                       if (img_ratio > THUMBNAIL_DEFAULT_RATIO) {
+                               thumb_height = THUMBNAIL_HEIGHT;
+                               thumb_width = (thumb_height * dest.width) / dest.height;
+                       } else {
+                               thumb_width = THUMBNAIL_WIDTH;
+                               thumb_height = (thumb_width * dest.height) / dest.width;
+                       }
+
+                       _mmcam_dbg_log("need to resize : thumbnail size %dx%d", thumb_width, thumb_height);
+
+                       if (!_mmcamcorder_resize_frame(GST_BUFFER_DATA(buffer1), dest.width, dest.height, GST_BUFFER_SIZE(buffer1), pixtype,
+                                                      &thumb_raw_data, &thumb_width, &thumb_height, &thumb_length)) {
+                               thumb_raw_data = NULL;
+                               _mmcam_dbg_warn("_mmcamcorder_resize_frame failed. skip thumbnail making...");
+                       }
+               } else {
+                       thumb_width = dest.width;
+                       thumb_height = dest.height;
+
+                       _mmcam_dbg_log("NO need to resize : thumbnail size %dx%d", thumb_width, thumb_height);
+
+                       thumb_raw_data = GST_BUFFER_DATA(buffer1);
+               }
+
+               if (thumb_raw_data) {
+                       __ta__("                _mmcamcorder_encode_jpeg:THUMBNAIL",
+                       ret = _mmcamcorder_encode_jpeg(thumb_raw_data, thumb_width, thumb_height,
+                                                      pixtype, thumb_length, THUMBNAIL_JPEG_QUALITY, &(thumb.data), &(thumb.length));
+                       );
+                       if (ret) {
+                               _mmcam_dbg_log("encode THUMBNAIL done - data %p, length %d", thumb.data, thumb.length);
+
+                               thumb.width = thumb_width;
+                               thumb.height = thumb_height;
+                               thumb.format = MM_PIXEL_FORMAT_ENCODED;
+                       } else {
+                               _mmcam_dbg_warn("failed to encode THUMBNAIL");
+                       }
 
-               __mmcamcorder_get_capture_data_from_buffer(&thumb, pixtype_sub, buffer2);
+                       if (thumb_raw_data != GST_BUFFER_DATA(buffer1)) {
+                               free(thumb_raw_data);
+                               thumb_raw_data = NULL;
+                               _mmcam_dbg_log("release thumb_raw_data");
+                       }
+               } else {
+                       _mmcam_dbg_warn("thumb_raw_data is NULL");
+               }
+#endif /* _MMCAMCORDER_MAKE_THUMBNAIL_INTERNAL_ENCODE */
        } else {
-               _mmcam_dbg_log("buffer2 has wrong pointer. Not Error. (buffer2=%p)",buffer2);
+               /* Thumbnail image buffer */
+               if (buffer2 && GST_BUFFER_DATA(buffer2) && (GST_BUFFER_SIZE(buffer2) !=0)) {
+                       _mmcam_dbg_log("Thumnail (buffer2=%p)",buffer2);
+
+                       pixtype_sub = _mmcamcorder_get_pixel_format(buffer2);
+                       __mmcamcorder_get_capture_data_from_buffer(&thumb, pixtype_sub, buffer2);
+               } else {
+                       _mmcam_dbg_log("buffer2 has wrong pointer. Not Error. (buffer2=%p)",buffer2);
+               }
        }
 
        /* Screennail image buffer */
        attrs = (mmf_attrs_t*)MMF_CAMCORDER_ATTRS(hcamcorder);
-       mm_attrs_get_index((MMHandleType)attrs, "captured-screennail", &attr_index);
-       item = &attrs->items[attr_index];
+       mm_attrs_get_index((MMHandleType)attrs, MMCAM_CAPTURED_SCREENNAIL, &attr_index);
+       item_screennail = &attrs->items[attr_index];
 
        if (buffer3 && GST_BUFFER_DATA(buffer3) && GST_BUFFER_SIZE(buffer3) != 0) {
                _mmcam_dbg_log("Screennail (buffer3=%p,size=%d)", buffer3, GST_BUFFER_SIZE(buffer3));
@@ -1569,28 +1342,67 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
                __mmcamcorder_get_capture_data_from_buffer(&scrnail, pixtype_sub, buffer3);
 
                /* Set screennail attribute for application */
-               mmf_attribute_set_data(item, &scrnail, sizeof(scrnail));
+               ret = mmf_attribute_set_data(item_screennail, &scrnail, sizeof(scrnail));
+               _mmcam_dbg_log("Screennail set attribute data %p, size %d, ret %x", &scrnail, sizeof(scrnail), ret);
        } else {
-               mmf_attribute_set_data(item, NULL, 0);
-
                _mmcam_dbg_log("buffer3 has wrong pointer. Not Error. (buffer3=%p)",buffer3);
+               mmf_attribute_set_data(item_screennail, NULL, 0);
        }
 
-       mmf_attrs_commit_err((MMHandleType)attrs, &err_attr_name);
+       /* commit screennail data */
+       mmf_attribute_commit(item_screennail);
+
+       /* create EXIF info */
+       __ta__("                    mm_exif_create_exif_info",
+       ret = mm_exif_create_exif_info(&(hcamcorder->exif_info));
+       );
+       if (ret != MM_ERROR_NONE) {
+               _mmcam_dbg_err("Failed to create exif_info [%x], but keep going...", ret);
+       } else {
+               /* add basic exif info */
+               _mmcam_dbg_log("add basic exif info");
+               __ta__("                    __mmcamcorder_set_exif_basic_info",
+               ret = __mmcamcorder_set_exif_basic_info((MMHandleType)hcamcorder, dest.width, dest.height);
+               );
+               if (ret != MM_ERROR_NONE) {
+                       _mmcam_dbg_warn("Failed set_exif_basic_info [%x], but keep going...", ret);
+                       ret = MM_ERROR_NONE;
+               }
+       }
 
-       /* Set extra data for jpeg */
-       if (dest.format == MM_PIXEL_FORMAT_ENCODED) {
-               int err = 0;
-               char *err_attr_name = NULL;
+       /* get attribute item for EXIF data */
+       mm_attrs_get_index((MMHandleType)attrs, MMCAM_CAPTURED_EXIF_RAW_DATA, &attr_index);
+       item_exif_raw_data = &attrs->items[attr_index];
 
-               err = mm_camcorder_get_attributes((MMHandleType)hcamcorder, &err_attr_name,
-                                                 MMCAM_IMAGE_ENCODER, &codectype,
-                                                 NULL);
-               if (err != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Getting codectype failed. (%s:%x)", err_attr_name, err);
-                       SAFE_FREE (err_attr_name);
-                       goto error;
+       /* set EXIF data to attribute */
+       if (hcamcorder->exif_info && hcamcorder->exif_info->data) {
+               exif_raw_data = (unsigned char *)malloc(hcamcorder->exif_info->size);
+               if (exif_raw_data) {
+                       memcpy(exif_raw_data, hcamcorder->exif_info->data, hcamcorder->exif_info->size);
+                       mmf_attribute_set_data(item_exif_raw_data, exif_raw_data, hcamcorder->exif_info->size);
+                       _mmcam_dbg_log("set EXIF raw data %p, size %d", exif_raw_data, hcamcorder->exif_info->size);
+               } else {
+                       _mmcam_dbg_warn("failed to alloc for EXIF, size %d", hcamcorder->exif_info->size);
                }
+       } else {
+               _mmcam_dbg_warn("failed to create EXIF. set EXIF as NULL");
+               mmf_attribute_set_data(item_exif_raw_data, NULL, 0);
+       }
+
+       /* commit EXIF data */
+       mmf_attribute_commit(item_exif_raw_data);
+
+       /* get tag-enable and provide-exif */
+       mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL, MMCAM_TAG_ENABLE, &tag_enable, NULL);
+       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "provide-exif", &provide_exif);
+
+       /* Set extra data for JPEG if tag enabled and doesn't provide EXIF */
+       if (dest.format == MM_PIXEL_FORMAT_ENCODED &&
+           tag_enable && !provide_exif) {
+               mm_camcorder_get_attributes((MMHandleType)hcamcorder, NULL,
+                                           MMCAM_IMAGE_ENCODER, &codectype,
+                                           NULL);
+               _mmcam_dbg_log("codectype %d", codectype);
 
                switch (codectype) {
                case MM_IMAGE_CODEC_JPEG:
@@ -1599,13 +1411,17 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
                        __ta__( "                __mmcamcorder_set_jpeg_data",
                        ret = __mmcamcorder_set_jpeg_data((MMHandleType)hcamcorder, &dest, &thumb);
                        );
-                       if (!ret) {
+                       if (ret != MM_ERROR_NONE) {
                                _mmcam_dbg_err("Error on setting extra data to jpeg");
+                               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, ret);
                                goto error;
                        }
                        break;
                default:
                        _mmcam_dbg_err("The codectype is not supported. (%d)", codectype);
+
+                       MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INTERNAL);
+
                        goto error;
                }
        }
@@ -1625,41 +1441,60 @@ static void __mmcamcorder_image_capture_cb(GstElement *element, GstBuffer *buffe
                _mmcam_dbg_log("APPLICATION CALLBACK END");
        } else {
                _mmcam_dbg_err("Capture callback is NULL.");
+
+               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_ERROR, MM_ERROR_CAMCORDER_INVALID_ARGUMENT);
+
                goto err_release_exif;
        }
 
-       /* Set send msg flag and capture count */
-       send_msg = TRUE;
-       type = info->type;
+       /* Set capture count */
        count = ++(info->capture_send_count);
+       send_captured_message = TRUE;
 
 err_release_exif:
        _MMCAMCORDER_UNLOCK_VCAPTURE_CALLBACK(hcamcorder);
 
+       /* init screennail and EXIF raw data */
+       __ta__("                init attributes:scrnl and EXIF",
+       mmf_attribute_set_data(item_screennail, NULL, 0);
+       mmf_attribute_commit(item_screennail);
+       if (exif_raw_data) {
+               free(exif_raw_data);
+               exif_raw_data = NULL;
+
+               mmf_attribute_set_data(item_exif_raw_data, NULL, 0);
+               mmf_attribute_commit(item_exif_raw_data);
+       }
+       );
+
        /* Release jpeg data */
        if (pixtype == MM_PIXEL_FORMAT_ENCODED) {
-               __ta__( "                __mmcamcorder_release_jpeg_data",
+               __ta__("                __mmcamcorder_release_jpeg_data",
                __mmcamcorder_release_jpeg_data((MMHandleType)hcamcorder, &dest);
                );
        }
 
 error:
        /* Check end condition and set proper value */
-       __mmcamcorder_init_stillshot_info((MMHandleType)hcamcorder);
-
-       /* send captured message if no problem */
-       if (send_msg) {
-               __mmcamcorder_capture_send_msg((MMHandleType)hcamcorder, type, count);
+       if (info->hdr_capture_mode != MM_CAMCORDER_HDR_ON_AND_ORIGINAL ||
+           (info->hdr_capture_mode == MM_CAMCORDER_HDR_ON_AND_ORIGINAL && count == 2)) {
+               __mmcamcorder_init_stillshot_info((MMHandleType)hcamcorder);
        }
 
        /* release internal allocated data */
-       if (encoded_data) {
-               if (dest.data == encoded_data) {
+       if (sc->internal_encode) {
+               if (dest.data) {
+                       free(dest.data);
                        dest.data = NULL;
+                       dest.length = 0;
+                       _mmcam_dbg_log("release internal encoded data MAIN");
+               }
+               if (thumb.data) {
+                       free(thumb.data);
+                       thumb.data = NULL;
+                       thumb.length = 0;
+                       _mmcam_dbg_log("release internal encoded data THUMB");
                }
-
-               free(encoded_data);
-               encoded_data = NULL;
        }
 
        /*free GstBuffer*/
@@ -1673,6 +1508,33 @@ error:
                gst_buffer_unref(buffer3);
        }
 
+       /* destroy exif info */
+       __ta__("                mm_exif_destory_exif_info",
+       mm_exif_destory_exif_info(hcamcorder->exif_info);
+       );
+       hcamcorder->exif_info = NULL;
+
+       /* send captured message */
+       if (send_captured_message) {
+               MMTA_ACUM_ITEM_BEGIN("                CAPTURED MESSAGE DELAY", FALSE);
+
+               if (info->hdr_capture_mode != MM_CAMCORDER_HDR_ON_AND_ORIGINAL) {
+                       MMCamcorderStateType current_state = MM_CAMCORDER_STATE_NONE;
+
+                       mm_camcorder_get_state((MMHandleType)hcamcorder, &current_state);
+
+                       /* Send CAPTURED message and count - capture success */
+                       if (current_state >= MM_CAMCORDER_STATE_RECORDING) {
+                               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_VIDEO_SNAPSHOT_CAPTURED, count);
+                       } else {
+                               MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_CAPTURED, count);
+                       }
+               } else if (info->hdr_capture_mode == MM_CAMCORDER_HDR_ON_AND_ORIGINAL && count == 2) {
+                       /* send captured message only once in HDR and Original Capture mode */
+                       MMCAM_SEND_MESSAGE(hcamcorder, MM_MESSAGE_CAMCORDER_CAPTURED, 1);
+               }
+       }
+
        MMTA_ACUM_ITEM_END( "            MSL capture callback", FALSE );
 
        _mmcam_dbg_err("END");
@@ -1730,7 +1592,7 @@ int _mmcamcorder_set_resize_property(MMHandleType handle, int capture_width, int
 }
 
 
-int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
+int __mmcamcorder_set_exif_basic_info(MMHandleType handle, int image_width, int image_height)
 {
        int ret = MM_ERROR_NONE;
        int value;
@@ -1742,7 +1604,9 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        double f_longitude = INVALID_GPS_VALUE;
        double f_altitude = INVALID_GPS_VALUE;
        char *str_value = NULL;
+#ifdef WRITE_EXIF_MAKER_INFO /* FIXME */
        char *maker = NULL;
+#endif
        char *user_comment = NULL;
        char *err_name = NULL;
        ExifData *ed = NULL;
@@ -1752,7 +1616,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        static ExifLong elong[10];
 
        GstCameraControl *control = NULL;
-       GstCameraControlExifInfo avsys_exif_info = {0,};
+       GstCameraControlExifInfo avsys_exif_info;
 
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(handle);
        _MMCamcorderSubContext *sc = NULL;
@@ -1764,17 +1628,22 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        mmf_return_val_if_fail(sc && sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
+       CLEAR(avsys_exif_info);
+
        if (!GST_IS_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst)) {
-               _mmcam_dbg_err("Can't cast Video source into camera control. Just return true.");
-               return MM_ERROR_NONE;
+               _mmcam_dbg_err("Can't cast Video source into camera control. Skip camera control values...");
+       } else {
+               control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
+               /* get device information */
+               __ta__("                        gst_camera_control_get_exif_info",
+               gst_camera_control_get_exif_info(control, &avsys_exif_info);
+               );
        }
 
-       control = GST_CAMERA_CONTROL(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst);
-       /* get device information */
-       gst_camera_control_get_exif_info(control, &avsys_exif_info);
-
        /* get ExifData from exif info */
+       __ta__("                        mm_exif_get_exif_from_info",
        ed = mm_exif_get_exif_from_info(hcamcorder->exif_info);
+       );
        if (ed == NULL || ed->ifd == NULL) {
                _mmcam_dbg_err("get exif data error!!(%p, %p)", ed, (ed ? ed->ifd : NULL));
                return MM_ERROR_INVALID_HANDLE;
@@ -1793,7 +1662,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        }
 
        /*1. EXIF_TAG_IMAGE_WIDTH */ /*EXIF_TAG_PIXEL_X_DIMENSION*/
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_WIDTH, &value, NULL);
+       value = image_width;
 
        exif_set_long((unsigned char *)&elong[cntl], exif_data_get_byte_order(ed), value);
        ret = mm_exif_set_add_entry(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_WIDTH,
@@ -1810,7 +1679,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        _mmcam_dbg_log("width[%d]", value);
 
        /*2. EXIF_TAG_IMAGE_LENGTH*/ /*EXIF_TAG_PIXEL_Y_DIMENSION*/
-       mm_camcorder_get_attributes(handle, NULL, MMCAM_CAPTURE_HEIGHT, &value, NULL);
+       value = image_height;
 
        exif_set_long((unsigned char *)&elong[cntl], exif_data_get_byte_order (ed), value);
        ret = mm_exif_set_add_entry(ed, EXIF_IFD_0, EXIF_TAG_IMAGE_LENGTH,
@@ -1880,6 +1749,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
                free(b);
        }
 
+#ifdef WRITE_EXIF_MAKER_INFO /* FIXME */
        /*5. EXIF_TAG_MAKE */
        maker = strdup(MM_MAKER_NAME);
        if (maker) {
@@ -1912,7 +1782,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        } else {
                _mmcam_dbg_warn("failed to get model name");
        }
-
+#endif
        /*6. EXIF_TAG_IMAGE_DESCRIPTION */
        mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_IMAGE_DESCRIPTION, &str_value, &str_val_len, NULL);
        _mmcam_dbg_log("desctiption [%s]", str_value);
@@ -1932,7 +1802,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
 
        /*7. EXIF_TAG_SOFTWARE*/
 /*
-       {
+       if (control != NULL) {
                char software[50] = {0,};
                unsigned int len = 0;
 
@@ -1946,10 +1816,9 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        }
 */
 
-       /*8. EXIF_TAG_ORIENTATION */ 
+       /*8. EXIF_TAG_ORIENTATION */
        mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_ORIENTATION, &value, NULL);
-
-       _mmcam_dbg_log("orientation [%d]",value);
+       _mmcam_dbg_log("get orientation [%d]",value);
        if (value == 0) {
                value = MM_EXIF_ORIENTATION;
        }
@@ -1980,20 +1849,24 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        }
 
        /*9. EXIF_TAG_COLOR_SPACE */
-       exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order(ed), avsys_exif_info.colorspace);
-       ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE,
-                                   EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
-       if (ret != MM_ERROR_NONE) {
-               EXIF_SET_ERR(ret, EXIF_TAG_COLOR_SPACE);
+       if (control != NULL) {
+               exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order(ed), avsys_exif_info.colorspace);
+               ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE,
+                                           EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
+               if (ret != MM_ERROR_NONE) {
+                       EXIF_SET_ERR(ret, EXIF_TAG_COLOR_SPACE);
+               }
        }
 
        /*10. EXIF_TAG_COMPONENTS_CONFIGURATION */
-       config = avsys_exif_info.component_configuration;
-       _mmcam_dbg_log("EXIF_TAG_COMPONENTS_CONFIGURATION [%4x] ",config);
-       ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_COMPONENTS_CONFIGURATION,
-                                   EXIF_FORMAT_UNDEFINED, 4, (unsigned char *)&config);
-       if (ret != MM_ERROR_NONE) {
-               EXIF_SET_ERR(ret, EXIF_TAG_COMPONENTS_CONFIGURATION);
+       if (control != NULL) {
+               config = avsys_exif_info.component_configuration;
+               _mmcam_dbg_log("EXIF_TAG_COMPONENTS_CONFIGURATION [%4x] ",config);
+               ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_COMPONENTS_CONFIGURATION,
+                                           EXIF_FORMAT_UNDEFINED, 4, (unsigned char *)&config);
+               if (ret != MM_ERROR_NONE) {
+                       EXIF_SET_ERR(ret, EXIF_TAG_COMPONENTS_CONFIGURATION);
+               }
        }
 
        /*11. EXIF_TAG_COMPRESSED_BITS_PER_PIXEL */
@@ -2001,6 +1874,7 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
 
        /*12. EXIF_TAG_DATE_TIME_ORIGINAL */
        /*13. EXIF_TAG_DATE_TIME_DIGITIZED*/
+
        /*14. EXIF_TAG_EXPOSURE_TIME*/
        if (avsys_exif_info.exposure_time_numerator && avsys_exif_info.exposure_time_denominator) {
                unsigned char *b = NULL;
@@ -2212,23 +2086,27 @@ int __mmcamcorder_set_exif_basic_info(MMHandleType handle)
        /* defualt : none */
 
        /*24. EXIF_TAG_METERING_MODE */
-       exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order(ed),avsys_exif_info.metering_mode);
-       _mmcam_dbg_log("EXIF_TAG_METERING_MODE [%d]", avsys_exif_info.metering_mode);
-       ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_METERING_MODE,
-                                   EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
-       if (ret != MM_ERROR_NONE) {
-               EXIF_SET_ERR(ret, EXIF_TAG_METERING_MODE);
+       if (control != NULL) {
+               exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order(ed),avsys_exif_info.metering_mode);
+               _mmcam_dbg_log("EXIF_TAG_METERING_MODE [%d]", avsys_exif_info.metering_mode);
+               ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_METERING_MODE,
+                                           EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
+               if (ret != MM_ERROR_NONE) {
+                       EXIF_SET_ERR(ret, EXIF_TAG_METERING_MODE);
+               }
        }
 
        /*25. EXIF_TAG_LIGHT_SOURCE*/
 
        /*26. EXIF_TAG_FLASH*/
-       exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order (ed),avsys_exif_info.flash);
-       _mmcam_dbg_log("EXIF_TAG_FLASH [%d]", avsys_exif_info.flash);
-       ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH,
-                                   EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
-       if (ret != MM_ERROR_NONE) {
-               EXIF_SET_ERR(ret, EXIF_TAG_FLASH);
+       if (control != NULL) {
+               exif_set_short((unsigned char *)&eshort[cnts], exif_data_get_byte_order (ed),avsys_exif_info.flash);
+               _mmcam_dbg_log("EXIF_TAG_FLASH [%d]", avsys_exif_info.flash);
+               ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH,
+                                           EXIF_FORMAT_SHORT, 1, (unsigned char *)&eshort[cnts++]);
+               if (ret != MM_ERROR_NONE) {
+                       EXIF_SET_ERR(ret, EXIF_TAG_FLASH);
+               }
        }
 
        /*27. EXIF_TAG_FOCAL_LENGTH*/
@@ -2813,3 +2691,45 @@ exit:
 
        return ret;
 }
+
+
+static void __sound_status_changed_cb(keynode_t* node, void *data)
+{
+       mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)data;
+       _MMCamcorderImageInfo *info = NULL;
+
+       mmf_return_if_fail(hcamcorder && hcamcorder->sub_context && hcamcorder->sub_context->info_image);
+
+       _mmcam_dbg_log("START");
+
+       info = hcamcorder->sub_context->info_image;
+
+       __ta__("        GET_IN_CB:VCONFKEY_SETAPPL_SOUND_STATUS_BOOL",
+       vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &(info->sound_status));
+       );
+
+       _mmcam_dbg_log("DONE : sound status %d", info->sound_status);
+
+       return;
+}
+
+
+static void __volume_level_changed_cb(void *data)
+{
+       mmf_camcorder_t *hcamcorder = (mmf_camcorder_t *)data;
+       _MMCamcorderImageInfo *info = NULL;
+
+       mmf_return_if_fail(hcamcorder && hcamcorder->sub_context && hcamcorder->sub_context->info_image);
+
+       _mmcam_dbg_log("START");
+
+       info = hcamcorder->sub_context->info_image;
+
+       __ta__("        GET_IN_CB:mm_sound_volume_get_value",
+       mm_sound_volume_get_value(VOLUME_TYPE_MEDIA, &info->volume_level);
+       );
+
+       _mmcam_dbg_log("DONE : volume level %d", info->volume_level);
+
+       return;
+}
index 688cc31..ec32843 100644 (file)
  *
  */
 
-/*===========================================================================================
-|                                                                                                                                                                                      |
-|  INCLUDE FILES                                                                                                                                                       |
-|                                                                                                                                                                                      |
-========================================================================================== */
+/*=======================================================================================
+|  INCLUDE FILES                                                                       |
+=======================================================================================*/
 #include <stdio.h>
 #include <stdarg.h>
 #include <camsrcjpegenc.h>
 
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_util.h"
+#include <mm_util_imgp.h>
 
-/*---------------------------------------------------------------------------
-|    GLOBAL VARIABLE DEFINITIONS for internal                                                          |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    GLOBAL VARIABLE DEFINITIONS for internal                          |
+-----------------------------------------------------------------------*/
+
+/*-----------------------------------------------------------------------
+|    LOCAL VARIABLE DEFINITIONS for internal                           |
+-----------------------------------------------------------------------*/
+#define TIME_STRING_MAX_LEN     64
 
-/*---------------------------------------------------------------------------
-|    LOCAL VARIABLE DEFINITIONS for internal                                                           |
----------------------------------------------------------------------------*/
-#define TIME_STRING_MAX_LEN   64
 #define FPUTC_CHECK(x_char, x_file)\
 {\
        if (fputc(x_char, x_file) == EOF) \
@@ -86,35 +86,51 @@ gint32 _mmcamcorder_double_to_fix(gdouble d_number)
 }
 
 // find top level tag only, do not use this function for finding sub level tags
-gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc)
+gint _mmcamcorder_find_tag(FILE *f, guint32 tag_fourcc, gboolean do_rewind)
 {
        guchar buf[8];
 
-       rewind(f);
+       if (do_rewind) {
+               rewind(f);
+       }
 
-       while(fread(&buf, sizeof(guchar), 8, f)>0)
-       {
-               gulong buf_size = 0;
-               guint32 buf_fourcc = MMCAM_FOURCC(buf[4], buf[5],buf[6],buf[7]);
+       while (fread(&buf, sizeof(guchar), 8, f)>0) {
+               unsigned long long buf_size = 0;
+               unsigned int buf_fourcc = MMCAM_FOURCC(buf[4], buf[5], buf[6], buf[7]);
 
-               if(tag_fourcc == buf_fourcc)
-               {
+               if (tag_fourcc == buf_fourcc) {
                        _mmcam_dbg_log("find tag : %c%c%c%c", MMCAM_FOURCC_ARGS(tag_fourcc));
-                       return 1;
-               }
-               else
-               {
-                       _mmcam_dbg_log("skip [%c%c%c%c]  tag", MMCAM_FOURCC_ARGS(buf_fourcc));          
-                       buf_size = _mmcamcorder_get_container_size(buf);
-                       if(fseek(f, buf_size-8, SEEK_CUR) != 0)
-                       {
-                               _mmcam_dbg_err("fseek() fail");
-                               return 0;
-                       }               
+                       return TRUE;
+               } else {
+                       _mmcam_dbg_log("skip [%c%c%c%c] tag", MMCAM_FOURCC_ARGS(buf_fourcc));
+
+                       buf_size = (unsigned long long)_mmcamcorder_get_container_size(buf);
+                       buf_size = buf_size - 8; /* include tag */
+
+                       do {
+                               if (buf_size > _MMCAMCORDER_MAX_INT) {
+                                       _mmcam_dbg_log("seek %d", _MMCAMCORDER_MAX_INT);
+                                       if (fseek(f, _MMCAMCORDER_MAX_INT, SEEK_CUR) != 0) {
+                                               _mmcam_dbg_err("fseek() fail");
+                                               return FALSE;
+                                       }
+
+                                       buf_size -= _MMCAMCORDER_MAX_INT;
+                               } else {
+                                       _mmcam_dbg_log("seek %d", buf_size);
+                                       if (fseek(f, buf_size, SEEK_CUR) != 0) {
+                                               _mmcam_dbg_err("fseek() fail");
+                                               return FALSE;
+                                       }
+                                       break;
+                               }
+                       } while (TRUE);
                }
        }
+
        _mmcam_dbg_log("cannot find tag : %c%c%c%c", MMCAM_FOURCC_ARGS(tag_fourcc));
-       return 0;
+
+       return FALSE;
 }
 
 gboolean _mmcamcorder_update_size(FILE *f, gint64 prev_pos, gint64 curr_pos)
@@ -241,21 +257,72 @@ gboolean _mmcamcorder_write_udta(FILE *f, _MMCamcorderLocationInfo info)
 }
 
 
-gulong _mmcamcorder_get_container_size(const guchar *size)
+guint64 _mmcamcorder_get_container_size(const guchar *size)
 {
-       gulong result = 0;
-       gulong temp = 0;
+       guint64 result = 0;
+       guint64 temp = 0;
+
        temp = size[0];
        result = temp << 24;
        temp = size[1];
        result = result | (temp << 16);
        temp = size[2];
        result = result | (temp << 8);
-       result = result | size[3];      
+       result = result | size[3];
+
+       _mmcam_dbg_log("result : %lld", (unsigned long long)result);
+
        return result;
 }
 
 
+gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation)
+{
+       /* for 0 degree */
+       guint32 a = 0x00010000;
+       guint32 b = 0;
+       guint32 c = 0;
+       guint32 d = 0x00010000;
+
+       switch (orientation) {
+       case MM_CAMCORDER_TAG_ORT_0R_VR_0C_VT:/* 90 degree */
+               a = 0;
+               b = 0x00010000;
+               c = 0xffff0000;
+               d = 0;
+               break;
+       case MM_CAMCORDER_TAG_ORT_0R_VB_0C_VR:/* 180 degree */
+               a = 0xffff0000;
+               d = 0xffff0000;
+               break;
+       case MM_CAMCORDER_TAG_ORT_0R_VL_0C_VB:/* 270 degree */
+               a = 0;
+               b = 0xffff0000;
+               c = 0x00010000;
+               d = 0;
+               break;
+       case MM_CAMCORDER_TAG_ORT_0R_VT_0C_VL:/* 0 degree */
+       default:
+               break;
+       }
+
+       write_to_32(f, a);
+       write_to_32(f, b);
+       write_to_32(f, 0);
+       write_to_32(f, c);
+       write_to_32(f, d);
+       write_to_32(f, 0);
+       write_to_32(f, 0);
+       write_to_32(f, 0);
+       write_to_32(f, 0x40000000);
+
+       _mmcam_dbg_log("orientation : %d, write data 0x%x 0x%x 0x%x 0x%x",
+                      orientation, a, b, c, d);
+
+       return TRUE;
+}
+
+
 int _mmcamcorder_get_freespace(const gchar *path, guint64 *free_space)
 {
        struct statfs fs;
@@ -547,6 +614,7 @@ void _mmcamcorder_remove_all_handlers(MMHandleType handle,  _MMCamcorderHandlerC
        _mmcam_dbg_log("LEAVE");
 }
 
+
 void _mmcamcorder_element_release_noti(gpointer data, GObject *where_the_object_was)
 {
        int i=0;
@@ -554,10 +622,8 @@ void _mmcamcorder_element_release_noti(gpointer data, GObject *where_the_object_
        mmf_return_if_fail(sc);
        mmf_return_if_fail(sc->element);
 
-       for(i=0;i< _MMCamcorder_PIPELINE_ELEMENT_NUM; i++)
-       {
-               if(sc->element[i].gst && (G_OBJECT(sc->element[i].gst) == where_the_object_was))
-               {
+       for (i = 0 ; i < _MMCamcorder_PIPELINE_ELEMENT_NUM ; i++) {
+               if (sc->element[i].gst && (G_OBJECT(sc->element[i].gst) == where_the_object_was)) {
                        _mmcam_dbg_log("The element[%d][%p] is finalized", sc->element[i].id, sc->element[i].gst);
                        sc->element[i].gst = NULL;
                        sc->element[i].id = _MMCAMCORDER_NONE;
@@ -570,33 +636,54 @@ void _mmcamcorder_element_release_noti(gpointer data, GObject *where_the_object_
 gboolean
 _mmcamcroder_msg_callback(void *data)
 {
-       _MMCamcorderMsgItem * item = (_MMCamcorderMsgItem*)data;
-       mmf_camcorder_t *hcamcorder= NULL;
-       mmf_return_val_if_fail( item, FALSE );
-       
+       _MMCamcorderMsgItem *item = (_MMCamcorderMsgItem*)data;
+       mmf_camcorder_t *hcamcorder = NULL;
+       mmf_return_val_if_fail(item, FALSE);
+
        hcamcorder = MMF_CAMCORDER(item->handle);
-       mmf_return_val_if_fail( hcamcorder, FALSE );
+       mmf_return_val_if_fail(hcamcorder, FALSE);
 
-//     _mmcam_dbg_log("msg id:%x, msg_cb:%p, msg_data:%p, item:%p", item->id, hcamcorder->msg_cb, hcamcorder->msg_data, item);
+       /*_mmcam_dbg_log("msg id:%x, msg_cb:%p, msg_data:%p, item:%p", item->id, hcamcorder->msg_cb, hcamcorder->msg_data, item);*/
 
-       _MMCAMCORDER_LOCK_MESSAGE_CALLBACK( hcamcorder );
+       _MMCAMCORDER_LOCK_MESSAGE_CALLBACK(hcamcorder);
+
+       /* check delay of CAPTURED message */
+       if (item->id == MM_MESSAGE_CAMCORDER_CAPTURED) {
+               MMTA_ACUM_ITEM_END("                CAPTURED MESSAGE DELAY", FALSE);
+       }
 
        if ((hcamcorder) && (hcamcorder->msg_cb)) {
                hcamcorder->msg_cb(item->id, (MMMessageParamType*)(&(item->param)), hcamcorder->msg_cb_param);
        }
 
-       _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK( hcamcorder );
+       _MMCAMCORDER_UNLOCK_MESSAGE_CALLBACK(hcamcorder);
 
        _MMCAMCORDER_LOCK((MMHandleType)hcamcorder);
-       
-       if (hcamcorder->msg_data)
+
+       if (hcamcorder->msg_data) {
                hcamcorder->msg_data = g_list_remove(hcamcorder->msg_data, item);
+       }
+
+       /* release allocated memory */
+       if (item->id == MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO) {
+               MMCamFaceDetectInfo *cam_fd_info = (MMCamFaceDetectInfo *)item->param.data;
+               if (cam_fd_info) {
+                       SAFE_FREE(cam_fd_info->face_info);
+                       free(cam_fd_info);
+                       cam_fd_info = NULL;
+               }
 
-       SAFE_FREE(item);
+               item->param.data = NULL;
+               item->param.size = 0;
+       }
+
+       free(item);
+       item = NULL;
 
        _MMCAMCORDER_UNLOCK((MMHandleType)hcamcorder);
 
-       return FALSE;           //For not being called again
+       /* For not being called again */
+       return FALSE;
 }
 
 
@@ -630,6 +717,8 @@ _mmcamcroder_send_message(MMHandleType handle, _MMCamcorderMsgItem *data)
                case MM_MESSAGE_CAMCORDER_ERROR:
                case MM_MESSAGE_CAMCORDER_FOCUS_CHANGED:
                case MM_MESSAGE_CAMCORDER_CAPTURED:
+               case MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED:
+               case MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED:
                case MM_MESSAGE_READY_TO_RESUME:
                default:
                        data->param.union_type = MM_MSG_UNION_CODE;
@@ -696,6 +785,12 @@ _mmcamcroder_remove_message_all(MMHandleType handle)
                hcamcorder->msg_data = NULL;
        }
 
+       /* remove idle function for playing capture sound */
+       do {
+               ret = g_idle_remove_by_data(hcamcorder);
+               _mmcam_dbg_log("remove idle function for playing capture sound. ret[%d]", ret);
+       } while (ret);
+
        _MMCAMCORDER_UNLOCK(handle);
 
        return;
@@ -837,9 +932,16 @@ unsigned int _mmcamcorder_get_fourcc(int pixtype, int codectype, int use_zero_co
                        fourcc = GST_MAKE_FOURCC ('J', 'P', 'E', 'G');
                }
                break;
+       case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
+               fourcc = GST_MAKE_FOURCC('I','T','L','V');
+               break;
        default:
-               _mmcam_dbg_log("Not proper pixel type. Set default.");
-               fourcc = GST_MAKE_FOURCC ('S', '4', '2', '0');
+               _mmcam_dbg_log("Not proper pixel type[%d]. Set default - I420", pixtype);
+               if (use_zero_copy_format) {
+                       fourcc = GST_MAKE_FOURCC ('S', '4', '2', '0');
+               } else {
+                       fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0');
+               }
                break;
        }
 
@@ -895,6 +997,10 @@ int _mmcamcorder_get_pixtype(unsigned int fourcc)
        case GST_MAKE_FOURCC ('P', 'N', 'G', ' '):
                pixtype = MM_PIXEL_FORMAT_ENCODED;
                break;
+       /*FIXME*/
+       case GST_MAKE_FOURCC ('I', 'T', 'L', 'V'):
+               pixtype = MM_PIXEL_FORMAT_ITLV_JPEG_UYVY;
+               break;
        default:
                _mmcam_dbg_log("Not supported fourcc type(%x)", fourcc);
                pixtype = MM_PIXEL_FORMAT_INVALID;
@@ -979,12 +1085,87 @@ _mmcamcorder_link_elements( GList *element_list )
 }
 
 
+gboolean _mmcamcorder_resize_frame(unsigned char *src_data, int src_width, int src_height, int src_length, int src_format,
+                                   unsigned char **dst_data, int *dst_width, int *dst_height, int *dst_length)
+{
+       int ret = TRUE;
+       int mm_ret = MM_ERROR_NONE;
+       int input_format = MM_UTIL_IMG_FMT_YUV420;
+       unsigned char *dst_tmp_data = NULL;
+
+       if (!src_data || !dst_data || !dst_width || !dst_height || !dst_length) {
+               _mmcam_dbg_err("something is NULL %p,%p,%p,%p,%p",
+                              src_data, dst_data, dst_width, dst_height, dst_length);
+               return FALSE;
+       }
+
+       /* set input format for mm-util */
+       switch (src_format) {
+       case MM_PIXEL_FORMAT_I420:
+               input_format = MM_UTIL_IMG_FMT_I420;
+               break;
+       case MM_PIXEL_FORMAT_YV12:
+               input_format = MM_UTIL_IMG_FMT_YUV420;
+               break;
+       case MM_PIXEL_FORMAT_NV12:
+               input_format = MM_UTIL_IMG_FMT_NV12;
+               break;
+       case MM_PIXEL_FORMAT_YUYV:
+               input_format = MM_UTIL_IMG_FMT_YUYV;
+               break;
+       case MM_PIXEL_FORMAT_UYVY:
+               input_format = MM_UTIL_IMG_FMT_UYVY;
+               break;
+       default:
+               _mmcam_dbg_err("NOT supported format", src_format);
+               return FALSE;
+       }
+
+       _mmcam_dbg_log("src size %dx%d -> dst size %dx%d",
+                       src_width, src_height, *dst_width, *dst_height);
+
+       /* get length of resized image */
+       __ta__("        mm_util_get_image_size 2",
+       mm_ret = mm_util_get_image_size(input_format, *dst_width, *dst_height, dst_length);
+       );
+       if (mm_ret != MM_ERROR_NONE) {
+               GST_ERROR("mm_util_get_image_size failed 0x%x", ret);
+               return FALSE;
+       }
+
+       _mmcam_dbg_log("dst_length : %d", *dst_length);
+
+       dst_tmp_data = (unsigned char *)malloc(*dst_length);
+       if (dst_tmp_data == NULL) {
+               _mmcam_dbg_err("failed to alloc dst_thumb_size(size %d)", *dst_length);
+               return FALSE;
+       }
+
+       __ta__("        mm_util_resize_image",
+       mm_ret = mm_util_resize_image(src_data, src_width, src_height, input_format,
+                                     dst_tmp_data, dst_width, dst_height);
+       );
+       if (mm_ret != MM_ERROR_NONE) {
+               GST_ERROR("mm_util_resize_image failed 0x%x", ret);
+               free(dst_tmp_data);
+               return FALSE;
+       }
+
+       *dst_data = dst_tmp_data;
+
+       _mmcam_dbg_log("resize done %p, %dx%d", *dst_data, *dst_width, *dst_height);
+
+       return TRUE;
+}
+
+
 gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsigned int src_height,
                                  int src_format, unsigned int src_length, unsigned int jpeg_quality,
                                  void **result_data, unsigned int *result_length)
 {
        int ret = 0;
        int i = 0;
+       int enc_type = JPEG_ENCODER_SOFTWARE;
        guint32 src_fourcc = 0;
        gboolean do_encode = FALSE;
        jpegenc_parameter enc_param;
@@ -1006,8 +1187,30 @@ gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsign
        src_fourcc = _mmcamcorder_get_fourcc(src_format, 0, FALSE);
        camsrcjpegenc_get_src_fmt(src_fourcc, &(enc_param.src_fmt));
 
-       if (enc_param.src_fmt != COLOR_FORMAT_NOT_SUPPORT &&
-           enc_info.sw_support == TRUE) {
+       if (enc_param.src_fmt == COLOR_FORMAT_NOT_SUPPORT) {
+               _mmcam_dbg_err("Not Supported FOURCC(format:%d)", src_format);
+               return FALSE;
+       }
+
+       /* check H/W encoder */
+       if (enc_info.hw_support) {
+               _mmcam_dbg_log("check H/W encoder supported format list");
+               /* Check supported format */
+               for (i = 0 ; i < enc_info.hw_enc.input_fmt_num ; i++) {
+                       if (enc_param.src_fmt == enc_info.hw_enc.input_fmt_list[i]) {
+                               do_encode = TRUE;
+                               break;
+                       }
+               }
+
+               if (do_encode) {
+                       enc_type = JPEG_ENCODER_HARDWARE;
+               }
+       }
+
+       /* check S/W encoder */
+       if (!do_encode && enc_info.sw_support) {
+               _mmcam_dbg_log("check S/W encoder supported format list");
                /* Check supported format */
                for (i = 0 ; i < enc_info.sw_enc.input_fmt_num ; i++) {
                        if (enc_param.src_fmt == enc_info.sw_enc.input_fmt_list[i]) {
@@ -1017,36 +1220,41 @@ gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsign
                }
 
                if (do_encode) {
-                       enc_param.src_data = src_data;
-                       enc_param.width = src_width;
-                       enc_param.height = src_height;
-                       enc_param.src_len = src_length;
-                       enc_param.jpeg_mode = JPEG_MODE_BASELINE;
-                       enc_param.jpeg_quality = jpeg_quality;
-
-                       __ta__("                    camsrcjpegenc_encode",
-                       ret = camsrcjpegenc_encode(&enc_info, JPEG_ENCODER_SOFTWARE, &enc_param );
-                       );
-                       if (ret == CAMSRC_JPEGENC_ERROR_NONE) {
-                               *result_data = enc_param.result_data;
-                               *result_length = enc_param.result_len;
-
-                               _mmcam_dbg_log("JPEG encode length(%d)", *result_length);
-
-                               return TRUE;
-                       } else {
-                               _mmcam_dbg_err("camsrcjpegenc_encode failed(%x)", ret);
-                               return FALSE;
-                       }
+                       enc_type = JPEG_ENCODER_SOFTWARE;
+               }
+       }
+
+       if (do_encode) {
+               enc_param.src_data = src_data;
+               enc_param.width = src_width;
+               enc_param.height = src_height;
+               enc_param.src_len = src_length;
+               enc_param.jpeg_mode = JPEG_MODE_BASELINE;
+               enc_param.jpeg_quality = jpeg_quality;
+
+               _mmcam_dbg_log("%ux%u, size %u, quality %u, type %d",
+                              src_width, src_height, src_length,
+                              jpeg_quality, enc_type);
+
+               __ta__("                    camsrcjpegenc_encode",
+               ret = camsrcjpegenc_encode(&enc_info, enc_type, &enc_param );
+               );
+               if (ret == CAMSRC_JPEGENC_ERROR_NONE) {
+                       *result_data = enc_param.result_data;
+                       *result_length = enc_param.result_len;
+
+                       _mmcam_dbg_log("JPEG encode length(%d)", *result_length);
+
+                       return TRUE;
                } else {
-                       _mmcam_dbg_err("S/W JPEG codec does NOT support format [%d]", src_format);
+                       _mmcam_dbg_err("camsrcjpegenc_encode failed(%x)", ret);
                        return FALSE;
                }
-       } else {
-               _mmcam_dbg_err("Not Supported FOURCC(format:%d) or There is NO S/W encoder(%d)",
-                               src_format, enc_info.sw_support);
-               return FALSE;
        }
+
+       _mmcam_dbg_err("No encoder supports %d format", src_format);
+
+       return FALSE;
 }
 
 
index 631f389..e728bef 100644 (file)
@@ -22,6 +22,7 @@
 /*=======================================================================================
 |  INCLUDE FILES                                                                       |
 =======================================================================================*/
+#include <gst/interfaces/cameracontrol.h>
 #include "mm_camcorder_internal.h"
 #include "mm_camcorder_videorec.h"
 
 |    GLOBAL VARIABLE DEFINITIONS for internal                                          |
 ---------------------------------------------------------------------------------------*/
 #define _MMCAMCORDER_LOCATION_INFO // for add gps information
+#define MAX_ERROR_MESSAGE_LEN         128
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL VARIABLE DEFINITIONS for internal                                           |
 ---------------------------------------------------------------------------------------*/
-#define _MMCAMCORDER_MINIMUM_FRAME              10
+#define _MMCAMCORDER_MINIMUM_FRAME              3
 #define _MMCAMCORDER_RETRIAL_COUNT              10
 #define _MMCAMCORDER_FRAME_WAIT_TIME            200000 /* ms */
 #define _MMCAMCORDER_FREE_SPACE_CHECK_INTERVAL  5
+#define _OFFSET_COMPOSITION_MATRIX              40L
 
 /*---------------------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                |
@@ -45,7 +48,7 @@
 static gboolean __mmcamcorder_audio_dataprobe_check(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 static gboolean __mmcamcorder_video_dataprobe_record(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 static gboolean __mmcamcorder_audioque_dataprobe(GstPad *pad, GstBuffer *buffer, gpointer u_data);
-static gboolean __mmcamcorder_video_dataprobe_slow(GstPad *pad, GstBuffer *buffer, gpointer u_data);
+static gboolean __mmcamcorder_video_dataprobe_audio_disable(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 static gboolean __mmcamcorder_audio_dataprobe_audio_mute(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 static gboolean __mmcamcorder_add_locationinfo(MMHandleType handle, int fileformat);
 static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle);
@@ -60,6 +63,7 @@ static gboolean __mmcamcorder_eventprobe_monitor(GstPad *pad, GstEvent *event, g
 int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
 {
        int err = MM_ERROR_NONE;
+       int audio_disable = FALSE;
        char* gst_element_rsink_name = NULL;
 
        GstPad *srcpad = NULL;
@@ -91,7 +95,20 @@ int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
                goto pipeline_creation_error;
        }
 
-       if (sc->is_slow == FALSE) {
+       /* get audio disable */
+       mm_camcorder_get_attributes(handle, NULL,
+                                   MMCAM_AUDIO_DISABLE, &audio_disable,
+                                   NULL);
+
+       if (sc->is_modified_rate || audio_disable) {
+               sc->audio_disable = TRUE;
+       } else {
+               sc->audio_disable = FALSE;
+       }
+       _mmcam_dbg_log("AUDIO DISABLE : %d (is_modified_rate %d, audio_disable %d)",
+                      sc->audio_disable, sc->is_modified_rate, audio_disable);
+
+       if (sc->audio_disable == FALSE) {
                /* Sub pipeline */
                __ta__("        __mmcamcorder_create_audiosrc_bin",
                err = _mmcamcorder_create_audiosrc_bin((MMHandleType)hcamcorder);
@@ -105,7 +122,7 @@ int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
        }
 
        __ta__("        _mmcamcorder_create_encodesink_bin",
-       err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder);
+       err = _mmcamcorder_create_encodesink_bin((MMHandleType)hcamcorder, MM_CAMCORDER_ENCBIN_PROFILE_VIDEO);
        );
        if (err != MM_ERROR_NONE) {
                return err;
@@ -119,7 +136,7 @@ int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
        sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, "video_sink0");
        _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
 
-       if (sc->is_slow == FALSE) {
+       if (sc->audio_disable == FALSE) {
                srcpad = gst_element_get_static_pad (sc->element[_MMCAMCORDER_AUDIOSRC_BIN].gst, "src");
                sinkpad = gst_element_get_static_pad (sc->element[_MMCAMCORDER_ENCSINK_BIN].gst, "audio_sink0");
                _MM_GST_PAD_LINK_UNREF(srcpad, sinkpad, err, pipeline_creation_error);
@@ -137,7 +154,7 @@ int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
 
        /* set data probe function for audio */
 
-       if (sc->is_slow == FALSE) {
+       if (sc->audio_disable == FALSE) {
                sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "sink");
                MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_VIDEOREC,
                                             __mmcamcorder_audioque_dataprobe, hcamcorder);
@@ -168,10 +185,10 @@ int _mmcamcorder_add_recorder_pipeline(MMHandleType handle)
                srcpad = NULL;
        }
 
-       if (sc->is_slow) {
+       if (sc->audio_disable) {
                sinkpad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_VENC].gst, "sink");
                MMCAMCORDER_ADD_BUFFER_PROBE(sinkpad, _MMCAMCORDER_HANDLER_VIDEOREC,
-                                            __mmcamcorder_video_dataprobe_slow, hcamcorder);
+                                            __mmcamcorder_video_dataprobe_audio_disable, hcamcorder);
                gst_object_unref(sinkpad);
                sinkpad = NULL;
        }
@@ -331,15 +348,16 @@ int _mmcamcorder_remove_recorder_pipeline(MMHandleType handle)
 
        _mmcamcorder_remove_all_handlers((MMHandleType)hcamcorder, _MMCAMCORDER_HANDLER_VIDEOREC);
 
-       ret = _mmcamcorder_remove_encoder_pipeline(handle);
+       /* remove audio pipeline first */
+       ret = _mmcamcorder_remove_audio_pipeline(handle);
        if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_err("Fail to remove encoder pipeline");
+               _mmcam_dbg_err("Fail to remove audio pipeline");
                return ret;
        }
 
-       ret = _mmcamcorder_remove_audio_pipeline(handle);
+       ret = _mmcamcorder_remove_encoder_pipeline(handle);
        if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_err("Fail to remove audio pipeline");
+               _mmcam_dbg_err("Fail to remove encoder pipeline");
                return ret;
        }
 
@@ -387,11 +405,11 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
        int size = 0;
        int fileformat = 0;
        int ret = MM_ERROR_NONE;
+       double motion_rate = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
        char *temp_filename = NULL;
        char *err_name = NULL;
 
        gint fps = 0;
-       gint slow_fps = 0;
        GstElement *pipeline = NULL;
        GstPad *pad = NULL;
 
@@ -403,10 +421,10 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       mmf_return_val_if_fail(sc->info, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc->info_video, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
        mmf_return_val_if_fail(sc->element, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
-       info = sc->info;
+       info = sc->info_video;
 
        _mmcam_dbg_log("Command(%d)", command);
 
@@ -416,6 +434,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
        case _MMCamcorder_CMD_RECORD:
        {
                if (_mmcamcorder_get_state((MMHandleType)hcamcorder) != MM_CAMCORDER_STATE_PAUSED) {
+                       guint imax_size = 0;
                        guint imax_time = 0;
 
                        /* Play record start sound */
@@ -424,6 +443,12 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                        /* Recording */
                        _mmcam_dbg_log("Record Start");
 
+                       /* set hybrid mode when ITLV format */
+                       if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                               _mmcam_dbg_log("flush cache TRUE");
+                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "flush-cache", TRUE);
+                       }
+
                        ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PAUSED);
                        if (ret != MM_ERROR_NONE) {
                                goto _ERR_CAMCORDER_VIDEO_COMMAND;
@@ -444,9 +469,10 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
 
                        ret = mm_camcorder_get_attributes(handle, &err_name,
                                                          MMCAM_CAMERA_FPS, &fps,
-                                                         "camera-slow-motion-fps", &slow_fps,
+                                                         MMCAM_CAMERA_RECORDING_MOTION_RATE, &motion_rate,
                                                          MMCAM_FILE_FORMAT, &fileformat,
                                                          MMCAM_TARGET_FILENAME, &temp_filename, &size,
+                                                         MMCAM_TARGET_MAX_SIZE, &imax_size,
                                                          MMCAM_TARGET_TIME_LIMIT, &imax_time,
                                                          MMCAM_FILE_FORMAT, &(info->fileformat),
                                                          NULL);
@@ -456,6 +482,13 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                                goto _ERR_CAMCORDER_VIDEO_COMMAND;
                        }
 
+                       /* set max size */
+                       if (imax_size <= 0) {
+                               info->max_size = 0; /* do not check */
+                       } else {
+                               info->max_size = ((guint64)imax_size) << 10; /* to byte */
+                       }
+
                        /* set max time */
                        if (imax_time <= 0) {
                                info->max_time = 0; /* do not check */
@@ -463,10 +496,13 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                                info->max_time = ((guint64)imax_time) * 1000; /* to millisecond */
                        }
 
-                       if (sc->is_slow) {
-                               info->multiple_fps = fps/slow_fps;
-                               _mmcam_dbg_log("high speed recording fps:%d,slow_fps:%d,multiple_fps:%d",
-                                              fps, slow_fps, info->multiple_fps);
+                       if (sc->is_modified_rate) {
+                               info->record_timestamp_ratio = (_MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE/motion_rate);
+                               _mmcam_dbg_log("high speed recording fps:%d, slow_rate:%f, timestamp_ratio:%f",
+                                              fps, motion_rate, info->record_timestamp_ratio);
+                       } else {
+                               info->record_timestamp_ratio = _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE;
+                               _mmcam_dbg_log("normal recording");
                        }
 
                        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hold-af-after-capturing", TRUE);
@@ -568,7 +604,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                }
 
                for (count = 0 ; count <= _MMCAMCORDER_RETRIAL_COUNT ; count++) {
-                       if (sc->is_slow) {
+                       if (sc->audio_disable) {
                                /* check only video frame */
                                if (info->video_frame_count >= _MMCAMCORDER_MINIMUM_FRAME) {
                                        break;
@@ -610,18 +646,13 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                        return MM_ERROR_CAMCORDER_CMD_IS_RUNNING;
                }
 
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hold-af-after-capturing", FALSE);
-
-               if (sc->now_continuous_af) {
-                       sc->now_continuous_af = FALSE;
-                       _mmcam_dbg_log("Set now_continuous_af as FALSE when CANCEL recording");
-               }
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hold-af-after-capturing", FALSE);
 
                __ta__("        _MMCamcorder_CMD_CANCEL:GST_STATE_READY",
                ret =_mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_READY);
                );
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
+               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
                if (ret != MM_ERROR_NONE) {
                        goto _ERR_CAMCORDER_VIDEO_COMMAND;
                }
@@ -647,13 +678,17 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                info->audio_frame_count = 0;
                info->filesize =0;
 
+               /* set flush cache as FALSE */
+               if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "flush-cache", FALSE);
+               }
+
                __ta__("        _MMCamcorder_CMD_CANCEL:GST_STATE_PLAYING",
                ret =_mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
                );
                if (ret != MM_ERROR_NONE) {
                        goto _ERR_CAMCORDER_VIDEO_COMMAND;
                }
-
                break;
        }
        case _MMCamcorder_CMD_COMMIT:
@@ -669,7 +704,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                }
 
                for (count = 0 ; count <= _MMCAMCORDER_RETRIAL_COUNT ; count++) {
-                       if (sc->is_slow) {
+                       if (sc->audio_disable) {
                                /* check only video frame */
                                if (info->video_frame_count >= _MMCAMCORDER_MINIMUM_FRAME) {
                                        break;
@@ -705,11 +740,6 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
 
                MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "hold-af-after-capturing", FALSE);
 
-               if (sc->now_continuous_af) {
-                       sc->now_continuous_af = FALSE;
-                       _mmcam_dbg_log("Set now_continuous_af as FALSE when COMMIT recording");
-               }
-
                if (sc->error_occurs) {
                        GstPad *video= NULL;
                        GstPad *audio = NULL;
@@ -729,7 +759,7 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                        _mmcam_dbg_err("Sending EOS video encoder src pad  : %d", ret);
                        gst_object_unref(video);
 
-                       if (!sc->is_slow) {
+                       if (sc->audio_disable == FALSE) {
                                audio = gst_element_get_static_pad(sc->element[_MMCAMCORDER_ENCSINK_AENC].gst, "src");
                                gst_pad_push_event (audio, gst_event_new_flush_start());
                                gst_pad_push_event (audio, gst_event_new_flush_stop());
@@ -766,50 +796,17 @@ int _mmcamcorder_video_command(MMHandleType handle, int command)
                /* Wait EOS */
                _mmcam_dbg_log("Start to wait EOS");
                ret =_mmcamcorder_get_eos_message(handle);
-               if (ret != MM_ERROR_NONE) {
-                       goto _ERR_CAMCORDER_VIDEO_COMMAND;
-               }
-       }
-               break;
-       case _MMCamcorder_CMD_PREVIEW_START:
-       {
-               int fps_auto = 0;
 
-               _mmcamcorder_vframe_stablize((MMHandleType)hcamcorder);
-
-               /* sc */
-               sc->display_interval = 0;
-               sc->previous_slot_time = 0;
-
-               mm_camcorder_get_attributes(handle, NULL, MMCAM_CAMERA_FPS_AUTO, &fps_auto, NULL);
-
-               MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "fps-auto", fps_auto);
-
-               __ta__("        _MMCamcorder_CMD_PREVIEW_START:GST_STATE_PLAYING",
-               ret =_mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
-               );
-               if (ret != MM_ERROR_NONE) {
-                       goto _ERR_CAMCORDER_VIDEO_COMMAND;
+               /* set flush cache as FALSE */
+               if (sc->info_image->preview_format == MM_PIXEL_FORMAT_ITLV_JPEG_UYVY) {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "flush-cache", FALSE);
                }
 
-               /* I place this function last because it miscalculates a buffer that sents in GST_STATE_PAUSED */
-               _mmcamcorder_video_current_framerate_init(handle);
-       }
-               break;
-       case _MMCamcorder_CMD_PREVIEW_STOP:
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
-               ret = _mmcamcorder_gst_set_state(handle, sc->element[_MMCAMCORDER_MAIN_PIPE].gst, GST_STATE_READY);
-               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
                if (ret != MM_ERROR_NONE) {
+                       info->b_commiting = FALSE;
                        goto _ERR_CAMCORDER_VIDEO_COMMAND;
                }
-
-               if (sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst) {
-                       int op_status = 0;
-                       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "operation-status", &op_status);
-                       _mmcam_dbg_err("Current Videosrc status[0x%x]", op_status);
-               }
-
+       }
                break;
        default:
                ret =  MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
@@ -833,9 +830,6 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
 {
        int ret = MM_ERROR_NONE;
        int enabletag = 0;
-       int camcorder_rotate = MM_VIDEO_INPUT_ROTATION_NONE;
-       int camera_rotate = MM_VIDEO_INPUT_ROTATION_NONE;
-       int display_rotate = MM_DISPLAY_ROTATION_NONE;
        guint64 file_size = 0;
 
        GstPad *pad = NULL;
@@ -851,9 +845,9 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
 
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
        mmf_return_val_if_fail(sc, FALSE);
-       mmf_return_val_if_fail(sc->info, FALSE);
+       mmf_return_val_if_fail(sc->info_video, FALSE);
 
-       info = sc->info;
+       info = sc->info_video;
 
        _mmcam_dbg_err("");
 
@@ -865,15 +859,19 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", FALSE);
        MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", TRUE);
 
+       mm_camcorder_get_attributes(handle, NULL,
+                                   MMCAM_TAG_ENABLE, &enabletag,
+                                   NULL);
+
        _mmcam_dbg_log("Set state of pipeline as PAUSED");
        __ta__("        _MMCamcorder_CMD_COMMIT:GST_STATE_PAUSED",
        ret = _mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PAUSED);
        );
        if (ret != MM_ERROR_NONE) {
-               _mmcam_dbg_warn("_MMCamcorder_CMD_COMMIT:GST_STATE_PAUSED failed. error[%x]", ret);
+               _mmcam_dbg_warn("_MMCamcorder_CMD_COMMIT:GST_STATE_READY or PAUSED failed. error[%x]", ret);
        }
 
-       MMCAMCORDER_G_OBJECT_SET( sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
+       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_VIDEOSINK_QUE].gst, "empty-buffers", FALSE);
 
        __ta__("        _MMCamcorder_CMD_COMMIT:__mmcamcorder_remove_recorder_pipeline",
        ret = _mmcamcorder_remove_recorder_pipeline((MMHandleType)hcamcorder);
@@ -893,31 +891,35 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
                }
        }
 
-       /* Recovering camera-rotation and display-rotation when start recording */
-       if (camcorder_rotate != camera_rotate &&
-           camera_rotate < MM_VIDEO_INPUT_ROTATION_FLIP_HORZ) {
-               _mmcamcorder_set_videosrc_rotation(handle, camera_rotate);
-               _mmcamcorder_set_display_rotation(handle, display_rotate);
-               _mmcam_dbg_log("## Recovering camcorder rotation is done. camcorder_rotate=%d, camera_rotate=%d, display_rotate=%d",
-                              camcorder_rotate,camera_rotate,display_rotate);
-       } else {
-               _mmcam_dbg_log("## No need to recover camcorder rotation. camcorder_rotate=%d, camera_rotate=%d, display_rotate=%d",
-                              camcorder_rotate,camera_rotate,display_rotate);
-
-               /* Flush EOS event to avoid pending pipeline */
-               pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "sink");
-               gst_pad_push_event(pad, gst_event_new_flush_start());
-               gst_pad_push_event(pad, gst_event_new_flush_stop());
-               gst_object_unref(pad);
-               pad = NULL;
-
-               pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "src");
-               gst_pad_push_event(pad, gst_event_new_flush_start());
-               gst_pad_push_event(pad, gst_event_new_flush_stop());
-               gst_object_unref(pad);
-               pad = NULL;
+       /* Check file size */
+       if (info->max_size > 0) {
+               _mmcamcorder_get_file_size(info->filename, &file_size);
+               _mmcam_dbg_log("MAX size %lld byte - created filesize %lld byte",
+                              info->max_size, file_size);
+
+               if (file_size > info->max_size) {
+                       _MMCamcorderMsgItem message;
+                       _mmcam_dbg_err("File size is greater than max size !!");
+                       message.id = MM_MESSAGE_CAMCORDER_ERROR;
+                       message.param.code = MM_ERROR_CAMCORDER_FILE_SIZE_OVER;
+                       _mmcamcroder_send_message((MMHandleType)hcamcorder, &message);
+               }
        }
 
+       /* Flush EOS event to avoid pending pipeline */
+       _mmcam_dbg_log("Flush EOS event");
+       pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSINK_SINK].gst, "sink");
+       gst_pad_push_event(pad, gst_event_new_flush_start());
+       gst_pad_push_event(pad, gst_event_new_flush_stop());
+       gst_object_unref(pad);
+       pad = NULL;
+
+       pad = gst_element_get_static_pad(sc->element[_MMCAMCORDER_VIDEOSRC_SRC].gst, "src");
+       gst_pad_push_event(pad, gst_event_new_flush_start());
+       gst_pad_push_event(pad, gst_event_new_flush_stop());
+       gst_object_unref(pad);
+       pad = NULL;
+
        _mmcam_dbg_log("Set state as PLAYING");
        __ta__("        _MMCamcorder_CMD_COMMIT:GST_STATE_PLAYING",
        ret =_mmcamcorder_gst_set_state(handle, pipeline, GST_STATE_PLAYING);
@@ -941,7 +943,7 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
        }
 
        /* Send recording report to application */
-       msg.id = MM_MESSAGE_CAMCORDER_CAPTURED;
+       msg.id = MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED;
        report = (MMCamRecordingReport *)malloc(sizeof(MMCamRecordingReport));
        if (!report) {
                _mmcam_dbg_err("Recording report fail(%s). Out of memory.", info->filename);
@@ -974,6 +976,7 @@ int _mmcamcorder_video_handle_eos(MMHandleType handle)
        return TRUE;
 }
 
+
 /**
  * This function is record video data probing function.
  * If this function is linked with certain pad by gst_pad_add_buffer_probe(),
@@ -1022,14 +1025,14 @@ static gboolean __mmcamcorder_audio_dataprobe_check(GstPad *pad, GstBuffer *buff
 {
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
        _MMCamcorderSubContext *sc = NULL;
-       _MMCamcorderVideoInfo * info = NULL;
+       _MMCamcorderVideoInfo *info = NULL;
 
        mmf_return_val_if_fail(hcamcorder, TRUE);
        mmf_return_val_if_fail(buffer, FALSE);
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
 
-       mmf_return_val_if_fail(sc && sc->info, TRUE);
-       info = sc->info;
+       mmf_return_val_if_fail(sc && sc->info_video, TRUE);
+       info = sc->info_video;
 
        /*_mmcam_dbg_err("[%" GST_TIME_FORMAT "]", GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));*/
 
@@ -1072,8 +1075,8 @@ static gboolean __mmcamcorder_video_dataprobe_record(GstPad *pad, GstBuffer *buf
        mmf_return_val_if_fail(buffer, FALSE);
 
        sc = MMF_CAMCORDER_SUBCONTEXT(hcamcorder);
-       mmf_return_val_if_fail(sc && sc->info, TRUE);
-       info = sc->info;
+       mmf_return_val_if_fail(sc && sc->info_video, TRUE);
+       info = sc->info_video;
 
        /*_mmcam_dbg_log("[%" GST_TIME_FORMAT "]", GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buffer)));*/
        if (sc->ferror_send) {
@@ -1091,17 +1094,6 @@ static gboolean __mmcamcorder_video_dataprobe_record(GstPad *pad, GstBuffer *buf
 
        buffer_size = GST_BUFFER_SIZE(buffer);
 
-       if (sc->now_continuous_af) {
-               _mmcam_dbg_log("Start continuous AF when START recording");
-               __ta__("        _MMCamcorder_CMD_RECORD:START CAF",
-               ret = _mmcamcorder_adjust_auto_focus((MMHandleType)hcamcorder);
-               );
-               sc->now_continuous_af = FALSE;
-               if (ret != MM_ERROR_NONE) {
-                       _mmcam_dbg_warn("Failed continuous AF when START recording");
-               }
-       }
-
        /* get trailer size */
        if (info->fileformat == MM_FILE_FORMAT_3GP || info->fileformat == MM_FILE_FORMAT_MP4) {
                MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_MUX].gst, "expected-trailer-size", &trailer_size);
@@ -1139,8 +1131,13 @@ static gboolean __mmcamcorder_video_dataprobe_record(GstPad *pad, GstBuffer *buf
                default: /* succeeded to get free space */
                        /* check free space for recording */
                        /* get queued buffer size */
-                       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_AENC_QUE].gst, "current-level-bytes", &aq_size);
-                       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_VENC_QUE].gst, "current-level-bytes", &vq_size);
+                       if (sc->element[_MMCAMCORDER_ENCSINK_AENC_QUE].gst) {
+                               MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_AENC_QUE].gst, "current-level-bytes", &aq_size);
+                       }
+                       if (sc->element[_MMCAMCORDER_ENCSINK_VENC_QUE].gst) {
+                               MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_VENC_QUE].gst, "current-level-bytes", &vq_size);
+                       }
+
                        queued_buffer = aq_size + vq_size;
 
                        /* check free space */
@@ -1164,17 +1161,43 @@ static gboolean __mmcamcorder_video_dataprobe_record(GstPad *pad, GstBuffer *buf
                }
        }
 
+       /* check max size of recorded file */
+       if (info->max_size > 0 &&
+           info->max_size < info->filesize + buffer_size + trailer_size + _MMCAMCORDER_MMS_MARGIN_SPACE) {
+               GstState pipeline_state = GST_STATE_VOID_PENDING;
+               GstElement *pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
+               _mmcam_dbg_warn("Max size!!! Recording is paused.");
+               _mmcam_dbg_warn("Max size : [%" G_GUINT64_FORMAT "], current file size : [%" G_GUINT64_FORMAT "]," \
+                               " buffer size : [%" G_GUINT64_FORMAT "], trailer size : [%" G_GUINT64_FORMAT "]",
+                               info->max_size, info->filesize, buffer_size, trailer_size);
+
+               if (!sc->isMaxsizePausing) {
+                       gst_element_get_state(pipeline, &pipeline_state, NULL, -1) ;
+                       if (pipeline_state == GST_STATE_PLAYING) {
+                               MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
+                               sc->isMaxsizePausing = TRUE;
+                       }
+
+                       msg.id = MM_MESSAGE_CAMCORDER_MAX_SIZE;
+                       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+               }
+
+               return FALSE;
+       }
+
        info->filesize += (guint64)buffer_size;
 
+       _mmcam_dbg_log("filesize %lld Byte, ", info->filesize);
+
        return TRUE;
 }
 
 
-static gboolean __mmcamcorder_video_dataprobe_slow(GstPad *pad, GstBuffer *buffer, gpointer u_data)
+static gboolean __mmcamcorder_video_dataprobe_audio_disable(GstPad *pad, GstBuffer *buffer, gpointer u_data)
 {
-       guint min_fps = 15;
        guint64 trailer_size = 0;
-       static guint count = 0;
+       guint64 rec_pipe_time = 0;
+       unsigned int remained_time = 0;
 
        GstClockTime b_time;
 
@@ -1188,28 +1211,65 @@ static gboolean __mmcamcorder_video_dataprobe_slow(GstPad *pad, GstBuffer *buffe
 
        sc = MMF_CAMCORDER_SUBCONTEXT(u_data);
        mmf_return_val_if_fail(sc, TRUE);
-       mmf_return_val_if_fail(sc->info, TRUE);
+       mmf_return_val_if_fail(sc->info_video, TRUE);
+
+       info = sc->info_video;
 
-       info = sc->info;
-       count %= min_fps;
        b_time = GST_BUFFER_TIMESTAMP(buffer);
 
-       if (!count) {
-               if (info->fileformat == MM_FILE_FORMAT_3GP || info->fileformat == MM_FILE_FORMAT_MP4) {
-                       MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_MUX].gst, "expected-trailer-size", &trailer_size);
-               } else {
-                       trailer_size = 0;
+       rec_pipe_time = GST_TIME_AS_MSECONDS(b_time);
+
+       if (info->fileformat == MM_FILE_FORMAT_3GP || info->fileformat == MM_FILE_FORMAT_MP4) {
+               MMCAMCORDER_G_OBJECT_GET(sc->element[_MMCAMCORDER_ENCSINK_MUX].gst, "expected-trailer-size", &trailer_size);
+       } else {
+               trailer_size = 0;
+       }
+
+       /* check max time */
+       if (info->max_time > 0 && rec_pipe_time > info->max_time) {
+               _mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \
+                               rec_pipe_time, info->max_time);
+
+               if (!sc->isMaxtimePausing) {
+                       MMCAMCORDER_G_OBJECT_SET(sc->element[_MMCAMCORDER_ENCSINK_ENCBIN].gst, "block", TRUE);
+
+                       sc->isMaxtimePausing = TRUE;
+
+                       msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
+                       msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+                       msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+                       msg.param.recording_status.remained_time = 0;
+                       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+
+                       msg.id = MM_MESSAGE_CAMCORDER_TIME_LIMIT;
+                       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
                }
 
-               msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
-               msg.param.recording_status.elapsed = (unsigned int)GST_TIME_AS_MSECONDS(b_time);
-               msg.param.recording_status.filesize = (unsigned int)((info->filesize + trailer_size) >> 10);
-               _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+               return FALSE;
        }
 
-       count++;
+       /* calculate remained time can be recorded */
+       if (info->max_time > 0 && info->max_time < (remained_time + rec_pipe_time)) {
+               remained_time = info->max_time - rec_pipe_time;
+       } else if (info->max_size > 0) {
+               long double max_size = (long double)info->max_size;
+               long double current_size = (long double)(info->filesize + trailer_size);
 
-       GST_BUFFER_TIMESTAMP(buffer) = b_time * (info->multiple_fps);
+               remained_time = (unsigned int)((long double)rec_pipe_time * (max_size/current_size)) - rec_pipe_time;
+       }
+
+       msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
+       msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+       msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+       msg.param.recording_status.remained_time = remained_time;
+       _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
+
+       _mmcam_dbg_log("time [%" GST_TIME_FORMAT "], size [%d]",
+                      GST_TIME_ARGS(rec_pipe_time), msg.param.recording_status.filesize);
+
+       if (info->record_timestamp_ratio != _MMCAMCORDER_DEFAULT_RECORDING_MOTION_RATE) {
+               GST_BUFFER_TIMESTAMP(buffer) = b_time * (info->record_timestamp_ratio);
+       }
 
        return TRUE;
 }
@@ -1224,16 +1284,17 @@ static gboolean __mmcamcorder_audioque_dataprobe(GstPad *pad, GstBuffer *buffer,
        GstElement *pipeline = NULL;
        mmf_camcorder_t *hcamcorder = MMF_CAMCORDER(u_data);
        _MMCamcorderVideoInfo *info = NULL;
+       unsigned int remained_time = 0;
 
        mmf_return_val_if_fail(buffer, FALSE);
        mmf_return_val_if_fail(hcamcorder, TRUE);
        sc = MMF_CAMCORDER_SUBCONTEXT(u_data);
 
        mmf_return_val_if_fail(sc, TRUE);
-       mmf_return_val_if_fail(sc->info, TRUE);
+       mmf_return_val_if_fail(sc->info_video, TRUE);
        mmf_return_val_if_fail(sc->element, TRUE);
 
-       info = sc->info;
+       info = sc->info_video;
        pipeline = sc->element[_MMCAMCORDER_MAIN_PIPE].gst;
 
        if (!GST_CLOCK_TIME_IS_VALID(GST_BUFFER_TIMESTAMP(buffer))) {
@@ -1249,6 +1310,16 @@ static gboolean __mmcamcorder_audioque_dataprobe(GstPad *pad, GstBuffer *buffer,
                trailer_size = 0;
        }
 
+       /* calculate remained time can be recorded */
+       if (info->max_time > 0 && info->max_time < (remained_time + rec_pipe_time)) {
+               remained_time = info->max_time - rec_pipe_time;
+       } else if (info->max_size > 0) {
+               long double max_size = (long double)info->max_size;
+               long double current_size = (long double)(info->filesize + trailer_size);
+
+               remained_time = (unsigned long long)((long double)rec_pipe_time * (max_size/current_size)) - rec_pipe_time;
+       }
+
        if (info->max_time > 0 && rec_pipe_time > info->max_time) {
                _mmcam_dbg_warn("Current time : [%" G_GUINT64_FORMAT "], Maximum time : [%" G_GUINT64_FORMAT "]", \
                                rec_pipe_time, info->max_time);
@@ -1259,8 +1330,9 @@ static gboolean __mmcamcorder_audioque_dataprobe(GstPad *pad, GstBuffer *buffer,
                        sc->isMaxtimePausing = TRUE;
 
                        msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
-                       msg.param.recording_status.elapsed = (unsigned int)rec_pipe_time;
-                       msg.param.recording_status.filesize = (unsigned int)((info->filesize + trailer_size) >> 10);
+                       msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+                       msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+                       msg.param.recording_status.remained_time = 0;
                        _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
 
                        msg.id = MM_MESSAGE_CAMCORDER_TIME_LIMIT;
@@ -1270,14 +1342,15 @@ static gboolean __mmcamcorder_audioque_dataprobe(GstPad *pad, GstBuffer *buffer,
                return FALSE;
        }
 
-       /*_mmcam_dbg_log("_mmcamcorder_audioque_dataprobe :: time [%" GST_TIME_FORMAT "], size [%d]",
-                      GST_TIME_ARGS(rec_pipe_time), (info->filesize + trailer_size) >> 10);*/
-
        msg.id = MM_MESSAGE_CAMCORDER_RECORDING_STATUS;
-       msg.param.recording_status.elapsed = (unsigned int)rec_pipe_time;
-       msg.param.recording_status.filesize = (unsigned int)((info->filesize + trailer_size) >> 10);
+       msg.param.recording_status.elapsed = (unsigned long long)rec_pipe_time;
+       msg.param.recording_status.filesize = (unsigned long long)((info->filesize + trailer_size) >> 10);
+       msg.param.recording_status.remained_time = remained_time;
        _mmcamcroder_send_message((MMHandleType)hcamcorder, &msg);
 
+       _mmcam_dbg_log("audio data probe :: time [%" GST_TIME_FORMAT "], size [%lld KB]",
+                      GST_TIME_ARGS(rec_pipe_time), msg.param.recording_status.filesize);
+
        return TRUE;
 }
 
@@ -1372,7 +1445,9 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
        gdouble latitude = 0;
        gdouble altitude = 0;
        int err = 0;
+       int orientation = 0;
        char *err_name = NULL;
+       char err_msg[MAX_ERROR_MESSAGE_LEN] = {'\0',};
        _MMCamcorderLocationInfo location_info = {0,};
 
        _MMCamcorderVideoInfo *info = NULL;
@@ -1383,28 +1458,28 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
        sc = MMF_CAMCORDER_SUBCONTEXT(handle);
 
        mmf_return_val_if_fail(sc, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
-       mmf_return_val_if_fail(sc->info, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
+       mmf_return_val_if_fail(sc->info_video, MM_ERROR_CAMCORDER_NOT_INITIALIZED);
 
        _mmcam_dbg_log("");
 
-       info = sc->info;
+       info = sc->info_video;
 
        f = fopen(info->filename, "rb+");
        if (f == NULL) {
+               strerror_r(errno, err_msg, MAX_ERROR_MESSAGE_LEN);
+               _mmcam_dbg_err("file open failed [%s]", err_msg);
                return FALSE;
        }
 
-       err = mm_camcorder_get_attributes(handle, &err_name,
-                                         MMCAM_TAG_LATITUDE, &latitude,
-                                         MMCAM_TAG_LONGITUDE, &longitude,
-                                         MMCAM_TAG_ALTITUDE, &altitude,
-                                         NULL);
-       if (err != MM_ERROR_NONE) {
+       mm_camcorder_get_attributes(handle, &err_name,
+                                   MMCAM_TAG_LATITUDE, &latitude,
+                                   MMCAM_TAG_LONGITUDE, &longitude,
+                                   MMCAM_TAG_ALTITUDE, &altitude,
+                                   MMCAM_TAG_ORIENTATION, &orientation,
+                                   NULL);
+       if (err_name) {
                _mmcam_dbg_warn("Get tag attrs fail. (%s:%x)", err_name, err);
                SAFE_FREE (err_name);
-               fclose(f);
-               f = NULL;
-               return FALSE;
        }
 
        location_info.longitude = _mmcamcorder_double_to_fix(longitude);
@@ -1414,7 +1489,9 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
        /* find udta container.
           if, there are udta container, write loci box after that
           else, make udta container and write loci box. */
-       if (_mmcamcorder_find_tag(f, MMCAM_FOURCC('u','d','t','a'))) {
+       if (_mmcamcorder_find_tag(f, MMCAM_FOURCC('u','d','t','a'), TRUE)) {
+               size_t nread = 0;
+
                _mmcam_dbg_log("find udta container");
 
                /* read size */
@@ -1427,7 +1504,10 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
                        goto ftell_fail;
                }
 
-               fread(&buf, sizeof(char), sizeof(buf), f);
+               nread = fread(&buf, sizeof(char), sizeof(buf), f);
+
+               _mmcam_dbg_log("recorded file fread %d", nread);
+
                udta_size = _mmcamcorder_get_container_size(buf);
 
                /* goto end of udta and write 'loci' box */
@@ -1462,9 +1542,11 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
           update moov container size. */
        if((current_pos = ftell(f))<0)
                goto ftell_fail;
-       
-       if (_mmcamcorder_find_tag(f, MMCAM_FOURCC('m','o','o','v'))) {
-               _mmcam_dbg_log("find moov container");
+
+       if (_mmcamcorder_find_tag(f, MMCAM_FOURCC('m','o','o','v'), TRUE)) {
+               gint64 internal_pos = ftell(f);
+
+               _mmcam_dbg_log("found moov container");
                if (fseek(f, -8L, SEEK_CUR) !=0) {
                        goto fail;
                }
@@ -1477,6 +1559,26 @@ static gboolean __mmcamcorder_add_locationinfo_mp4(MMHandleType handle)
                if (!_mmcamcorder_update_size(f, moov_pos, current_pos)) {
                        goto fail;
                }
+
+               /* add orientation info */
+               fseek(f, internal_pos, SEEK_SET);
+               if (!_mmcamcorder_find_tag(f, MMCAM_FOURCC('t','r','a','k'), FALSE)) {
+                       _mmcam_dbg_err("failed to find [trak] tag");
+                       goto fail;
+               }
+
+               if (!_mmcamcorder_find_tag(f, MMCAM_FOURCC('t','k','h','d'), FALSE)) {
+                       _mmcam_dbg_err("failed to find [tkhd] tag");
+                       goto fail;
+               }
+
+               _mmcam_dbg_log("found [tkhd] tag");
+
+               /* seek to start position of composition matrix */
+               fseek(f, _OFFSET_COMPOSITION_MATRIX, SEEK_CUR);
+
+               /* update composition matrix for orientation */
+               _mmcamcorder_update_composition_matrix(f, orientation);
        } else {
                _mmcam_dbg_err("No 'moov' container");
                goto fail;
old mode 100755 (executable)
new mode 100644 (file)
index 0c18a31..c6859b0
@@ -9,6 +9,7 @@ mm_camcorder_testsuite_CFLAGS = -I$(srcdir)/../src/include \
                             $(MMTA_CFLAGS)\
                             $(MM_SOUND_CFLAGS)
 
+
 ############################################
 #mm_camcorder_testsuite_CFLAGS += -DAPPSRC_TEST
 ############################################
index 57e7eb6..39e3f05 100644 (file)
@@ -32,61 +32,60 @@ when                who                                             what, where, why
 */
 
 
-/*===========================================================================================
-|                                                                                                                                                                                      |
-|  INCLUDE FILES                                                                                                                                                       |
-|                                                                                                                                                                                      |
-========================================================================================== */
+/*=======================================================================================
+|  INCLUDE FILES                                                                        |
+=======================================================================================*/
 #include <stdio.h>
 #include <stdlib.h>
 #include <glib.h>
 #include <gst/gst.h>
 #include <sys/time.h>
-#include <mm_camcorder.h>
-#include <mm_camcorder_internal.h>
-#include <mm_camcorder_util.h>
+#include "../src/include/mm_camcorder.h"
+#include "../src/include/mm_camcorder_internal.h"
+#include "../src/include/mm_camcorder_util.h"
 #include <gst/interfaces/colorbalance.h>
 #include <mm_ta.h>
 
-/*---------------------------------------------------------------------------
-|    GLOBAL VARIABLE DEFINITIONS:                                                                                      |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    GLOBAL VARIABLE DEFINITIONS:                                       |
+-----------------------------------------------------------------------*/
 #define EXPORT_API __attribute__((__visibility__("default")))
 
 #define PACKAGE "mm_camcorder_testsuite"
 
-GMainLoop      *g_loop;
+GMainLoop *g_loop;
 GIOChannel *stdin_channel;
 int resolution_set;
-int    g_current_state;
+int g_current_state;
 int src_w, src_h;
 GstCaps *filtercaps;
-bool           isMultishot;
+bool isMultishot;
 MMCamPreset cam_info;
 int mmcamcorder_state;
 int mmcamcorder_print_state;
 int multishot_num;
-static int audio_stream_cb_cnt, video_stream_cb_cnt;
+static int audio_stream_cb_cnt;
+static int video_stream_cb_cnt;
 static GTimer *timer = NULL;
 
-/*---------------------------------------------------------------------------
-|    GLOBAL CONSTANT DEFINITIONS:                                                                                      |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    GLOBAL CONSTANT DEFINITIONS:                                       |
+-----------------------------------------------------------------------*/
 
 
-/*---------------------------------------------------------------------------
-|    IMPORTED VARIABLE DECLARATIONS:                                                                           |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    IMPORTED VARIABLE DECLARATIONS:                                    |
+-----------------------------------------------------------------------*/
 
 
-/*---------------------------------------------------------------------------
-|    IMPORTED FUNCTION DECLARATIONS:                                                                           |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    IMPORTED FUNCTION DECLARATIONS:                                    |
+-----------------------------------------------------------------------*/
 
 
-/*---------------------------------------------------------------------------
-|    LOCAL #defines:                                                                                                           |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL #defines:                                                    |
+-----------------------------------------------------------------------*/
 #define test_ffmux_mp4
 
 // FULLHD(1080P)
@@ -140,7 +139,7 @@ static GTimer *timer = NULL;
 #define IMAGE_ENC_QUALITY               85    // quality of jpeg 
 #define IMAGE_CAPTURE_COUNT_STILL       1     // the number of still-shot
 #define IMAGE_CAPTURE_COUNT_MULTI       3     // default the number of multi-shot
-#define IMAGE_CAPTURE_COUNT_INTERVAL    500   // mili seconds
+#define IMAGE_CAPTURE_COUNT_INTERVAL    100   // mili seconds
 
 #define MAX_FILE_SIZE_FOR_MMS           (250 * 1024)
 
@@ -150,8 +149,11 @@ static GTimer *timer = NULL;
 #define EXT_AMR                         "amr"
 #define EXT_MKV                         "mkv"
 
-#define STILL_CAPTURE_FILE_PATH_NAME    "/root/StillshotCapture"
-#define MULTI_CAPTURE_FILE_PATH_NAME    "/root/MultishotCapture"
+#define STILL_CAPTURE_FILE_PATH_NAME    "/opt/media/StillshotCapture"
+#define MULTI_CAPTURE_FILE_PATH_NAME    "/opt/media/MultishotCapture"
+#define IMAGE_CAPTURE_THUMBNAIL_PATH    "/opt/media/thumbnail.jpg"
+#define IMAGE_CAPTURE_SCREENNAIL_PATH   "/opt/media/screennail.yuv"
+#define IMAGE_CAPTURE_EXIF_PATH         "/opt/media/exif.raw"
 #define TARGET_FILENAME_PATH            "/opt/media/"
 #define TARGET_FILENAME_VIDEO           "/opt/media/test_rec_video.3gp"
 #define TARGET_FILENAME_AUDIO           "/opt/media/test_rec_audio.amr"
@@ -162,8 +164,9 @@ static GTimer *timer = NULL;
 #define AUDIO_SOURCE_FORMAT             MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE
 #define AUDIO_SOURCE_CHANNEL_AAC        2
 #define AUDIO_SOURCE_CHANNEL_AMR        1
+#define VIDEO_ENCODE_BITRATE            40000000 /* bps */
 
-#define DEFAULT_CAM_DEVICE                             MM_VIDEO_DEVICE_CAMERA1
+#define DEFAULT_CAM_DEVICE              MM_VIDEO_DEVICE_CAMERA1
 
 /*
  * D E B U G   M E S S A G E
@@ -216,7 +219,7 @@ do { \
 
 
 GTimeVal previous;
-GTimeVal current;      
+GTimeVal current;
 GTimeVal result;
 //temp
 
@@ -224,24 +227,23 @@ GTimeVal result;
  * Enumerations for command
  */
 #define SENSOR_WHITEBALANCE_NUM                10
-#define SENSOR_COLOR_TONE_NUM                  27
-#define SENSOR_FLIP_NUM                                3
+#define SENSOR_COLOR_TONE_NUM          37
+#define SENSOR_FLIP_NUM                        3
 #define SENSOR_PROGRAM_MODE_NUM                15
-#define SENSOR_FOCUS_NUM                               5
-#define SENSOR_INPUT_ROTATION                  6
-#define SENSOR_AF_SCAN_NUM                             4
-#define SENSOR_ISO_NUM                                 8
-#define SENSOR_EXPOSURE_NUM                    9
-#define SENSOR_IMAGE_FORMAT                    9
+#define SENSOR_FOCUS_NUM               6
+#define SENSOR_INPUT_ROTATION          4
+#define SENSOR_AF_SCAN_NUM             4
+#define SENSOR_ISO_NUM                 8
+#define SENSOR_EXPOSURE_NUM            9
+#define SENSOR_IMAGE_FORMAT            9
 
 
-/*---------------------------------------------------------------------------
-|    LOCAL CONSTANT DEFINITIONS:                                                                                       |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL CONSTANT DEFINITIONS:                                        |
+-----------------------------------------------------------------------*/
 enum 
 {
-       MODE_IMAGE,             /* capture mode */
-       MODE_VIDEO,             /* recording mode */
+       MODE_VIDEO_CAPTURE,     /* recording and image capture mode */
        MODE_AUDIO,             /* audio recording*/ 
        MODE_NUM,               
 };
@@ -253,22 +255,22 @@ enum
        MENU_STATE_NUM,
 };
 
-/*---------------------------------------------------------------------------
-|    LOCAL DATA TYPE DEFINITIONS:                                                                                      |
----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------
+|    LOCAL DATA TYPE DEFINITIONS:                                      |
+-----------------------------------------------------------------------*/
 typedef struct _cam_handle
 {
        MMHandleType camcorder;
-       int mode;                                                /* image(capture)/video(recording) mode */
-       bool isMultishot;
-       int stillshot_count;                    /* total stillshot count */ 
-       int multishot_count;                    /* total multishot count */ 
-       char *stillshot_filename;               /* stored filename of  stillshot  */ 
-       char *multishot_filename;               /* stored filename of  multishot  */ 
-       int     menu_state;
-       int     fps;    
-       bool    isMute;
-       unsigned int elapsed_time;
+       int mode;                       /* image(capture)/video(recording) mode */
+       bool isMultishot;               /* flag for multishot mode */
+       int stillshot_count;            /* total stillshot count */
+       int multishot_count;            /* total multishot count */
+       char *stillshot_filename;       /* stored filename of  stillshot  */
+       char *multishot_filename;       /* stored filename of  multishot  */
+       int menu_state;
+       int fps;
+       bool isMute;
+       unsigned long long elapsed_time;
 } cam_handle_t;
 
 typedef struct _cam_xypair
@@ -316,14 +318,18 @@ char *ct[SENSOR_COLOR_TONE_NUM] = {
        "PURPLE",
        "EMBOSS",
        "OUTLINE",
-       "SOLARIZATION_1",
-       "SOLARIZATION_2",
-       "SOLARIZATION_3",
-       "SOLARIZATION_4",
-       "SKETCH_1",
-       "SKETCH_2",
-       "SKETCH_3",
-       "SKETCH_4",
+       "SOLARIZATION",
+       "SKETCH",
+       "WASHED",
+       "VINTAGE_WARM",
+       "VINTAGE_COLD",
+       "POSTERIZATION",
+       "CARTOON",
+       "SELECTVE_COLOR_RED",
+       "SELECTVE_COLOR_GREEN",
+       "SELECTVE_COLOR_BLUE",
+       "SELECTVE_COLOR_YELLOW",
+       "SELECTVE_COLOR_RED_YELLOW",
 };
 
 char *flip[SENSOR_FLIP_NUM] = {
@@ -356,6 +362,7 @@ char *focus_mode[SENSOR_FOCUS_NUM] = {
        "Auto",
        "Manual",
        "Touch Auto",
+       "Continuous Auto",
 };
 
 char *camera_rotation[SENSOR_INPUT_ROTATION] = {
@@ -363,8 +370,6 @@ char *camera_rotation[SENSOR_INPUT_ROTATION] = {
        "90",
        "180",
        "270",
-       "Flip Horizontal",
-       "Flip Vertical",
 };
 
 char *af_scan[SENSOR_AF_SCAN_NUM] = {
@@ -409,6 +414,17 @@ char *image_fmt[SENSOR_IMAGE_FORMAT] = {
        "YV12",
 };
 
+char *face_zoom_mode[] = {
+       "Face Zoom OFF",
+       "Face Zoom ON",
+};
+
+char *display_mode[] = {
+       "Default",
+       "Primary Video ON and Secondary Video Full Screen",
+       "Primary Video OFF and Secondary Video Full Screen",
+};
+
 char *output_mode[] = {
        "Letter Box mode",
        "Original Size mode",
@@ -422,8 +438,6 @@ char *rotate_mode[] = {
        "90",
        "180",
        "270",
-       "Flip Horizontal",
-       "Flip Vertical",
 };
 
 char* strobe_mode[] = {
@@ -448,6 +462,12 @@ char *wdr_mode[] = {
        "WDR AUTO",
 };
 
+char *hdr_mode[] = {
+       "HDR OFF",
+       "HDR ON",
+       "HDR ON and Original",
+};
+
 char *ahs_mode[] = {
        "Anti-handshake OFF",
        "Anti-handshake ON",
@@ -455,17 +475,16 @@ char *ahs_mode[] = {
        "Anti-handshake MOVIE",
 };
 
+char *vs_mode[] = {
+       "Video-stabilization OFF",
+       "Video-stabilization ON",
+};
+
 char *visible_mode[] = {
        "Display OFF",
        "Display ON", 
 };
 
-char *camcorder_rotate_val[] = {
-       "0",
-       "90",
-       "180",
-       "270",
-};
 
 /*---------------------------------------------------------------------------
 |    LOCAL FUNCTION PROTOTYPES:                                                                                                |
@@ -504,47 +523,76 @@ cam_utils_convert_YUYV_to_UYVY(unsigned char* dst, unsigned char* src, gint leng
        }
 }
 
+#ifdef USE_AUDIO_STREAM_CB
 static int camcordertest_audio_stream_cb(MMCamcorderAudioStreamDataType *stream, void *user_param)
 {
-       if ( (int)(stream->timestamp)/1000 == audio_stream_cb_cnt ) {
-               audio_stream_cb_cnt++;
-               printf("audio_stream cb is called ( data:%p, format:%d, channel:%d, volume_dB:%f, length:%d, timestamp:%d)\n",  stream->data, stream->format, stream->channel, stream->volume_dB, stream->length, stream->timestamp);
-       }
+       audio_stream_cb_cnt++;
+       printf("audio_stream cb is called (stream:%p, data:%p, format:%d, channel:%d, volume_dB:%f, length:%d, timestamp:%d)\n",
+              stream, stream->data, stream->format, stream->channel, stream->volume_dB, stream->length, stream->timestamp);
+
        return TRUE;
 }
+#endif /* USE_AUDIO_STREAM_CB */
 
 static int camcordertest_video_stream_cb(MMCamcorderVideoStreamDataType *stream, void *user_param)
 {
-       if ( (int)(stream->timestamp)/1000 == video_stream_cb_cnt ) {
-               video_stream_cb_cnt++;
-               printf("video_stream cb is called ( data:%p, format:%d, length:%d, width:%d, height:%d, timestamp:%d)\n",  stream->data, stream->format, stream->length, stream->width, stream->height, stream->timestamp);
-       }
+       video_stream_cb_cnt++;
+
+       printf("VIDEO STREAM CALLBACK total length :%u, size %dx%d\n", stream->length_total, stream->width, stream->height);
+
        return TRUE;
 }
 
+static void _file_write(char *path, void *data, int size)
+{
+       FILE *fp = NULL;
+
+       if (!path || !data || size <= 0) {
+               printf("ERROR %p %p %d\n", path, data, size);
+               return;
+       }
+
+       fp = fopen(path, "w");
+       if (fp == NULL) {
+               printf("open error! [%s], errno %d\n", path, errno);
+               return;
+       } else {
+               printf("open success [%s]\n", path);
+               if (fwrite(data, size, 1, fp) != 1) {
+                       printf("write error! errno %d\n", errno);
+               } else {
+                       printf("write success [%s]\n", path);
+               }
+
+               fclose(fp);
+               fp = NULL;
+       }
+}
+
+
 static int
 camcordertest_video_capture_cb(MMCamcorderCaptureDataType *main, MMCamcorderCaptureDataType *thumb, void *data)
 {
        int nret = 0;
        int scrnl_size = 0;
+       int exif_size = 0;
        char m_filename[CAPTURE_FILENAME_LEN];
-       FILE *fp = NULL;
        MMCamcorderCaptureDataType *scrnl = NULL;
-
-       debug_msg_t("hcamcorder->isMultishot=%d =>1: MULTI, 0: STILL",hcamcorder->isMultishot);
+       unsigned char *exif_data = NULL;
 
        if (main == NULL) {
                warn_msg_t("Capture callback : Main image buffer is NULL!!!");
                return FALSE;
        }
 
-       if (hcamcorder->isMultishot == TRUE) {
-               snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg",   hcamcorder->multishot_filename,hcamcorder->multishot_count++);
+       if (hcamcorder->isMultishot) {
+               snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg", hcamcorder->multishot_filename, hcamcorder->multishot_count++);
        } else {
-               snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg",   hcamcorder->stillshot_filename,hcamcorder->stillshot_count++);
+               snprintf(m_filename, CAPTURE_FILENAME_LEN, "%s%03d.jpg", hcamcorder->stillshot_filename, hcamcorder->stillshot_count++);
        }
 
-       debug_msg_t("filename : %s", m_filename);
+       debug_msg_t("hcamcorder->isMultishot=%d =>1: MULTI, 0: STILL, filename : %s",
+                   hcamcorder->isMultishot, m_filename);
 
        if (main->format != MM_PIXEL_FORMAT_ENCODED) {
                unsigned int dst_size = 0;
@@ -553,71 +601,24 @@ camcordertest_video_capture_cb(MMCamcorderCaptureDataType *main, MMCamcorderCapt
                nret = _mmcamcorder_encode_jpeg(main->data, main->width, main->height, main->format,
                                                main->length, 90, &dst, &dst_size);
                if (nret) {
-                       fp = fopen(m_filename, "w+");
-                       if (fp == NULL) {
-                               printf("FileOPEN error!!\n");
-                               warn_msg_t("FileOPEN error!!");
-                               return FALSE;
-                       } else {
-                               printf("open success\n");
-                               if (fwrite(dst, dst_size, 1, fp) != 1) {
-                                       printf("File write error!!\n");
-                                       warn_msg_t("File write error!!");
-                                       fclose(fp);
-                                       return FALSE;
-                               }
-                               printf("write success\n");
-                       }
-                       fclose(fp);
-                       fp = NULL;
+                       _file_write(m_filename, dst, dst_size);
                } else {
                        printf("Failed to encode YUV(%d) -> JPEG. \n", main->format);
                }
 
                free(dst);
                dst = NULL;
-       } else {
+       } else if (!hcamcorder->isMultishot) {
+
                printf("MM_PIXEL_FORMAT_ENCODED main->data=%p main->length=%d, main->width=%d, main->heigtht=%d \n",
                       main->data, main->length, main->width, main->height);
 
                /* main image */
-               fp = fopen(m_filename, "w+");
-               if (fp == NULL) {
-                       printf("FileOPEN error!!\n");
-                       warn_msg_t("FileOPEN error!!");
-                       return FALSE;
-               } else {
-                       printf("open success\n");
-                       if (fwrite(main->data, main->length, 1, fp) != 1) {
-                               printf("File write error!!\n");
-                               warn_msg_t("File write error!!");
-                               fclose(fp);
-                               return FALSE;
-                       }
-                       printf("write success\n");
-               }
-               fclose(fp);
-               fp = NULL;
+               _file_write(m_filename, main->data, main->length);
 
                /* thumbnail */
                if (thumb != NULL) {
-                       fp = fopen("./thumbnail.jpg", "w+");
-                       if (fp == NULL) {
-                               printf("FileOPEN error!!\n");
-                               warn_msg_t("FileOPEN error!!");
-                               return FALSE;
-                       } else {
-                               printf("open success\n");
-                               if (fwrite(thumb->data, thumb->length, 1, fp) != 1) {
-                                       printf("File write error!!\n");
-                                       warn_msg_t("File write error!!");
-                                       fclose(fp);
-                                       return FALSE;
-                               }
-                               printf("write success\n");
-                       }
-                       fclose(fp);
-                       fp = NULL;
+                       _file_write(IMAGE_CAPTURE_THUMBNAIL_PATH, thumb->data, thumb->length);
                }
 
                /* screennail */
@@ -625,30 +626,18 @@ camcordertest_video_capture_cb(MMCamcorderCaptureDataType *main, MMCamcorderCapt
                                            "captured-screennail", &scrnl, &scrnl_size,
                                            NULL);
                if (scrnl != NULL) {
-                       fp = fopen("./screennail.yuv", "w+");
-                       if (fp == NULL) {
-                               printf("FileOPEN error!!\n");
-                               warn_msg_t("FileOPEN error!!");
-                               return FALSE;
-                       } else {
-                               printf("open success\n");
-
-                               if (fwrite(scrnl->data, scrnl->length, 1, fp) != 1) {
-                                       printf("File write error!!\n");
-                                       warn_msg_t("File write error!!");
-                                       fclose(fp);
-                                       fp = NULL;
-                                       return FALSE;
-                               }
-
-                               fclose(fp);
-                               fp = NULL;
-
-                               printf("write success\n");
-                       }
+                       _file_write(IMAGE_CAPTURE_SCREENNAIL_PATH, scrnl->data, scrnl->length);
                } else {
                        printf( "Screennail buffer is NULL.\n" );
                }
+
+               /* EXIF data */
+               mm_camcorder_get_attributes(hcamcorder->camcorder, NULL,
+                                           "captured-exif-raw-data", &exif_data, &exif_size,
+                                           NULL);
+               if (exif_data) {
+                       _file_write(IMAGE_CAPTURE_EXIF_PATH, exif_data, exif_size);
+               }
        }
 
        return TRUE;
@@ -658,16 +647,8 @@ static gboolean test_idle_capture_start()
 {
        int err;
 
-       if (!hcamcorder->isMultishot)
-       {
-               camcordertest_set_attr_int("capture-format", MM_PIXEL_FORMAT_ENCODED);
-               camcordertest_set_attr_int(MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG);
-       }
-       else
-       {
-//             camcordertest_set_attr_int("capture-format", MM_PIXEL_FORMAT_I420);
-               camcordertest_set_attr_int("capture-format", MM_PIXEL_FORMAT_YUYV);
-       }
+       camcordertest_set_attr_int(MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED);
+       camcordertest_set_attr_int(MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG);
 
        g_timer_reset(timer);
        err = mm_camcorder_capture_start(hcamcorder->camcorder);
@@ -686,32 +667,29 @@ int camcordertest_set_attr_int(char * attr_subcategory, int value)
        char * err_attr_name = NULL;
        int err;
 
-       if (hcamcorder)
-       {
-               if (hcamcorder->camcorder)
-               {
+       if (hcamcorder) {
+               if (hcamcorder->camcorder) {
                        debug_msg_t("camcordertest_set_attr_int(%s, %d)", attr_subcategory, value);
 
                        err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                                               attr_subcategory, value, 
-                                                                                               NULL);
-                       if (err < 0) 
-                       {
+                                                         attr_subcategory, value,
+                                                         NULL);
+                       if (err != MM_ERROR_NONE) {
                                err_msg_t("camcordertest_set_attr_int : Error(%s:%x)!!!!!!!", err_attr_name, err);
-                               SAFE_FREE (err_attr_name);
+                               SAFE_FREE(err_attr_name);
                                return FALSE;
                        }
 
                        //success
                        return TRUE;
                }
-               
+
                debug_msg_t("camcordertest_set_attr_int(!hcamcorder->camcorde)");
        }
 
        debug_msg_t("camcordertest_set_attr_int(!hcamcorder)");
-       return FALSE;   
 
+       return FALSE;
 }
 
 int camcordertest_set_attr_xypair(cam_xypair_t pair)
@@ -756,24 +734,21 @@ int camcordertest_get_attr_valid_intarray(char * attr_name, int ** array, int *c
        {
                if (hcamcorder->camcorder)
                {
-                       debug_msg_t("camcordertest_get_attr_valid_intarray((%s),(%p, %p))",  attr_name, array, count);
+                       debug_msg_t("camcordertest_get_attr_valid_intarray(%s)", attr_name);
 
                        err = mm_camcorder_get_attribute_info(hcamcorder->camcorder, attr_name, &info);
-
-                       if (err < 0) 
-                       {
-                               err_msg_t("camcordertest_get_attr_valid_intarray : Error(%x)!!",  err);
+                       if (err != MM_ERROR_NONE) {
+                               err_msg_t("camcordertest_get_attr_valid_intarray : Error(%x)!!", err);
                                return FALSE;
-                       }
-                       else
-                       {
-                               if (info.type == MM_CAM_ATTRS_TYPE_INT)
-                                       if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY)
-                                       {                                                               
+                       } else {
+                               if (info.type == MM_CAM_ATTRS_TYPE_INT) {
+                                       if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY) {
                                                *array = info.int_array.array;
                                                *count = info.int_array.count;
+                                               debug_msg_t("INT ARRAY - default value : %d", info.int_array.def);
                                                return TRUE;
                                        }
+                               }
 
                                err_msg_t("camcordertest_get_attr_valid_intarray : Type mismatched!!");
                                return FALSE;
@@ -797,24 +772,21 @@ int camcordertest_get_attr_valid_intrange(char * attr_name, int *min, int *max)
        {
                if (hcamcorder->camcorder)
                {
-                       debug_msg_t("camcordertest_get_attr_valid_intarray((%s),(%p, %p))",  attr_name, min, max);
+                       debug_msg_t("camcordertest_get_attr_valid_intrange(%s)", attr_name);
 
                        err = mm_camcorder_get_attribute_info(hcamcorder->camcorder, attr_name, &info);
-
-                       if (err < 0) 
-                       {
+                       if (err != MM_ERROR_NONE) {
                                err_msg_t("camcordertest_get_attr_valid_intarray : Error(%x)!!",  err);
                                return FALSE;
-                       }
-                       else
-                       {
-                               if (info.type == MM_CAM_ATTRS_TYPE_INT)
-                                       if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_RANGE)
-                                       {                                                               
+                       } else {
+                               if (info.type == MM_CAM_ATTRS_TYPE_INT) {
+                                       if (info.validity_type == MM_CAM_ATTRS_VALID_TYPE_INT_RANGE) {
                                                *min = info.int_range.min;
                                                *max = info.int_range.max;
+                                               debug_msg_t("INT RANGE - default : %d", info.int_range.def);
                                                return TRUE;
                                        }
+                               }
 
                                err_msg_t("camcordertest_get_attr_valid_intarray : Type mismatched!!");
                                return FALSE;
@@ -841,49 +813,33 @@ static void print_menu()
        switch(hcamcorder->menu_state)
        {
                case MENU_STATE_MAIN:
-                       if (hcamcorder->mode == MODE_IMAGE)
-                       {
-                               g_print("\n\t=======================================\n");
-                               if ( cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA1 )
-                                       g_print("\t   Image Capture (Front camera)\n");
-                               else if(  cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA0 )
-                                       g_print("\t   Image Capture (Rear camera)\n");
-                               g_print("\t=======================================\n");
-                               g_print("\t   '1' Take a photo\n");
-                               g_print("\t   '2' Setting\n");
-                               g_print("\t   '3' Print FPS\n");
-                               g_print("\t   'b' back\n");
-                               g_print("\t=======================================\n");
-                       }
-                       else if (hcamcorder->mode == MODE_VIDEO)
-                       {
+                       if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
                                g_print("\n\t=======================================\n");
                                if ( cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA1 )
-                                       g_print("\t   Video Recording (Front camera)\n");
+                                       g_print("\t   Video Capture (Front camera)\n");
                                else if(  cam_info.videodev_type == MM_VIDEO_DEVICE_CAMERA0 )
-                                       g_print("\t   Video Recording (Rear camera)\n");
+                                       g_print("\t   Video Capture (Rear camera)\n");
                                g_print("\t=======================================\n");
 
                                if(mmcamcorder_print_state <= MM_CAMCORDER_STATE_PREPARE) {
-                                       g_print("\t   '1' Start Recording\n");
-                                       g_print("\t   '2' Setting\n");
-                                       g_print("\t   '3' Print FPS\n");
+                                       g_print("\t   '1' Take a photo\n");
+                                       g_print("\t   '2' Start Recording\n");
+                                       g_print("\t   '3' Setting\n");
+                                       g_print("\t   '4' Print FPS\n");
                                        g_print("\t   'b' back\n");
-                               }
-                               else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_RECORDING) {
+                               } else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_RECORDING) {
                                        g_print("\t   'p' Pause Recording\n");
                                        g_print("\t   'c' Cancel\n");
                                        g_print("\t   's' Save\n");
-                               }
-                               else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_PAUSED) {
+                                       g_print("\t   'n' Capture video snapshot\n");
+                               else if(mmcamcorder_print_state == MM_CAMCORDER_STATE_PAUSED) {
                                        g_print("\t   'r' Resume Recording\n");
                                        g_print("\t   'c' Cancel\n");
                                        g_print("\t   's' Save\n");
+                                       g_print("\t   'n' Capture video snapshot\n");
                                }
                                g_print("\t=======================================\n");
-                       }
-                       else if (hcamcorder->mode == MODE_AUDIO)
-                       {
+                       } else if (hcamcorder->mode == MODE_AUDIO) {
                                g_print("\n\t=======================================\n");
                                g_print("\t   Audio Recording\n");
                                g_print("\t=======================================\n");
@@ -906,85 +862,50 @@ static void print_menu()
                        break;
 
                case MENU_STATE_SETTING:
-                       if (hcamcorder->mode == MODE_IMAGE) {
-                               g_print("\n\t=======================================\n");
-                               g_print("\t   Image Capture > Setting\n");
-                               g_print("\t=======================================\n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera]  \n");
-                               g_print("\t     '1' Capture resolution \n");
-                               g_print("\t     '2' Digital zoom level \n");
-                               g_print("\t     '3' Optical zoom level \n");
-                               g_print("\t     '4' AF mode \n");
-                               g_print("\t     '5' AF scan range \n");
-                               g_print("\t     '6' Exposure mode \n");
-                               g_print("\t     '7' Exposure value \n");
-                               g_print("\t     '8' F number \n");
-                               g_print("\t     '9' Shutter speed \n");
-                               g_print("\t     'i' ISO \n");
-                               g_print("\t     'r' Rotate camera input \n");
-                               g_print("\t     'j' Jpeg quality \n");
-                               g_print("\t     'p' Picture format \n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>> [Display/Filter]\n");
-                               g_print("\t     'v' Visible \n");
-                               g_print("\t     'o' Output mode \n");
-                               g_print("\t     'y' Rotate display \n");
-                               g_print("\t     'g' Brightness \n");
-                               g_print("\t     'c' Contrast \n");
-                               g_print("\t     's' Saturation \n");
-                               g_print("\t     'h' Hue \n");
-                               g_print("\t     'a' Sharpness \n");
-                               g_print("\t     'w' White balance \n");
-                               g_print("\t     't' Color tone \n");
-                               g_print("\t     'd' WDR \n");
-                               g_print("\t     'e' EV program mode \n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
-                               g_print("\t     'z' Strobe (Flash) \n");
-                               g_print("\t     'x' Capture mode (Still/Multishot)\n");
-                               g_print("\t     'f' Face detection \n");
-                               g_print("\t     'k' Anti-handshake \n");
-                               g_print("\t     'u' Touch AF area \n");
-                               g_print("\t     'm' Stream callback function \n");
-                               g_print("\t     'b' back\n");
-                               g_print("\t=======================================\n");
-
-                       } else if (hcamcorder->mode == MODE_VIDEO) {
-                               g_print("\n\t=======================================\n");
-                               g_print("\t   Video Recording > Setting\n");
-                               g_print("\t=======================================\n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera]  \n");
-                               g_print("\t     '1' Recording resolution \n");
-                               g_print("\t     '2' Digital zoom level \n");
-                               g_print("\t     '3' Optical zoom level \n");
-                               g_print("\t     '4' AF mode \n");
-                               g_print("\t     '5' AF scan range \n");
-                               g_print("\t     '6' Exposure mode \n");
-                               g_print("\t     '7' Exposure value \n");
-                               g_print("\t     '8' F number \n");
-                               g_print("\t     'i' ISO \n");
-                               g_print("\t     'r' Rotate camera input \n");
-                               g_print("\t     'p' FPS \n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>> [Display/Filter]\n");
-                               g_print("\t     'v' Visible \n");
-                               g_print("\t     'o' Output mode \n");
-                               g_print("\t     'y' Rotate display \n");
-                               g_print("\t     'g' Brightness \n");
-                               g_print("\t     'c' Contrast \n");
-                               g_print("\t     's' Saturation \n");
-                               g_print("\t     'h' Hue \n");
-                               g_print("\t     'a' Sharpness \n");
-                               g_print("\t     'w' White balance \n");
-                               g_print("\t     't' Color tone \n");
-                               g_print("\t     'd' WDR \n");
-                               g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
-                               g_print("\t     'x' High speed recording\n");
-                               g_print("\t     'u' Mute \n");
-                               g_print("\t     'z' Strobe (Flash) \n");
-                               g_print("\t     'k' Anti-handshake \n");
-                               g_print("\t     'e' Camcorder-rotation setting \n");
-                               g_print("\t     'm' Stream callback function \n");
-                               g_print("\t     'b' back\n");
-                               g_print("\t=======================================\n");
-                       }
+                       g_print("\n\t=======================================\n");
+                       g_print("\t   Video Capture > Setting\n");
+                       g_print("\t=======================================\n");
+                       g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>> [Camera]  \n");
+                       g_print("\t     '1' Capture resolution \n");
+                       g_print("\t     '2' Digital zoom level \n");
+                       g_print("\t     '3' Optical zoom level \n");
+                       g_print("\t     '4' AF mode \n");
+                       g_print("\t     '5' AF scan range \n");
+                       g_print("\t     '6' Exposure mode \n");
+                       g_print("\t     '7' Exposure value \n");
+                       g_print("\t     '8' F number \n");
+                       g_print("\t     '9' Shutter speed \n");
+                       g_print("\t     'i' ISO \n");
+                       g_print("\t     'r' Rotate camera input \n");
+                       g_print("\t     'f' Flip camera input \n");
+                       g_print("\t     'j' Jpeg quality \n");
+                       g_print("\t     'p' Picture format \n");
+                       g_print("\t     'E' EXIF orientation \n");
+                       g_print("\t  >>>>>>>>>>>>>>>>>>>> [Display/Filter]\n");
+                       g_print("\t     'v' Visible \n");
+                       g_print("\t     'n' Display mode \n");
+                       g_print("\t     'o' Output mode \n");
+                       g_print("\t     'y' Rotate display \n");
+                       g_print("\t     'Y' Flip display \n");
+                       g_print("\t     'g' Brightness \n");
+                       g_print("\t     'c' Contrast \n");
+                       g_print("\t     's' Saturation \n");
+                       g_print("\t     'h' Hue \n");
+                       g_print("\t     'a' Sharpness \n");
+                       g_print("\t     'w' White balance \n");
+                       g_print("\t     't' Color tone \n");
+                       g_print("\t     'd' WDR \n");
+                       g_print("\t     'e' EV program mode \n");
+                       g_print("\t  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [etc.]\n");
+                       g_print("\t     'z' Strobe (Flash) \n");
+                       g_print("\t     'x' Capture mode (Still/Multishot/HDR)\n");
+                       g_print("\t     'l' Face detection \n");
+                       g_print("\t     'k' Anti-handshake \n");
+                       g_print("\t     'K' Video-stabilization \n");
+                       g_print("\t     'u' Touch AF area \n");
+                       g_print("\t     'm' Stream callback function \n");
+                       g_print("\t     'b' back\n");
+                       g_print("\t=======================================\n");
                        break;
 
                default:
@@ -1001,93 +922,60 @@ static void main_menu(gchar buf)
        int current_fps = 0;
        int average_fps = 0;
        char *err_attr_name = NULL;
-       int width = 0, height = 0;
-
-       if (hcamcorder->mode == MODE_IMAGE) {
-               switch(buf) {
-                       case '1' : //Capture
-                               if(hcamcorder->isMultishot) {
-                                       err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                                       MMCAM_CAPTURE_WIDTH, 640,
-                                                                                       MMCAM_CAPTURE_HEIGHT, 480,
-                                                                                       MMCAM_CAPTURE_COUNT, multishot_num,
-                                                                                       MMCAM_CAPTURE_INTERVAL, IMAGE_CAPTURE_COUNT_INTERVAL,
-                                                                                       NULL);
-                                       if (err < 0) {
-                                               err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
-                                               SAFE_FREE (err_attr_name);
-                                       }       
-                               } else {
-                                       err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                                       MMCAM_CAPTURE_COUNT, IMAGE_CAPTURE_COUNT_STILL,
-                                                                                       NULL);
-                                       if (err < 0) {
-                                               err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
-                                               SAFE_FREE (err_attr_name);
-                                       }
-                               }
 
-                               g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, (GSourceFunc)test_idle_capture_start, NULL, NULL);
-                               break;
-
-                       case '2' : // Setting
-                               hcamcorder->menu_state = MENU_STATE_SETTING;
-                               break;
-
-                       case '3' : // Print frame rate
-                               current_fps = _mmcamcorder_video_current_framerate(hcamcorder->camcorder);
-                               average_fps = _mmcamcorder_video_average_framerate(hcamcorder->camcorder);
-                               g_print("\tVideo Frame Rate[Current : %d.0 fps, Average : %d.0 fps]\n", current_fps, average_fps);
-                               break;
+       if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
+               if (mmcamcorder_state == MM_CAMCORDER_STATE_PREPARE) {
+                       switch (buf) {
+                               case '1' : //Capture
+                                       if(hcamcorder->isMultishot) {
+                                               int interval = 0;
+                                               flush_stdin();
+                                               printf("\ninput interval(ms) \n");
+                                               err = scanf("%d", &interval);
+                                               if (err == EOF) {
+                                                       printf("\nscanf error : errno %d\n", errno);
+                                                       interval = 300;
+                                               }
+                                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
+                                                                                 MMCAM_CAPTURE_INTERVAL, interval,
+                                                                                 NULL);
+                                               if (err != MM_ERROR_NONE) {
+                                                       err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
+                                                       SAFE_FREE (err_attr_name);
+                                               }
+                                       } else {
+                                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
+                                                                                 MMCAM_CAPTURE_COUNT, IMAGE_CAPTURE_COUNT_STILL,
+                                                                                 NULL);
+                                               if (err != MM_ERROR_NONE) {
+                                                       err_msg_t("Attribute setting fail : (%s:%x)", err_attr_name, err);
+                                                       SAFE_FREE (err_attr_name);
+                                               }
+                                       }
 
-                       case 'b' : // back
-                               hcamcorder->menu_state = MENU_STATE_MAIN;
-                               mode_change();
-                               break;
+                                       g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, (GSourceFunc)test_idle_capture_start, NULL, NULL);
+                                       break;
 
-                       default:
-                               g_print("\t Invalid input \n");
-                               break;                                  
-               }                       
-       }
-       else if (hcamcorder->mode == MODE_VIDEO)
-       {
-               if (mmcamcorder_state == MM_CAMCORDER_STATE_PREPARE) {
-                       switch(buf) {
-                               case '1' : // Start Recording
+                               case '2' : // Start Recording
                                        g_print("*Recording start!\n");
                                        video_stream_cb_cnt = 0;
                                        audio_stream_cb_cnt = 0;
 
-                                       mm_camcorder_get_attributes( hcamcorder->camcorder, NULL,
-                                                                               MMCAM_CAMERA_WIDTH, &width,
-                                                                               MMCAM_CAMERA_HEIGHT, &height,
-                                                                               NULL );
-
-                                       mm_camcorder_set_attributes( hcamcorder->camcorder, NULL,
-                                                                               MMCAM_CAMERA_AF_TOUCH_X, width>>1,
-                                                                               MMCAM_CAMERA_AF_TOUCH_Y, height>>1,
-                                                                               MMCAM_CAMERA_AF_TOUCH_WIDTH, 30,
-                                                                               MMCAM_CAMERA_AF_TOUCH_HEIGHT, 30,
-                                                                               NULL );
-
-                                       mm_camcorder_start_focusing(hcamcorder->camcorder);
-
                                        g_timer_reset(timer);
                                        err = mm_camcorder_record(hcamcorder->camcorder);
 
-                                       if (err < 0) {
-                                               warn_msg_t("Rec start mm_camcorder_record  = %x", err);
+                                       if (err != MM_ERROR_NONE) {
+                                               warn_msg_t("Rec start mm_camcorder_record 0x%x", err);
                                        }
 
                                        mmcamcorder_print_state = MM_CAMCORDER_STATE_RECORDING;
                                        break;
 
-                               case '2' : // Setting
+                               case '3' : // Setting
                                        hcamcorder->menu_state = MENU_STATE_SETTING;
                                        break;
 
-                               case '3' :
+                               case '4' : // Print frame rate
                                        current_fps = _mmcamcorder_video_current_framerate(hcamcorder->camcorder);
                                        average_fps = _mmcamcorder_video_average_framerate(hcamcorder->camcorder);
                                        g_print("\tVideo Frame Rate[Current : %d.0 fps, Average : %d.0 fps]\n", current_fps, average_fps);
@@ -1097,9 +985,13 @@ static void main_menu(gchar buf)
                                        hcamcorder->menu_state = MENU_STATE_MAIN;
                                        mode_change();
                                        break;
+
+                               default:
+                                       g_print("\t Invalid input \n");
+                                       break;
                        }
                } else if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING || mmcamcorder_state == MM_CAMCORDER_STATE_PAUSED) {
-                       switch(buf) {
+                       switch (buf) {
                                if (mmcamcorder_state == MM_CAMCORDER_STATE_RECORDING) {
                                        case 'p'  : // Pause Recording
                                                g_print("*Pause!\n");
@@ -1145,6 +1037,10 @@ static void main_menu(gchar buf)
                                        mmcamcorder_print_state = MM_CAMCORDER_STATE_PREPARE;
                                        break;
 
+                               case 'n' : /* Capture video snapshot */
+                                       err = mm_camcorder_capture_start(hcamcorder->camcorder);
+                                       break;
+
                                default :
                                        g_print("\t Invalid input \n");
                                        break;
@@ -1152,9 +1048,7 @@ static void main_menu(gchar buf)
                } else {
                        err_msg_t("Wrong camcorder state, check status!!");
                }
-       }
-       else if (hcamcorder->mode == MODE_AUDIO)
-       {
+       } else if (hcamcorder->mode == MODE_AUDIO) {
                if (mmcamcorder_state == MM_CAMCORDER_STATE_PREPARE) {
                        switch(buf) {
                                case '1' : //  Start Recording
@@ -1244,31 +1138,48 @@ static void setting_menu(gchar buf)
        int min = 0;
        int max = 0;
        int width_count = 0;
-       int heigh_count = 0;
+       int height_count = 0;
        int i=0;
        int count = 0;
        int value = 0;
        int* array = NULL;
        int *width_array = NULL;
-       int *heigh_array = NULL;
+       int *height_array = NULL;
        char *err_attr_name = NULL;
        cam_xypair_t input_pair;
        int err = MM_ERROR_NONE;
        int x = 0, y = 0, width = 0, height = 0;
-       double new_volume = 0.0;
        gint error_num=0;
 
-       if (hcamcorder->mode == MODE_IMAGE)
-       {
-               switch(buf) {
-       /* Camera setting */
+       if (hcamcorder->mode == MODE_VIDEO_CAPTURE) {
+               switch (buf) {
+                       /* Camera setting */
                        case '1' : // Setting > Capture Resolution setting
+                               /* check recommend preview resolution */
+                               camcordertest_get_attr_valid_intarray(MMCAM_RECOMMEND_CAMERA_WIDTH, &width_array, &width_count);
+                               camcordertest_get_attr_valid_intarray(MMCAM_RECOMMEND_CAMERA_HEIGHT, &height_array, &height_count);
+                               if(width_count != height_count) {
+                                       err_msg_t("System has wrong information!!\n");
+                               } else if (width_count == 0) {
+                                       g_print("MMCAM_RECOMMEND_CAMERA_WIDTH/HEIGHT Not supported!!\n");
+                               } else {
+                                       g_print("\n - MMCAM_RECOMMEND_CAMERA_WIDTH and HEIGHT (count %d) -\n", width_count);
+                                       g_print("\t NORMAL ratio : %dx%d\n",
+                                               width_array[MM_CAMCORDER_PREVIEW_TYPE_NORMAL], height_array[MM_CAMCORDER_PREVIEW_TYPE_NORMAL]);
+                                       if (width_count >= 2) {
+                                               g_print("\t WIDE ratio   : %dx%d\n\n",
+                                                       width_array[MM_CAMCORDER_PREVIEW_TYPE_WIDE], height_array[MM_CAMCORDER_PREVIEW_TYPE_WIDE]);
+                                       } else {
+                                               g_print("\t There is ONLY NORMAL resolution\n\n");
+                                       }
+                               }
+
                                g_print("*Select the resolution!\n");
                                camcordertest_get_attr_valid_intarray("capture-width", &width_array, &width_count);
-                               camcordertest_get_attr_valid_intarray("capture-height", &heigh_array, &heigh_count);
+                               camcordertest_get_attr_valid_intarray("capture-height", &height_array, &height_count);
 
-                               if(width_count != heigh_count) {
-                                       err_msg_t("System has wrong information!!");
+                               if(width_count != height_count) {
+                                       err_msg_t("System has wrong information!!\n");
                                } else if (width_count == 0) {
                                        g_print("Not supported!!\n");
                                } else {
@@ -1276,17 +1187,20 @@ static void setting_menu(gchar buf)
                                        flush_stdin();
 
                                        for ( i = 0; i < width_count; i++) {
-                                               g_print("\t %d. %d*%d\n", i+1, width_array[i], heigh_array[i]);
+                                               g_print("\t %d. %d*%d\n", i+1, width_array[i], height_array[i]);
                                        }
-                                       scanf("%d",&index);
-
-                                       if( index > 0 && index <= width_count ) {
-                               //Set capture size first
-                                               input_pair.attr_subcat_x = "capture-width";
-                                               input_pair.attr_subcat_y = "capture-height";
-                                               input_pair.x = width_array[index-1];
-                                               input_pair.y = heigh_array[index-1];
-                                               bret = camcordertest_set_attr_xypair(input_pair);
+                                       err = scanf("%d",&index);
+                                       if (err == EOF) {
+                                               printf("\nscanf error : errno %d\n", errno);
+                                       } else {
+                                               if( index > 0 && index <= width_count ) {
+                                                       //Set capture size first
+                                                       input_pair.attr_subcat_x = "capture-width";
+                                                       input_pair.attr_subcat_y = "capture-height";
+                                                       input_pair.x = width_array[index-1];
+                                                       input_pair.y = height_array[index-1];
+                                                       bret = camcordertest_set_attr_xypair(input_pair);
+                                               }
                                        }
                                }
                                break;
@@ -1300,7 +1214,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Digital zoom level (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-digital-zoom", index);
                                }
                                break;
@@ -1314,25 +1228,47 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Optical zoom level (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-optical-zoom", index);
                                }
                                break;
 
                        case '4' : // Setting > AF mode
-                               g_print("*Focus mode !\n");
-                               camcordertest_get_attr_valid_intarray("camera-focus-mode", &array, &count);
+                               g_print("\t0. AF Mode setting !\n");
+                               g_print("\t1. AF Start !\n");
+                               g_print("\t2. AF Stop !\n\n");
 
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Focus mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], focus_mode[array[i]]);
+                               flush_stdin();
+                               err = scanf("%d", &index);
+
+                               switch (index) {
+                               case 0:
+                               {
+                                       g_print("*Focus mode !\n");
+                                       camcordertest_get_attr_valid_intarray("camera-focus-mode", &array, &count);
+
+                                       if(count <= 0) {
+                                               g_print("Not supported !! \n");
+                                       } else {
+                                               g_print("\n Select Focus mode \n");
+                                               flush_stdin();
+                                               for (i = 0 ; i < count ; i++) {
+                                                       g_print("\t %d. %s\n", array[i], focus_mode[array[i]]);
+                                               }
+                                               err = scanf("%d",&index);
+                                               bret = camcordertest_set_attr_int("camera-focus-mode", index);
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-focus-mode", index);
+                               }
+                                       break;
+                               case 1:
+                                       mm_camcorder_start_focusing(hcamcorder->camcorder);
+                                       break;
+                               case 2:
+                                       mm_camcorder_stop_focusing(hcamcorder->camcorder);
+                                       break;
+                               default:
+                                       g_print("Wrong Input[%d] !! \n", index);
+                                       break;
                                }
                                break;
 
@@ -1348,12 +1284,8 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], af_scan[array[i]]);
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-af-scan-range", index);
-
-                                       if( bret ) {
-                                               mm_camcorder_start_focusing(hcamcorder->camcorder);
-                                       }
+                                       err = scanf("%d",&index);
+                                       camcordertest_set_attr_int("camera-af-scan-range", index);
                                }
                                break;
 
@@ -1369,7 +1301,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], exposure_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-exposure-mode", index);
                                }
                                break;
@@ -1383,7 +1315,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Exposure value(%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-exposure-value", index);
                                }
                                break;
@@ -1404,7 +1336,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %d \n", i+1, array[i]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
 
                                        if( index > 0 && index <= count ) {
                                                bret = camcordertest_set_attr_int("camera-shutter-speed", array[index-1]);
@@ -1424,32 +1356,48 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], iso_name[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-iso", index);
                                }
                                break;
 
                        case 'r' : // Setting > Rotate camera input when recording
-                               g_print("*Rotate camera input when recording !\n");
-                               camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_ROTATION, &array, &count);
+                               g_print("*Rotate camera input\n");
+                               camcordertest_get_attr_valid_intrange(MMCAM_CAMERA_ROTATION, &min, &max);
 
-                               if(count <= 0) {
+                               if(min >= max) {
                                        g_print("Not supported !! \n");
                                } else {
-                                       g_print("\n Select Rotate angle of camera \n");
                                        flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], camera_rotation[array[i]]);
+                                       for (i = min ; i <= max ; i++) {
+                                               g_print("\t %d. %s\n", i, camera_rotation[i]);
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int(MMCAM_CAMERA_ROTATION, index);
+                                       err = scanf("%d",&index);
                                        CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
+                                       bret = camcordertest_set_attr_int(MMCAM_CAMERA_ROTATION, index);
                                        CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
                                }
                                break;
 
+                       case 'f' : // Setting > Flip camera input
+                               flush_stdin();
+                               g_print("*Flip camera input\n");
+                               g_print(" 0. Flip NONE\n");
+                               g_print(" 1. Flip HORIZONTAL\n");
+                               g_print(" 2. Flip VERTICAL\n");
+                               g_print(" 3. Flip BOTH\n");
+
+                               err = scanf("%d", &index);
+
+                               CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
+                               CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
+
+                               camcordertest_set_attr_int(MMCAM_CAMERA_FLIP, index);
+
+                               CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
+                               CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
+                               break;
+
                        case 'j' : // Setting > Jpeg quality
                                g_print("*Jpeg quality !\n");
                                camcordertest_get_attr_valid_intrange("image-encoder-quality", &min, &max);
@@ -1459,7 +1407,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Jpeg quality (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("image-encoder-quality", index);
                                }
                                break;
@@ -1476,7 +1424,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], image_fmt[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-format", index);
                                        CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
                                        CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
@@ -1485,7 +1433,30 @@ static void setting_menu(gchar buf)
                                }
                                break;
 
-               /* Display / Filter setting */
+                       case 'E' : // Setting > EXIF orientation
+                               g_print("* EXIF Orientation\n");
+
+                               g_print("\t 1. TOP_LEFT\n");
+                               g_print("\t 2. TOP_RIGHT(flipped)\n");
+                               g_print("\t 3. BOTTOM_RIGHT\n");
+                               g_print("\t 4. BOTTOM_LEFT(flipped)\n");
+                               g_print("\t 5. LEFT_TOP(flipped)\n");
+                               g_print("\t 6. RIGHT_TOP\n");
+                               g_print("\t 7. RIGHT_BOTTOM(flipped)\n");
+                               g_print("\t 8. LEFT_BOTTOM\n");
+
+                               flush_stdin();
+                               err = scanf("%d", &index);
+
+                               if (index < 1 || index > 8) {
+                                       g_print("Wrong INPUT[%d]!! \n", index);
+                               } else {
+                                       camcordertest_set_attr_int(MMCAM_TAG_ORIENTATION, index);
+                               }
+
+                               break;
+
+                       /* Display / Filter setting */
                        case 'v' : // Display visible
                                g_print("* Display visible setting !\n");
                                camcordertest_get_attr_valid_intarray( "display-visible", &array, &count );
@@ -1498,11 +1469,28 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], visible_mode[array[i]]);
                                        }
-                                       scanf("%d",&value);
+                                       err = scanf("%d",&value);
                                        bret = camcordertest_set_attr_int( "display-visible", value );
                                }
                                break;
 
+                       case 'n' : //  Setting > Display mode
+                               g_print("* Display mode!\n");
+                               camcordertest_get_attr_valid_intarray(MMCAM_DISPLAY_MODE, &array, &count);
+
+                               if (count <= 0 || count > 255) {
+                                       g_print("Not supported !! \n");
+                               } else {
+                                       flush_stdin();
+                                       g_print("\n Select Display mode\n");
+                                       for (i = 0 ; i < count ; i++) {
+                                               g_print("\t %d. %s\n", array[i], display_mode[array[i]]);
+                                       }
+                                       err = scanf("%d",&index);
+                                       bret = camcordertest_set_attr_int(MMCAM_DISPLAY_MODE, index);
+                               }
+                               break;
+
                        case 'o' : //  Setting > Output mode
                                g_print("* Output mode!\n");
                                camcordertest_get_attr_valid_intrange("display-geometry-method", &min, &max);
@@ -1515,27 +1503,33 @@ static void setting_menu(gchar buf)
                                        for( i = min ; i <= max ; i++ ) {
                                                g_print( "%d. %s\n", i, output_mode[i] );
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("display-geometry-method", index);
                                }
                                break;
 
                        case 'y' : // Setting > Rotate Display
-                               camcordertest_get_attr_valid_intarray( MMCAM_DISPLAY_ROTATION, &array, &count );
+                               camcordertest_get_attr_valid_intrange(MMCAM_DISPLAY_ROTATION, &min, &max);
 
-                               if( count <= 0 || count > 256 ) {
+                               if( min > max ) {
                                        g_print("Not supported !! \n");
                                } else {
                                        flush_stdin();
-                                       g_print("\n Select Rotation mode\n");
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], rotate_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int( MMCAM_DISPLAY_ROTATION, index );
+                                       g_print("\n Select Rotate mode(%d ~ %d)\n", min, max);
+                                       g_print("\t0. 0\n\t1. 90\n\t2. 180\n\t3. 270\n\n");
+                                       err = scanf("%d",&index);
+                                       bret = camcordertest_set_attr_int(MMCAM_DISPLAY_ROTATION, index);
                                }
                                break;
 
+                       case 'Y' : // Setting > Flip Display
+                               flush_stdin();
+                               g_print("\n Select Rotate mode(%d ~ %d)\n", min, max);
+                               g_print("\t0. NONE\n\t1. HORIZONTAL\n\t2. VERTICAL\n\t3. BOTH\n\n");
+                               err = scanf("%d",&index);
+                               camcordertest_set_attr_int(MMCAM_DISPLAY_FLIP, index);
+                               break;
+
                        case 'g' : // Setting > Brightness
                                g_print("*Brightness !\n");
                                camcordertest_get_attr_valid_intrange("filter-brightness", &min, &max);
@@ -1545,7 +1539,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  brightness (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-brightness", index);
                                }
                                break;
@@ -1559,7 +1553,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Contrast (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-contrast", index);
                                }
                                break;
@@ -1573,7 +1567,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Saturation (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-saturation", index);
                                }
                                break;
@@ -1587,7 +1581,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Hue (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-hue", index);
                                }
                                break;
@@ -1601,7 +1595,7 @@ static void setting_menu(gchar buf)
                                } else {
                                        flush_stdin();
                                        g_print("\n Select  Sharpness (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-sharpness", index);
                                }
                                break;
@@ -1618,7 +1612,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], wb[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-wb", index);
                                }
                                break;
@@ -1635,7 +1629,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], ct[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-color-tone", index);
                                }
                                break;
@@ -1653,7 +1647,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], wdr_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("camera-wdr", index);
                                }
                                break;
@@ -1670,12 +1664,12 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], program_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("filter-scene-mode", index);
                                }
                                break;
 
-               /* ext. setting */
+                       /* ext. setting */
                        case 'z' : // Setting > Strobe setting
                                g_print("*Strobe Mode\n");
                                camcordertest_get_attr_valid_intarray("strobe-mode", &array, &count);
@@ -1687,7 +1681,7 @@ static void setting_menu(gchar buf)
                                        for ( i = 0; i < count; i++) {
                                                g_print("\t %d. %s\n", array[i], strobe_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
+                                       err = scanf("%d",&index);
                                        bret = camcordertest_set_attr_int("strobe-mode", index);
                                }
                                break;
@@ -1695,15 +1689,20 @@ static void setting_menu(gchar buf)
                        case 'x' : // Setting > Capture mode ,Muitishot?
                                g_print("*Select Capture mode!\n");
                                flush_stdin();
-                               g_print(" \n\t1. Stillshot mode\n\t2. Multishot mode \n");
-                               scanf("%d",&index);
+                               g_print(" \n\t1. Stillshot mode\n\t2. Multishot mode\n\t3. HDR capture\n");
+                               err = scanf("%d",&index);
 
-                               if(index == 1) {
+                               switch (index) {
+                               case 1:
                                        g_print("stillshot mode selected and capture callback is set!!!!\n");
                                        hcamcorder->isMultishot = FALSE;
-                               } else if (index == 2) {
+                                       camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, 0);
+                                       break;
+                               case 2:
                                        g_print("Multilshot mode selected!!\n");
 
+                                       camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, 0);
+
                                        index = 0;
                                        min = 0;
                                        max = 0;
@@ -1715,650 +1714,176 @@ static void setting_menu(gchar buf)
                                                flush_stdin();
                                                //g_print("\n Check Point!!! [Change resolution to 800x480]\n");
                                                g_print("Select  mulitshot number (%d ~ %d)\n", min, max);
-                                               scanf("%d",&index);
+                                               err = scanf("%d",&index);
                                                if( index >= min && index <= max ) {
                                                        multishot_num = index;
+                                                       mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
+                                                                                   MMCAM_CAPTURE_COUNT, multishot_num,
+                                                                                   NULL);
                                                        hcamcorder->isMultishot = TRUE;
                                                } else {
                                                        g_print("Wrong input value, Multishot setting failed!!\n");
                                                }
                                        }
-                               } else {
-                                       g_print("Wrong input, select again!!\n");
-                               }
-                               break;
+                                       break;
+                               case 3:
+                                       g_print("HDR Capture mode selected\n");
+                                       hcamcorder->isMultishot = FALSE;
 
-                       case 'f' : // Setting > Face detection setting
-                               //hcamcorder->menu_state = MENU_STATE_SETTING_DETECTION;
-                               g_print("* Face detect mode !\n");
-
-                               camcordertest_get_attr_valid_intarray("detect-mode", &array, &count);
-                               if(count <= 0 || count > 256) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Face detect mode  \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s \n", array[i], detection_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-
-                                       if( index >= 0 && index < count ) {
-                                               bret = camcordertest_set_attr_int("detect-mode", array[index]);
-                                       } else {
-                                               g_print("Wrong input value. Try again!!\n");
-                                               bret = FALSE;
-                                       }
-                               }
-                               break;
-
-                       case 'k' : // Setting > Anti-handshake
-                               g_print("*Anti-handshake !\n");
-                               camcordertest_get_attr_valid_intarray("camera-anti-handshake", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Anti-handshake mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], ahs_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-anti-handshake", index);
-                               }
-                               break;
-
-                       case 'u': // Touch AF area
-                               g_print("* Touch AF area !\n");
-                               camcordertest_get_attr_valid_intrange("camera-af-touch-x", &min, &max);
-                               if( max < min ) {
-                                       g_print( "Not Supported camera-af-touch-x !!\n" );
-                                       break;
-                               }
-                               camcordertest_get_attr_valid_intrange("camera-af-touch-y", &min, &max);
-                               if( max < min ) {
-                                       g_print( "Not Supported camera-af-touch-y !!\n" );
-                                       break;
-                               }
-                               camcordertest_get_attr_valid_intrange("camera-af-touch-width", &min, &max);
-                               if( max < min ) {
-                                       g_print( "Not Supported camera-af-touch-width !!\n" );
-                                       break;
-                               }
-                               camcordertest_get_attr_valid_intrange("camera-af-touch-height", &min, &max);
-                               if( max < min ) {
-                                       g_print( "Not Supported camera-af-touch-height!!\n" );
-                                       break;
-                               }
-
-                               flush_stdin();
-                               g_print( "\n Input x,y,width,height \n" );
-                               scanf( "%d,%d,%d,%d", &x, &y, &width, &height );
-                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                                               MMCAM_CAMERA_AF_TOUCH_X, x,
-                                                                                               MMCAM_CAMERA_AF_TOUCH_Y, y,
-                                                                                               MMCAM_CAMERA_AF_TOUCH_WIDTH, width,
-                                                                                               MMCAM_CAMERA_AF_TOUCH_HEIGHT, height,
-                                                                                               NULL);
-
-                               if( err != MM_ERROR_NONE ) {
-                                       g_print( "Failed to set touch AF area.(%x)(%s)\n", err, err_attr_name );
-                                       free( err_attr_name );
-                                       err_attr_name = NULL;
-                               } else {
-                                       g_print( "Succeed to set touch AF area.\n" );
-                               }
-                               break;
-
-                       case 'm' : // Setting > Stream callback function
-                               g_print("Not supported !! \n");
-                               break;
-
-                       case 'b' : // back
-                               hcamcorder->menu_state = MENU_STATE_MAIN;
-                               break;
-
-                       default :
-                               g_print("\t Invalid input \n");
-                               break;
-               }
-       }
-       else if(hcamcorder->mode == MODE_VIDEO)
-       {
-               switch(buf)
-               {
-               /* Camera setting */
-                       case '1' : // Setting > Recording Resolution
-                               g_print("*Select resolution!\n");
-
-                               camcordertest_get_attr_valid_intarray("camera-width", &width_array, &width_count);
-                               camcordertest_get_attr_valid_intarray("camera-height", &heigh_array, &heigh_count);
-
-                               if(width_count != heigh_count) {
-                                       err_msg_t("System has wrong information!!");
-                               } else if(width_count == 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select  the resolution \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < width_count; i++) {
-                                               g_print("\t %d. %d*%d\n", i+1, width_array[i], heigh_array[i]);
-                                       }
-                                       scanf("%d",&index);
-
-                                       if( index > 0 && index <= width_count ) {
-                                               g_timer_reset(timer);
-                                               CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
-                                               CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
-
-                                               //Set source size
-                                               input_pair.attr_subcat_x = "camera-width";
-                                               input_pair.attr_subcat_y = "camera-height";
-                                               input_pair.x = width_array[index-1];
-                                               input_pair.y = heigh_array[index-1];
-
-                                               bret = camcordertest_set_attr_xypair(input_pair);
-
-                                               CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
-                                               CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
-                                               time_msg_t("Resolution change  : %12.6lf s", g_timer_elapsed(timer, NULL));
-                                       } else {
-                                               warn_msg_t( "Out of index" );
-                                       }
-                               }
-                       break;
-
-                       case '2' : // Setting > Digital zoom level
-                               g_print("*Digital zoom level  !\n");
-                               camcordertest_get_attr_valid_intrange("camera-digital-zoom", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Digital zoom level (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-digital-zoom", index);
-                               }
-                               break;
-
-                       case '3' : // Setting > Optical zoom level
-                               g_print("*Optical zoom level  !\n");
-                               camcordertest_get_attr_valid_intrange("camera-optical-zoom", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Optical zoom level (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-optical-zoom", index);
-                               }
-                               break;
-
-                       case '4' : // Setting > AF mode
-                               g_print("*Focus mode !\n");
-                               camcordertest_get_attr_valid_intarray("camera-focus-mode", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Focus mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], focus_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-focus-mode", index);
-                               }
-                               break;
-
-                       case '5' : // Setting > AF scan range
-                               g_print("*AF scan range !\n");
-                               camcordertest_get_attr_valid_intarray("camera-af-scan-range", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select AF scan range \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], af_scan[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-af-scan-range", index);
-
-                                       if( bret ) {
-                                               mm_camcorder_start_focusing(hcamcorder->camcorder);
-                                       }
-                               }
-                               break;
-
-                       case '6' : // Setting > Exposure mode
-                               g_print("* Exposure mode!\n");
-                               camcordertest_get_attr_valid_intarray("camera-exposure-mode", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select  Exposure mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], exposure_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-exposure-mode", index);
-                               }
-                               break;
-
-                       case '7' :  // Setting > Exposure value
-                               g_print("*Exposure value  !\n");
-                               camcordertest_get_attr_valid_intrange("camera-exposure-value", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Exposure value(%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-exposure-value", index);
-                               }
-                               break;
-
-                       case '8' : // Setting > F number
-                               g_print("Not supported !! \n");
-                               break;
-
-                       case 'i' : // Setting > ISO
-                               g_print("*ISO !\n");
-                               camcordertest_get_attr_valid_intarray("camera-iso", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select ISO \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], iso_name[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-iso", index);
-                               }
-                               break;
-
-                       case 'r' : // Setting > Rotate camera input when recording
-                               g_print("*Rotate camera input !\n");
-                               camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_ROTATION, &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Rotate angle of camera (Do Not use it for recording test !!) \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], camera_rotation[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-
-                                       CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
-
-                                       bret = camcordertest_set_attr_int(MMCAM_CAMERA_ROTATION, index);
-
-                                       CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
-                               }
-                               break;
-
-                       case 'p' : // Setting > FPS
-                               g_print("* FPS !\n");
-
-                               camcordertest_get_attr_valid_intarray("camera-fps", &array, &count);
-
-                               if(count <= 0 || count > 256)
-                               { 
-                                       g_print("Not supported !! \n");
-                               }
-                               else
-                               {
-                                       g_print("\n Select  FPS \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++)
-                                       {
-                                               g_print("\t %d. %d \n", i+1, array[i]);
-                                       }                                       
-                                       scanf("%d",&index);
-
-                                       if( index > 0 && index <= count )
-                                       {
-                                               bret = camcordertest_set_attr_int("camera-fps", array[index-1]);
-                                               hcamcorder->fps = array[index-1];
-                                       }
-                                       else
-                                       {
-                                               bret = FALSE;
-                                               g_print("\n Out of index \n");
-                                       }
-                               }
-                               break;
-
-               /* Display / Filter setting */
-                       case 'v' : // Setting > Display visible
-                               g_print("* Display visible setting !\n");
-                               camcordertest_get_attr_valid_intarray( "display-visible", &array, &count );
-
-                               if( count < 1 ) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Display visible \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], visible_mode[array[i]]);
-                                       }
-                                       scanf("%d",&value);
-                                       bret = camcordertest_set_attr_int( "display-visible", value );
-                               }
-                               break;
-
-                       case 'o' : // Setting > Output mode
-                               g_print("* Output mode!\n");
-                               camcordertest_get_attr_valid_intrange("display-geometry-method", &min, &max);
-
-                               if( min > max ) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select Output mode(%d ~ %d)\n", min, max);
-                                       for( i = min ; i <= max ; i++ ) {
-                                               g_print( "%d. %s\n", i, output_mode[i] );
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("display-geometry-method", index);
-                               }
-                               break;
-
-                       case 'y' : // Setting > Rotate Display
-                               camcordertest_get_attr_valid_intarray( MMCAM_DISPLAY_ROTATION, &array, &count );
-
-                               if( count <= 0 || count > 256 ) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select Rotation mode\n");
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], rotate_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int( MMCAM_DISPLAY_ROTATION, index );
-                               }
-                               break;
-
-                       case 'g' : // Setting > Brightness
-                               g_print("*Brightness !\n");
-                               camcordertest_get_attr_valid_intrange("filter-brightness", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  brightness (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-brightness", index);
-                               }
-                               break;
-
-                       case 'c' : // Setting > Contrast
-                               g_print("*Contrast !\n");
-                               camcordertest_get_attr_valid_intrange("filter-contrast", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Contrast (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-contrast", index);
-                               }
-                               break;
-
-                       case 's' : // Setting > Saturation
-                               g_print("*Saturation !\n");
-                               camcordertest_get_attr_valid_intrange("filter-saturation", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Saturation (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-saturation", index);
-                               }
-                               break;
-
-                       case 'h' : // Setting > Hue
-                               g_print("*Hue !\n");
-                               camcordertest_get_attr_valid_intrange("filter-hue", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Hue (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-hue", index);
-                               }
-                               break;
-
-                       case 'a' : // Setting > Sharpness
-                               g_print("*Sharpness !\n");
-                               camcordertest_get_attr_valid_intrange("filter-sharpness", &min, &max);
-
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       flush_stdin();
-                                       g_print("\n Select  Sharpness (%d ~ %d)\n", min, max);
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-sharpness", index);
+                                       camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_HDR_CAPTURE, &array, &count);
+                                       if(count <= 0) {
+                                               g_print("Not supported !! \n");
+                                       } else {
+                                               g_print("\nSelect HDR capture mode\n");
+                                               flush_stdin();
+                                               for ( i = 0; i < count; i++) {
+                                                       g_print("\t %d. %s\n", array[i], hdr_mode[array[i]]);
+                                               }
+                                               err = scanf("%d",&index);
+                                               bret = camcordertest_set_attr_int(MMCAM_CAMERA_HDR_CAPTURE, index);
+                                       }
+                                       break;
+                               default:
+                                       g_print("Wrong input, select again!!\n");
+                                       break;
                                }
                                break;
 
-                       case 'w' : // Setting > White balance
-                               g_print("*White balance !\n");
-                               camcordertest_get_attr_valid_intarray("filter-wb", &array, &count);
+                       case 'l' : // Setting > Face detection setting
+                               //hcamcorder->menu_state = MENU_STATE_SETTING_DETECTION;
+                               g_print("* Face detect mode !\n");
 
-                               if(count <= 0) {
+                               camcordertest_get_attr_valid_intarray("detect-mode", &array, &count);
+                               if(count <= 0 || count > 256) {
                                        g_print("Not supported !! \n");
                                } else {
+                                       g_print("\n Face detect mode  \n");
                                        flush_stdin();
-                                       g_print("\n Select White balance \n");
                                        for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], wb[array[i]]);
+                                               g_print("\t %d. %s \n", array[i], detection_mode[array[i]]);
+                                       }
+                                       err = scanf("%d",&index);
+
+                                       if( index >= 0 && index < count ) {
+                                               bret = camcordertest_set_attr_int("detect-mode", array[index]);
+                                       } else {
+                                               g_print("Wrong input value. Try again!!\n");
+                                               bret = FALSE;
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-wb", index);
                                }
                                break;
 
-                       case 't' : // Setting > Color tone
-                               g_print("*Color tone !\n");
-                               camcordertest_get_attr_valid_intarray("filter-color-tone", &array, &count);
+                       case 'k' : // Setting > Anti-handshake
+                               g_print("*Anti-handshake !\n");
+                               camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_ANTI_HANDSHAKE, &array, &count);
 
                                if(count <= 0) {
                                        g_print("Not supported !! \n");
                                } else {
-                                       g_print("\n Select Color tone \n");
+                                       g_print("\n Select Anti-handshake mode \n");
                                        flush_stdin();
                                        for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], ct[array[i]]);
+                                               g_print("\t %d. %s\n", array[i], ahs_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("filter-color-tone", index);
+                                       err = scanf("%d",&index);
+                                       bret = camcordertest_set_attr_int(MMCAM_CAMERA_ANTI_HANDSHAKE, index);
                                }
                                break;
 
-                       case 'd' : // Setting > WDR
-                               g_print("*WDR !\n");
-                               camcordertest_get_attr_valid_intarray("camera-wdr", &array, &count);
+                       case 'K' : // Setting > Video-stabilization
+                               g_print("*Video-stabilization !\n");
+                               camcordertest_get_attr_valid_intarray(MMCAM_CAMERA_VIDEO_STABILIZATION, &array, &count);
 
                                if(count <= 0) {
                                        g_print("Not supported !! \n");
-                               }
-                               else {
-                                       g_print("\n Select WDR Mode \n");
+                               } else {
+                                       g_print("\n Select Video-stabilization mode \n");
                                        flush_stdin();
                                        for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], wdr_mode[array[i]]);
+                                               g_print("\t %d. %s\n", array[i], vs_mode[array[i]]);
                                        }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-wdr", index);
-                               }
-                               break;
-
-               /* ext. setting */
-                       case 'x' : // Setting > High Speed
-                       {
-                               static int backup_width = 0;
-                               static int backup_height = 0;
-
-                               g_print("\n Select High Speed Recording mode\n");
-                               g_print("\t 1. High Speed Recording mode ON\n");
-                               g_print("\t 2. High Speed Recording mode OFF \n");
+                                       err = scanf("%d",&index);
 
-                               flush_stdin();
-                               scanf("%d",&index);
-                               if (index == 1) {
-                                       mm_camcorder_get_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                   MMCAM_CAMERA_WIDTH, &backup_width,
-                                                                   MMCAM_CAMERA_HEIGHT, &backup_height,
-                                                                   NULL);
-
-                                       CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
-
-                                       err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                         MMCAM_CAMERA_WIDTH, 320,
-                                                                         MMCAM_CAMERA_HEIGHT, 240,
-                                                                         MMCAM_CAMERA_FPS, 120,
-                                                                         "camera-slow-motion-fps", 30,
-                                                                         NULL);
-                                       if (err != MM_ERROR_NONE) {
-                                               warn_msg_t("High speed recording. mm_camcorder_set_attributes fail. (%s:%x)", err_attr_name, err);
-                                               SAFE_FREE(err_attr_name);
-                                       }
+                                       if (index == MM_CAMCORDER_VIDEO_STABILIZATION_ON) {
+                                               g_print("\n Restart preview with NV12 and 720p resolution\n");
 
-                                       CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
+                                               err = mm_camcorder_stop(hcamcorder->camcorder);
+                                               if (err == MM_ERROR_NONE) {
+                                                       err = mm_camcorder_unrealize(hcamcorder->camcorder);
+                                               }
 
-                               } else if(index == 2) {
-                                       CHECK_MM_ERROR(mm_camcorder_stop(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_unrealize(hcamcorder->camcorder));
+                                               input_pair.attr_subcat_x = MMCAM_CAMERA_WIDTH;
+                                               input_pair.attr_subcat_y = MMCAM_CAMERA_HEIGHT;
+                                               input_pair.x = 1280;
+                                               input_pair.y = 720;
+                                               camcordertest_set_attr_xypair(input_pair);
+                                               camcordertest_set_attr_int(MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12);
+                                               camcordertest_set_attr_int(MMCAM_CAMERA_VIDEO_STABILIZATION, index);
+
+                                               if (err == MM_ERROR_NONE) {
+                                                       err = mm_camcorder_realize(hcamcorder->camcorder);
+                                                       if (err == MM_ERROR_NONE) {
+                                                               err = mm_camcorder_start(hcamcorder->camcorder);
+                                                       }
+                                               }
 
-                                       if (backup_width && backup_height) {
-                                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                                 MMCAM_CAMERA_WIDTH, backup_width,
-                                                                                 MMCAM_CAMERA_HEIGHT, backup_height,
-                                                                                 NULL);
                                                if (err != MM_ERROR_NONE) {
-                                                       warn_msg_t("get_attributes fail. (%s:%x)", err_attr_name, err);
-                                                       SAFE_FREE (err_attr_name);
+                                                       g_print("\n Restart FAILED! %x\n", err);
                                                }
+                                       } else {
+                                               camcordertest_set_attr_int(MMCAM_CAMERA_VIDEO_STABILIZATION, index);
                                        }
-
-                                       err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                         MMCAM_CAMERA_FPS, SRC_VIDEO_FRAME_RATE_30,
-                                                                         "camera-slow-motion-fps", 0,
-                                                                         NULL);
-                                       if (err != MM_ERROR_NONE) {
-                                               warn_msg_t("Normal speed recording. mm_camcorder_set_attributes fail. (%s:%x)", err_attr_name, err);
-                                               SAFE_FREE (err_attr_name);
-                                       }
-
-                                       CHECK_MM_ERROR(mm_camcorder_realize(hcamcorder->camcorder));
-                                       CHECK_MM_ERROR(mm_camcorder_start(hcamcorder->camcorder));
-                               } else {
-                                       g_print("Wrong input, Try again!!\n");
                                }
                                break;
-                       }
-                       case 'u' : // Setting > Mute
-                               g_print("*Mute!(%d)\n", hcamcorder->isMute);
 
-                               if (hcamcorder->isMute) {
-                                       new_volume = 0.0;
-                               } else {
-                                       new_volume = 1.0;
+                       case 'u': // Touch AF area
+                               g_print("* Touch AF area !\n");
+                               camcordertest_get_attr_valid_intrange("camera-af-touch-x", &min, &max);
+                               if( max < min ) {
+                                       g_print( "Not Supported camera-af-touch-x !!\n" );
+                                       break;
                                }
-
-                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
-                                                                               MMCAM_AUDIO_VOLUME, new_volume,
-                                                                               NULL);
-                               if (err < 0) {
-                                       warn_msg_t("Can' Mute. mm_camcorder_set_attributes fail. (%s:%x)", err_attr_name, err);
-                                       SAFE_FREE (err_attr_name);
+                               camcordertest_get_attr_valid_intrange("camera-af-touch-y", &min, &max);
+                               if( max < min ) {
+                                       g_print( "Not Supported camera-af-touch-y !!\n" );
+                                       break;
                                }
-
-                               hcamcorder->isMute = !(hcamcorder->isMute);
-                               break;
-
-                       case 'z' : // Setting > Strobe setting
-                               g_print("*Strobe Mode\n");
-                               camcordertest_get_attr_valid_intarray("strobe-mode", &array, &count);
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Strobe Mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], strobe_mode[array[i]]);
-                                       }                                       
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("strobe-mode", index);
+                               camcordertest_get_attr_valid_intrange("camera-af-touch-width", &min, &max);
+                               if( max < min ) {
+                                       g_print( "Not Supported camera-af-touch-width !!\n" );
+                                       break;
                                }
-                               break;
-
-                       case 'k' : //  Setting > Anti-handshake
-                               g_print("*Anti-handshake !\n");
-                               camcordertest_get_attr_valid_intarray("camera-anti-handshake", &array, &count);
-
-                               if(count <= 0) {
-                                       g_print("Not supported !! \n");
-                               } else {
-                                       g_print("\n Select Anti-handshake mode \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < count; i++) {
-                                               g_print("\t %d. %s\n", array[i], ahs_mode[array[i]]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camera-anti-handshake", index);
+                               camcordertest_get_attr_valid_intrange("camera-af-touch-height", &min, &max);
+                               if( max < min ) {
+                                       g_print( "Not Supported camera-af-touch-height!!\n" );
+                                       break;
                                }
-                               break;
 
-                       case 'e' : //  Setting > Camcorder-rotation setting
-                               g_print("*Camcorder-rotation setting!\n");
-                               camcordertest_get_attr_valid_intrange("camcorder-rotation", &min, &max);
+                               flush_stdin();
+                               g_print( "\n Input x,y,width,height \n" );
+                               err = scanf( "%d,%d,%d,%d", &x, &y, &width, &height );
+                               err = mm_camcorder_set_attributes(hcamcorder->camcorder, &err_attr_name,
+                                                                                               MMCAM_CAMERA_AF_TOUCH_X, x,
+                                                                                               MMCAM_CAMERA_AF_TOUCH_Y, y,
+                                                                                               MMCAM_CAMERA_AF_TOUCH_WIDTH, width,
+                                                                                               MMCAM_CAMERA_AF_TOUCH_HEIGHT, height,
+                                                                                               NULL);
 
-                               if(min >= max) {
-                                       g_print("Not supported !! \n");
+                               if( err != MM_ERROR_NONE ) {
+                                       g_print( "Failed to set touch AF area.(%x)(%s)\n", err, err_attr_name );
+                                       free( err_attr_name );
+                                       err_attr_name = NULL;
                                } else {
-                                       g_print("\n Select camcorder-rotation value \n");
-                                       flush_stdin();
-                                       for ( i = 0; i < (max-min+1); i++) {
-                                               g_print("\t %d. %s\n", i, camcorder_rotate_val[i]);
-                                       }
-                                       scanf("%d",&index);
-                                       bret = camcordertest_set_attr_int("camcorder-rotation", index);
+                                       g_print( "Succeed to set touch AF area.\n" );
                                }
                                break;
 
                        case 'm' : // Setting > Stream callback function
                                g_print("\n Select Stream Callback Function\n");
                                g_print("\t 1. Set Video Stream Callback \n");
-                               g_print("\t 2. Set Audio Stream Callback \n");
-                               g_print("\t 3. Unset Stream Callback \n");
+                               g_print("\t 2. Unset Video Stream Callback \n");
                                flush_stdin();
-                               scanf("%d", &index);
+                               err = scanf("%d", &index);
                                if(index == 1) {
                                        video_stream_cb_cnt = 0;
                                        error_num = mm_camcorder_set_video_stream_callback(hcamcorder->camcorder, (mm_camcorder_video_stream_callback)camcordertest_video_stream_cb, (void*)hcamcorder->camcorder);
@@ -2368,26 +1893,16 @@ static void setting_menu(gchar buf)
                                                g_print("\n Setting Failure\n");
                                        }
                                } else if(index == 2) {
-                                       audio_stream_cb_cnt = 0;
-                                       error_num = mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcamcorder->camcorder);
-                                       if( error_num == MM_ERROR_NONE ) {
-                                               g_print("\n Setting Success\n");
-                                       } else {
-                                               g_print("\n Setting Failure\n");
-                                       }
-                               } else if(index == 3) {
                                        mm_camcorder_set_video_stream_callback(hcamcorder->camcorder, NULL, (void*)hcamcorder->camcorder);
-                                       mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, NULL, (void*)hcamcorder->camcorder);
                                        video_stream_cb_cnt = 0;
                                        audio_stream_cb_cnt = 0;
                                        g_print("\n Unset stream callback success\n");
                                } else {
                                        g_print("\t Invalid input \n");
                                }
-                               //g_print("Not supported !! \n");
                                break;
 
-                       case 'b' : //  back
+                       case 'b' : // back
                                hcamcorder->menu_state = MENU_STATE_MAIN;
                                break;
 
@@ -2395,9 +1910,7 @@ static void setting_menu(gchar buf)
                                g_print("\t Invalid input \n");
                                break;
                }
-       }
-       else 
-       {
+       } else {
                g_print("\t Invalid mode, back to upper menu \n");
                hcamcorder->menu_state = MENU_STATE_MAIN;
        }
@@ -2411,7 +1924,7 @@ static void setting_menu(gchar buf)
  *
  * @return     This function returns TRUE/FALSE
  * @remark
- * @see                
+ * @see
  */
 static gboolean cmd_input(GIOChannel *channel)
 {
@@ -2482,29 +1995,28 @@ static gboolean init(int type)
        int size;
        int preview_format = MM_PIXEL_FORMAT_NV12;
        MMHandleType cam_handle = 0;
-       
+
        char *err_attr_name = NULL;
 
        if (!hcamcorder)
                return FALSE;
-       
+
        if(!hcamcorder->camcorder)
                return FALSE;
 
        cam_handle = (MMHandleType)(hcamcorder->camcorder);
-       
+
        /*================================================================================
-               image mode
+               Video capture mode
        *=================================================================================*/
-       if (type == MODE_IMAGE)
-       {
+       if (type == MODE_VIDEO_CAPTURE) {
                mm_camcorder_get_attributes((MMHandleType)cam_handle, NULL,
                                            MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE, &preview_format,
                                            NULL);
 
                /* camcorder attribute setting */
                err = mm_camcorder_set_attributes( (MMHandleType)cam_handle, &err_attr_name,
-                                                  MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
+                                                  MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO_CAPTURE,
                                                   MMCAM_CAMERA_FORMAT, preview_format,
                                                   "camera-delay-attr-setting", TRUE,
                                                   MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
@@ -2520,73 +2032,40 @@ static gboolean init(int type)
                                                   MMCAM_DISPLAY_RECT_WIDTH, 480,
                                                   MMCAM_DISPLAY_RECT_HEIGHT, 640,
                                                   MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
+                                                  //MMCAM_DISPLAY_FLIP, MM_FLIP_HORIZONTAL,
                                                   MMCAM_DISPLAY_GEOMETRY_METHOD, MM_DISPLAY_METHOD_LETTER_BOX,
                                                   MMCAM_CAPTURE_COUNT, IMAGE_CAPTURE_COUNT_STILL,
                                                   "capture-thumbnail", TRUE,
                                                   "tag-gps-time-stamp", 72815.5436243543,
                                                   "tag-gps-date-stamp", "2010:09:20", 10,
                                                   "tag-gps-processing-method", "GPS NETWORK HYBRID ARE ALL FINE.", 32,
-                                                  "capture-sound-enable", TRUE,
-                                                  NULL );
-
-               if (err != MM_ERROR_NONE) {
-                       warn_msg_t("Init fail. (%s:%x)", err_attr_name, err);
-                       SAFE_FREE (err_attr_name);
-                       goto ERROR;
-               }
-
-               mm_camcorder_set_video_capture_callback(hcamcorder->camcorder, (mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, hcamcorder);
-       }
-       /*================================================================================
-               video mode
-       *=================================================================================*/
-       else if (type == MODE_VIDEO)
-       {
-               mm_camcorder_get_attributes((MMHandleType)cam_handle, NULL,
-                                           MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, &preview_format,
-                                           NULL);
-
-               size = strlen(TARGET_FILENAME_VIDEO)+1;
-
-               /* camcorder attribute setting */
-               err = mm_camcorder_set_attributes( (MMHandleType)cam_handle, &err_attr_name,
-                                                  MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO,
                                                   MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
-                                                  MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AMR,
-                                                  MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_H264,
+                                                  MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
+                                                  MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
+                                                  MMCAM_VIDEO_ENCODER_BITRATE, VIDEO_ENCODE_BITRATE,
                                                   MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
-                                                  MMCAM_CAMERA_FORMAT, preview_format,
                                                   MMCAM_CAMERA_FPS, SRC_VIDEO_FRAME_RATE_30,
                                                   MMCAM_CAMERA_FPS_AUTO, 0,
-                                                  "camera-delay-attr-setting", TRUE,
                                                   MMCAM_CAMERA_ROTATION, MM_VIDEO_INPUT_ROTATION_NONE,
-                                                  MMCAM_AUDIO_SAMPLERATE, AUDIO_SOURCE_SAMPLERATE_AMR,
+                                                  MMCAM_AUDIO_SAMPLERATE, AUDIO_SOURCE_SAMPLERATE_AAC,
                                                   MMCAM_AUDIO_FORMAT, AUDIO_SOURCE_FORMAT,
-                                                  MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AMR,
-                                                  MMCAM_AUDIO_INPUT_ROUTE, MM_AUDIOROUTE_CAPTURE_NORMAL,
-                                                  MMCAM_TAG_ENABLE, 1,
-                                                  MMCAM_TAG_LATITUDE, 37.25796666,
-                                                  MMCAM_TAG_LONGITUDE, 127.05332222,
-                                                  MMCAM_TAG_ALTITUDE, 45.0000,
-                                                  MMCAM_DISPLAY_DEVICE, MM_DISPLAY_DEVICE_MAINLCD,
-                                                  MMCAM_DISPLAY_SURFACE, MM_DISPLAY_SURFACE_X,
-                                                  MMCAM_DISPLAY_RECT_X, DISPLAY_X_0,
-                                                  MMCAM_DISPLAY_RECT_Y, DISPLAY_Y_0,
-                                                  MMCAM_DISPLAY_RECT_WIDTH, 480,
-                                                  MMCAM_DISPLAY_RECT_HEIGHT, 640,
-                                                  MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
-                                                  MMCAM_TARGET_FILENAME, TARGET_FILENAME_VIDEO, size,
-                                                  "capture-sound-enable", TRUE,
+                                                  MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AAC,
+                                                  //MMCAM_AUDIO_DISABLE, TRUE,
+                                                  MMCAM_TARGET_FILENAME, TARGET_FILENAME_VIDEO, strlen(TARGET_FILENAME_VIDEO),
+                                                  //MMCAM_TARGET_TIME_LIMIT, 360000,
+#ifndef _TIZEN_PUBLIC_
+                                                  //MMCAM_TARGET_MAX_SIZE, 102400,
+#endif /* _TIZEN_PUBLIC_ */
                                                   NULL );
 
                if (err != MM_ERROR_NONE) {
-                       fprintf(stderr, "video mode init fail. [%s][%x)", err_attr_name, err);
+                       warn_msg_t("Init fail. (%s:%x)", err_attr_name, err);
                        SAFE_FREE (err_attr_name);
                        goto ERROR;
                }
-//             mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcamcorder->camcorder);
-       }
 
+               mm_camcorder_set_video_capture_callback(hcamcorder->camcorder, (mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, hcamcorder);
+       }
        /*================================================================================
                Audio mode
        *=================================================================================*/
@@ -2602,20 +2081,24 @@ static gboolean init(int type)
                                                   MMCAM_FILE_FORMAT, MM_FILE_FORMAT_AMR,
                                                   MMCAM_AUDIO_SAMPLERATE, AUDIO_SOURCE_SAMPLERATE_AMR,
                                                   MMCAM_AUDIO_FORMAT, AUDIO_SOURCE_FORMAT,
-                                                  MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AMR,
-                                                  MMCAM_AUDIO_INPUT_ROUTE, MM_AUDIOROUTE_CAPTURE_NORMAL,
+                                                  MMCAM_AUDIO_CHANNEL, AUDIO_SOURCE_CHANNEL_AAC,
                                                   MMCAM_TARGET_FILENAME, TARGET_FILENAME_AUDIO, size,
                                                   MMCAM_TARGET_TIME_LIMIT, 360000,
+                                                  MMCAM_AUDIO_ENCODER_BITRATE, 12200,
+#ifndef _TIZEN_PUBLIC_
+                                                  MMCAM_TARGET_MAX_SIZE, 300,
+#endif /* _TIZEN_PUBLIC_ */
                                                   NULL);
        
-               if (err < 0) 
-               {
+               if (err < 0) {
                        warn_msg_t("Init fail. (%s:%x)", err_attr_name, err);
                        SAFE_FREE (err_attr_name);
                        goto ERROR;
                }
 
-//             mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcamcorder->camcorder);
+#ifdef USE_AUDIO_STREAM_CB
+               mm_camcorder_set_audio_stream_callback(hcamcorder->camcorder, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcamcorder->camcorder);
+#endif /* USE_AUDIO_STREAM_CB */
        }
 
        debug_msg_t("Init DONE.");
@@ -2679,57 +2162,41 @@ static gboolean msg_callback(int message, void *msg_param, void *user_param)
                        break;
 
                case MM_MESSAGE_CAMCORDER_CAPTURED:
-               {
-                       if (hcamcorder->mode == MODE_IMAGE)
-                       {
-                               time_msg_t("Stillshot capture  : %12.6lf s", g_timer_elapsed(timer, NULL));     
-                               
-                               g_print("*******************************************************\n");
-                               g_print("[Camcorder Testsuite] Camcorder Stillshot Captured!!\n");
-                               g_print("*******************************************************\n");
-
-                               if (hcamcorder->isMultishot)            //multishot
-                               {
-                                       g_print("[CamcorderApp] Camcorder Captured(Capture Count=%d)\n", param->code);
-                                       
-                                       if (param->code >= multishot_num)
-                                       {
-                                               get_me_out();
-//                                             g_timeout_add (100, (GSourceFunc)get_me_out, NULL);
-//                                             hcamcorder->isMultishot = FALSE;
-                                       }
-                               }
-                               else            //singleshot
-                               {
+                       time_msg_t("Stillshot capture  : %12.6lf s", g_timer_elapsed(timer, NULL));
+                       if (hcamcorder->isMultishot) {
+                               //g_print("[CamcorderApp] Camcorder Captured(Capture Count=%d)\n", param->code);
+                               if (param->code >= multishot_num) {
                                        get_me_out();
-//                                     g_timeout_add (1000, (GSourceFunc)get_me_out, NULL);
+//                                     g_timeout_add (100, (GSourceFunc)get_me_out, NULL);
+//                                     hcamcorder->isMultishot = FALSE;
                                }
-
+                       } else {
+                               get_me_out();
+//                             g_timeout_add (1000, (GSourceFunc)get_me_out, NULL);
                        }
-                       else
-                       {
-                               MMCamRecordingReport* report ;
-                               
-                               time_msg_t("Recording commit time : %12.6lf s", g_timer_elapsed(timer, NULL));
+                       break;
+               case MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED:
+               case MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED:
+               {
+                       MMCamRecordingReport* report ;
 
-                               if (param)
-                                       report = (MMCamRecordingReport*)(param->data);
-                               else
-                                       return FALSE;
+                       time_msg_t("Recording commit time : %12.6lf s", g_timer_elapsed(timer, NULL));
 
-                               if( report != NULL )
-                               {
-                                       g_print("*******************************************************\n");
-                                       g_print("[Camcorder Testsuite] Camcorder Captured(filename=%s)\n", report->recording_filename);
-                                       g_print("*******************************************************\n");
+                       if (param) {
+                               report = (MMCamRecordingReport*)(param->data);
+                       } else {
+                               return FALSE;
+                       }
 
-                                       SAFE_FREE (report->recording_filename);
-                                       SAFE_FREE (report);
-                               }
-                               else
-                               {
-                                       g_print( "[Camcorder Testsuite] report is NULL.\n" );
-                               }
+                       if (report != NULL) {
+                               g_print("*******************************************************\n");
+                               g_print("[Camcorder Testsuite] Camcorder Captured(filename=%s)\n", report->recording_filename);
+                               g_print("*******************************************************\n");
+
+                               SAFE_FREE (report->recording_filename);
+                               SAFE_FREE (report);
+                       } else {
+                               g_print( "[Camcorder Testsuite] report is NULL.\n" );
                        }
                }
                        break;
@@ -2740,18 +2207,19 @@ static gboolean msg_callback(int message, void *msg_param, void *user_param)
                        break;
                case MM_MESSAGE_CAMCORDER_RECORDING_STATUS:
                {
-                       unsigned int elapsed;
+                       unsigned long long elapsed;
                        elapsed = param->recording_status.elapsed / 1000;
                        if (hcamcorder->elapsed_time != elapsed) {
-                               unsigned int temp_time;
-                               int hour, minute, second;
+                               unsigned long temp_time;
+                               unsigned long long hour, minute, second;
                                hcamcorder->elapsed_time = elapsed;
                                temp_time = elapsed;
                                hour = temp_time / 3600;
                                temp_time = elapsed % 3600;
                                minute = temp_time / 60;
                                second = temp_time % 60;
-                               debug_msg_t("Current Time - %d:%d:%d", hour, minute, second);
+                               debug_msg_t("Current Time - %lld:%lld:%lld, remained %lld ms, filesize %lld KB",
+                                            hour, minute, second, param->recording_status.remained_time, param->recording_status.filesize);
                        }
                }
                        break;                  
@@ -2790,6 +2258,47 @@ static gboolean msg_callback(int message, void *msg_param, void *user_param)
                        g_print( "Focus State changed. State:[%d]\n", param->code );
                }
                        break;
+               case MM_MESSAGE_CAMCORDER_FACE_DETECT_INFO:
+               {
+                       static int info_count = 0;
+                       MMCamFaceDetectInfo *cam_fd_info = NULL;
+
+                       cam_fd_info = (MMCamFaceDetectInfo *)(param->data);
+
+                       if (cam_fd_info) {
+                               int i = 0;
+
+                               g_print("\tface detect num %d, pointer %p\n", cam_fd_info->num_of_faces, cam_fd_info);
+
+                               for (i = 0 ; i < cam_fd_info->num_of_faces ; i++) {
+                                       g_print("\t\t[%2d][score %d] position %d,%d %dx%d\n",
+                                               cam_fd_info->face_info[i].id,
+                                               cam_fd_info->face_info[i].score,
+                                               cam_fd_info->face_info[i].rect.x,
+                                               cam_fd_info->face_info[i].rect.y,
+                                               cam_fd_info->face_info[i].rect.width,
+                                               cam_fd_info->face_info[i].rect.height);
+                               }
+
+                               if (info_count == 0) {
+                                       mm_camcorder_set_attributes(hcamcorder->camcorder, NULL,
+                                                                   MMCAM_CAMERA_FACE_ZOOM_MODE, MM_CAMCORDER_FACE_ZOOM_MODE_ON,
+                                                                   MMCAM_CAMERA_FACE_ZOOM_X, cam_fd_info->face_info[0].rect.x + (cam_fd_info->face_info[0].rect.width>>1),
+                                                                   MMCAM_CAMERA_FACE_ZOOM_Y, cam_fd_info->face_info[0].rect.y + (cam_fd_info->face_info[0].rect.height>>1),
+                                                                   MMCAM_CAMERA_FACE_ZOOM_LEVEL, 0,
+                                                                   NULL);
+                                       info_count = 1;
+                                       g_print("\n\t##### START FACE ZOOM [%d,%d] #####\n", cam_fd_info->face_info[0].rect.x, cam_fd_info->face_info[0].rect.y);
+                               } else if (info_count++ == 90) {
+                                       mm_camcorder_set_attributes(hcamcorder->camcorder, NULL,
+                                                                   MMCAM_CAMERA_FACE_ZOOM_MODE, MM_CAMCORDER_FACE_ZOOM_MODE_OFF,
+                                                                   NULL);
+                                       g_print("\n\t##### STOP FACE ZOOM #####\n");
+                                       info_count = -60;
+                               }
+                       }
+               }
+                       break;
                default:
                        g_print("Message %x received\n", message);
                        break;
@@ -2800,16 +2309,16 @@ static gboolean msg_callback(int message, void *msg_param, void *user_param)
 
 static gboolean init_handle()
 {
-       hcamcorder->mode = MODE_IMAGE;                                           /* image(capture)/video(recording) mode */
+       hcamcorder->mode = MODE_VIDEO_CAPTURE;  /* image(capture)/video(recording) mode */
        hcamcorder->isMultishot =  FALSE;
-       hcamcorder->stillshot_count = 0;                        /* total stillshot count */ 
-       hcamcorder->multishot_count = 0;                        /* total multishot count */ 
-       hcamcorder->stillshot_filename = STILL_CAPTURE_FILE_PATH_NAME;          /* stored filename of  stillshot  */ 
-       hcamcorder->multishot_filename = MULTI_CAPTURE_FILE_PATH_NAME;          /* stored filename of  multishot  */ 
+       hcamcorder->stillshot_count = 0;        /* total stillshot count */
+       hcamcorder->multishot_count = 0;        /* total multishot count */
+       hcamcorder->stillshot_filename = STILL_CAPTURE_FILE_PATH_NAME;  /* stored filename of  stillshot  */ 
+       hcamcorder->multishot_filename = MULTI_CAPTURE_FILE_PATH_NAME;  /* stored filename of  multishot  */ 
        hcamcorder->menu_state = MENU_STATE_MAIN;
-       hcamcorder->isMute = FALSE;     
+       hcamcorder->isMute = FALSE;
        hcamcorder->elapsed_time = 0;
-       hcamcorder->fps = SRC_VIDEO_FRAME_RATE_15; //SRC_VIDEO_FRAME_RATE_30;
+       hcamcorder->fps = SRC_VIDEO_FRAME_RATE_15; /*SRC_VIDEO_FRAME_RATE_30;*/
        multishot_num = IMAGE_CAPTURE_COUNT_MULTI;
 
        return TRUE;
@@ -2826,8 +2335,12 @@ static gboolean init_handle()
 static gboolean mode_change()
 {
        int err = MM_ERROR_NONE;
-       int state;
+       int state = MM_CAMCORDER_STATE_NONE;
+       int name_size = 0;
+       int device_count = 0;
+       int facing_direction = 0;
        char media_type = '\0';
+       char *evassink_name = NULL;
        bool check= FALSE;
 
        debug_msg_t("MMCamcorder State : %d", mmcamcorder_state);
@@ -2889,57 +2402,45 @@ static gboolean mode_change()
                g_print("\n\t=======================================\n");
                g_print("\t   MM_CAMCORDER_TESTSUIT\n");
                g_print("\t=======================================\n");
-               g_print("\t   '1' Image Capture - Front Camera\n");
-               g_print("\t   '2' Image Capture - Rear Camera\n");
-               g_print("\t   '3' Video Recording - Front Camera\n");
-               g_print("\t   '4' Video Recording - Rear Camera\n");
-               g_print("\t   '5' Audio Recording\n");
+               g_print("\t   '1' Video Capture - Front Camera\n");
+               g_print("\t   '2' Video Capture - Rear Camera\n");
+               g_print("\t   '3' Audio Recording\n");
                g_print("\t   'q' Exit\n");
                g_print("\t=======================================\n");
 
                g_print("\t  Enter the media type:\n\t");       
 
-               while ((media_type=getchar()) == '\n');
+               err = scanf("%c", &media_type);
                
-               switch(media_type) {
-                       case '1':
-                               hcamcorder->mode= MODE_IMAGE;
-                               cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA1;
-                               check = TRUE;
-                               break;
-                       case '2':
-                               hcamcorder->mode= MODE_IMAGE;
-                               cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
-                               check = TRUE;
-                               break;
-                       case '3':
-                               hcamcorder->mode= MODE_VIDEO;
-                               cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA1;
-                               check = TRUE;
-                               break;
-                       case '4':
-                               hcamcorder->mode= MODE_VIDEO;
-                               cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
-                               check = TRUE;
-                               break;
-                       case '5':
-                               hcamcorder->mode= MODE_AUDIO;
-                               cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
-                               check = TRUE;
-                               break;
-                       case 'q':
-                               g_print("\t Quit Camcorder Testsuite!!\n");
-                               hcamcorder->mode = -1;
-                               if(g_main_loop_is_running(g_loop)) {
-                                       g_main_loop_quit(g_loop);
-                               }
-                               return FALSE;
-                       default:
-                               g_print("\t Invalid media type(%d)\n", media_type);
-                               continue;
+               switch (media_type) {
+               case '1':
+                       hcamcorder->mode= MODE_VIDEO_CAPTURE;
+                       cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA1;
+                       check = TRUE;
+                       break;
+               case '2':
+                       hcamcorder->mode= MODE_VIDEO_CAPTURE;
+                       cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
+                       check = TRUE;
+                       break;
+               case '3':
+                       hcamcorder->mode= MODE_AUDIO;
+                       cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
+                       check = TRUE;
+                       break;
+               case 'q':
+                       g_print("\t Quit Camcorder Testsuite!!\n");
+                       hcamcorder->mode = -1;
+                       if(g_main_loop_is_running(g_loop)) {
+                               g_main_loop_quit(g_loop);
+                       }
+                       return FALSE;
+               default:
+                       g_print("\t Invalid media type(%d)\n", media_type);
+                       continue;
                }
        }
-       
+
        debug_msg_t("mm_camcorder_create");
        g_get_current_time(&previous);
        g_timer_reset(timer);
@@ -2954,6 +2455,15 @@ static gboolean mode_change()
                mmcamcorder_state = MM_CAMCORDER_STATE_NULL;
        }
 
+       /* get evassink name */
+       mm_camcorder_get_attributes(hcamcorder->camcorder, NULL,
+                                   MMCAM_DISPLAY_EVAS_SURFACE_SINK, &evassink_name, &name_size,
+                                   MMCAM_CAMERA_DEVICE_COUNT, &device_count,
+                                   MMCAM_CAMERA_FACING_DIRECTION, &facing_direction,
+                                   NULL);
+       debug_msg_t("evassink name[%s], device count[%d], facing direction[%d]",
+                   evassink_name, device_count, facing_direction);
+
        mm_camcorder_set_message_callback(hcamcorder->camcorder, (MMMessageCallback)msg_callback, hcamcorder);
 
        if (!init(hcamcorder->mode)) {