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