Fix Svace issue
[platform/core/multimedia/libmm-camcorder.git] / src / include / mm_camcorder.h
1 /*
2  * libmm-camcorder
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Jeongmo Yang <jm80.yang@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 /**
23         @addtogroup CAMCORDER
24         @{
25
26         @par
27         This part describes the APIs with respect to Multimedia Camcorder.
28         Camcorder is for recording audio and video from audio and video input devices, capturing
29         still image from video input device, and audio recording from audio input
30         device.
31
32         @par
33         Camcorder can be reached by calling functions as shown in the following
34         figure, "The State of Camcorder".
35
36         @par
37         @image html     camcorder_state.png     "The State of Camcorder"        width=12cm
38         @image latex    camcorder_state.png     "The State of Camcorder"        width=12cm
39
40         @par
41         Between each states there is intermediate state, and in this state,
42         any function call which change the camcorder state will be failed.
43
44         @par
45         Recording state and paused state exists when the mode of camcorder is
46         video-capture or audio-capture mode. In case of image-capture mode, CAPTURING state will
47         exist.
48
49         @par
50 <div>
51 <table>
52         <tr>
53                 <td>FUNCTION</td>
54                 <td>PRE-STATE</td>
55                 <td>POST-STATE</td>
56                 <td>SYNC TYPE</td>
57         </tr>
58         <tr>
59                 <td>mm_camcorder_create()</td>
60                 <td>NONE</td>
61                 <td>NULL</td>
62                 <td>SYNC</td>
63         </tr>
64         <tr>
65                 <td>mm_camcorder_destroy()</td>
66                 <td>NULL</td>
67                 <td>NONE</td>
68                 <td>SYNC</td>
69         </tr>
70         <tr>
71                 <td>mm_camcorder_realize()</td>
72                 <td>NULL</td>
73                 <td>READY</td>
74                 <td>SYNC</td>
75         </tr>
76         <tr>
77                 <td>mm_camcorder_unrealize()</td>
78                 <td>READY</td>
79                 <td>NULL</td>
80                 <td>SYNC</td>
81         </tr>
82         <tr>
83                 <td>mm_camcorder_start()</td>
84                 <td>READY</td>
85                 <td>PREPARED</td>
86                 <td>SYNC</td>
87         </tr>
88         <tr>
89                 <td>mm_camcorder_stop()</td>
90                 <td>PREPARED</td>
91                 <td>READY</td>
92                 <td>SYNC</td>
93         </tr>
94         <tr>
95                 <td>mm_camcorder_capture_start()</td>
96                 <td>PREPARED</td>
97                 <td>CAPTURING</td>
98                 <td>SYNC</td>
99         </tr>
100         <tr>
101                 <td>mm_camcorder_capture_stop()</td>
102                 <td>CAPTURING</td>
103                 <td>PREPARED</td>
104                 <td>SYNC</td>
105         </tr>
106         <tr>
107                 <td>mm_camcorder_record()</td>
108                 <td>PREPARED/PAUSED</td>
109                 <td>RECORDING</td>
110                 <td>SYNC</td>
111         </tr>
112         <tr>
113                 <td>mm_camcorder_pause()</td>
114                 <td>RECORDING</td>
115                 <td>PAUSED</td>
116                 <td>SYNC</td>
117         </tr>
118         <tr>
119                 <td>mm_camcorder_commit()</td>
120                 <td>RECORDING/PAUSED</td>
121                 <td>PREPARED</td>
122                 <td>SYNC</td>
123         </tr>
124         <tr>
125                 <td>mm_camcorder_cancel()</td>
126                 <td>RECORDING/PAUSED</td>
127                 <td>PREPARED</td>
128                 <td>SYNC</td>
129         </tr>
130         <tr>
131                 <td>mm_camcorder_set_message_callback()</td>
132                 <td>N/A</td>
133                 <td>N/A</td>
134                 <td>SYNC</td>
135         </tr>
136         <tr>
137                 <td>mm_camcorder_set_video_stream_callback()</td>
138                 <td>N/A</td>
139                 <td>N/A</td>
140                 <td>SYNC</td>
141         </tr>
142         <tr>
143                 <td>mm_camcorder_set_video_capture_callback()</td>
144                 <td>N/A</td>
145                 <td>N/A</td>
146                 <td>SYNC</td>
147         </tr>
148         <tr>
149                 <td>mm_camcorder_get_state()</td>
150                 <td>N/A</td>
151                 <td>N/A</td>
152                 <td>SYNC</td>
153         </tr>
154         <tr>
155                 <td>mm_camcorder_get_attributes()</td>
156                 <td>N/A</td>
157                 <td>N/A</td>
158                 <td>SYNC</td>
159         </tr>
160         <tr>
161                 <td>mm_camcorder_set_attributes()</td>
162                 <td>N/A</td>
163                 <td>N/A</td>
164                 <td>SYNC</td>
165         </tr>
166         <tr>
167                 <td>mm_camcorder_get_attribute_info()</td>
168                 <td>N/A</td>
169                 <td>N/A</td>
170                 <td>SYNC</td>
171         </tr>
172         <tr>
173                 <td>mm_camcorder_init_focusing()</td>
174                 <td>N/A</td>
175                 <td>N/A</td>
176                 <td>SYNC</td>
177         </tr>
178         <tr>
179                 <td>mm_camcorder_start_focusing()</td>
180                 <td>N/A</td>
181                 <td>N/A</td>
182                 <td>SYNC</td>
183         </tr>
184         <tr>
185                 <td>mm_camcorder_stop_focusing()</td>
186                 <td>N/A</td>
187                 <td>N/A</td>
188                 <td>SYNC</td>
189         </tr>
190 </table>
191 </div>
192
193         @par
194         * Attribute @n
195         Attribute system is an interface to operate camcorder. Depending on each attribute, camcorder behaves differently.
196         Attribute system provides get/set functions. Setting proper attributes, a user can control camcorder as he want. (mm_camcorder_set_attributes())
197         Also, a user can comprehend current status of the camcorder, calling getter function(mm_camcorder_get_attributes()).
198         Beware, arguments of mm_camcorder_set_attributes() and mm_camcorder_get_attributes() should be finished with 'NULL'.
199         This is a rule for the variable argument.
200         @par
201         Besides its value, each Attribute also has 'type' and 'validity type'. 'type' describes variable type that the attribute can get.
202         If you input a value that has wrong type, camcorder will not work properly or be crashed. 'validity' describes array or
203         range of values that are able to set to the attribute. 'validity type' defines type of the 'validity'.
204         @par
205         A user can retrieve these values using mm_camcorder_get_attribute_info().
206         Following tables have 'Attribute name', 'Attribute macro', 'Type', and 'Validity type'. You can refer '#MMCamAttrsType' and '#MMCamAttrsValidType'
207         for discerning 'Type' and 'Validity type'.
208
209
210         @par
211         Following are the attributes which should be set before initialization (#mm_camcorder_realize):
212
213         @par
214 <div>
215 <table>
216         <tr>
217                 <td><center><b>Attribute</b></center></td>
218                 <td><center><b>Description</b></center></td>
219         </tr>
220         <tr>
221                 <td>#MMCAM_MODE</td>
222                 <td>Mode of camcorder ( still/video/audio )</td>
223         </tr>
224         <tr>
225                 <td>#MMCAM_AUDIO_DEVICE</td>
226                 <td>Audio device ID for capturing audio stream</td>
227         </tr>
228         <tr>
229                 <td>#MMCAM_CAMERA_DEVICE_COUNT</td>
230                 <td>Video device count</td>
231         </tr>
232         <tr>
233                 <td>#MMCAM_AUDIO_ENCODER</td>
234                 <td>Audio codec for encoding audio stream</td>
235         </tr>
236         <tr>
237                 <td>#MMCAM_VIDEO_ENCODER</td>
238                 <td>Video codec for encoding video stream</td>
239         </tr>
240         <tr>
241                 <td>#MMCAM_IMAGE_ENCODER</td>
242                 <td>Image codec for capturing still-image</td>
243         </tr>
244         <tr>
245                 <td>#MMCAM_FILE_FORMAT</td>
246                 <td>File format for recording media stream</td>
247         </tr>
248         <tr>
249                 <td>#MMCAM_AUDIO_SAMPLERATE</td>
250                 <td>Sampling rate of audio stream ( This is an integer field )</td>
251         </tr>
252         <tr>
253                 <td>#MMCAM_AUDIO_FORMAT</td>
254                 <td>Audio format of each sample</td>
255         </tr>
256         <tr>
257                 <td>#MMCAM_AUDIO_CHANNEL</td>
258                 <td>Channels of each sample ( This is an integer field )</td>
259         </tr>
260         <tr>
261                 <td>#MMCAM_AUDIO_INPUT_ROUTE(deprecated)</td>
262                 <td>Set audio input route</td>
263         </tr>
264         <tr>
265                 <td>#MMCAM_CAMERA_FORMAT</td>
266                 <td>Format of video stream. This is an integer field</td>
267         </tr>
268         <tr>
269                 <td>#MMCAM_CAMERA_FPS</td>
270                 <td>Frames per second ( This is an integer field )</td>
271         </tr>
272         <tr>
273                 <td>#MMCAM_CAMERA_WIDTH</td>
274                 <td>Width of input video stream</td>
275         </tr>
276         <tr>
277                 <td>#MMCAM_CAMERA_HEIGHT</td>
278                 <td>Height of input video stream</td>
279         </tr>
280         <tr>
281                 <td>#MMCAM_CAMERA_FPS_AUTO</td>
282                 <td>FPS Auto. When you set true to this attribute, FPS will vary depending on the amount of the light.</td>
283         </tr>
284         <tr>
285                 <td>#MMCAM_DISPLAY_HANDLE</td>
286                 <td>Pointer of display buffer or ID of xwindow</td>
287         </tr>
288         <tr>
289                 <td>#MMCAM_DISPLAY_DEVICE</td>
290                 <td>Device of display</td>
291         </tr>
292         <tr>
293                 <td>#MMCAM_DISPLAY_SURFACE</td>
294                 <td>Surface of display</td>
295         </tr>
296         <tr>
297                 <td>#MMCAM_DISPLAY_SOURCE_X</td>
298                 <td>X position of source rectangle. When you want to crop the source, you can set the area with this value.</td>
299         </tr>
300         <tr>
301                 <td>#MMCAM_DISPLAY_SOURCE_Y</td>
302                 <td>Y position of source rectangle. When you want to crop the source, you can set the area with this value.</td>
303         </tr>
304         <tr>
305                 <td>#MMCAM_DISPLAY_SOURCE_WIDTH</td>
306                 <td>Width of source rectangle. When you want to crop the source, you can set the area with this value.</td>
307         </tr>
308         <tr>
309                 <td>#MMCAM_DISPLAY_SOURCE_HEIGHT</td>
310                 <td>Height of source rectangle. When you want to crop the source, you can set the area with this value.</td>
311         </tr>
312         <tr>
313                 <td>#MMCAM_DISPLAY_ROTATION</td>
314                 <td>Rotation of display</td>
315         </tr>
316         <tr>
317                 <td>#MMCAM_DISPLAY_VISIBLE</td>
318                 <td>Visible of display</td>
319         </tr>
320         <tr>
321                 <td>#MMCAM_DISPLAY_SCALE</td>
322                 <td>A scale of displayed image</td>
323         </tr>
324         <tr>
325                 <td>#MMCAM_DISPLAY_GEOMETRY_METHOD</td>
326                 <td>A method that describes a form of geometry for display</td>
327         </tr>
328 </table>
329 </div>
330
331         @par
332         Following are the attributes which should be set before recording (mm_camcorder_record()):
333
334         @par
335 <div>
336 <table>
337         <tr>
338                 <td><center><b>Attribute</b></center></td>
339                 <td><center><b>Description</b></center></td>
340         </tr>
341         <tr>
342                 <td>#MMCAM_AUDIO_ENCODER_BITRATE</td>
343                 <td>Bitrate of Audio Encoder</td>
344         </tr>
345         <tr>
346                 <td>#MMCAM_VIDEO_ENCODER_BITRATE</td>
347                 <td>Bitrate of Video Encoder</td>
348         </tr>
349         <tr>
350                 <td>#MMCAM_TARGET_FILENAME</td>
351                 <td>Target filename. Only used in Audio/Video recording. This is not used for capturing.</td>
352         </tr>
353         <tr>
354                 <td>#MMCAM_TARGET_MAX_SIZE</td>
355                 <td>Maximum size of recording file(Kbyte). If the size of file reaches this value.</td>
356         </tr>
357         <tr>
358                 <td>#MMCAM_TARGET_TIME_LIMIT</td>
359                 <td>Time limit of recording file. If the elapsed time of recording reaches this value.</td>
360         </tr>
361 </table>
362 </div>
363
364         @par
365         Following are the attributes which should be set before capturing (mm_camcorder_capture_start()):
366
367         @par
368 <div>
369 <table>
370         <tr>
371                 <td><center><b>Attribute</b></center></td>
372                 <td><center><b>Description</b></center></td>
373         </tr>
374         <tr>
375                 <td>#MMCAM_IMAGE_ENCODER_QUALITY</td>
376                 <td>Encoding quality of Image codec</td>
377         </tr>
378         <tr>
379                 <td>#MMCAM_CAPTURE_FORMAT</td>
380                 <td>Pixel format that you want to capture</td>
381         </tr>
382         <tr>
383                 <td>#MMCAM_CAPTURE_WIDTH</td>
384                 <td>Width of the image that you want to capture</td>
385         </tr>
386         <tr>
387                 <td>#MMCAM_CAPTURE_HEIGHT</td>
388                 <td>Height of the image that you want to capture</td>
389         </tr>
390         <tr>
391                 <td>#MMCAM_CAPTURE_COUNT</td>
392                 <td>Total count of capturing</td>
393         </tr>
394         <tr>
395                 <td>#MMCAM_CAPTURE_INTERVAL</td>
396                 <td>Interval between each capturing on Multishot ( MMCAM_CAPTURE_COUNT > 1 )</td>
397         </tr>
398 </table>
399 </div>
400
401         @par
402         Following are the attributes which can be set anytime:
403
404         @par
405 <div>
406 <table>
407         <tr>
408                 <td><center><b>Attribute</b></center></td>
409                 <td><center><b>Description</b></center></td>
410         </tr>
411         <tr>
412                 <td>#MMCAM_AUDIO_VOLUME</td>
413                 <td>Input volume of audio source ( double value )</td>
414         </tr>
415         <tr>
416                 <td>#MMCAM_CAMERA_DIGITAL_ZOOM</td>
417                 <td>Digital zoom level</td>
418         </tr>
419         <tr>
420                 <td>#MMCAM_CAMERA_OPTICAL_ZOOM</td>
421                 <td>Optical zoom level</td>
422         </tr>
423         <tr>
424                 <td>#MMCAM_CAMERA_FOCUS_MODE</td>
425                 <td>Focus mode</td>
426         </tr>
427         <tr>
428                 <td>#MMCAM_CAMERA_AF_SCAN_RANGE</td>
429                 <td>AF Scan range</td>
430         </tr>
431         <tr>
432                 <td>#MMCAM_CAMERA_AF_TOUCH_X</td>
433                 <td>X coordinate of touching position</td>
434         </tr>
435         <tr>
436                 <td>#MMCAM_CAMERA_AF_TOUCH_Y</td>
437                 <td>Y coordinate of touching position</td>
438         </tr>
439         <tr>
440                 <td>#MMCAM_CAMERA_AF_TOUCH_WIDTH</td>
441                 <td>Width of touching area</td>
442         </tr>
443         <tr>
444                 <td>#MMCAM_CAMERA_AF_TOUCH_HEIGHT</td>
445                 <td>Height of touching area</td>
446         </tr>
447         <tr>
448                 <td>#MMCAM_CAMERA_EXPOSURE_MODE</td>
449                 <td>Exposure mode</td>
450         </tr>
451         <tr>
452                 <td>#MMCAM_CAMERA_EXPOSURE_VALUE</td>
453                 <td>Exposure value</td>
454         </tr>
455         <tr>
456                 <td>#MMCAM_CAMERA_F_NUMBER</td>
457                 <td>f number of camera</td>
458         </tr>
459         <tr>
460                 <td>#MMCAM_CAMERA_SHUTTER_SPEED</td>
461                 <td>Shutter speed</td>
462         </tr>
463         <tr>
464                 <td>#MMCAM_CAMERA_ISO</td>
465                 <td>ISO of capturing image</td>
466         </tr>
467         <tr>
468                 <td>#MMCAM_CAMERA_WDR</td>
469                 <td>Wide dynamic range</td>
470         </tr>
471         <tr>
472                 <td>#MMCAM_CAMERA_ANTI_HANDSHAKE</td>
473                 <td>Anti Handshake</td>
474         </tr>
475         <tr>
476                 <td>#MMCAM_CAMERA_FOCAL_LENGTH</td>
477                 <td>Focal length of camera lens</td>
478         </tr>
479         <tr>
480                 <td>#MMCAM_FILTER_BRIGHTNESS</td>
481                 <td>Brightness level</td>
482         </tr>
483         <tr>
484                 <td>#MMCAM_FILTER_CONTRAST</td>
485                 <td>Contrast level</td>
486         </tr>
487         <tr>
488                 <td>#MMCAM_FILTER_WB</td>
489                 <td>White balance</td>
490         </tr>
491         <tr>
492                 <td>#MMCAM_FILTER_COLOR_TONE</td>
493                 <td>Color tone (Color effect)</td>
494         </tr>
495         <tr>
496                 <td>#MMCAM_FILTER_SCENE_MODE</td>
497                 <td>Scene mode (Program mode)</td>
498         </tr>
499         <tr>
500                 <td>#MMCAM_FILTER_SATURATION</td>
501                 <td>Saturation level</td>
502         </tr>
503         <tr>
504                 <td>#MMCAM_FILTER_HUE</td>
505                 <td>Hue level</td>
506         </tr>
507         <tr>
508                 <td>#MMCAM_FILTER_SHARPNESS</td>
509                 <td>Sharpness level</td>
510         </tr>
511         <tr>
512                 <td>#MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT</td>
513                 <td>Set this as true when you want to stop multishot immediately</td>
514         </tr>
515         <tr>
516                 <td>#MMCAM_DISPLAY_RECT_X</td>
517                 <td>X position of display rectangle (This is only available when MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI)</td>
518         </tr>
519         <tr>
520                 <td>#MMCAM_DISPLAY_RECT_Y</td>
521                 <td>Y position of display rectangle (This is only available when MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI)</td>
522         </tr>
523         <tr>
524                 <td>#MMCAM_DISPLAY_RECT_WIDTH</td>
525                 <td>Width of display rectangle (This is only available when MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI)</td>
526         </tr>
527         <tr>
528                 <td>#MMCAM_DISPLAY_RECT_HEIGHT</td>
529                 <td>Height of display rectangle (This is only available when MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI)</td>
530         </tr>
531         <tr>
532                 <td>#MMCAM_TAG_ENABLE</td>
533                 <td>Enable to write tags (If this value is FALSE, none of tag information will be written to captured file)</td>
534         </tr>
535         <tr>
536                 <td>#MMCAM_TAG_IMAGE_DESCRIPTION</td>
537                 <td>Image description</td>
538         </tr>
539         <tr>
540                 <td>#MMCAM_TAG_ORIENTATION</td>
541                 <td>Orientation of captured image</td>
542         </tr>
543         <tr>
544                 <td>#MMCAM_TAG_VIDEO_ORIENTATION</td>
545                 <td>Orientation of encoded video</td>
546         </tr>
547         <tr>
548                 <td>#MMCAM_TAG_SOFTWARE</td>
549                 <td>software name and version</td>
550         </tr>
551         <tr>
552                 <td>#MMCAM_TAG_LATITUDE</td>
553                 <td>Latitude of captured position (GPS information)</td>
554         </tr>
555         <tr>
556                 <td>#MMCAM_TAG_LONGITUDE</td>
557                 <td>Longitude of captured position (GPS information)</td>
558         </tr>
559         <tr>
560                 <td>#MMCAM_TAG_ALTITUDE</td>
561                 <td>Altitude of captured position (GPS information)</td>
562         </tr>
563         <tr>
564                 <td>#MMCAM_STROBE_CONTROL</td>
565                 <td>Strobe control</td>
566         </tr>
567         <tr>
568                 <td>#MMCAM_STROBE_MODE</td>
569                 <td>Operation Mode of strobe</td>
570         </tr>
571         <tr>
572                 <td>#MMCAM_DETECT_MODE</td>
573                 <td>Detection mode</td>
574         </tr>
575         <tr>
576                 <td>#MMCAM_DETECT_NUMBER</td>
577                 <td>Total number of detected object</td>
578         </tr>
579         <tr>
580                 <td>#MMCAM_DETECT_FOCUS_SELECT</td>
581                 <td>Select one of detected objects</td>
582         </tr>
583 </table>
584 </div>
585  */
586
587
588
589 #ifndef __MM_CAMCORDER_H__
590 #define __MM_CAMCORDER_H__
591
592
593 /*=======================================================================================
594 | INCLUDE FILES                                                                         |
595 ========================================================================================*/
596 #include <glib.h>
597
598 #include <mm_types.h>
599 #include <mm_error.h>
600 #include <mm_message.h>
601
602 #ifdef __cplusplus
603 extern "C" {
604 #endif
605
606 /*=======================================================================================
607 | GLOBAL DEFINITIONS AND DECLARATIONS FOR CAMCORDER                                     |
608 ========================================================================================*/
609 #define MM_CAMCORDER_EXTRA_PREVIEW_STREAM_MAX   10          /**< The maximum number of extra preview stream */
610
611 /*=======================================================================================
612 | MACRO DEFINITIONS                                                                     |
613 ========================================================================================*/
614 /**
615  * Get numerator. Definition for fraction setting, such as MMCAM_CAMERA_SHUTTER_SPEED and MMCAM_CAMERA_EXPOSURE_VALUE.
616  */
617 #define MM_CAMCORDER_GET_NUMERATOR(x)                                   ((int)(((int)(x) >> 16) & 0xFFFF))
618 /**
619  * Get denominator. Definition for fraction setting, such as MMCAM_CAMERA_SHUTTER_SPEED and MMCAM_CAMERA_EXPOSURE_VALUE.
620  */
621 #define MM_CAMCORDER_GET_DENOMINATOR(x)                                 ((int)(((int)(x)) & 0xFFFF))
622 /**
623  * Set fraction value. Definition for fraction setting, such as MMCAM_CAMERA_SHUTTER_SPEED and MMCAM_CAMERA_EXPOSURE_VALUE.
624  */
625 #define MM_CAMCORDER_SET_FRACTION(numerator, denominator)       ((int)((((int)(numerator)) << 16) | (int)(denominator)))
626
627 /* Attributes Macros */
628 /**
629  * Mode of camcorder (still/video/audio).
630  * @see         MMCamcorderModeType
631  */
632 #define MMCAM_MODE                              "mode"
633
634 /**
635  * Audio device ID for capturing audio stream.
636  * @see         MMAudioDeviceType (in mm_types.h)
637  */
638 #define MMCAM_AUDIO_DEVICE                      "audio-device"
639
640 /**
641  * Video device count.
642  */
643 #define MMCAM_CAMERA_DEVICE_COUNT               "camera-device-count"
644
645 /**
646  * Facing direction of camera device.
647  * @see         MMCamcorderCameraFacingDirection
648  */
649 #define MMCAM_CAMERA_FACING_DIRECTION           "camera-facing-direction"
650
651 /**
652  * Audio codec for encoding audio stream.
653  * @see         MMAudioCodecType  (in mm_types.h)
654  */
655 #define MMCAM_AUDIO_ENCODER                     "audio-encoder"
656
657 /**
658  * Video codec for encoding video stream.
659  * @see         MMVideoCodecType (in mm_types.h)
660  */
661 #define MMCAM_VIDEO_ENCODER                     "video-encoder"
662
663 /**
664  * Image codec for capturing still-image.
665  * @see         MMImageCodecType (in mm_types.h)
666  */
667 #define MMCAM_IMAGE_ENCODER                     "image-encoder"
668
669 /**
670  * File format for recording media stream.
671  * @see         MMFileFormatType (in mm_types.h)
672  */
673 #define MMCAM_FILE_FORMAT                       "file-format"
674
675 /**
676  * Sampling rate of audio stream. This is an integer field.
677  */
678 #define MMCAM_AUDIO_SAMPLERATE                  "audio-samplerate"
679
680 /**
681  * Audio format of each sample.
682  * @see         MMCamcorderAudioFormat
683  */
684 #define MMCAM_AUDIO_FORMAT                      "audio-format"
685
686 /**
687  * Channels of each sample. This is an integer field.
688  */
689 #define MMCAM_AUDIO_CHANNEL                     "audio-channel"
690
691 /**
692  * Input volume of audio source. Double value.
693  */
694 #define MMCAM_AUDIO_VOLUME                      "audio-volume"
695
696 /**
697  * Disable Audio stream when record.
698  */
699 #define MMCAM_AUDIO_DISABLE                     "audio-disable"
700
701 /**
702  * Set audio input route
703  * @remarks     Deprecated. This will be removed soon.
704  * @see         MMAudioRoutePolicy (in mm_types.h)
705  */
706 #define MMCAM_AUDIO_INPUT_ROUTE                 "audio-input-route"
707
708 /**
709  * Format of video stream. This is an integer field
710  * @see         MMPixelFormatType (in mm_types.h)
711  */
712 #define MMCAM_CAMERA_FORMAT                     "camera-format"
713
714 /**
715  * Slow motion rate when video recording
716  * @remarks     Deprecated
717  */
718 #define MMCAM_CAMERA_SLOW_MOTION_RATE           "camera-slow-motion-rate"
719
720 /**
721  * Motion rate when video recording
722  * @remarks     This should be bigger than 0(zero).
723  *              Default value is 1 and it's for normal video recording.
724  *              If the value is smaller than 1, recorded file will be played slower,
725  *              otherwise, recorded file will be played faster.
726  */
727 #define MMCAM_CAMERA_RECORDING_MOTION_RATE      "camera-recording-motion-rate"
728
729 /**
730  * Frames per second. This is an integer field
731  *
732  */
733 #define MMCAM_CAMERA_FPS                        "camera-fps"
734
735 /**
736  * Width of preview stream.
737  */
738 #define MMCAM_CAMERA_WIDTH                      "camera-width"
739
740 /**
741  * Height of preview stream.
742  */
743 #define MMCAM_CAMERA_HEIGHT                     "camera-height"
744
745 /**
746  * Width of video stream.
747  */
748 #define MMCAM_VIDEO_WIDTH                       "video-width"
749
750 /**
751  * Height of video stream.
752  */
753 #define MMCAM_VIDEO_HEIGHT                      "video-height"
754
755 /**
756  * Digital zoom level.
757  */
758 #define MMCAM_CAMERA_DIGITAL_ZOOM               "camera-digital-zoom"
759
760 /**
761  * Optical zoom level.
762  */
763 #define MMCAM_CAMERA_OPTICAL_ZOOM               "camera-optical-zoom"
764
765 /**
766  * Focus mode
767  * @see         MMCamcorderFocusMode
768  */
769 #define MMCAM_CAMERA_FOCUS_MODE                 "camera-focus-mode"
770
771 /**
772  * Focus level
773  */
774 #define MMCAM_CAMERA_FOCUS_LEVEL                "camera-focus-level"
775
776 /**
777  * AF Scan range
778  * @see         MMCamcorderAutoFocusType
779  */
780 #define MMCAM_CAMERA_AF_SCAN_RANGE              "camera-af-scan-range"
781
782 /**
783  * X coordinate of touching position. Only available when you set '#MM_CAMCORDER_AUTO_FOCUS_TOUCH' to '#MMCAM_CAMERA_AF_SCAN_RANGE'.
784  * @see         MMCamcorderAutoFocusType
785  */
786 #define MMCAM_CAMERA_AF_TOUCH_X                 "camera-af-touch-x"
787
788 /**
789  * Y coordinate of touching position. Only available when you set '#MM_CAMCORDER_AUTO_FOCUS_TOUCH' to '#MMCAM_CAMERA_AF_SCAN_RANGE'.
790  * @see         MMCamcorderAutoFocusType
791  */
792 #define MMCAM_CAMERA_AF_TOUCH_Y                 "camera-af-touch-y"
793
794 /**
795  * Width of touching area. Only available when you set '#MM_CAMCORDER_AUTO_FOCUS_TOUCH' to '#MMCAM_CAMERA_AF_SCAN_RANGE'.
796  * @see         MMCamcorderAutoFocusType
797  */
798 #define MMCAM_CAMERA_AF_TOUCH_WIDTH             "camera-af-touch-width"
799
800 /**
801  * Height of touching area. Only available when you set '#MM_CAMCORDER_AUTO_FOCUS_TOUCH' to '#MMCAM_CAMERA_AF_SCAN_RANGE'.
802  * @see         MMCamcorderAutoFocusType
803  */
804 #define MMCAM_CAMERA_AF_TOUCH_HEIGHT            "camera-af-touch-height"
805
806 /**
807  * Exposure mode
808  * @see         MMCamcorderAutoExposureType
809  */
810 #define MMCAM_CAMERA_EXPOSURE_MODE              "camera-exposure-mode"
811
812 /**
813  * Exposure value
814  */
815 #define MMCAM_CAMERA_EXPOSURE_VALUE             "camera-exposure-value"
816
817 /**
818  * f number of camera
819  */
820 #define MMCAM_CAMERA_F_NUMBER                   "camera-f-number"
821
822 /**
823  * Shutter speed
824  */
825 #define MMCAM_CAMERA_SHUTTER_SPEED              "camera-shutter-speed"
826
827 /**
828  * ISO of capturing image
829  * @see         MMCamcorderISOType
830  */
831 #define MMCAM_CAMERA_ISO                        "camera-iso"
832
833 /**
834  * Camera gain
835  */
836 #define MMCAM_CAMERA_GAIN                       "camera-gain"
837
838 /**
839  * Step of camera gain
840  */
841 #define MMCAM_CAMERA_GAIN_STEP                  "camera-gain-step"
842
843 /**
844  * Wide dynamic range.
845  * @see         MMCamcorderWDRMode
846  */
847 #define MMCAM_CAMERA_WDR                        "camera-wdr"
848
849 /**
850  * Focal length of camera lens.
851  */
852 #define MMCAM_CAMERA_FOCAL_LENGTH               "camera-focal-length"
853
854 /**
855  * Anti Handshake
856  * @see         MMCamcorderAHSMode
857  */
858 #define MMCAM_CAMERA_ANTI_HANDSHAKE             "camera-anti-handshake"
859
860 /**
861  * Video Stabilization
862  * @see         MMCamcorderVideoStabilizationMode
863  */
864 #define MMCAM_CAMERA_VIDEO_STABILIZATION        "camera-video-stabilization"
865
866 /**
867  * FPS Auto. When you set true to this attribute, FPS will vary depending on the amount of the light.
868  */
869 #define MMCAM_CAMERA_FPS_AUTO                   "camera-fps-auto"
870
871 /**
872  * Rotation angle of video input stream.
873  * @see         MMVideoInputRotationType (in mm_types.h)
874  */
875 #define MMCAM_CAMERA_ROTATION                   "camera-rotation"
876
877 /**
878  * HDR(High Dynamic Range) Capture mode
879  * @see         MMCamcorderHDRMode
880  */
881 #define MMCAM_CAMERA_HDR_CAPTURE                "camera-hdr-capture"
882
883 /**
884  * Bitrate of Audio Encoder
885  */
886 #define MMCAM_AUDIO_ENCODER_BITRATE             "audio-encoder-bitrate"
887
888 /**
889  * Bitrate of Video Encoder
890  */
891 #define MMCAM_VIDEO_ENCODER_BITRATE             "video-encoder-bitrate"
892
893 /**
894  * Encoding quality of Image codec
895  */
896 #define MMCAM_IMAGE_ENCODER_QUALITY             "image-encoder-quality"
897
898 /**
899  * Brightness level
900  */
901 #define MMCAM_FILTER_BRIGHTNESS                 "filter-brightness"
902
903 /**
904  * Contrast level
905  */
906 #define MMCAM_FILTER_CONTRAST                   "filter-contrast"
907
908 /**
909  * White balance
910  * @see         MMCamcorderWhiteBalanceType
911  */
912 #define MMCAM_FILTER_WB                         "filter-wb"
913
914 /**
915  * White balance temperature
916  */
917 #define MMCAM_FILTER_WB_TEMPERATURE             "filter-wb-temperature"
918
919 /**
920  * Step of white balance temperature
921  */
922 #define MMCAM_FILTER_WB_TEMPERATURE_STEP        "filter-wb-temperature-step"
923
924 /**
925  * Color tone. (Color effect)
926  * @see         MMCamcorderColorToneType
927  */
928 #define MMCAM_FILTER_COLOR_TONE                 "filter-color-tone"
929
930 /**
931  * Scene mode (Program mode)
932  * @see         MMCamcorderSceneModeType
933  */
934 #define MMCAM_FILTER_SCENE_MODE                 "filter-scene-mode"
935
936 /**
937  * Saturation  level
938  */
939 #define MMCAM_FILTER_SATURATION                 "filter-saturation"
940
941 /**
942  * Hue  level
943  */
944 #define MMCAM_FILTER_HUE                        "filter-hue"
945
946 /**
947  * Sharpness  level
948  */
949 #define MMCAM_FILTER_SHARPNESS                  "filter-sharpness"
950
951 /**
952  * Pixel format that you want to capture. If you set MM_PIXEL_FORMAT_ENCODED,
953  * the result will be encoded by image codec specified in #MMCAM_IMAGE_ENCODER.
954  * If not, the result will be raw data.
955  *
956  * @see         MMPixelFormatType (in mm_types.h)
957  */
958 #define MMCAM_CAPTURE_FORMAT                    "capture-format"
959
960 /**
961  * Width of the image that you want to capture
962  */
963 #define MMCAM_CAPTURE_WIDTH                     "capture-width"
964
965 /**
966  * Height of the image that you want to capture
967
968  */
969 #define MMCAM_CAPTURE_HEIGHT                    "capture-height"
970
971 /**
972  * Total count of capturing. If you set this, it will capture multiple time.
973  */
974 #define MMCAM_CAPTURE_COUNT                     "capture-count"
975
976 /**
977  * Interval between each capturing on Multishot.
978  */
979 #define MMCAM_CAPTURE_INTERVAL                  "capture-interval"
980
981 /**
982  * Set this when you want to stop multishot immediately.
983  */
984 #define MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT     "capture-break-cont-shot"
985
986 /**
987  * Raw data of captured image which resolution is same as preview.
988  * This is READ-ONLY attribute and only available in capture callback.
989  * This should be used after casted as MMCamcorderCaptureDataType.
990  */
991 #define MMCAM_CAPTURED_SCREENNAIL               "captured-screennail"
992
993 /**
994  * Raw data of EXIF. This is READ-ONLY attribute and only available in capture callback.
995  */
996 #define MMCAM_CAPTURED_EXIF_RAW_DATA            "captured-exif-raw-data"
997
998 /**
999  * Pointer of display buffer or ID of xwindow.
1000  */
1001 #define MMCAM_DISPLAY_HANDLE                    "display-handle"
1002
1003 /**
1004  * Device of display.
1005  * @see         MMDisplayDeviceType (in mm_types.h)
1006  */
1007 #define MMCAM_DISPLAY_DEVICE                    "display-device"
1008
1009 /**
1010  * Surface of display.
1011  * @see         MMDisplaySurfaceType (in mm_types.h)
1012  */
1013 #define MMCAM_DISPLAY_SURFACE                    "display-surface"
1014
1015 /**
1016  * Mode of display.
1017  * @see         MMDisplayModeType (in mm_types.h)
1018  */
1019 #define MMCAM_DISPLAY_MODE                       "display-mode"
1020
1021 /**
1022  * X position of display rectangle.
1023  * This is only available when #MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI.
1024  * @see         MMCamcorderGeometryMethod
1025  */
1026 #define MMCAM_DISPLAY_RECT_X                    "display-rect-x"
1027
1028 /**
1029  * Y position of display rectangle
1030  * This is only available when #MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI.
1031  * @see         MMCamcorderGeometryMethod
1032  */
1033 #define MMCAM_DISPLAY_RECT_Y                    "display-rect-y"
1034
1035 /**
1036  * Width of display rectangle
1037  * This is only available when #MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI.
1038  * @see         MMCamcorderGeometryMethod
1039  */
1040 #define MMCAM_DISPLAY_RECT_WIDTH                "display-rect-width"
1041
1042 /**
1043  * Height of display rectangle
1044  * This is only available when #MMCAM_DISPLAY_GEOMETRY_METHOD is MM_CAMCORDER_CUSTOM_ROI.
1045  * @see         MMCamcorderGeometryMethod
1046  */
1047 #define MMCAM_DISPLAY_RECT_HEIGHT               "display-rect-height"
1048
1049 /**
1050  * X position of source rectangle. When you want to crop the source, you can set the area with this value.
1051  */
1052 #define MMCAM_DISPLAY_SOURCE_X                  "display-src-x"
1053
1054 /**
1055  * Y position of source rectangle. When you want to crop the source, you can set the area with this value.
1056  */
1057 #define MMCAM_DISPLAY_SOURCE_Y                  "display-src-y"
1058
1059 /**
1060  * Width of source rectangle. When you want to crop the source, you can set the area with this value.
1061  */
1062 #define MMCAM_DISPLAY_SOURCE_WIDTH              "display-src-width"
1063
1064 /**
1065  * Height of source rectangle. When you want to crop the source, you can set the area with this value.
1066  */
1067 #define MMCAM_DISPLAY_SOURCE_HEIGHT             "display-src-height"
1068
1069 /**
1070  * Rotation angle of display.
1071  * @see         MMDisplayRotationType (in mm_types.h)
1072  */
1073 #define MMCAM_DISPLAY_ROTATION                  "display-rotation"
1074
1075 /**
1076  * Flip of display.
1077  * @see         MMFlipType (in mm_types.h)
1078  */
1079 #define MMCAM_DISPLAY_FLIP                      "display-flip"
1080
1081 /**
1082  * Visible of display.
1083  */
1084 #define MMCAM_DISPLAY_VISIBLE                   "display-visible"
1085
1086 /**
1087  * A scale of displayed image. Available value is like below.
1088  * @see         MMDisplayScaleType (in mm_types.h)
1089  */
1090 #define MMCAM_DISPLAY_SCALE                     "display-scale"
1091
1092 /**
1093  * A method that describes a form of geometry for display.
1094  * @see         MMCamcorderGeometryMethod
1095  */
1096 #define MMCAM_DISPLAY_GEOMETRY_METHOD           "display-geometry-method"
1097
1098 /**
1099  * A videosink name of evas surface.
1100  * This is READ-ONLY attribute.
1101  */
1102 #define MMCAM_DISPLAY_EVAS_SURFACE_SINK         "display-evas-surface-sink"
1103
1104 /**
1105  * This attribute is only available if value of MMCAM_DISPLAY_EVAS_SURFACE_SINK "evaspixmapsink"
1106  */
1107 #define MMCAM_DISPLAY_EVAS_DO_SCALING           "display-evas-do-scaling"
1108
1109 /**
1110  * Target filename. Only used in Audio/Video recording. This is not used for capturing.
1111  */
1112 #define MMCAM_TARGET_FILENAME                   "target-filename"
1113
1114 /**
1115  * Maximum size(Kbyte) of recording file. If the size of file reaches this value,
1116  * camcorder will send 'MM_MESSAGE_CAMCORDER_MAX_SIZE' message.
1117  */
1118 #define MMCAM_TARGET_MAX_SIZE                   "target-max-size"
1119
1120 /**
1121  * Time limit(Second) of recording file. If the elapsed time of recording reaches this value,
1122  * camcorder will send 'MM_MESSAGE_CAMCORDER_TIME_LIMIT' message.
1123  */
1124 #define MMCAM_TARGET_TIME_LIMIT                 "target-time-limit"
1125
1126 /**
1127  * Enable to write tags. If this value is FALSE, none of tag information will be written to captured file.
1128  */
1129 #define MMCAM_TAG_ENABLE                        "tag-enable"
1130
1131 /**
1132  * Image description.
1133  */
1134 #define MMCAM_TAG_IMAGE_DESCRIPTION             "tag-image-description"
1135
1136 /**
1137  * Orientation of captured image
1138  * @see         MMCamcorderTagOrientation
1139  */
1140 #define MMCAM_TAG_ORIENTATION                   "tag-orientation"
1141
1142 /**
1143  * Orientation of captured video
1144  * @see         MMCamcorderTagVideoOrientation
1145  */
1146 #define MMCAM_TAG_VIDEO_ORIENTATION            "tag-video-orientation"
1147
1148 /**
1149  * software name and version
1150  */
1151 #define MMCAM_TAG_SOFTWARE                      "tag-software"
1152
1153 /**
1154  * Enable to write tags related to GPS. If this value is TRUE, tags related GPS information will be written to captured file.
1155  */
1156 #define MMCAM_TAG_GPS_ENABLE                    "tag-gps-enable"
1157
1158 /**
1159  * Latitude of captured position. GPS information.
1160  */
1161 #define MMCAM_TAG_LATITUDE                      "tag-latitude"
1162
1163 /**
1164  * Longitude of captured position. GPS information.
1165  */
1166 #define MMCAM_TAG_LONGITUDE                     "tag-longitude"
1167
1168 /**
1169  * Altitude of captured position. GPS information.
1170  */
1171 #define MMCAM_TAG_ALTITUDE                      "tag-altitude"
1172
1173 /**
1174  * Strobe control
1175  * @see         MMCamcorderStrobeControl
1176  */
1177 #define MMCAM_STROBE_CONTROL                    "strobe-control"
1178
1179 /**
1180  * Operation Mode of strobe
1181  * @see         MMCamcorderStrobeMode
1182  */
1183 #define MMCAM_STROBE_MODE                       "strobe-mode"
1184
1185 /**
1186  * Brightness of strobe
1187  */
1188 #define MMCAM_STROBE_BRIGHTNESS                 "strobe-brightness"
1189
1190 /**
1191  * Detection mode
1192  * @see         MMCamcorderDetectMode
1193  */
1194 #define MMCAM_DETECT_MODE                       "detect-mode"
1195
1196 /**
1197  * Total number of detected object
1198  */
1199 #define MMCAM_DETECT_NUMBER                     "detect-number"
1200
1201 /**
1202  * You can use this attribute to select one of detected objects.
1203  */
1204 #define MMCAM_DETECT_FOCUS_SELECT               "detect-focus-select"
1205
1206 /**
1207  * Recommend preview format for capture
1208  */
1209 #define MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_CAPTURE     "recommend-preview-format-for-capture"
1210
1211 /**
1212  * Recommend preview format for recording
1213  */
1214 #define MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING   "recommend-preview-format-for-recording"
1215
1216 /**
1217  * Recommend rotation of display
1218  */
1219 #define MMCAM_RECOMMEND_DISPLAY_ROTATION        "recommend-display-rotation"
1220
1221 /**
1222  * Recommend width of camera preview.
1223  * This attribute can be used with #mm_camcorder_get_attribute_info and #MMCamcorderPreviewType.
1224  * @see         mm_camcorder_get_attribute_info, MMCamcorderPreviewType
1225  */
1226 #define MMCAM_RECOMMEND_CAMERA_WIDTH            "recommend-camera-width"
1227
1228 /**
1229  * Recommend height of camera preview
1230  * This attribute can be used with #mm_camcorder_get_attribute_info and #MMCamcorderPreviewType.
1231  * @see         mm_camcorder_get_attribute_info, MMCamcorderPreviewType
1232  */
1233 #define MMCAM_RECOMMEND_CAMERA_HEIGHT           "recommend-camera-height"
1234
1235 /**
1236  * Enable to play capture sound
1237  */
1238 #define MMCAM_CAPTURE_SOUND_ENABLE              "capture-sound-enable"
1239
1240 /**
1241  * Flip of video input stream.
1242  * @see         MMFlipType (in mm_types.h)
1243  */
1244 #define MMCAM_CAMERA_FLIP                       "camera-flip"
1245
1246 /**
1247  * Support Zero Shutter Lag capture
1248  */
1249 #define MMCAM_SUPPORT_ZSL_CAPTURE               "support-zsl-capture"
1250
1251 /**
1252 * Support zero copy format
1253 */
1254 #define MMCAM_SUPPORT_ZERO_COPY_FORMAT          "support-zero-copy-format"
1255
1256 /**
1257 * Support media packet callback
1258 */
1259 #define MMCAM_SUPPORT_MEDIA_PACKET_PREVIEW_CB   "support-media-packet-preview-cb"
1260
1261 /**
1262 * Support user buffer for zero copy
1263 */
1264 #define MMCAM_SUPPORT_USER_BUFFER               "support-user-buffer"
1265
1266 /**
1267  * Support Extra Preview
1268  */
1269 #define MMCAM_SUPPORT_EXTRA_PREVIEW             "support-extra-preview"
1270
1271 /**
1272  * Request codec config for encoded format
1273  */
1274 #define MMCAM_REQUEST_CODEC_CONFIG              "request-codec-config"
1275
1276 /**
1277 * Buffer fd from user
1278 */
1279 #define MMCAM_USER_BUFFER_FD                    "user-buffer-fd"
1280
1281 /**
1282  * Enable to write tags for recorded file
1283  */
1284 #define MMCAM_RECORDER_TAG_ENABLE               "recorder-tag-enable"
1285
1286 /**
1287  * Determines the socket stream path
1288  */
1289 #define MMCAM_DISPLAY_SOCKET_PATH               "display-socket-path"
1290
1291 /**
1292  * Client PID
1293  */
1294 #define MMCAM_CLIENT_PID                        "client-pid"
1295
1296 /**
1297  * Root directory of application
1298  */
1299 #define MMCAM_ROOT_DIRECTORY                    "root-directory"
1300
1301 /**
1302  * Bitrate for encoded preview stream
1303  */
1304 #define MMCAM_ENCODED_PREVIEW_BITRATE           "encoded-preview-bitrate"
1305
1306 /**
1307  * GOP interval for encoded preview stream
1308  */
1309 #define MMCAM_ENCODED_PREVIEW_GOP_INTERVAL      "encoded-preview-gop-interval"
1310
1311 /**
1312  * The distance to move the camera horizontally and physically
1313  */
1314 #define MMCAM_CAMERA_PAN_MECHA                  "camera-pan-mecha"
1315
1316 /**
1317  * The distance to move the camera horizontally
1318  */
1319 #define MMCAM_CAMERA_PAN_ELEC                   "camera-pan-elec"
1320
1321 /**
1322  * The distance to move the camera vertically and physically
1323  */
1324 #define MMCAM_CAMERA_TILT_MECHA                 "camera-tilt-mecha"
1325
1326 /**
1327  * The distance to move the camera vertically
1328  */
1329 #define MMCAM_CAMERA_TILT_ELEC                  "camera-tilt-elec"
1330
1331 /**
1332  * The type of PTZ(Pan Tilt Zoom). Mechanical or Electronic PTZ.
1333  */
1334 #define MMCAM_CAMERA_PTZ_TYPE                   "camera-ptz-type"
1335
1336 /**
1337  * Stream type and index for sound route
1338  */
1339 #define MMCAM_SOUND_STREAM_TYPE                 "sound-stream-type"
1340 #define MMCAM_SOUND_STREAM_INDEX                "sound-stream-index"
1341
1342 /**
1343  * The display reuse flag and sink element pointer
1344  */
1345 #define MMCAM_DISPLAY_REUSE_HINT                "display-reuse-hint"
1346 #define MMCAM_DISPLAY_REUSE_ELEMENT             "display-reuse-element"
1347
1348 /**
1349  * The GDBus connection from outside
1350  */
1351 #define MMCAM_GDBUS_CONNECTION                  "gdbus-connection"
1352
1353 /**
1354  * Replay gain enable
1355  */
1356 #define MMCAM_AUDIO_REPLAY_GAIN_ENABLE          "audio-replay-gain-enable"
1357
1358 /**
1359  * Reference level for replay gain
1360  */
1361 #define MMCAM_AUDIO_REPLAY_GAIN_REFERENCE_LEVEL "audio-replay-gain-reference-level"
1362
1363 /**
1364  * Platform privilege name for camera device
1365  */
1366 #define MMCAM_PLATFORM_PRIVILEGE_CAMERA         "platform-privilege-camera"
1367
1368 /**
1369  * The name of videosrc element
1370  */
1371 #define MMCAM_VIDEOSRC_ELEMENT_NAME             "videosrc-element-name"
1372
1373 /**
1374  * The name of audiosrc element
1375  */
1376 #define MMCAM_AUDIOSRC_ELEMENT_NAME             "audiosrc-element-name"
1377
1378 /**
1379  * Extra preview enable
1380  */
1381 #define MMCAM_EXTRA_PREVIEW_ENABLE              "extra-preview-enable"
1382
1383
1384
1385 /*=======================================================================================
1386 | ENUM DEFINITIONS                                                                      |
1387 ========================================================================================*/
1388 /**
1389  * An enumeration for camcorder states.
1390  */
1391 typedef enum {
1392         MM_CAMCORDER_STATE_NONE,                /**< Camcorder is not created yet */
1393         MM_CAMCORDER_STATE_NULL,                /**< Camcorder is created, but not initialized yet */
1394         MM_CAMCORDER_STATE_READY,               /**< Camcorder is ready to capture */
1395         MM_CAMCORDER_STATE_PREPARE,             /**< Camcorder is prepared to capture (Preview) */
1396         MM_CAMCORDER_STATE_CAPTURING,           /**< Camcorder is now capturing still images */
1397         MM_CAMCORDER_STATE_RECORDING,           /**< Camcorder is now recording */
1398         MM_CAMCORDER_STATE_PAUSED,              /**< Camcorder is paused while recording */
1399         MM_CAMCORDER_STATE_NUM,                 /**< Number of camcorder states */
1400 } MMCamcorderStateType;
1401
1402 /**
1403  * An enumeration for camcorder mode.
1404  */
1405 typedef enum {
1406         MM_CAMCORDER_MODE_VIDEO_CAPTURE = 0,    /**< Video recording and Image capture mode */
1407         MM_CAMCORDER_MODE_AUDIO,                /**< Audio recording mode */
1408 } MMCamcorderModeType;
1409
1410 /**
1411  * An enumeration for facing direction.
1412  */
1413 typedef enum {
1414         MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR = 0, /**< Facing direction of camera is REAR */
1415         MM_CAMCORDER_CAMERA_FACING_DIRECTION_FRONT,    /**< Facing direction of camera is FRONT */
1416 } MMCamcorderCameraFacingDirection;
1417
1418
1419 /**
1420  * An enumeration of audio format.
1421  */
1422 typedef enum {
1423         MM_CAMCORDER_AUDIO_FORMAT_PCM_U8 = 0,           /**< unsigned 8bit audio */
1424         MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE = 2,       /**< signed 16bit audio. Little endian. */
1425 } MMCamcorderAudioFormat;
1426
1427 /**
1428  * An enumeration of capture mode.
1429  */
1430 typedef enum {
1431         MM_CAMCORDER_CAPTURE_MODE_ENCODEBIN = 0,        /**< Capture through encodebin */
1432         MM_CAMCORDER_CAPTURE_MODE_CAMERA_CONTROL,       /**< Capture through camera control interface in camerasrc plugin */
1433         MM_CAMCORDER_CAPTURE_MODE_IMAGE_PAD             /**< Capture through image source pad in camerasrc plugin */
1434 } MMCamcorderCaptureMode;
1435
1436 /**
1437  * An enumeration of extra preview mode.
1438  */
1439 typedef enum {
1440         MM_CAMCORDER_EXTRA_PREVIEW_MODE_CAMERA_CONTROL = 0, /**< Extra preview through camera control interface of camerasrc plugin */
1441         MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_SRCPAD,    /**< Extra preview through additional source pad in camerasrc plugin */
1442         MM_CAMCORDER_EXTRA_PREVIEW_MODE_PIPELINE_ELEMENT    /**< Extra preview through additional element */
1443 } MMCamcorderExtraPreviewMode;
1444
1445
1446 /**
1447  * An enumeration for color tone. Color tone provides an impression of
1448  * seeing through a tinted glass.
1449  */
1450 enum MMCamcorderColorToneType {
1451         MM_CAMCORDER_COLOR_TONE_NONE = 0,               /**< None */
1452         MM_CAMCORDER_COLOR_TONE_MONO,                   /**< Mono */
1453         MM_CAMCORDER_COLOR_TONE_SEPIA,                  /**< Sepia */
1454         MM_CAMCORDER_COLOR_TONE_NEGATIVE,               /**< Negative */
1455         MM_CAMCORDER_COLOR_TONE_BLUE,                   /**< Blue */
1456         MM_CAMCORDER_COLOR_TONE_GREEN,                  /**< Green */
1457         MM_CAMCORDER_COLOR_TONE_AQUA,                   /**< Aqua */
1458         MM_CAMCORDER_COLOR_TONE_VIOLET,                 /**< Violet */
1459         MM_CAMCORDER_COLOR_TONE_ORANGE,                 /**< Orange */
1460         MM_CAMCORDER_COLOR_TONE_GRAY,                   /**< Gray */
1461         MM_CAMCORDER_COLOR_TONE_RED,                    /**< Red */
1462         MM_CAMCORDER_COLOR_TONE_ANTIQUE,                /**< Antique */
1463         MM_CAMCORDER_COLOR_TONE_WARM,                   /**< Warm */
1464         MM_CAMCORDER_COLOR_TONE_PINK,                   /**< Pink */
1465         MM_CAMCORDER_COLOR_TONE_YELLOW,                 /**< Yellow */
1466         MM_CAMCORDER_COLOR_TONE_PURPLE,                 /**< Purple */
1467         MM_CAMCORDER_COLOR_TONE_EMBOSS,                 /**< Emboss */
1468         MM_CAMCORDER_COLOR_TONE_OUTLINE,                /**< Outline */
1469         MM_CAMCORDER_COLOR_TONE_SOLARIZATION,           /**< Solarization */
1470         MM_CAMCORDER_COLOR_TONE_SKETCH,                 /**< Sketch */
1471         MM_CAMCORDER_COLOR_TONE_WASHED,                 /**< Washed */
1472         MM_CAMCORDER_COLOR_TONE_VINTAGE_WARM,           /**< Vintage warm */
1473         MM_CAMCORDER_COLOR_TONE_VINTAGE_COLD,           /**< Vintage cold */
1474         MM_CAMCORDER_COLOR_TONE_POSTERIZATION,          /**< Posterization */
1475         MM_CAMCORDER_COLOR_TONE_CARTOON,                /**< Cartoon */
1476         MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED,          /**< Selective color - Red */
1477         MM_CAMCORDER_COLOR_TONE_SELECTIVE_GREEN,        /**< Selective color - Green */
1478         MM_CAMCORDER_COLOR_TONE_SELECTIVE_BLUE,         /**< Selective color - Blue */
1479         MM_CAMCORDER_COLOR_TONE_SELECTIVE_YELLOW,       /**< Selective color - Yellow */
1480         MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED_YELLOW,   /**< Selective color - Red and Yellow */
1481 };
1482
1483
1484 /**
1485  * An enumeration for white balance. White Balance is the control that adjusts
1486  * the camcorder's color sensitivity to match the prevailing color of white
1487  * outdoor light, yellower indoor light, or (sometimes) greenish fluorescent
1488  * light. White balance may be set either automatically or manually. White balance
1489  * may be set "incorrectly" on purpose to achieve special effects.
1490  */
1491 enum MMCamcorderWhiteBalanceType {
1492         MM_CAMCORDER_WHITE_BALANCE_NONE = 0,            /**< None */
1493         MM_CAMCORDER_WHITE_BALANCE_AUTOMATIC,           /**< Automatic */
1494         MM_CAMCORDER_WHITE_BALANCE_DAYLIGHT,            /**< Daylight */
1495         MM_CAMCORDER_WHITE_BALANCE_CLOUDY,              /**< Cloudy */
1496         MM_CAMCORDER_WHITE_BALANCE_FLUORESCENT,         /**< Fluorescent */
1497         MM_CAMCORDER_WHITE_BALANCE_INCANDESCENT,        /**< Incandescent */
1498         MM_CAMCORDER_WHITE_BALANCE_SHADE,               /**< Shade */
1499         MM_CAMCORDER_WHITE_BALANCE_HORIZON,             /**< Horizon */
1500         MM_CAMCORDER_WHITE_BALANCE_FLASH,               /**< Flash */
1501         MM_CAMCORDER_WHITE_BALANCE_CUSTOM,              /**< Custom */
1502 };
1503
1504
1505 /**
1506  * An enumeration for scene mode. Scene mode gives the environment condition
1507  * for operating camcorder. The mode of operation can be in daylight, night and
1508  * backlight. It can be an automatic setting also.
1509  */
1510 enum MMCamcorderSceneModeType {
1511         MM_CAMCORDER_SCENE_MODE_NORMAL = 0,     /**< Normal */
1512         MM_CAMCORDER_SCENE_MODE_PORTRAIT,       /**< Portrait */
1513         MM_CAMCORDER_SCENE_MODE_LANDSCAPE,      /**< Landscape */
1514         MM_CAMCORDER_SCENE_MODE_SPORTS,         /**< Sports */
1515         MM_CAMCORDER_SCENE_MODE_PARTY_N_INDOOR, /**< Party & indoor */
1516         MM_CAMCORDER_SCENE_MODE_BEACH_N_INDOOR, /**< Beach & indoor */
1517         MM_CAMCORDER_SCENE_MODE_SUNSET,         /**< Sunset */
1518         MM_CAMCORDER_SCENE_MODE_DUSK_N_DAWN,    /**< Dusk & dawn */
1519         MM_CAMCORDER_SCENE_MODE_FALL_COLOR,     /**< Fall */
1520         MM_CAMCORDER_SCENE_MODE_NIGHT_SCENE,    /**< Night scene */
1521         MM_CAMCORDER_SCENE_MODE_FIREWORK,       /**< Firework */
1522         MM_CAMCORDER_SCENE_MODE_TEXT,           /**< Text */
1523         MM_CAMCORDER_SCENE_MODE_SHOW_WINDOW,    /**< Show window */
1524         MM_CAMCORDER_SCENE_MODE_CANDLE_LIGHT,   /**< Candle light */
1525         MM_CAMCORDER_SCENE_MODE_BACKLIGHT,      /**< Backlight */
1526         MM_CAMCORDER_SCENE_MODE_AQUA,           /**< Aqua */
1527 };
1528
1529
1530 /**
1531  * An enumeration for focusing .
1532  */
1533 enum MMCamcorderFocusMode {
1534         MM_CAMCORDER_FOCUS_MODE_NONE = 0,       /**< Focus mode is None */
1535         MM_CAMCORDER_FOCUS_MODE_PAN,            /**< Pan focus mode*/
1536         MM_CAMCORDER_FOCUS_MODE_AUTO,           /**< Autofocus mode*/
1537         MM_CAMCORDER_FOCUS_MODE_MANUAL,         /**< Manual focus mode*/
1538         MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO,     /**< Touch Autofocus mode*/
1539         MM_CAMCORDER_FOCUS_MODE_CONTINUOUS,     /**< Continuous Autofocus mode*/
1540 };
1541
1542
1543 /**
1544  * An enumeration for auto focus scan range (af scan range)
1545  */
1546 enum MMCamcorderAutoFocusType {
1547         MM_CAMCORDER_AUTO_FOCUS_NONE = 0,       /**< Scan autofocus is not set */
1548         MM_CAMCORDER_AUTO_FOCUS_NORMAL,         /**< Scan autofocus normally*/
1549         MM_CAMCORDER_AUTO_FOCUS_MACRO,          /**< Scan autofocus in macro mode(close distance)*/
1550         MM_CAMCORDER_AUTO_FOCUS_FULL,           /**< Scan autofocus in full mode(all range scan, limited by dev spec)*/
1551 };
1552
1553
1554 /**
1555  * An enumeration for focus state.
1556  * When 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED' is delivered through 'MMMessageCallback',
1557  * this enumeration will be set to 'code' of MMMessageParamType.
1558  */
1559 enum MMCamcorderFocusStateType {
1560         MM_CAMCORDER_FOCUS_STATE_RELEASED = 0,  /**< Focus released.*/
1561         MM_CAMCORDER_FOCUS_STATE_ONGOING,       /**< Focus in progress*/
1562         MM_CAMCORDER_FOCUS_STATE_FOCUSED,       /**< Focus success*/
1563         MM_CAMCORDER_FOCUS_STATE_FAILED,        /**< Focus failed*/
1564 };
1565
1566
1567 /**
1568  * An enumeration for ISO.
1569  */
1570 enum MMCamcorderISOType {
1571         MM_CAMCORDER_ISO_AUTO = 0,              /**< ISO auto mode*/
1572         MM_CAMCORDER_ISO_50,                    /**< ISO 50*/
1573         MM_CAMCORDER_ISO_100,                   /**< ISO 100*/
1574         MM_CAMCORDER_ISO_200,                   /**< ISO 200*/
1575         MM_CAMCORDER_ISO_400,                   /**< ISO 400*/
1576         MM_CAMCORDER_ISO_800,                   /**< ISO 800*/
1577         MM_CAMCORDER_ISO_1600,                  /**< ISO 1600*/
1578         MM_CAMCORDER_ISO_3200,                  /**< ISO 3200*/
1579         MM_CAMCORDER_ISO_6400,                  /**< ISO 6400*/
1580         MM_CAMCORDER_ISO_12800,                 /**< ISO 12800*/
1581 };
1582
1583 /**
1584  * An enumeration for Automatic exposure.
1585  */
1586 enum MMCamcorderAutoExposureType {
1587         MM_CAMCORDER_AUTO_EXPOSURE_OFF = 0,             /**< AE off*/
1588         MM_CAMCORDER_AUTO_EXPOSURE_ALL,                 /**< AE default */
1589         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_1,            /**< AE center mode*/
1590         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_2,            /**< Unused */
1591         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_3,            /**< Unused */
1592         MM_CAMCORDER_AUTO_EXPOSURE_SPOT_1,              /**< AE spot mode*/
1593         MM_CAMCORDER_AUTO_EXPOSURE_SPOT_2,              /**< Unused */
1594         MM_CAMCORDER_AUTO_EXPOSURE_CUSTOM_1,            /**< AE manual mode */
1595         MM_CAMCORDER_AUTO_EXPOSURE_CUSTOM_2,            /**< Unused */
1596         MM_CAMCORDER_AUTO_EXPOSURE_SHUTTER_PRIORITY,    /**< AE shutter priority mode */
1597         MM_CAMCORDER_AUTO_EXPOSURE_APERTURE_PRIORITY    /**< AE aperture priority mode */
1598 };
1599
1600
1601 /**
1602  * An enumeration for WDR mode .
1603  */
1604 enum MMCamcorderWDRMode {
1605         MM_CAMCORDER_WDR_OFF = 0,               /**< WDR OFF*/
1606         MM_CAMCORDER_WDR_ON,                    /**< WDR ON*/
1607         MM_CAMCORDER_WDR_AUTO,                  /**< WDR AUTO*/
1608 };
1609
1610
1611 /**
1612  * An enumeration for HDR capture mode
1613  */
1614 enum MMCamcorderHDRMode {
1615         MM_CAMCORDER_HDR_OFF = 0,               /**< HDR OFF */
1616         MM_CAMCORDER_HDR_ON,                    /**< HDR ON and no original data - capture callback will be come once */
1617         MM_CAMCORDER_HDR_ON_AND_ORIGINAL,       /**< HDR ON and original data - capture callback will be come twice(1st:Original, 2nd:HDR) */
1618 };
1619
1620
1621 /**
1622  * An enumeration for Anti-handshake mode .
1623  */
1624 enum MMCamcorderAHSMode {
1625         MM_CAMCORDER_AHS_OFF = 0,               /**< AHS OFF*/
1626         MM_CAMCORDER_AHS_ON,                    /**< AHS ON*/
1627         MM_CAMCORDER_AHS_AUTO,                  /**< AHS AUTO*/
1628         MM_CAMCORDER_AHS_MOVIE,                 /**< AHS MOVIE*/
1629 };
1630
1631
1632 /**
1633  * An enumeration for Video stabilization mode
1634  */
1635 enum MMCamcorderVideoStabilizationMode {
1636         MM_CAMCORDER_VIDEO_STABILIZATION_OFF = 0,       /**< Video Stabilization OFF*/
1637         MM_CAMCORDER_VIDEO_STABILIZATION_ON,            /**< Video Stabilization ON*/
1638 };
1639
1640
1641 /**
1642  * Geometry method for camcorder display.
1643  */
1644 enum MMCamcorderGeometryMethod {
1645         MM_CAMCORDER_LETTER_BOX = 0,            /**< Letter box*/
1646         MM_CAMCORDER_ORIGIN_SIZE,               /**< Origin size*/
1647         MM_CAMCORDER_FULL,                      /**< full-screen*/
1648         MM_CAMCORDER_CROPPED_FULL,              /**< Cropped full-screen*/
1649         MM_CAMCORDER_ORIGIN_OR_LETTER,          /**< Origin size or Letter box*/
1650         MM_CAMCORDER_CUSTOM_ROI,                /**< Explicitly described destination ROI*/
1651 };
1652
1653
1654 /**
1655  * An enumeration for orientation values of tag .
1656  */
1657 enum MMCamcorderTagOrientation {
1658         MM_CAMCORDER_TAG_ORT_NONE = 0,          /**< No Orientation.*/
1659         MM_CAMCORDER_TAG_ORT_0R_VT_0C_VL,       /**< The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.*/
1660         MM_CAMCORDER_TAG_ORT_0R_VT_0C_VR,       /**< The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.*/
1661         MM_CAMCORDER_TAG_ORT_0R_VB_0C_VR,       /**< The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.*/
1662         MM_CAMCORDER_TAG_ORT_0R_VB_0C_VL,       /**< The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.*/
1663         MM_CAMCORDER_TAG_ORT_0R_VL_0C_VT,       /**< The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.*/
1664         MM_CAMCORDER_TAG_ORT_0R_VR_0C_VT,       /**< The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.*/
1665         MM_CAMCORDER_TAG_ORT_0R_VR_0C_VB,       /**< The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.*/
1666         MM_CAMCORDER_TAG_ORT_0R_VL_0C_VB,       /**< The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.*/
1667 };
1668
1669 /**
1670  * An enumeration for captured video orientation values of tag .
1671  */
1672 enum MMCamcorderTagVideoOrientation {
1673         MM_CAMCORDER_TAG_VIDEO_ORT_NONE = 0,    /**< No Orientation.*/
1674         MM_CAMCORDER_TAG_VIDEO_ORT_90,          /**< 90 degree */
1675         MM_CAMCORDER_TAG_VIDEO_ORT_180, /**< 180 degree */
1676         MM_CAMCORDER_TAG_VIDEO_ORT_270, /**< 270 degree */
1677 };
1678
1679
1680
1681 /**
1682  * An enumeration for Strobe mode.
1683  */
1684 enum MMCamcorderStrobeMode {
1685         MM_CAMCORDER_STROBE_MODE_OFF = 0,               /**< Always off */
1686         MM_CAMCORDER_STROBE_MODE_ON,                    /**< Always splashes */
1687         MM_CAMCORDER_STROBE_MODE_AUTO,                  /**< Depending on intensity of light, strobe starts to flash. */
1688         MM_CAMCORDER_STROBE_MODE_REDEYE_REDUCTION,      /**< Red eye reduction. Multiple flash before capturing. */
1689         MM_CAMCORDER_STROBE_MODE_SLOW_SYNC,             /**< Slow sync. A type of curtain synchronization. */
1690         MM_CAMCORDER_STROBE_MODE_FRONT_CURTAIN,         /**< Front curtain. A type of curtain synchronization. */
1691         MM_CAMCORDER_STROBE_MODE_REAR_CURTAIN,          /**< Rear curtain. A type of curtain synchronization. */
1692         MM_CAMCORDER_STROBE_MODE_PERMANENT,             /**< keep turned on until turning off */
1693 };
1694
1695
1696 /**
1697  * An enumeration for Strobe Control.
1698  */
1699 enum MMCamcorderStrobeControl {
1700         MM_CAMCORDER_STROBE_CONTROL_OFF = 0,    /**< turn off the flash light */
1701         MM_CAMCORDER_STROBE_CONTROL_ON,         /**< turn on the flash light */
1702         MM_CAMCORDER_STROBE_CONTROL_CHARGE,     /**< charge the flash light */
1703 };
1704
1705
1706 /**
1707  * An enumeration for Detection mode.
1708  */
1709 enum MMCamcorderDetectMode {
1710         MM_CAMCORDER_DETECT_MODE_OFF = 0,       /**< turn detection off */
1711         MM_CAMCORDER_DETECT_MODE_ON,            /**< turn detection on */
1712 };
1713
1714
1715 /**
1716  * An enumeration for recommended preview resolution.
1717  */
1718 enum MMCamcorderPreviewType {
1719         MM_CAMCORDER_PREVIEW_TYPE_NORMAL = 0,   /**< normal ratio like 4:3 */
1720         MM_CAMCORDER_PREVIEW_TYPE_WIDE,         /**< wide ratio like 16:9 */
1721         MM_CAMCORDER_PREVIEW_TYPE_SQUARE,       /**< square ratio like 1:1 */
1722 };
1723
1724
1725 /**
1726  * An enumeration for log level.
1727  */
1728 enum MMCamcorderLogLevel {
1729         MM_CAMCORDER_LOG_LEVEL_CRITICAL = 0,
1730         MM_CAMCORDER_LOG_LEVEL_ERROR,
1731         MM_CAMCORDER_LOG_LEVEL_WARNING,
1732         MM_CAMCORDER_LOG_LEVEL_INFO,
1733         MM_CAMCORDER_LOG_LEVEL_DEBUG,
1734         MM_CAMCORDER_LOG_LEVEL_VERBOSE
1735 };
1736
1737
1738 /**********************************
1739 *          Attribute info         *
1740 **********************************/
1741 /**
1742  * An enumeration for attribute values types.
1743  */
1744 typedef enum {
1745         MM_CAM_ATTRS_TYPE_INVALID = -1,         /**< Type is invalid */
1746         MM_CAM_ATTRS_TYPE_INT,                  /**< Integer type attribute */
1747         MM_CAM_ATTRS_TYPE_DOUBLE,               /**< Double type attribute */
1748         MM_CAM_ATTRS_TYPE_STRING,               /**< UTF-8 String type attribute */
1749         MM_CAM_ATTRS_TYPE_DATA,                 /**< Pointer type attribute */
1750 } MMCamAttrsType;
1751
1752
1753 /**
1754  * An enumeration for attribute validation type.
1755  */
1756 typedef enum {
1757         MM_CAM_ATTRS_VALID_TYPE_INVALID = -1,   /**< Invalid validation type */
1758         MM_CAM_ATTRS_VALID_TYPE_NONE,           /**< Do not check validity */
1759         MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY,      /**< validity checking type of integer array */
1760         MM_CAM_ATTRS_VALID_TYPE_INT_RANGE,      /**< validity checking type of integer range */
1761         MM_CAM_ATTRS_VALID_TYPE_DOUBLE_ARRAY,   /**< validity checking type of double array */
1762         MM_CAM_ATTRS_VALID_TYPE_DOUBLE_RANGE,   /**< validity checking type of double range */
1763 } MMCamAttrsValidType;
1764
1765
1766 /**
1767  * An enumeration for attribute access flag.
1768  */
1769 typedef enum {
1770         MM_CAM_ATTRS_FLAG_DISABLED = 0,         /**< None flag is set. This means the attribute is not allowed to use.  */
1771         MM_CAM_ATTRS_FLAG_READABLE = 1 << 0,    /**< Readable */
1772         MM_CAM_ATTRS_FLAG_WRITABLE = 1 << 1,    /**< Writable */
1773         MM_CAM_ATTRS_FLAG_MODIFIED = 1 << 2,    /**< Modified */
1774         MM_CAM_ATTRS_FLAG_RW = MM_CAM_ATTRS_FLAG_READABLE | MM_CAM_ATTRS_FLAG_WRITABLE, /**< Readable and Writable */
1775 } MMCamAttrsFlag;
1776
1777
1778 /**********************************
1779 *          Stream data            *
1780 **********************************/
1781 /**
1782  * An enumeration for stream data type.
1783  */
1784 typedef enum {
1785         MM_CAM_STREAM_DATA_YUV420 = 0,          /**< YUV420 Packed type - 1 plane */
1786         MM_CAM_STREAM_DATA_YUV422,              /**< YUV422 Packed type - 1 plane */
1787         MM_CAM_STREAM_DATA_YUV420SP,            /**< YUV420 SemiPlannar type - 2 planes */
1788         MM_CAM_STREAM_DATA_YUV420P,             /**< YUV420 Plannar type - 3 planes */
1789         MM_CAM_STREAM_DATA_YUV422P,             /**< YUV422 Plannar type - 3 planes */
1790         MM_CAM_STREAM_DATA_ENCODED,             /**< Encoded data type - 1 plane */
1791         MM_CAM_STREAM_DATA_DEPTH,               /**< Depth data type - 1 plane */
1792         MM_CAM_STREAM_DATA_RGB                  /**< RGB data type - 1 plane */
1793 } MMCamStreamData;
1794
1795
1796 /*=======================================================================================
1797 | STRUCTURE DEFINITIONS                                                                 |
1798 ========================================================================================*/
1799 /**
1800  * A structure for attribute information
1801  */
1802 typedef struct {
1803         MMCamAttrsType type;
1804         MMCamAttrsFlag flag;
1805         MMCamAttrsValidType validity_type;
1806
1807         /**
1808          * A union that describes validity of the attribute.
1809          * Only when type is 'MM_CAM_ATTRS_TYPE_INT' or 'MM_CAM_ATTRS_TYPE_DOUBLE',
1810          * the attribute can have validity.
1811          */
1812         union {
1813                 /**
1814                  * Validity structure for integer array.
1815                  */
1816                  struct {
1817                         int *array;             /**< a pointer of array */
1818                         int count;              /**< size of array */
1819                         int def;                /**< default value. Real value not index of array */
1820                 } int_array;
1821
1822                 /**
1823                  * Validity structure for integer range.
1824                  */
1825                 struct {
1826                         int min;                /**< minimum range */
1827                         int max;                /**< maximum range */
1828                         int def;                /**< default value */
1829                 } int_range;
1830
1831                 /**
1832                  * Validity structure for double array.
1833                  */
1834                  struct {
1835                         double *array;          /**< a pointer of array */
1836                         int count;              /**< size of array */
1837                         double def;             /**< default value. Real value not index of array */
1838                 } double_array;
1839
1840                 /**
1841                  * Validity structure for double range.
1842                  */
1843                 struct {
1844                         double min;             /**< minimum range */
1845                         double max;             /**< maximum range */
1846                         double def;             /**< default value */
1847                 } double_range;
1848         };
1849 } MMCamAttrsInfo;
1850
1851
1852 /* General Structure */
1853 /**
1854  * Structure for capture data.
1855  */
1856 typedef struct {
1857         void *data;                     /**< pointer of captured image */
1858         unsigned int length;            /**< length of captured image (in byte)*/
1859         MMPixelFormatType format;       /**< image format */
1860         int width;                      /**< width of captured image */
1861         int height;                     /**< height of captured image */
1862         int encoder_type;               /**< encoder type */
1863 } MMCamcorderCaptureDataType;
1864
1865
1866 /**
1867  * Structure for metadata of stream buffer.
1868  */
1869 typedef struct {
1870         unsigned long long ts_soe;
1871         unsigned long long ts_eoe;
1872         unsigned long long ts_sof;
1873         unsigned long long ts_eof;
1874         unsigned long long ts_hal;
1875         unsigned long long ts_qmf;
1876         unsigned long long ts_gst;
1877         unsigned long long td_exp;
1878         unsigned long long ts_aux;
1879         unsigned long long td_aux;
1880         unsigned long long seqnum;
1881         unsigned long long flags;
1882 } MMCamcorderFrameMeta;
1883
1884
1885 /**
1886  * Structure for video stream data.
1887  */
1888 #define BUFFER_MAX_PLANE_NUM 4
1889
1890 typedef struct {
1891         union {
1892                 struct {
1893                         unsigned char *yuv;
1894                         unsigned int length_yuv;
1895                 } yuv420, yuv422;
1896                 struct {
1897                         unsigned char *y;
1898                         unsigned int length_y;
1899                         unsigned char *uv;
1900                         unsigned int length_uv;
1901                 } yuv420sp;
1902                 struct {
1903                         unsigned char *y;
1904                         unsigned int length_y;
1905                         unsigned char *u;
1906                         unsigned int length_u;
1907                         unsigned char *v;
1908                         unsigned int length_v;
1909                 } yuv420p, yuv422p;
1910                 struct {
1911                         unsigned char *data;
1912                         unsigned int length_data;
1913                         int is_delta_frame;
1914                         int is_header_included;
1915                 } encoded, depth, rgb;
1916         } data;                             /**< pointer of captured stream */
1917         MMCamStreamData data_type;          /**< data type */
1918         unsigned int length_total;          /**< total length of stream buffer(byte) */
1919         unsigned int num_planes;            /**< number of planes */
1920         MMPixelFormatType format;           /**< image format */
1921         int width;                          /**< width of video buffer */
1922         int height;                         /**< height of video buffer */
1923         unsigned int timestamp;             /**< timestamp of stream buffer(msec) */
1924         void *bo[BUFFER_MAX_PLANE_NUM];     /**< TBM buffer object */
1925         void *internal_buffer;              /**< Internal buffer pointer */
1926         int stride[BUFFER_MAX_PLANE_NUM];   /**< Stride of each plane */
1927         int elevation[BUFFER_MAX_PLANE_NUM];/**< Elevation of each plane */
1928         int extra_stream_id;                /**< ID of extra preview stream */
1929         int focus_state;                    /**< Focus state */
1930         int facing_direction;               /**< Facing direction */
1931         int flip;                           /**< Flip */
1932         int rotation;                       /**< Rotation */
1933         unsigned long long timestamp_nsec;  /**< timestamp of stream buffer(nsec) */
1934         MMCamcorderFrameMeta frame_meta;    /**< Metadata of stream buffer */
1935         int status_ae;                      /**< Status of auto exposure */
1936         int status_awb;                     /**< Status of auto white balance */
1937 } MMCamcorderVideoStreamDataType;
1938
1939
1940 /**
1941  * Structure for audio stream data.
1942  */
1943 typedef struct {
1944         void *data;                             /**< pointer of captured stream */
1945         unsigned int length;                    /**< length of stream buffer (in byte)*/
1946         MMCamcorderAudioFormat format;          /**< audio format */
1947         int channel;                            /**< number of channel of the stream */
1948         unsigned int timestamp;                 /**< timestamp of stream buffer (msec)*/
1949         float volume_dB;                        /**< dB value of audio stream */
1950 } MMCamcorderAudioStreamDataType;
1951
1952
1953 /**
1954  * Structure for muxed stream data.
1955  */
1956 typedef struct {
1957         void *data;             /**< pointer of muxed stream */
1958         unsigned int length;    /**< length of stream buffer (in byte) */
1959         unsigned long long offset;  /**< current offset for data */
1960 } MMCamcorderMuxedStreamDataType;
1961
1962
1963 /**
1964   * Prerequisite information for mm_camcorder_create()
1965   * The information to set prior to create.
1966   */
1967 typedef struct {
1968         enum MMVideoDeviceType videodev_type;   /**< Video device type */
1969         /* For future use */
1970         int reserved[4];                        /**< reserved fields */
1971 } MMCamPreset;
1972
1973
1974 /**
1975  * Report structure of recording file
1976  */
1977 typedef struct {
1978         char *recording_filename;               /**< File name of stored recording file. Please free after using. */
1979 } MMCamRecordingReport; /**< report structure definition of recording file */
1980
1981
1982 /**
1983  * Face detect detailed information
1984  */
1985 typedef struct _MMCamFaceInfo {
1986         int id;                                 /**< id of each face */
1987         int score;                              /**< score of each face */
1988         MMRectType rect;                        /**< area of face */
1989 } MMCamFaceInfo;
1990
1991 /**
1992  * Face detect information
1993  */
1994 typedef struct _MMCamFaceDetectInfo {
1995         int num_of_faces;                       /**< number of detected faces */
1996         MMCamFaceInfo *face_info;               /**< face information, this should be freed after use it. */
1997 } MMCamFaceDetectInfo;
1998
1999 /**
2000  * Window information
2001  */
2002 typedef struct _MMCamWindowInfo {
2003         int surface_id;
2004         MMRectType rect;
2005 } MMCamWindowInfo;
2006
2007
2008 /*=======================================================================================
2009 | TYPE DEFINITIONS                                                                      |
2010 ========================================================================================*/
2011 /**
2012  *      Function definition for video stream callback.
2013  *  Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
2014  *  mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
2015  *  Please don't hang this function long. It may cause low performance of preview or occur timeout error from video source.
2016  *  Also, you're not allowed to call mm_camcorder_stop() even in other context, while you're hanging this function.
2017  *  I recommend to you releasing this function ASAP.
2018  *
2019  *      @param[in]      stream                  Reference pointer to video stream data
2020  *      @param[in]      user_param              User parameter which is received from user when callback function was set
2021  *      @return         This function returns true on success, or false on failure.
2022  *      @remarks                This function is issued in the context of gstreamer (video sink thread).
2023  */
2024 typedef gboolean (*mm_camcorder_video_stream_callback)(MMCamcorderVideoStreamDataType *stream, void *user_param);
2025
2026
2027 /**
2028  *      Function definition for audio stream callback.
2029  *  Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
2030  *  mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
2031  *  Please don't hang this function long. It may cause low performance of camcorder or occur timeout error from audio source.
2032  *  I recommend to you releasing this function ASAP.
2033  *
2034  *      @param[in]      stream                  Reference pointer to audio stream data
2035  *      @param[in]      user_param              User parameter which is received from user when callback function was set
2036  *      @return         This function returns true on success, or false on failure.
2037  *      @remarks
2038  */
2039 typedef gboolean (*mm_camcorder_audio_stream_callback)(MMCamcorderAudioStreamDataType *stream, void *user_param);
2040
2041
2042 /**
2043  *      Function definition for muxed stream callback.
2044  *  Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
2045  *  mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
2046  *  Please don't hang this function long. It may cause low performance of camcorder or occur timeout error from encoding pipeline.
2047  *  I recommend to you releasing this function ASAP.
2048  *
2049  *      @param[in]      stream                  Reference pointer to muxed stream data
2050  *      @param[in]      user_param              User parameter which is received from user when callback function was set
2051  *      @return         This function returns true on success, or false on failure.
2052  *      @remarks
2053  */
2054 typedef gboolean (*mm_camcorder_muxed_stream_callback)(MMCamcorderMuxedStreamDataType *stream, void *user_param);
2055
2056
2057 /**
2058  *      Function definition for video capture callback.
2059  *  Like '#mm_camcorder_video_stream_callback', you can't call mm_camcorder_stop() while you are hanging this function.
2060  *
2061  *      @param[in]      frame                   Reference pointer to captured data
2062  *      @param[in]      thumbnail               Reference pointer to thumbnail data
2063  *      @param[in]      user_param              User parameter which is received from user when callback function was set
2064  *      @return         This function returns true on success, or false on failure.
2065  *      @remarks                This function is issued in the context of gstreamer (video src thread).
2066  */
2067 typedef gboolean (*mm_camcorder_video_capture_callback)(MMCamcorderCaptureDataType *frame, MMCamcorderCaptureDataType *thumbnail, void *user_param);
2068
2069 /**
2070  *      Function definition for video encode decision callback.
2071  *  Like '#mm_camcorder_video_stream_callback', you can't call mm_camcorder_stop() while you are hanging this function.
2072  *
2073  *      @param[in]      stream                  Reference pointer to video stream data
2074  *      @param[in]      user_param              User parameter which is received from user when callback function was set
2075  *      @return         This function returns true on encoding, or false on drop frame.
2076  *      @remarks                This function is issued in the context of gstreamer (video sink or internal of camerasrc thread).
2077  */
2078 typedef gboolean (*mm_camcorder_video_encode_decision_callback)(MMCamcorderVideoStreamDataType *stream, void *user_param);
2079
2080
2081 /*=======================================================================================
2082 | GLOBAL FUNCTION PROTOTYPES                                                            |
2083 ========================================================================================*/
2084 /**
2085  *    mm_camcorder_create:\n
2086  *  Create camcorder object. This is the function that an user who wants to use mm_camcorder calls first.
2087  *  This function creates handle structure and initialize mutex, attributes, gstreamer.
2088  *  When this function success, it will return  a handle of newly created object.
2089  *  A user have to put the handle when he calls every function of mm_camcorder. \n
2090  *  Second argument of this function is the field to describe pre-setting information of mm_camcorder such as which camera device it will use.
2091  *  Normally, MM_VIDEO_DEVICE_CAMERA0 is for Main camera(or Mega camera, Back camera),
2092  *  and MM_VIDEO_DEVICE_CAMERA1 is for VGA camera (or Front camera). If you want audio recording,
2093  *  please set MM_VIDEO_DEVICE_NONE. (No camera device is needed.)
2094  *
2095  *      @param[out]     camcorder       A handle of camcorder.
2096  *      @param[in]      info            Information for camera device. Depending on this information,
2097  *                                      camcorder opens different camera devices.
2098  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2099  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2100  *      @see            mm_camcorder_destroy
2101  *      @pre            None
2102  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_NULL
2103  *      @remarks        You can create multiple handles on a context at the same time. However,
2104  *                      camcorder cannot guarantee proper operation because of limitation of resources, such as
2105  *                      camera device, audio device, and display device.
2106  *      @par example
2107  *      @code
2108
2109 #include <mm_camcorder.h>
2110
2111 gboolean initialize_camcorder()
2112 {
2113         int err;
2114         MMCamPreset cam_info;
2115 #if 1
2116         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2117 #else
2118         // when you want to record audio only, enable this.
2119         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2120 #endif
2121
2122         err = mm_camcorder_create(&hcam, &cam_info);
2123
2124         if (err != MM_ERROR_NONE) {
2125                 printf("Fail to call mm_camcorder_create = %x\n", err);
2126                 return FALSE;
2127         }
2128
2129         return TRUE;
2130 }
2131
2132  *      @endcode
2133  */
2134 int mm_camcorder_create(MMHandleType *camcorder, MMCamPreset *info);
2135
2136
2137 /**
2138  *    mm_camcorder_destroy:\n
2139  *  Destroy camcorder object. Release handle and all of the resources that were created in mm_camcorder_create().\n
2140  *  This is the finalizing function of mm_camcorder. If this function is not called or fails to call, the handle isn't released fully.
2141  *  This function releases attributes, mutexes, sessions, and handle itself. This function also removes all of remaining messages.
2142  *  So if your application should wait a certain message of mm_camcorder, please wait to call this function till getting the message.
2143  *
2144  *
2145  *      @param[in]      camcorder       A handle of camcorder.
2146  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2147  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2148  *      @see            mm_camcorder_create
2149  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_NULL
2150  *      @post           Because the handle is not valid, you can't check the state.
2151  *      @remarks        None
2152  *      @par example
2153  *      @code
2154
2155 #include <mm_camcorder.h>
2156
2157 gboolean destroy_camcorder()
2158 {
2159         int err;
2160
2161         //Destroy camcorder handle
2162         err = mm_camcorder_destroy(hcam);
2163         if (err < 0) {
2164                 printf("Fail to call mm_camcorder_destroy  = %x\n", err);
2165                 return FALSE;
2166         }
2167
2168         return TRUE;
2169 }
2170
2171  *      @endcode
2172  */
2173 int mm_camcorder_destroy(MMHandleType camcorder);
2174
2175
2176 /**
2177  *    mm_camcorder_realize:\n
2178  *  Allocate resources for camcorder and initialize it.
2179  *  This also creates streamer pipeline. So you have to set attributes that are pivotal to create
2180  *  the pipeline before calling this function. This function also takes a roll to manage conflict
2181  *  between different applications which use camcorder. For example, if you try to use camcorder when
2182  *  other application that is more important such as call application, this function will return
2183  *  'MM_ERROR_POLICY_BLOCKED'. On the contrary, if your application that uses camcorder starts to launch
2184  *  while another application that uses speaker and has lower priority, your application will kick
2185  *  another application.
2186  *
2187  *      @param[in]      camcorder       A handle of camcorder.
2188  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2189  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2190  *      @see            mm_camcorder_unrealize
2191  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_NULL
2192  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_READY
2193  *      @remarks        None
2194  *      @par example
2195  *      @code
2196
2197 #include <mm_camcorder.h>
2198
2199 //For image capturing
2200 gboolean initialize_image_capture()
2201 {
2202         int err;
2203         MMCamPreset cam_info;
2204         char *err_attr_name = NULL;
2205         void * hdisplay = NULL;
2206         int hsize = 0;
2207
2208         //Set video device as 'camera0' (main camera device)
2209         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2210
2211         err = mm_camcorder_create(&hcam, &cam_info);
2212
2213         if (err != MM_ERROR_NONE) {
2214                 printf("Fail to call mm_camcorder_create = %x\n", err);
2215                 return FALSE;
2216         }
2217
2218         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2219         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
2220
2221         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2222         hsize = sizeof(ad.xid);         //size of xid structure.
2223
2224         // camcorder attribute setting
2225         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2226                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
2227                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
2228                                           MMCAM_CAMERA_WIDTH, 640,
2229                                           MMCAM_CAMERA_HEIGHT, 480,
2230                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
2231                                           MMCAM_CAMERA_FPS, 30,
2232                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2233                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,
2234                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
2235                                           MMCAM_CAPTURE_WIDTH, 640,
2236                                           MMCAM_CAPTURE_HEIGHT, 480,
2237                                           NULL);
2238
2239         if (err < 0) {
2240                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2241                 if (err_attr_name) {
2242                         free(err_attr_name);
2243                         err_attr_name = NULL;
2244                         return FALSE;
2245                 }
2246         }
2247
2248         err =  mm_camcorder_realize(hcam);
2249         if (err < 0) {
2250                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2251                 return FALSE;
2252         }
2253
2254         return TRUE;
2255 }
2256
2257 //For A/V capturing
2258 gboolean initialize_video_capture()
2259 {
2260         int err;
2261         MMCamPreset cam_info;
2262         char *err_attr_name = NULL;
2263         void * hdisplay = NULL;
2264         int hsize = 0;
2265
2266         //Set video device as 'camera0' (main camera device)
2267         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2268
2269         err = mm_camcorder_create(&hcam, &cam_info);
2270
2271         if (err != MM_ERROR_NONE) {
2272                 printf("Fail to call mm_camcorder_create = %x\n", err);
2273                 return FALSE;
2274         }
2275
2276         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, hcam);
2277
2278         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2279         hsize = sizeof(ad.xid);         //size of xid structure.
2280
2281         // camcorder attribute setting
2282         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2283                                           MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO,
2284                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2285                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2286                                           MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
2287                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2288                                           MMCAM_CAMERA_WIDTH, 1280,
2289                                           MMCAM_CAMERA_HEIGHT, 720,
2290                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12,
2291                                           MMCAM_CAMERA_FPS, 30,
2292                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2293                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2294                                           MMCAM_AUDIO_CHANNEL, 2,
2295                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2296                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,               hsize,
2297                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2298                                           NULL);
2299
2300         if (err < 0) {
2301                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2302                 if (err_attr_name) {
2303                         free(err_attr_name);
2304                         err_attr_name = NULL;
2305                         return FALSE;
2306                 }
2307         }
2308
2309         err =  mm_camcorder_realize(hcam);
2310         if (err < 0) {
2311                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2312                 return FALSE;
2313         }
2314
2315         return TRUE;
2316 }
2317
2318 //For audio(only) capturing
2319 gboolean initialize_audio_capture()
2320 {
2321         int err;
2322         MMCamPreset cam_info;
2323         char *err_attr_name = NULL;
2324         void * hdisplay = NULL;
2325         int hsize = 0;
2326
2327         //Set no video device, because audio recording doesn't need video input.
2328         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2329
2330         err = mm_camcorder_create(&hcam, &cam_info);
2331
2332         if (err != MM_ERROR_NONE) {
2333                 printf("Fail to call mm_camcorder_create = %x\n", err);
2334                 return FALSE;
2335         }
2336
2337         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2338
2339         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2340         hsize = sizeof(ad.xid);         //size of xid structure.
2341
2342         // camcorder attribute setting
2343         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2344                                           MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
2345                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2346                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2347                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2348                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2349                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2350                                           MMCAM_AUDIO_CHANNEL, 2,
2351                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2352                                           MMCAM_TARGET_TIME_LIMIT, 360000,
2353                                           NULL);
2354
2355         if (err < 0) {
2356                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2357                 if (err_attr_name) {
2358                         free(err_attr_name);
2359                         err_attr_name = NULL;
2360                         return FALSE;
2361                 }
2362         }
2363
2364         err =  mm_camcorder_realize(hcam);
2365         if (err < 0) {
2366                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2367                 return FALSE;
2368         }
2369
2370         return TRUE;
2371 }
2372  *      @endcode
2373  */
2374 int mm_camcorder_realize(MMHandleType camcorder);
2375
2376
2377 /**
2378  *    mm_camcorder_unrealize:\n
2379  *  Uninitialize camcoder resources and free allocated memory.
2380  *  Most important resource that is released here is gstreamer pipeline of mm_camcorder.
2381  *  Because most of resources, such as camera device, video display device, and audio I/O device, are operating on the gstreamer pipeline,
2382  *  this function should be called to release its resources.
2383  *
2384  *      @param[in]      camcorder       A handle of camcorder.
2385  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2386  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2387  *      @see            mm_camcorder_realize
2388  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_READY
2389  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_NULL
2390  *      @remarks        None
2391  *      @par example
2392  *      @code
2393
2394 #include <mm_camcorder.h>
2395
2396 gboolean unrealize_camcorder()
2397 {
2398         int err;
2399
2400         //Release all resources of camcorder handle
2401         err =  mm_camcorder_unrealize(hcam);
2402         if (err < 0) {
2403                 printf("Fail to call mm_camcorder_unrealize  = %x\n", err);
2404                 return FALSE;
2405         }
2406
2407         return TRUE;
2408 }
2409
2410  *      @endcode
2411  */
2412 int mm_camcorder_unrealize(MMHandleType camcorder);
2413
2414
2415 /**
2416  *      mm_camcorder_start:\n
2417  *   Start previewing. (Image/Video mode)
2418  *  'mm_camcorder_video_stream_callback' is activated after calling this function.
2419  *
2420  *      @param[in]      camcorder       A handle of camcorder.
2421  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2422  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2423  *      @see            mm_camcorder_stop
2424  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_READY
2425  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2426  *      @remarks        None
2427  *      @par example
2428  *      @code
2429
2430 #include <mm_camcorder.h>
2431
2432 //For image capturing
2433 gboolean initialize_image_capture()
2434 {
2435         int err;
2436         MMCamPreset cam_info;
2437         char *err_attr_name = NULL;
2438         void * hdisplay = NULL;
2439         int hsize = 0;
2440
2441         //Set video device as 'camera0' (main camera device)
2442         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2443
2444         err = mm_camcorder_create(&hcam, &cam_info);
2445
2446         if (err != MM_ERROR_NONE) {
2447                         printf("Fail to call mm_camcorder_create = %x\n", err);
2448                         return FALSE;
2449         }
2450
2451         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2452         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
2453
2454         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2455         hsize = sizeof(ad.xid);         //size of xid structure.
2456
2457         // camcorder attribute setting
2458         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2459                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
2460                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
2461                                           MMCAM_CAMERA_WIDTH, 640,
2462                                           MMCAM_CAMERA_HEIGHT, 480,
2463                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
2464                                           MMCAM_CAMERA_FPS, 30,
2465                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2466                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,
2467                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
2468                                           MMCAM_CAPTURE_WIDTH, 640,
2469                                           MMCAM_CAPTURE_HEIGHT, 480,
2470                                           NULL);
2471
2472         if (err < 0) {
2473                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2474                 if (err_attr_name) {
2475                         free(err_attr_name);
2476                         err_attr_name = NULL;
2477                         return FALSE;
2478                 }
2479         }
2480
2481         err =  mm_camcorder_realize(hcam);
2482         if (err < 0) {
2483                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2484                 return FALSE;
2485         }
2486
2487         // start camcorder
2488         err = mm_camcorder_start(hcam);
2489         if (err < 0) {
2490                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2491                 return FALSE;
2492         }
2493
2494         return TRUE;
2495 }
2496
2497 //For A/V capturing
2498 gboolean initialize_video_capture()
2499 {
2500         int err;
2501         MMCamPreset cam_info;
2502         char *err_attr_name = NULL;
2503         void * hdisplay = NULL;
2504         int hsize = 0;
2505
2506         //Set video device as 'camera0' (main camera device)
2507         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2508
2509         err = mm_camcorder_create(&hcam, &cam_info);
2510
2511         if (err != MM_ERROR_NONE) {
2512                         printf("Fail to call mm_camcorder_create = %x\n", err);
2513                         return FALSE;
2514         }
2515
2516         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, hcam);
2517
2518         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2519         hsize = sizeof(ad.xid);         //size of xid structure.
2520
2521         // camcorder attribute setting
2522         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2523                                           MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO,
2524                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2525                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2526                                           MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
2527                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2528                                           MMCAM_CAMERA_WIDTH, 1280,
2529                                           MMCAM_CAMERA_HEIGHT, 720,
2530                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12,
2531                                           MMCAM_CAMERA_FPS, 30,
2532                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2533                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2534                                           MMCAM_AUDIO_CHANNEL, 2,
2535                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2536                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,               hsize,
2537                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2538                                           NULL);
2539
2540         if (err < 0) {
2541                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2542                 if (err_attr_name) {
2543                         free(err_attr_name);
2544                         err_attr_name = NULL;
2545                         return FALSE;
2546                 }
2547         }
2548
2549         err =  mm_camcorder_realize(hcam);
2550         if (err < 0) {
2551                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2552                 return FALSE;
2553         }
2554
2555         // start camcorder
2556         err = mm_camcorder_start(hcam);
2557         if (err < 0) {
2558                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2559                 return FALSE;
2560         }
2561
2562         return TRUE;
2563 }
2564
2565 //For audio(only) capturing
2566 gboolean initialize_audio_capture()
2567 {
2568         int err;
2569         MMCamPreset cam_info;
2570         char *err_attr_name = NULL;
2571         void * hdisplay = NULL;
2572         int hsize = 0;
2573
2574         //Set no video device, because audio recording doesn't need video input.
2575         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2576
2577         err = mm_camcorder_create(&hcam, &cam_info);
2578
2579         if (err != MM_ERROR_NONE) {
2580                 printf("Fail to call mm_camcorder_create = %x\n", err);
2581                 return FALSE;
2582         }
2583
2584         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2585
2586         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2587         hsize = sizeof(ad.xid);         //size of xid structure.
2588
2589         // camcorder attribute setting
2590         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2591                                           MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
2592                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2593                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2594                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2595                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2596                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2597                                           MMCAM_AUDIO_CHANNEL, 2,
2598                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2599                                           MMCAM_TARGET_TIME_LIMIT, 360000,
2600                                           NULL);
2601
2602         if (err < 0) {
2603                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2604                 if (err_attr_name) {
2605                         free(err_attr_name);
2606                         err_attr_name = NULL;
2607                         return FALSE;
2608                 }
2609         }
2610
2611         err =  mm_camcorder_realize(hcam);
2612         if (err < 0) {
2613                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2614                 return FALSE;
2615         }
2616
2617         // start camcorder
2618         err = mm_camcorder_start(hcam);
2619         if (err < 0) {
2620                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2621                 return FALSE;
2622         }
2623
2624         return TRUE;
2625 }
2626  *      @endcode
2627  */
2628 int mm_camcorder_start(MMHandleType camcorder);
2629
2630
2631 /**
2632  *    mm_camcorder_stop:\n
2633  *  Stop previewing. (Image/Video mode)
2634  *  This function will change the status of pipeline. If an application doesn't return callbacks
2635  *  of camcorder, this function can be locked. For example, if your application still
2636  *  holds '#mm_camcorder_video_capture_callback' or '#mm_camcorder_video_stream_callback',
2637  *  this function could be hung. So users have to return every callback before calling this function.
2638  *
2639  *      @param[in]      camcorder       A handle of camcorder.
2640  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2641  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2642  *      @see            mm_camcorder_start
2643  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2644  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_READY
2645  *      @remarks        None
2646  *      @par example
2647  *      @code
2648
2649 #include <mm_camcorder.h>
2650
2651 gboolean stop_camcorder()
2652 {
2653         int err;
2654
2655         //Stop preview
2656         err =  mm_camcorder_stop(hcam);
2657         if (err < 0) {
2658                 printf("Fail to call mm_camcorder_stop  = %x\n", err);
2659                 return FALSE;
2660         }
2661
2662         return TRUE;
2663 }
2664
2665  *      @endcode
2666  */
2667 int mm_camcorder_stop(MMHandleType camcorder);
2668
2669
2670 /**
2671  *    mm_camcorder_capture_start:\n
2672  *  Start capturing of still images. (Image mode only)
2673  *  Captured image will be delievered through 'mm_camcorder_video_capture_callback'.
2674  *  So basically, the operation is working asynchronously. \n
2675  *  When a user call this function, MSL will stop to retrieving preview from camera device.
2676  *  Then set capture resolution, pixel format, and encoding type to camera driver. After resuming,
2677  *  camera can get still image.  A user will be notified by
2678  *  'MM_MESSAGE_CAMCORDER_CAPTURED' message when capturing succeed. When a user sets
2679  *  multishot (by setting multiple number to MMCAM_CAPTURE_COUNT), the message
2680  *  will be called multiple time. You can get the number of image from 'code' of
2681  *  'MMMessageParamType'.
2682  *
2683  *      @param[in]      camcorder       A handle of camcorder.
2684  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2685  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2686  *      @see            mm_camcorder_capture_stop
2687  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2688  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_CAPTURING
2689  *      @remarks        To call this function, preview should be started successfully.\n
2690  *                      This function is a pair of mm_camcorder_capture_stop().
2691  *                      So user should call mm_camcorder_capture_stop() after getting captured image.
2692  *      @par example
2693  *      @code
2694
2695 #include <mm_camcorder.h>
2696
2697 gboolean capturing_picture()
2698 {
2699         int err;
2700
2701         err =  mm_camcorder_capture_start(hcam);
2702         if (err < 0)
2703         {
2704                 printf("Fail to call mm_camcorder_capture_start  = %x\n", err);
2705                 return FALSE;
2706         }
2707
2708         //mm_camcorder_capture_stop should be called after getting
2709         //MM_MESSAGE_CAMCORDER_CAPTURED message.
2710
2711         return TRUE;
2712 }
2713
2714
2715  *      @endcode
2716  */
2717 int mm_camcorder_capture_start(MMHandleType camcorder);
2718
2719
2720 /**
2721  *    mm_camcorder_capture_stop:\n
2722  *  Stop capturing of still images. (Image mode only)
2723  *  This function notifies the end of capturing and launch preview again.
2724  *  Just as mm_camcorder_capture_start(), this function stops still image stream and set preview information such as
2725  *  resolution, pixel format, and framerate to camera driver. Then it command to start preview.
2726  *  If you don't call this, preview will not be displayed even though capturing was finished.
2727  *
2728  *      @param[in]      camcorder       A handle of camcorder.
2729  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2730  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2731  *      @see            mm_camcorder_capture_start
2732  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_CAPTURING
2733  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2734  *      @remarks        To call this function, a user has to call mm_camcorder_capture_start() first.\n
2735  *                      This is not a function to stop multishot in the middle of operation. For that,
2736  *                      please use '#MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT' instead.
2737  *      @par example
2738  *      @code
2739
2740 #include <mm_camcorder.h>
2741
2742 gboolean capturing_picture_stop()
2743 {
2744         int err;
2745
2746         err =  mm_camcorder_capture_stop(hcam);
2747         if (err < 0) {
2748                 printf("Fail to call mm_camcorder_capture_stop  = %x\n", err);
2749                 return FALSE;
2750         }
2751
2752         //After calling upper function, preview will start.
2753
2754         return TRUE;
2755 }
2756
2757  *      @endcode
2758  */
2759 int mm_camcorder_capture_stop(MMHandleType camcorder);
2760
2761
2762 /**
2763  *    mm_camcorder_record:\n
2764  *  Start recording. (Audio/Video mode only)
2765  *  Camcorder starts to write a file when you call this function. You can specify the name of file
2766  *  using '#MMCAM_TARGET_FILENAME'. Beware, if you fail to call mm_camcorder_commit() or mm_camcorder_cancel(),
2767  *  the recorded file is still on the storage.
2768  *
2769  *      @param[in]      camcorder       A handle of camcorder.
2770  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2771  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2772  *      @see            mm_camcorder_pause
2773  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2774  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_RECORDING
2775  *      @remarks        None
2776  *      @par example
2777  *      @code
2778
2779 #include <mm_camcorder.h>
2780
2781 gboolean record_and_cancel_video_file()
2782 {
2783         int err;
2784
2785         // Start recording
2786         err =  mm_camcorder_record(hcam);
2787         if (err < 0) {
2788                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2789                 return FALSE;
2790         }
2791
2792         return TRUE;
2793 }
2794
2795  *      @endcode
2796  */
2797 int mm_camcorder_record(MMHandleType camcorder);
2798
2799
2800 /**
2801  *    mm_camcorder_pause:\n
2802  *  Pause A/V recording or Audio recording. (Audio/Video mode only)
2803  *  On video recording, you can see preview while on pausing. So mm_camcorder cuts video stream path to encoder and keep the flow to preview.
2804  *  If you call mm_camcorder_commit() while on pausing, the recorded file only has Audio and Video stream which were generated before pause().
2805  *
2806  *      @param[in]      camcorder       A handle of camcorder.
2807  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2808  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2809  *      @see            mm_camcorder_record
2810  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2811  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PAUSED
2812  *      @remarks        Even though this function is for pausing recording, small amount of buffers could be recorded after pause().
2813  *                      Because the buffers which are existed in the queue were created before pause(), the buffers should be recorded.
2814  *      @par example
2815  *      @code
2816
2817 #include <mm_camcorder.h>
2818
2819 gboolean record_pause_and_resume_recording()
2820 {
2821         int err;
2822
2823         // Start recording
2824         err =  mm_camcorder_record(hcam);
2825         if (err < 0) {
2826                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2827                 return FALSE;
2828         }
2829
2830         // Wait while recording...
2831
2832         // Pause
2833         err =  mm_camcorder_pause(hcam);
2834         if (err < 0) {
2835                 printf("Fail to call mm_camcorder_pause  = %x\n", err);
2836                 return FALSE;
2837         }
2838
2839         // Pausing...
2840
2841         // Resume
2842         err =  mm_camcorder_record(hcam);
2843         if (err < 0) {
2844                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2845                 return FALSE;
2846         }
2847
2848         return TRUE;
2849 }
2850
2851
2852  *      @endcode
2853  */
2854 int mm_camcorder_pause(MMHandleType camcorder);
2855
2856
2857 /**
2858  *    mm_camcorder_commit:\n
2859  *  Stop recording and save results.  (Audio/Video mode only)\n
2860  *  After starting recording, encoded data frame will be stored in the location specified in MMCAM_TARGET_FILENAME.
2861  *  Some encoder or muxer require a certain type of finalizing such as adding some information to header.
2862  *  This function takes that roll. So if you don't call this function after recording, the result file may not be playable.\n
2863  *  After committing successfully, camcorder resumes displaying preview (video recording case).
2864  *  Because this is the function for saving the recording result, the operation is available
2865  *  only when the mode of camcorder is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
2866  *
2867  *      @param[in]      camcorder       A handle of camcorder.
2868  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2869  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2870  *      @see            mm_camcorder_cancel
2871  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2872  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2873  *      @remarks        This function can take a few second when recording time is long.
2874  *                      and if there are only quite few input buffer from video src or audio src,
2875  *                      committing could be failed.
2876  *      @par example
2877  *      @code
2878
2879 #include <mm_camcorder.h>
2880
2881 gboolean record_and_save_video_file()
2882 {
2883         int err;
2884
2885         // Start recording
2886         err =  mm_camcorder_record(hcam);
2887         if (err < 0) {
2888                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2889                 return FALSE;
2890         }
2891
2892         // Wait while recording for test...
2893         // In normal case, mm_camcorder_record() and mm_camcorder_commit() aren't called in the same function.
2894
2895         // Save file
2896         err =  mm_camcorder_commit(hcam);
2897         if (err < 0) {
2898                 printf("Fail to call mm_camcorder_commit  = %x\n", err);
2899                 return FALSE;
2900         }
2901
2902         return TRUE;
2903 }
2904
2905  *      @endcode
2906  */
2907 int mm_camcorder_commit(MMHandleType camcorder);
2908
2909
2910 /**
2911  *      mm_camcorder_cancel:\n
2912  *    Stop recording and discard the result. (Audio/Video mode only)
2913  *      When a user want to finish recording without saving the result file, this function can be used.
2914  *      Like mm_camcorder_commit(), this function also stops recording, release related resources(like codec) ,and goes back to preview status.
2915  *      However, instead of saving file, this function unlinks(delete) the result.\n
2916  *      Because this is the function for canceling recording, the operation is available
2917  *      only when mode is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO.
2918  *
2919  *      @param[in]      camcorder       A handle of camcorder.
2920  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2921  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2922  *      @see            mm_camcorder_commit
2923  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2924  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2925  *      @remarks        None
2926  *      @par example
2927  *      @code
2928
2929 #include <mm_camcorder.h>
2930
2931 gboolean record_and_cancel_video_file()
2932 {
2933         int err;
2934
2935         // Start recording
2936         err =  mm_camcorder_record(hcam);
2937         if (err < 0) {
2938                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2939                 return FALSE;
2940         }
2941
2942         // Wait while recording...
2943
2944         // Cancel recording
2945         err =  mm_camcorder_cancel(hcam);
2946         if (err < 0) {
2947                 printf("Fail to call mm_camcorder_cancel  = %x\n", err);
2948                 return FALSE;
2949         }
2950
2951         return TRUE;
2952 }
2953
2954  *      @endcode
2955  */
2956 int mm_camcorder_cancel(MMHandleType camcorder);
2957
2958
2959 /**
2960  *    mm_camcorder_set_message_callback:\n
2961  *  Set callback for receiving messages from camcorder. Through this callback function, camcorder
2962  *  sends various message including status changes, asynchronous error, capturing, and limitations.
2963  *  One thing you have to know is that message callback is working on the main loop of application.
2964  *  So until releasing the main loop, message callback will not be called.
2965  *
2966  *      @param[in]      camcorder       A handle of camcorder.
2967  *      @param[in]      callback        Function pointer of callback function. Please refer 'MMMessageCallback'.
2968  *      @param[in]      user_data       User parameter for passing to callback function.
2969  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2970  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2971  *      @see            MMMessageCallback
2972  *      @pre            None
2973  *      @post           None
2974  *      @remarks        registered 'callback' is called on main loop of the application. So until the main loop is released, 'callback' will not be called.
2975  *      @par example
2976  *      @code
2977
2978 #include <mm_camcorder.h>
2979
2980 gboolean setting_msg_callback()
2981 {
2982         //set callback
2983         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2984
2985         return TRUE;
2986 }
2987
2988
2989  *      @endcode
2990  */
2991 int mm_camcorder_set_message_callback(MMHandleType camcorder, MMMessageCallback callback, void *user_data);
2992
2993
2994 /**
2995  *    mm_camcorder_set_video_stream_callback:\n
2996  *  Set callback for user defined video stream callback function.
2997  *  Users can retrieve video frame using registered callback.
2998  *  The callback function holds the same buffer that will be drawn on the display device.
2999  *  So if an user change the buffer, it will be displayed on the device.
3000  *
3001  *      @param[in]      camcorder       A handle of camcorder.
3002  *      @param[in]      callback        Function pointer of callback function.
3003  *      @param[in]      user_data       User parameter for passing to callback function.
3004  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3005  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3006  *      @see            mm_camcorder_video_stream_callback
3007  *      @pre            None
3008  *      @post           None
3009  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
3010  *      @par example
3011  *      @code
3012
3013 #include <mm_camcorder.h>
3014
3015 gboolean setting_video_stream_callback()
3016 {
3017         //set callback
3018         mm_camcorder_set_video_stream_callback(hcam, (mm_camcorder_video_stream_callback)camcordertest_video_stream_cb, (void*)hcam);
3019
3020         return TRUE;
3021 }
3022  *      @endcode
3023  */
3024 int mm_camcorder_set_video_stream_callback(MMHandleType camcorder, mm_camcorder_video_stream_callback callback, void *user_data);
3025
3026
3027 /**
3028  *    mm_camcorder_set_video_capture_callback:\n
3029  *  Set callback for user defined video capture callback function.  (Image mode only)
3030  *  mm_camcorder deliver captured image through the callback.\n
3031  *  Normally, this function provides main captured image and thumbnail image. But depending on the environment,
3032  *  thumbnail would not be available. Information related with main captured image and thumbnail image is also included
3033  *  in the argument of the callback function.
3034  *  For more detail information of callback, please refer 'mm_camcorder_video_capture_callback'.
3035  *
3036  *      @param[in]      camcorder       A handle of camcorder.
3037  *      @param[in]      callback        Function pointer of callback function.
3038  *      @param[in]      user_data       User parameter for passing to callback function.
3039  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3040  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3041  *      @see            mm_camcorder_video_capture_callback
3042  *      @pre            None
3043  *      @post           None
3044  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
3045  *      @par example
3046  *      @code
3047
3048 #include <mm_camcorder.h>
3049
3050 gboolean setting_capture_callback()
3051 {
3052         //set callback
3053         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
3054
3055         return TRUE;
3056 }
3057  *      @endcode
3058  */
3059 int mm_camcorder_set_video_capture_callback(MMHandleType camcorder, mm_camcorder_video_capture_callback callback, void *user_data);
3060
3061
3062 /**
3063  *    mm_camcorder_set_audio_stream_callback:\n
3064  *  Set callback for user defined audio stream callback function.
3065  *  Users can retrieve audio data using registered callback.
3066  *  The callback function holds the same buffer that will be recorded.
3067  *  So if an user change the buffer, the result file will has the buffer.
3068  *
3069  *      @param[in]      camcorder       A handle of camcorder.
3070  *      @param[in]      callback        Function pointer of callback function.
3071  *      @param[in]      user_data       User parameter for passing to callback function.
3072  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3073  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3074  *      @see            mm_camcorder_audio_stream_callback
3075  *      @pre            None
3076  *      @post           None
3077  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
3078  *      @par example
3079  *      @code
3080
3081 #include <mm_camcorder.h>
3082
3083 gboolean setting_audio_stream_callback()
3084 {
3085         //set callback
3086         mm_camcorder_set_audio_stream_callback(hcam, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcam);
3087
3088         return TRUE;
3089 }
3090  *  @endcode
3091  */
3092 int mm_camcorder_set_audio_stream_callback(MMHandleType camcorder, mm_camcorder_audio_stream_callback callback, void *user_data);
3093
3094
3095 /**
3096  *    mm_camcorder_set_muxed_stream_callback:\n
3097  *  Set callback for user defined muxed stream callback function.
3098  *  Users can retrieve muxed data using registered callback.
3099  *  The callback function holds the same buffer that will be recorded.
3100  *
3101  *      @param[in]      camcorder       A handle of camcorder.
3102  *      @param[in]      callback        Function pointer of callback function.
3103  *      @param[in]      user_data       User parameter for passing to callback function.
3104  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3105  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3106  *      @see            mm_camcorder_muxed_stream_callback
3107  *      @pre            None
3108  *      @post           None
3109  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
3110  *      @par example
3111  *      @code
3112
3113 #include <mm_camcorder.h>
3114
3115 gboolean setting_muxed_stream_callback()
3116 {
3117         //set callback
3118         mm_camcorder_set_muxed_stream_callback(hcam, (mm_camcorder_muxed_stream_callback)camcordertest_muxed_stream_cb, (void*)hcam);
3119
3120         return TRUE;
3121 }
3122  *  @endcode
3123  */
3124 int mm_camcorder_set_muxed_stream_callback(MMHandleType camcorder, mm_camcorder_muxed_stream_callback callback, void *user_data);
3125
3126
3127 /**
3128  *    mm_camcorder_set_video_encode_decision_callback:\n
3129  *  Set callback for user defined video encode decision callback function.
3130  *  Users can retrieve video frame using registered callback,
3131  *  and decide to encoding video frame by return value of function.
3132  *
3133  *      @param[in]      camcorder       A handle of camcorder.
3134  *      @param[in]      callback        Function pointer of callback function.
3135  *      @param[in]      user_data       User parameter for passing to callback function.
3136  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3137  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3138  *      @see            mm_camcorder_video_encode_decision_callback
3139  *      @pre            None
3140  *      @post           None
3141  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
3142  */
3143 int mm_camcorder_set_video_encode_decision_callback(MMHandleType camcorder, mm_camcorder_video_encode_decision_callback callback, void *user_data);
3144
3145
3146 /**
3147  *    mm_camcorder_get_state:\n
3148  *  Get the current state of camcorder.
3149  *  mm_camcorder is working on the base of its state. An user should check the state of mm_camcorder before calling its functions.
3150  *  If the handle is available, user can retrieve the value.
3151  *
3152  *      @param[in]      camcorder       A handle of camcorder.
3153  *      @param[out]     state           On return, it contains current state of camcorder.
3154  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3155  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3156  *      @see            MMCamcorderStateType
3157  *      @pre            None
3158  *      @post           None
3159  *      @remarks        None
3160  *      @par example
3161  *      @code
3162
3163 #include <mm_camcorder.h>
3164
3165 gboolean get_state_of_camcorder()
3166 {
3167         MMCamcorderStateType state;
3168
3169         //Get state of camcorder
3170         mm_camcorder_get_state(hcam, &state);
3171         printf("Current status is %d\n", state);
3172
3173         return TRUE;
3174 }
3175
3176  *      @endcode
3177  */
3178 int mm_camcorder_get_state(MMHandleType camcorder, MMCamcorderStateType *state);
3179 int mm_camcorder_get_state2(MMHandleType camcorder, MMCamcorderStateType *state, MMCamcorderStateType *old_state);
3180
3181
3182 /**
3183  *    mm_camcorder_get_attributes:\n
3184  *  Get attributes of camcorder with given attribute names. This function can get multiple attributes
3185  *  simultaneously. If one of attribute fails, this function will stop at the point.
3186  *  'err_attr_name' let you know the name of the attribute.
3187  *
3188  *      @param[in]      camcorder       Specifies the camcorder  handle.
3189  *      @param[out]     err_attr_name   Specifies the name of attributes that made an error. If the function doesn't make an error, this will be null. @n
3190  *                                      Free this variable after using.
3191  *      @param[in]      attribute_name  attribute name that user want to get.
3192  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3193  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3194  *      @pre            None
3195  *      @post           None
3196  *      @remarks        You can retrieve multiple attributes at the same time.  @n
3197  *                      This function must finish with 'NULL' argument.  @n
3198  *                      ex) mm_camcorder_get_attributes(....... , NULL);
3199  *      @see            mm_camcorder_set_attributes
3200  *      @par example
3201  *      @code
3202
3203 #include <mm_camcorder.h>
3204
3205 gboolean getting_attribute()
3206 {
3207         int err;
3208         MMCamPreset cam_info;
3209         char *err_attr_name = NULL;
3210         void * hdisplay = NULL;
3211         int hsize = 0;
3212
3213         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
3214         hsize = sizeof(ad.xid);         //size of xid structure.
3215
3216         // camcorder attribute setting
3217         err = mm_camcorder_get_attributes(hcamcorder, NULL,     //The second is the argument for debugging. But you can skip this.
3218                                           MMCAM_MODE,  &mode,   //You have to input a pointer instead of variable itself.
3219                                           NULL);                //mm_camcorder_set_attributes() should be finished with a NULL argument.
3220
3221         return TRUE;
3222 }
3223
3224  *      @endcode
3225  */
3226 int mm_camcorder_get_attributes(MMHandleType camcorder,  char **err_attr_name, const char *attribute_name, ...) G_GNUC_NULL_TERMINATED;
3227
3228
3229
3230 /**
3231  *    mm_camcorder_set_attributes:\n
3232  *  Set attributes of camcorder with given attribute names. This function can set multiple attributes
3233  *  simultaneously. If one of attribute fails, this function will stop at the point.
3234  *  'err_attr_name' let you know the name of the attribute.
3235  *
3236  *      @param[in]      camcorder       Specifies the camcorder  handle.
3237  *      @param[out]     err_attr_name   Specifies the name of attributes that made an error. If the function doesn't make an error, this will be null. @n
3238  *                                      Free this variable after using.
3239  *      @param[in]      attribute_name  attribute name that user want to set.
3240  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3241  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3242  *      @pre            None
3243  *      @post           None
3244  *      @remarks        You can put multiple attributes to camcorder at the same time.  @n
3245  *                      This function must finish with 'NULL' argument.  @n
3246  *                      ex) mm_camcorder_set_attributes(....... , NULL);
3247  *      @see            mm_camcorder_get_attributes
3248  *      @par example
3249  *      @code
3250
3251 #include <mm_camcorder.h>
3252
3253 gboolean setting_attribute()
3254 {
3255         int err;
3256         MMCamPreset cam_info;
3257         char *err_attr_name = NULL;
3258         void * hdisplay = NULL;
3259         int hsize = 0;
3260
3261         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
3262         hsize = sizeof(ad.xid);         //size of xid structure.
3263
3264         // camcorder attribute setting
3265         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,           //The second is the argument for debugging.
3266                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
3267                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
3268                                           MMCAM_CAMERA_WIDTH, 640,
3269                                           MMCAM_CAMERA_HEIGHT, 480,
3270                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
3271                                           MMCAM_CAMERA_FPS, 30,
3272                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
3273                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,               //Beware some types require 'size' value, too. (STRING, DATA type attributes)
3274                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
3275                                           MMCAM_CAPTURE_WIDTH, 640,
3276                                           MMCAM_CAPTURE_HEIGHT, 480,
3277                                           NULL);                //mm_camcorder_set_attributes() should be finished with a NULL argument.
3278
3279         if (err < 0) {
3280                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);                //When the function failed, 'err_attr_name' has the name of attr that made the error.
3281                 if (err_attr_name) {
3282                         free(err_attr_name);                    //Please free 'err_attr_name', after using the argument.
3283                         err_attr_name = NULL;
3284                         return FALSE;
3285                 }
3286         }
3287
3288         return TRUE;
3289 }
3290  *      @endcode
3291  */
3292 int mm_camcorder_set_attributes(MMHandleType camcorder,  char **err_attr_name, const char *attribute_name, ...) G_GNUC_NULL_TERMINATED;
3293
3294
3295 /**
3296  *    mm_camcorder_get_attribute_info:\n
3297  *  Get detail information of the attribute. To manager attributes, an user may want to know the exact character of the attribute,
3298  *  such as type, flag, and validity. This is the function to provide such information.
3299  *  Depending on the 'validity_type', validity union would be different. To know about the type of union, please refer 'MMCamAttrsInfo'.
3300  *
3301  *      @param[in]      camcorder       Specifies the camcorder  handle.
3302  *      @param[in]      attribute_name  attribute name that user want to get information.
3303  *      @param[out]     info            a structure that holds information related with the attribute.
3304  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3305  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3306  *      @pre            None
3307  *      @post           None
3308  *      @remarks        If the function succeeds, 'info' holds detail information about the attribute, such as type,
3309  *                      flag, validity_type, validity_values, and default values.
3310  *      @see            mm_camcorder_get_attributes, mm_camcorder_set_attributes
3311  *      @par example
3312  *      @code
3313
3314 #include <mm_camcorder.h>
3315
3316 gboolean getting_info_from_attribute()
3317 {
3318         MMCamAttrsInfo info;
3319         int err;
3320
3321         err = mm_camcorder_get_attribute_info(handle, MMCAM_CAPTURE_HEIGHT, &info);
3322         if (err < 0) {
3323                 printf("Fail to call mm_camcorder_get_attribute_info()");
3324                 return FALSE;
3325         }
3326
3327         //Now 'info' has many information about 'MMCAM_CAPTURE_HEIGHT'
3328
3329         return TRUE;
3330 }
3331  *      @endcode
3332  */
3333 int mm_camcorder_get_attribute_info(MMHandleType camcorder, const char *attribute_name, MMCamAttrsInfo *info);
3334
3335
3336 /**
3337  *    mm_camcorder_get_fps_list_by_resolution:\n
3338  *  Get detail information of the fps configure. To manager fps, an user may want to know the supported fps list by the current preview resolution,
3339  *  Gives attribute information structure, from the configure data.
3340  *  Depending on the 'validity_type', validity union would be different. To know about the type of union, please refer 'MMCamAttrsInfo'.
3341  *
3342  *      @param[in]      camcorder       Specifies the camcorder  handle.
3343  *      @param[in]      width   width value of the current Preview resolution.
3344  *      @param[in]      height  height value of the current Preview resolution.
3345  *      @param[out]     fps_info                a structure that holds information related with the attribute.
3346  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3347  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3348  *      @pre            None
3349  *      @post           None
3350  *      @remarks        If the function succeeds, 'info' holds detail information about the attribute, such as type,
3351  *                      flag, validity_type, validity_values, and default values.
3352  *      @see            mm_camcorder_get_attributes, mm_camcorder_set_attributes
3353  *      @par example
3354  *      @code
3355
3356 #include <mm_camcorder.h>
3357
3358 gboolean getting_info_from_attribute()
3359 {
3360         MMCamAttrsInfo info;
3361         int err;
3362
3363         err = mm_camcorder_get_fps_list_by_resolution(handle, width, height, &info);
3364         if (err < 0) {
3365                 printf("Fail to call mm_camcorder_get_attribute_info()");
3366                 return FALSE;
3367         }
3368
3369         //Now 'info' has many information about 'MMCAM_CAPTURE_HEIGHT'
3370
3371         return TRUE;
3372 }
3373  *      @endcode
3374  */
3375 int mm_camcorder_get_fps_list_by_resolution(MMHandleType camcorder, int width, int height, MMCamAttrsInfo *fps_info);
3376
3377
3378 /**
3379  *    mm_camcorder_init_focusing:\n
3380  *  Initialize focusing. \n
3381  *  This function stops focusing action and adjust the camera lens to initial position.
3382  *  Some camera application requires to initialize its lens position after releasing half shutter. In that case,
3383  *  this should be a good choice. Comparing with mm_camcorder_stop_focusing, this function not only stops focusing,
3384  *  but also initialize the lens. Preview image might be out-focused after calling this function.
3385  *      @param[in]      camcorder  A handle of camcorder.
3386  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3387  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3388  *      @pre            The status of camcorder should be MM_CAMCORDER_STATE_PREPARE, MM_CAMCORDER_STATE_RECORDING, or MM_CAMCORDER_STATE_PAUSED.
3389  *      @post           None
3390  *      @remarks        None
3391  *      @see            mm_camcorder_start_focusing, mm_camcorder_stop_focusing
3392  *      @par example
3393  *      @code
3394
3395 #include <mm_camcorder.h>
3396
3397 gboolean start_autofocus()
3398 {
3399         int err;
3400         char * err_attr_name = NULL;
3401
3402         // Set focus mode to 'AUTO' and scan range to 'AF Normal'.
3403         //You just need to set these values one time. After that, just call mm_camcorder_start_focusing().
3404         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
3405                                           MMCAM_CAMERA_FOCUS_MODE, MM_CAMCORDER_FOCUS_MODE_AUTO,
3406                                           MMCAM_CAMERA_AF_SCAN_RANGE, MM_CAMCORDER_AUTO_FOCUS_NORMAL,
3407                                           NULL);
3408
3409         if (err < 0) {
3410                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
3411                 if (err_attr_name) {
3412                         free(err_attr_name);
3413                         err_attr_name = NULL;
3414                         return FALSE;
3415                 }
3416         }
3417
3418         mm_camcorder_init_focusing(hcam);
3419         mm_camcorder_start_focusing(hcam);
3420         printf("Waiting for adjusting focus\n");
3421
3422         // Waiting for 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED'
3423
3424         return TRUE;
3425 }
3426
3427  *      @endcode
3428  */
3429 int mm_camcorder_init_focusing(MMHandleType camcorder);
3430
3431
3432 /**
3433  *    mm_camcorder_start_focusing:\n
3434  *  Start focusing. \n
3435  *  This function command to start focusing operation. Because focusing operation depends on mechanic or electric module,
3436  *  it may take small amount of time. (For ex, 500ms ~ 3sec). \n
3437  *  This function works asynchronously. When an user call this function,  it will return immediately.
3438  *  However, focusing operation will continue until it gets results.
3439  *  After finishing operation, you can get 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED' message.
3440  *  'param.code' of the message structure describes the focusing was success or not.
3441  *
3442  *      @param[in]      camcorder       A handle of camcorder.
3443  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3444  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3445  *      @pre            None
3446  *      @post           None
3447  *      @remarks        None
3448  *      @see            mm_camcorder_init_focusing, mm_camcorder_stop_focusing
3449  *      @par example
3450  *      @code
3451
3452 #include <mm_camcorder.h>
3453
3454 gboolean start_autofocus()
3455 {
3456         int err;
3457         char * err_attr_name = NULL;
3458
3459         // Set focus mode to 'AUTO' and scan range to 'AF Normal'.
3460         //You just need to set these values one time. After that, just call mm_camcorder_start_focusing().
3461         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
3462                                           MMCAM_CAMERA_FOCUS_MODE, MM_CAMCORDER_FOCUS_MODE_AUTO,
3463                                           MMCAM_CAMERA_AF_SCAN_RANGE, MM_CAMCORDER_AUTO_FOCUS_NORMAL,
3464                                           NULL);
3465
3466         if (err < 0) {
3467                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
3468                 if (err_attr_name) {
3469                         free(err_attr_name);
3470                         err_attr_name = NULL;
3471                         return FALSE;
3472                 }
3473         }
3474
3475         mm_camcorder_init_focusing(hcam);
3476         mm_camcorder_start_focusing(hcam);
3477         printf("Waiting for adjusting focus\n");
3478
3479         // Waiting for 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED'
3480
3481         return TRUE;
3482 }
3483
3484  *      @endcode
3485  */
3486 int mm_camcorder_start_focusing(MMHandleType camcorder);
3487
3488
3489 /**
3490  *    mm_camcorder_stop_focusing:\n
3491  *  Stop focusing. This function halts focusing operation.\n
3492  *  This is the function to stop focusing in the middle of the operation. So if focusing is already finished or not started yet,
3493  *  this function will do nothing.
3494  *
3495  *      @param[in]      camcorder       A handle of camcorder.
3496  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3497  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3498  *      @see            mm_camcorder_init_focusing, mm_camcorder_start_focusing
3499  *      @pre            mm_camcorder_start_focusing() should be called before calling this function.
3500  *      @post           None
3501  *      @remarks        None
3502  *      @par example
3503  *      @code
3504
3505 #include <mm_camcorder.h>
3506
3507 gboolean stop_autofocus()
3508 {
3509         int err;
3510
3511         //Stop focusing
3512         mm_camcorder_stop_focusing(hcam);
3513
3514         return TRUE;
3515 }
3516
3517  *      @endcode
3518  */
3519 int mm_camcorder_stop_focusing(MMHandleType camcorder);
3520
3521 /* emit signal */
3522 void mm_camcorder_emit_signal(MMHandleType camcorder, const char *object_name,
3523         const char *interface_name, const char *signal_name, int value);
3524
3525 /* check compatibility between codec and file format */
3526 int mm_camcorder_check_codec_fileformat_compatibility(const char *codec_type, int codec, int file_format);
3527
3528 /* external storage state management */
3529 int mm_camcorder_manage_external_storage_state(MMHandleType camcorder, int storage_state);
3530
3531 /* get log level */
3532 int mm_camcorder_get_log_level(void);
3533
3534 /* extra preview */
3535 int mm_camcorder_set_extra_preview_device_type(MMHandleType camcorder, int stream_id, int device_type);
3536 int mm_camcorder_set_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int pixel_format, int width, int height, int fps);
3537 int mm_camcorder_get_extra_preview_stream_format(MMHandleType camcorder, int stream_id, int *pixel_format, int *width, int *height, int *fps);
3538 int mm_camcorder_set_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int bitrate);
3539 int mm_camcorder_get_extra_preview_bitrate(MMHandleType camcorder, int stream_id, int *bitrate);
3540 int mm_camcorder_set_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int interval);
3541 int mm_camcorder_get_extra_preview_gop_interval(MMHandleType camcorder, int stream_id, int *interval);
3542
3543 /* get exposure */
3544 int mm_camcorder_get_exposure(MMHandleType camcorder, int *exposure);
3545
3546 /**
3547         @}
3548  */
3549
3550 #ifdef __cplusplus
3551 }
3552 #endif
3553
3554 #endif /* __MM_CAMCORDER_H__ */