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