Support waylandsink
[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 /*=======================================================================================
1227 | ENUM DEFINITIONS                                                                      |
1228 ========================================================================================*/
1229 /**
1230  * An enumeration for camcorder states.
1231  */
1232 typedef enum {
1233         MM_CAMCORDER_STATE_NONE,                /**< Camcorder is not created yet */
1234         MM_CAMCORDER_STATE_NULL,                /**< Camcorder is created, but not initialized yet */
1235         MM_CAMCORDER_STATE_READY,               /**< Camcorder is ready to capture */
1236         MM_CAMCORDER_STATE_PREPARE,             /**< Camcorder is prepared to capture (Preview) */
1237         MM_CAMCORDER_STATE_CAPTURING,           /**< Camcorder is now capturing still images */
1238         MM_CAMCORDER_STATE_RECORDING,           /**< Camcorder is now recording */
1239         MM_CAMCORDER_STATE_PAUSED,              /**< Camcorder is paused while recording */
1240         MM_CAMCORDER_STATE_NUM,                 /**< Number of camcorder states */
1241 } MMCamcorderStateType;
1242
1243 /**
1244  * An enumeration for camcorder mode.
1245  */
1246 typedef enum {
1247         MM_CAMCORDER_MODE_VIDEO_CAPTURE = 0,    /**< Video recording and Image capture mode */
1248         MM_CAMCORDER_MODE_AUDIO,                /**< Audio recording mode */
1249 } MMCamcorderModeType;
1250
1251 /**
1252  * An enumeration for facing direction.
1253  */
1254 typedef enum {
1255         MM_CAMCORDER_CAMERA_FACING_DIRECTION_REAR = 0, /**< Facing direction of camera is REAR */
1256         MM_CAMCORDER_CAMERA_FACING_DIRECTION_FRONT,    /**< Facing direction of camera is FRONT */
1257 } MMCamcorderCameraFacingDirection;
1258
1259
1260 /**
1261  * An enumeration of Audio Format.
1262  */
1263 typedef enum
1264 {
1265         MM_CAMCORDER_AUDIO_FORMAT_PCM_U8 = 0,           /**< unsigned 8bit audio */
1266         MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE = 2,       /**< signed 16bit audio. Little endian. */
1267 } MMCamcorderAudioFormat;
1268
1269
1270 /**
1271  * An enumeration for color tone. Color tone provides an impression of
1272  * seeing through a tinted glass.
1273  */
1274 enum MMCamcorderColorToneType {
1275         MM_CAMCORDER_COLOR_TONE_NONE = 0,               /**< None */
1276         MM_CAMCORDER_COLOR_TONE_MONO,                   /**< Mono */
1277         MM_CAMCORDER_COLOR_TONE_SEPIA,                  /**< Sepia */
1278         MM_CAMCORDER_COLOR_TONE_NEGATIVE,               /**< Negative */
1279         MM_CAMCORDER_COLOR_TONE_BLUE,                   /**< Blue */
1280         MM_CAMCORDER_COLOR_TONE_GREEN,                  /**< Green */
1281         MM_CAMCORDER_COLOR_TONE_AQUA,                   /**< Aqua */
1282         MM_CAMCORDER_COLOR_TONE_VIOLET,                 /**< Violet */
1283         MM_CAMCORDER_COLOR_TONE_ORANGE,                 /**< Orange */
1284         MM_CAMCORDER_COLOR_TONE_GRAY,                   /**< Gray */
1285         MM_CAMCORDER_COLOR_TONE_RED,                    /**< Red */
1286         MM_CAMCORDER_COLOR_TONE_ANTIQUE,                /**< Antique */
1287         MM_CAMCORDER_COLOR_TONE_WARM,                   /**< Warm */
1288         MM_CAMCORDER_COLOR_TONE_PINK,                   /**< Pink */
1289         MM_CAMCORDER_COLOR_TONE_YELLOW,                 /**< Yellow */
1290         MM_CAMCORDER_COLOR_TONE_PURPLE,                 /**< Purple */
1291         MM_CAMCORDER_COLOR_TONE_EMBOSS,                 /**< Emboss */
1292         MM_CAMCORDER_COLOR_TONE_OUTLINE,                /**< Outline */
1293         MM_CAMCORDER_COLOR_TONE_SOLARIZATION,           /**< Solarization */
1294         MM_CAMCORDER_COLOR_TONE_SKETCH,                 /**< Sketch */
1295         MM_CAMCORDER_COLOR_TONE_WASHED,                 /**< Washed */
1296         MM_CAMCORDER_COLOR_TONE_VINTAGE_WARM,           /**< Vintage warm */
1297         MM_CAMCORDER_COLOR_TONE_VINTAGE_COLD,           /**< Vintage cold */
1298         MM_CAMCORDER_COLOR_TONE_POSTERIZATION,          /**< Posterization */
1299         MM_CAMCORDER_COLOR_TONE_CARTOON,                /**< Cartoon */
1300         MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED,          /**< Selective color - Red */
1301         MM_CAMCORDER_COLOR_TONE_SELECTIVE_GREEN,        /**< Selective color - Green */
1302         MM_CAMCORDER_COLOR_TONE_SELECTIVE_BLUE,         /**< Selective color - Blue */
1303         MM_CAMCORDER_COLOR_TONE_SELECTIVE_YELLOW,       /**< Selective color - Yellow */
1304         MM_CAMCORDER_COLOR_TONE_SELECTIVE_RED_YELLOW,   /**< Selective color - Red and Yellow */
1305 };
1306
1307
1308 /**
1309  * An enumeration for white balance. White Balance is the control that adjusts
1310  * the camcorder's color sensitivity to match the prevailing color of white
1311  * outdoor light, yellower indoor light, or (sometimes) greenish fluorescent
1312  * light. White balance may be set either automatically or manually. White balance
1313  * may be set "incorrectly" on purpose to achieve special effects.
1314  */
1315 enum MMCamcorderWhiteBalanceType {
1316         MM_CAMCORDER_WHITE_BALANCE_NONE = 0,            /**< None */
1317         MM_CAMCORDER_WHITE_BALANCE_AUTOMATIC,           /**< Automatic */
1318         MM_CAMCORDER_WHITE_BALANCE_DAYLIGHT,            /**< Daylight */
1319         MM_CAMCORDER_WHITE_BALANCE_CLOUDY,              /**< Cloudy */
1320         MM_CAMCORDER_WHITE_BALANCE_FLUOROSCENT,         /**< Fluorescent */
1321         MM_CAMCORDER_WHITE_BALANCE_INCANDESCENT,        /**< Incandescent */
1322         MM_CAMCORDER_WHITE_BALANCE_SHADE,               /**< Shade */
1323         MM_CAMCORDER_WHITE_BALANCE_HORIZON,             /**< Horizon */
1324         MM_CAMCORDER_WHITE_BALANCE_FLASH,               /**< Flash */
1325         MM_CAMCORDER_WHITE_BALANCE_CUSTOM,              /**< Custom */
1326 };
1327
1328
1329 /**
1330  * An enumeration for scene mode. Scene mode gives the environment condition
1331  * for operating camcorder. The mode of operation can be in daylight, night and
1332  * backlight. It can be an automatic setting also.
1333  */
1334 enum MMCamcorderSceneModeType {
1335         MM_CAMCORDER_SCENE_MODE_NORMAL = 0,     /**< Normal */
1336         MM_CAMCORDER_SCENE_MODE_PORTRAIT,       /**< Portrait */
1337         MM_CAMCORDER_SCENE_MODE_LANDSCAPE,      /**< Landscape */
1338         MM_CAMCORDER_SCENE_MODE_SPORTS,         /**< Sports */
1339         MM_CAMCORDER_SCENE_MODE_PARTY_N_INDOOR, /**< Party & indoor */
1340         MM_CAMCORDER_SCENE_MODE_BEACH_N_INDOOR, /**< Beach & indoor */
1341         MM_CAMCORDER_SCENE_MODE_SUNSET,         /**< Sunset */
1342         MM_CAMCORDER_SCENE_MODE_DUSK_N_DAWN,    /**< Dusk & dawn */
1343         MM_CAMCORDER_SCENE_MODE_FALL_COLOR,     /**< Fall */
1344         MM_CAMCORDER_SCENE_MODE_NIGHT_SCENE,    /**< Night scene */
1345         MM_CAMCORDER_SCENE_MODE_FIREWORK,       /**< Firework */
1346         MM_CAMCORDER_SCENE_MODE_TEXT,           /**< Text */
1347         MM_CAMCORDER_SCENE_MODE_SHOW_WINDOW,    /**< Show window */
1348         MM_CAMCORDER_SCENE_MODE_CANDLE_LIGHT,   /**< Candle light */
1349         MM_CAMCORDER_SCENE_MODE_BACKLIGHT,      /**< Backlight */
1350         MM_CAMCORDER_SCENE_MODE_AQUA,           /**< Aqua */
1351 };
1352
1353
1354 /**
1355  * An enumeration for focusing .
1356  */
1357 enum MMCamcorderFocusMode {
1358         MM_CAMCORDER_FOCUS_MODE_NONE = 0,       /**< Focus mode is None */
1359         MM_CAMCORDER_FOCUS_MODE_PAN,            /**< Pan focus mode*/
1360         MM_CAMCORDER_FOCUS_MODE_AUTO,           /**< Autofocus mode*/
1361         MM_CAMCORDER_FOCUS_MODE_MANUAL,         /**< Manual focus mode*/
1362         MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO,     /**< Touch Autofocus mode*/
1363         MM_CAMCORDER_FOCUS_MODE_CONTINUOUS,     /**< Continuous Autofocus mode*/
1364 };
1365
1366
1367 /**
1368  * An enumeration for auto focus scan range (af scan range)
1369  */
1370 enum MMCamcorderAutoFocusType {
1371         MM_CAMCORDER_AUTO_FOCUS_NONE = 0,       /**< Scan autofocus is not set */
1372         MM_CAMCORDER_AUTO_FOCUS_NORMAL,         /**< Scan autofocus normally*/
1373         MM_CAMCORDER_AUTO_FOCUS_MACRO,          /**< Scan autofocus in macro mode(close distance)*/
1374         MM_CAMCORDER_AUTO_FOCUS_FULL,           /**< Scan autofocus in full mode(all range scan, limited by dev spec)*/
1375 };
1376
1377
1378 /**
1379  * An enumeration for focus state.
1380  * When 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED' is delievered through 'MMMessageCallback',
1381  * this enumeration will be set to 'code' of MMMessageParamType.
1382  */
1383 enum MMCamcorderFocusStateType {
1384         MM_CAMCORDER_FOCUS_STATE_RELEASED = 0,  /**< Focus released.*/
1385         MM_CAMCORDER_FOCUS_STATE_ONGOING,       /**< Focus in pregress*/
1386         MM_CAMCORDER_FOCUS_STATE_FOCUSED,       /**< Focus success*/
1387         MM_CAMCORDER_FOCUS_STATE_FAILED,        /**< Focus failed*/
1388 };
1389
1390
1391 /**
1392  * An enumeration for ISO.
1393  */
1394 enum MMCamcorderISOType {
1395         MM_CAMCORDER_ISO_AUTO = 0,              /**< ISO auto mode*/
1396         MM_CAMCORDER_ISO_50,                    /**< ISO 50*/
1397         MM_CAMCORDER_ISO_100,                   /**< ISO 100*/
1398         MM_CAMCORDER_ISO_200,                   /**< ISO 200*/
1399         MM_CAMCORDER_ISO_400,                   /**< ISO 400*/
1400         MM_CAMCORDER_ISO_800,                   /**< ISO 800*/
1401         MM_CAMCORDER_ISO_1600,                  /**< ISO 1600*/
1402         MM_CAMCORDER_ISO_3200,                  /**< ISO 3200*/
1403         MM_CAMCORDER_ISO_6400,                  /**< ISO 6400*/
1404         MM_CAMCORDER_ISO_12800,                 /**< ISO 12800*/
1405 };
1406
1407 /**
1408  * An enumeration for Automatic exposure.
1409  */
1410 enum MMCamcorderAutoExposureType {
1411         MM_CAMCORDER_AUTO_EXPOSURE_OFF = 0,     /**< AE off*/
1412         MM_CAMCORDER_AUTO_EXPOSURE_ALL,         /**< AE on, XXX mode*/
1413         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_1,    /**< AE on, XXX mode*/
1414         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_2,    /**< AE on, XXX mode*/
1415         MM_CAMCORDER_AUTO_EXPOSURE_CENTER_3,    /**< AE on, XXX mode*/
1416         MM_CAMCORDER_AUTO_EXPOSURE_SPOT_1,      /**< AE on, XXX mode*/
1417         MM_CAMCORDER_AUTO_EXPOSURE_SPOT_2,      /**< AE on, XXX mode*/
1418         MM_CAMCORDER_AUTO_EXPOSURE_CUSTOM_1,    /**< AE on, XXX mode*/
1419         MM_CAMCORDER_AUTO_EXPOSURE_CUSTOM_2,    /**< AE on, XXX mode*/
1420 };
1421
1422
1423 /**
1424  * An enumeration for WDR mode .
1425  */
1426 enum MMCamcorderWDRMode {
1427         MM_CAMCORDER_WDR_OFF = 0,               /**< WDR OFF*/
1428         MM_CAMCORDER_WDR_ON,                    /**< WDR ON*/
1429         MM_CAMCORDER_WDR_AUTO,                  /**< WDR AUTO*/
1430 };
1431
1432
1433 /**
1434  * An enumeration for HDR capture mode
1435  */
1436 enum MMCamcorderHDRMode {
1437         MM_CAMCORDER_HDR_OFF = 0,               /**< HDR OFF */
1438         MM_CAMCORDER_HDR_ON,                    /**< HDR ON and no original data - capture callback will be come once */
1439         MM_CAMCORDER_HDR_ON_AND_ORIGINAL,       /**< HDR ON and original data - capture callback will be come twice(1st:Original, 2nd:HDR) */
1440 };
1441
1442
1443 /**
1444  * An enumeration for Anti-handshake mode .
1445  */
1446 enum MMCamcorderAHSMode {
1447         MM_CAMCORDER_AHS_OFF = 0,               /**< AHS OFF*/
1448         MM_CAMCORDER_AHS_ON,                    /**< AHS ON*/
1449         MM_CAMCORDER_AHS_AUTO,                  /**< AHS AUTO*/
1450         MM_CAMCORDER_AHS_MOVIE,                 /**< AHS MOVIE*/
1451 };
1452
1453
1454 /**
1455  * An enumeration for Video stabilization mode
1456  */
1457 enum MMCamcorderVideoStabilizationMode {
1458         MM_CAMCORDER_VIDEO_STABILIZATION_OFF = 0,       /**< Video Stabilization OFF*/
1459         MM_CAMCORDER_VIDEO_STABILIZATION_ON,            /**< Video Stabilization ON*/
1460 };
1461
1462
1463 /**
1464  * Geometry method for camcorder display.
1465  */
1466 enum MMCamcorderGeometryMethod {
1467         MM_CAMCORDER_LETTER_BOX = 0,            /**< Letter box*/
1468         MM_CAMCORDER_ORIGIN_SIZE,               /**< Origin size*/
1469         MM_CAMCORDER_FULL,                      /**< full-screen*/
1470         MM_CAMCORDER_CROPPED_FULL,              /**< Cropped full-screen*/
1471         MM_CAMCORDER_ORIGIN_OR_LETTER,          /**< Origin size or Letter box*/
1472         MM_CAMCORDER_CUSTOM_ROI,                /**< Explicitely described destination ROI*/
1473 };
1474
1475
1476 /**
1477  * An enumeration for orientation values of tag .
1478  */
1479 enum MMCamcorderTagOrientation {
1480         MM_CAMCORDER_TAG_ORT_NONE =0,           /**< No Orientation.*/
1481         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.*/
1482         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.*/
1483         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.*/
1484         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.*/
1485         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.*/
1486         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.*/
1487         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.*/
1488         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.*/
1489 };
1490
1491 /**
1492  * An enumeration for captured video orientation values of tag .
1493  */
1494 enum MMCamcorderTagVideoOrientation {
1495         MM_CAMCORDER_TAG_VIDEO_ORT_NONE =0,     /**< No Orientation.*/
1496         MM_CAMCORDER_TAG_VIDEO_ORT_90,          /**< 90 degree */
1497         MM_CAMCORDER_TAG_VIDEO_ORT_180, /**< 180 degree */
1498         MM_CAMCORDER_TAG_VIDEO_ORT_270, /**< 270 degree */
1499 };
1500
1501
1502
1503 /**
1504  * An enumeration for Strobe mode.
1505  */
1506 enum MMCamcorderStrobeMode {
1507         MM_CAMCORDER_STROBE_MODE_OFF = 0,               /**< Always off */
1508         MM_CAMCORDER_STROBE_MODE_ON,                    /**< Always splashes */
1509         MM_CAMCORDER_STROBE_MODE_AUTO,                  /**< Depending on intensity of light, strobe starts to flash. */
1510         MM_CAMCORDER_STROBE_MODE_REDEYE_REDUCTION,      /**< Red eye reduction. Multiple flash before capturing. */
1511         MM_CAMCORDER_STROBE_MODE_SLOW_SYNC,             /**< Slow sync. A type of curtain synchronization. */
1512         MM_CAMCORDER_STROBE_MODE_FRONT_CURTAIN,         /**< Front curtain. A type of curtain synchronization. */
1513         MM_CAMCORDER_STROBE_MODE_REAR_CURTAIN,          /**< Rear curtain. A type of curtain synchronization. */
1514         MM_CAMCORDER_STROBE_MODE_PERMANENT,             /**< keep turned on until turning off */
1515 };
1516
1517
1518 /**
1519  * An enumeration for Strobe Control.
1520  */
1521 enum MMCamcorderStrobeControl {
1522         MM_CAMCORDER_STROBE_CONTROL_OFF = 0,    /**< turn off the flash light */
1523         MM_CAMCORDER_STROBE_CONTROL_ON,         /**< turn on the flash light */
1524         MM_CAMCORDER_STROBE_CONTROL_CHARGE,     /**< charge the flash light */
1525 };
1526
1527
1528 /**
1529  * An enumeration for Detection mode.
1530  */
1531 enum MMCamcorderDetectMode {
1532         MM_CAMCORDER_DETECT_MODE_OFF = 0,       /**< turn detection off */
1533         MM_CAMCORDER_DETECT_MODE_ON,            /**< turn detection on */
1534 };
1535
1536
1537 /**
1538  * An enumeration for recommended preview resolution.
1539  */
1540 enum MMCamcorderPreviewType {
1541         MM_CAMCORDER_PREVIEW_TYPE_NORMAL = 0,   /**< normal ratio like 4:3 */
1542         MM_CAMCORDER_PREVIEW_TYPE_WIDE,         /**< wide ratio like 16:9 */
1543         MM_CAMCORDER_PREVIEW_TYPE_SQUARE,       /**< square ratio like 1:1 */
1544 };
1545
1546
1547 /**********************************
1548 *          Attribute info         *
1549 **********************************/
1550 /**
1551  * An enumeration for attribute values types.
1552  */
1553 typedef enum{
1554         MM_CAM_ATTRS_TYPE_INVALID = -1,         /**< Type is invalid */
1555         MM_CAM_ATTRS_TYPE_INT,                  /**< Integer type attribute */
1556         MM_CAM_ATTRS_TYPE_DOUBLE,               /**< Double type attribute */
1557         MM_CAM_ATTRS_TYPE_STRING,               /**< UTF-8 String type attribute */
1558         MM_CAM_ATTRS_TYPE_DATA,                 /**< Pointer type attribute */
1559 }MMCamAttrsType;
1560
1561
1562 /**
1563  * An enumeration for attribute validation type.
1564  */
1565 typedef enum {
1566         MM_CAM_ATTRS_VALID_TYPE_INVALID = -1,   /**< Invalid validation type */
1567         MM_CAM_ATTRS_VALID_TYPE_NONE,           /**< Do not check validity */
1568         MM_CAM_ATTRS_VALID_TYPE_INT_ARRAY,      /**< validity checking type of integer array */
1569         MM_CAM_ATTRS_VALID_TYPE_INT_RANGE,      /**< validity checking type of integer range */
1570         MM_CAM_ATTRS_VALID_TYPE_DOUBLE_ARRAY,   /**< validity checking type of double array */
1571         MM_CAM_ATTRS_VALID_TYPE_DOUBLE_RANGE,   /**< validity checking type of double range */
1572 } MMCamAttrsValidType;
1573
1574
1575 /**
1576  * An enumeration for attribute access flag.
1577  */
1578 typedef enum {
1579         MM_CAM_ATTRS_FLAG_DISABLED = 0,         /**< None flag is set. This means the attribute is not allowed to use.  */
1580         MM_CAM_ATTRS_FLAG_READABLE = 1 << 0,    /**< Readable */
1581         MM_CAM_ATTRS_FLAG_WRITABLE = 1 << 1,    /**< Writable */
1582         MM_CAM_ATTRS_FLAG_MODIFIED = 1 << 2,    /**< Modified */
1583         MM_CAM_ATTRS_FLAG_RW = MM_CAM_ATTRS_FLAG_READABLE | MM_CAM_ATTRS_FLAG_WRITABLE, /**< Readable and Writable */
1584 } MMCamAttrsFlag;
1585
1586
1587 /**********************************
1588 *          Stream data            *
1589 **********************************/
1590 /**
1591  * An enumeration for stream data type.
1592  */
1593 typedef enum {
1594         MM_CAM_STREAM_DATA_YUV420 = 0,          /**< YUV420 Packed type - 1 plane */
1595         MM_CAM_STREAM_DATA_YUV422,              /**< YUV422 Packed type - 1 plane */
1596         MM_CAM_STREAM_DATA_YUV420SP,            /**< YUV420 SemiPlannar type - 2 planes */
1597         MM_CAM_STREAM_DATA_YUV420P,             /**< YUV420 Plannar type - 3 planes */
1598         MM_CAM_STREAM_DATA_YUV422P,             /**< YUV422 Plannar type - 3 planes */
1599 } MMCamStreamData;
1600
1601
1602 /*=======================================================================================
1603 | STRUCTURE DEFINITIONS                                                                 |
1604 ========================================================================================*/
1605 /**
1606  * A structure for attribute information
1607  */
1608 typedef struct {
1609         MMCamAttrsType type;
1610         MMCamAttrsFlag flag;
1611         MMCamAttrsValidType validity_type;
1612
1613         /**
1614          * A union that describes validity of the attribute. 
1615          * Only when type is 'MM_CAM_ATTRS_TYPE_INT' or 'MM_CAM_ATTRS_TYPE_DOUBLE',
1616          * the attribute can have validity.
1617          */
1618         union {
1619                 /**
1620                  * Validity structure for integer array.
1621                  */
1622                  struct {
1623                         int *array;             /**< a pointer of array */
1624                         int count;              /**< size of array */
1625                         int def;                /**< default value. Real value not index of array */
1626                 } int_array;
1627
1628                 /**
1629                  * Validity structure for integer range.
1630                  */
1631                 struct {
1632                         int min;                /**< minimum range */
1633                         int max;                /**< maximum range */
1634                         int def;                /**< default value */
1635                 } int_range;
1636
1637                 /**
1638                  * Validity structure for double array.
1639                  */
1640                  struct {
1641                         double *array;          /**< a pointer of array */
1642                         int count;              /**< size of array */
1643                         double def;             /**< default value. Real value not index of array */
1644                 } double_array;
1645
1646                 /**
1647                  * Validity structure for double range.
1648                  */
1649                 struct {
1650                         double min;             /**< minimum range */
1651                         double max;             /**< maximum range */
1652                         double def;             /**< default value */
1653                 } double_range;
1654         };
1655 } MMCamAttrsInfo;
1656
1657
1658 /* General Structure */
1659 /**
1660  * Structure for capture data.
1661  */
1662 typedef struct {
1663         void *data;                     /**< pointer of captured image */
1664         unsigned int length;            /**< length of captured image (in byte)*/
1665         MMPixelFormatType format;       /**< image format */
1666         int width;                      /**< width of captured image */
1667         int height;                     /**< height of captured image */
1668         int encoder_type;               /**< encoder type */
1669 } MMCamcorderCaptureDataType;
1670
1671
1672 /**
1673  * Structure for video stream data.
1674  */
1675 #define BUFFER_MAX_PLANE_NUM 4
1676
1677 typedef struct {
1678         union {
1679                 struct {
1680                         unsigned char *yuv;
1681                         unsigned int length_yuv;
1682                 } yuv420, yuv422;
1683                 struct {
1684                         unsigned char *y;
1685                         unsigned int length_y;
1686                         unsigned char *uv;
1687                         unsigned int length_uv;
1688                 } yuv420sp;
1689                 struct {
1690                         unsigned char *y;
1691                         unsigned int length_y;
1692                         unsigned char *u;
1693                         unsigned int length_u;
1694                         unsigned char *v;
1695                         unsigned int length_v;
1696                 } yuv420p, yuv422p;
1697         } data;                         /**< pointer of captured stream */
1698         MMCamStreamData data_type;      /**< data type */
1699         unsigned int length_total;      /**< total length of stream buffer (in byte)*/
1700         unsigned int num_planes;        /**< number of planes */
1701         MMPixelFormatType format;       /**< image format */
1702         int width;                      /**< width of video buffer */
1703         int height;                     /**< height of video buffer */
1704         unsigned int timestamp;         /**< timestamp of stream buffer (msec)*/
1705         void *bo[BUFFER_MAX_PLANE_NUM]; /**< TBM buffer object */
1706         void *internal_buffer;          /**< Internal buffer pointer */
1707 } MMCamcorderVideoStreamDataType;
1708
1709
1710 /**
1711  * Structure for audio stream data.
1712  */
1713 typedef struct {
1714         void *data;                             /**< pointer of captured stream */
1715         unsigned int length;                    /**< length of stream buffer (in byte)*/
1716         MMCamcorderAudioFormat format;          /**< audio format */
1717         int channel;                            /**< number of channel of the stream */
1718         unsigned int timestamp;                 /**< timestamp of stream buffer (msec)*/
1719         float volume_dB;                        /**< dB value of audio stream */
1720 } MMCamcorderAudioStreamDataType;
1721
1722
1723 /**
1724   * Prerequisite information for mm_camcorder_create()
1725   * The information to set prior to create.
1726   */
1727 typedef struct {
1728         enum MMVideoDeviceType videodev_type;   /**< Video device type */
1729         /* For future use */
1730         int reserved[4];                        /**< reserved fields */
1731 } MMCamPreset;
1732
1733
1734 /**
1735  * Report structure of recording file
1736  */
1737 typedef struct {
1738         char *recording_filename;               /**< File name of stored recording file. Please free after using. */
1739 } MMCamRecordingReport; /**< report structure definition of recording file */
1740
1741
1742 /**
1743  * Face detect defailed information
1744  */
1745 typedef struct _MMCamFaceInfo {
1746         int id;                                 /**< id of each face */
1747         int score;                              /**< score of each face */
1748         MMRectType rect;                        /**< area of face */
1749 } MMCamFaceInfo;
1750
1751 /**
1752  * Face detect information
1753  */
1754 typedef struct _MMCamFaceDetectInfo {
1755         int num_of_faces;                       /**< number of detected faces */
1756         MMCamFaceInfo *face_info;               /**< face information, this should be freed after use it. */
1757 } MMCamFaceDetectInfo;
1758
1759 #ifdef HAVE_WAYLAND
1760 /**
1761  * Wayland information
1762  */
1763 typedef struct _MMCamWaylandInfo {
1764         void *evas_obj;
1765         void *window;
1766         void *surface;
1767         void *display;
1768         int window_x;
1769         int window_y;
1770         int window_width;
1771         int window_height;
1772 } MMCamWaylandInfo;
1773 #endif /* HAVE_WAYLAND */
1774
1775 /*=======================================================================================
1776 | TYPE DEFINITIONS                                                                      |
1777 ========================================================================================*/
1778 /**
1779  *      Function definition for video stream callback.
1780  *  Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(), 
1781  *  mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
1782  *  Please don't hang this function long. It may cause low performance of preview or occur timeout error from video source. 
1783  *  Also, you're not allowed to call mm_camcorder_stop() even in other context, while you're hanging this function. 
1784  *  I recommend to you releasing this function ASAP.
1785  *
1786  *      @param[in]      stream                  Reference pointer to video stream data
1787  *      @param[in]      user_param              User parameter which is received from user when callback function was set
1788  *      @return         This function returns true on success, or false on failure.
1789  *      @remarks                This function is issued in the context of gstreamer (video sink thread).
1790  */
1791 typedef gboolean (*mm_camcorder_video_stream_callback)(MMCamcorderVideoStreamDataType *stream, void *user_param);
1792
1793
1794 /**
1795  *      Function definition for audio stream callback.
1796  *  Be careful! In this function, you can't call functions that change the state of camcorder such as mm_camcorder_stop(),
1797  *  mm_camcorder_unrealize(), mm_camcorder_record(), mm_camcorder_commit(), and mm_camcorder_cancel(), etc.
1798  *  Please don't hang this function long. It may cause low performance of camcorder or occur timeout error from audio source.
1799  *  I recommend to you releasing this function ASAP.
1800  *
1801  *      @param[in]      stream                  Reference pointer to audio stream data
1802  *      @param[in]      user_param              User parameter which is received from user when callback function was set
1803  *      @return         This function returns true on success, or false on failure.
1804  *      @remarks
1805  */
1806 typedef gboolean (*mm_camcorder_audio_stream_callback)(MMCamcorderAudioStreamDataType *stream, void *user_param);
1807
1808
1809 /**
1810  *      Function definition for video capture callback.
1811  *  Like '#mm_camcorder_video_stream_callback', you can't call mm_camcorder_stop() while you are hanging this function.
1812  *
1813  *      @param[in]      frame                   Reference pointer to captured data
1814  *      @param[in]      thumbnail               Reference pointer to thumbnail data
1815  *      @param[in]      user_param              User parameter which is received from user when callback function was set
1816  *      @return         This function returns true on success, or false on failure.
1817  *      @remarks                This function is issued in the context of gstreamer (video src thread).
1818  */
1819 typedef gboolean (*mm_camcorder_video_capture_callback)(MMCamcorderCaptureDataType *frame, MMCamcorderCaptureDataType *thumbnail, void *user_param);
1820
1821
1822 /*=======================================================================================
1823 | GLOBAL FUNCTION PROTOTYPES                                                            |
1824 ========================================================================================*/
1825 /**
1826  *    mm_camcorder_create:\n
1827  *  Create camcorder object. This is the function that an user who wants to use mm_camcorder calls first. 
1828  *  This function creates handle structure and initialize mutex, attributes, gstreamer.
1829  *  When this function success, it will return  a handle of newly created object. 
1830  *  A user have to put the handle when he calls every function of mm_camcorder. \n
1831  *  Second argument of this function is the field to decribe pre-setting information of mm_camcorder such as which camera device it will use.
1832  *  Normally, MM_VIDEO_DEVICE_CAMERA0 is for Main camera(or Mega camera, Back camera), 
1833  *  and MM_VIDEO_DEVICE_CAMERA1 is for VGA camera (or Front camera). If you want audio recording,
1834  *  please set MM_VIDEO_DEVICE_NONE. (No camera device is needed.)
1835  *
1836  *      @param[out]     camcorder       A handle of camcorder.
1837  *      @param[in]      info            Information for camera device. Depending on this information,
1838  *                                      camcorder opens different camera devices.
1839  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
1840  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
1841  *      @see            mm_camcorder_destroy
1842  *      @pre            None
1843  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_NULL
1844  *      @remarks        You can create multiple handles on a context at the same time. However,
1845  *                      camcorder cannot guarantee proper operation because of limitation of resources, such as
1846  *                      camera device, audio device, and display device.
1847  *      @par example
1848  *      @code
1849
1850 #include <mm_camcorder.h>
1851
1852 gboolean initialize_camcorder()
1853 {
1854         int err;
1855         MMCamPreset cam_info;
1856 #if 1
1857         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
1858 #else
1859         // when you want to record audio only, enable this.
1860         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
1861 #endif
1862
1863         err = mm_camcorder_create(&hcam, &cam_info);
1864
1865         if (err != MM_ERROR_NONE) {
1866                 printf("Fail to call mm_camcorder_create = %x\n", err);
1867                 return FALSE;
1868         }
1869
1870         return TRUE;
1871 }
1872
1873  *      @endcode
1874  */
1875 int mm_camcorder_create(MMHandleType *camcorder, MMCamPreset *info);
1876
1877
1878 /**
1879  *    mm_camcorder_destroy:\n
1880  *  Destroy camcorder object. Release handle and all of the resources that were created in mm_camcorder_create().\n
1881  *  This is the finalizing function of mm_camcorder. If this function is not called or fails to call, the handle isn't released fully.
1882  *  This function releases attributes, mutexes, sessions, and handle itself. This function also removes all of remaining messages.
1883  *  So if your application should wait a certain message of mm_camcorder, please wait to call this function till getting the message.
1884  *      
1885  *
1886  *      @param[in]      camcorder       A handle of camcorder.
1887  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
1888  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
1889  *      @see            mm_camcorder_create
1890  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_NULL
1891  *      @post           Because the handle is not valid, you can't check the state.
1892  *      @remarks        None
1893  *      @par example
1894  *      @code
1895
1896 #include <mm_camcorder.h>
1897
1898 gboolean destroy_camcorder()
1899 {
1900         int err;
1901
1902         //Destroy camcorder handle
1903         err = mm_camcorder_destroy(hcam);
1904         if (err < 0) {
1905                 printf("Fail to call mm_camcorder_destroy  = %x\n", err);
1906                 return FALSE;
1907         }
1908
1909         return TRUE;
1910 }
1911
1912  *      @endcode
1913  */
1914 int mm_camcorder_destroy(MMHandleType camcorder);
1915
1916
1917 /**
1918  *    mm_camcorder_realize:\n
1919  *  Allocate resources for camcorder and initialize it.
1920  *  This also creates streamer pipeline. So you have to set attributes that are pivotal to create
1921  *  the pipeline before calling this function. This function also takes a roll to manage confliction
1922  *  between different applications which use camcorder. For example, if you try to use camcorder when
1923  *  other application that is more important such as call application, this function will return
1924  *  'MM_ERROR_POLICY_BLOCKED'. On the contrary, if your application that uses camcorder starts to launch
1925  *  while another application that uses speaker and has lower priority, your application will kick
1926  *  another application.
1927  *
1928  *      @param[in]      camcorder       A handle of camcorder.
1929  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
1930  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
1931  *      @see            mm_camcorder_unrealize
1932  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_NULL
1933  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_READY
1934  *      @remarks        None
1935  *      @par example
1936  *      @code
1937
1938 #include <mm_camcorder.h>
1939
1940 //For image capturing
1941 gboolean initialize_image_capture()
1942 {
1943         int err;
1944         MMCamPreset cam_info;
1945         char *err_attr_name = NULL;
1946         void * hdisplay = NULL;
1947         int hsize = 0;
1948
1949         //Set video device as 'camera0' (main camera device)
1950         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
1951
1952         err = mm_camcorder_create(&hcam, &cam_info);
1953
1954         if (err != MM_ERROR_NONE) {
1955                 printf("Fail to call mm_camcorder_create = %x\n", err);
1956                 return FALSE;
1957         }
1958
1959         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
1960         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
1961
1962         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
1963         hsize = sizeof(ad.xid);         //size of xid structure.
1964
1965         // camcorder attribute setting
1966         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
1967                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
1968                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
1969                                           MMCAM_CAMERA_WIDTH, 640,
1970                                           MMCAM_CAMERA_HEIGHT, 480,
1971                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
1972                                           MMCAM_CAMERA_FPS, 30,
1973                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
1974                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,
1975                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
1976                                           MMCAM_CAPTURE_WIDTH, 640,
1977                                           MMCAM_CAPTURE_HEIGHT, 480,
1978                                           NULL);
1979
1980         if (err < 0) {
1981                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
1982                 if (err_attr_name) {
1983                         free(err_attr_name);
1984                         err_attr_name = NULL;
1985                         return FALSE;
1986                 }
1987         }
1988
1989         err =  mm_camcorder_realize(hcam);
1990         if (err < 0) {
1991                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
1992                 return FALSE;
1993         }
1994
1995         return TRUE;
1996 }
1997
1998 //For A/V capturing
1999 gboolean initialize_video_capture()
2000 {
2001         int err;
2002         MMCamPreset cam_info;
2003         char *err_attr_name = NULL;
2004         void * hdisplay = NULL;
2005         int hsize = 0;
2006
2007         //Set video device as 'camera0' (main camera device)
2008         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2009
2010         err = mm_camcorder_create(&hcam, &cam_info);
2011
2012         if (err != MM_ERROR_NONE) {
2013                 printf("Fail to call mm_camcorder_create = %x\n", err);
2014                 return FALSE;
2015         }
2016
2017         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, hcam);
2018
2019         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2020         hsize = sizeof(ad.xid);         //size of xid structure.
2021
2022         // camcorder attribute setting
2023         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2024                                           MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO,
2025                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2026                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2027                                           MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
2028                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2029                                           MMCAM_CAMERA_WIDTH, 1280,
2030                                           MMCAM_CAMERA_HEIGHT, 720,
2031                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12,
2032                                           MMCAM_CAMERA_FPS, 30,
2033                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2034                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2035                                           MMCAM_AUDIO_CHANNEL, 2,
2036                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2037                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,               hsize,
2038                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2039                                           NULL);
2040
2041         if (err < 0) {
2042                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2043                 if (err_attr_name) {
2044                         free(err_attr_name);
2045                         err_attr_name = NULL;
2046                         return FALSE;
2047                 }
2048         }
2049
2050         err =  mm_camcorder_realize(hcam);
2051         if (err < 0) {
2052                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2053                 return FALSE;
2054         }
2055
2056         return TRUE;
2057 }
2058
2059 //For audio(only) capturing
2060 gboolean initialize_audio_capture()
2061 {
2062         int err;
2063         MMCamPreset cam_info;
2064         char *err_attr_name = NULL;
2065         void * hdisplay = NULL;
2066         int hsize = 0;
2067
2068         //Set no video device, because audio recording doesn't need video input.
2069         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2070
2071         err = mm_camcorder_create(&hcam, &cam_info);
2072
2073         if (err != MM_ERROR_NONE) {
2074                 printf("Fail to call mm_camcorder_create = %x\n", err);
2075                 return FALSE;
2076         }
2077
2078         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2079
2080         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2081         hsize = sizeof(ad.xid);         //size of xid structure.
2082
2083         // camcorder attribute setting
2084         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2085                                           MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
2086                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2087                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2088                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2089                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2090                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2091                                           MMCAM_AUDIO_CHANNEL, 2,
2092                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2093                                           MMCAM_TARGET_TIME_LIMIT, 360000,
2094                                           NULL);
2095
2096         if (err < 0) {
2097                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2098                 if (err_attr_name) {
2099                         free(err_attr_name);
2100                         err_attr_name = NULL;
2101                         return FALSE;
2102                 }
2103         }
2104
2105         err =  mm_camcorder_realize(hcam);
2106         if (err < 0) {
2107                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2108                 return FALSE;
2109         }
2110
2111         return TRUE;
2112 }
2113  *      @endcode
2114  */
2115 int mm_camcorder_realize(MMHandleType camcorder);
2116
2117
2118 /**
2119  *    mm_camcorder_unrealize:\n
2120  *  Uninitialize camcoder resources and free allocated memory.
2121  *  Most important resource that is released here is gstreamer pipeline of mm_camcorder.
2122  *  Because most of resources, such as camera device, video display device, and audio I/O device, are operating on the gstreamer pipeline, 
2123  *  this function should be called to release its resources.
2124  *  Moreover, mm_camcorder is controlled by audio session manager. If an user doesn't call this function when he want to release mm_camcorder,
2125  *  other multimedia frameworks may face session problem. For more detail information, please refer mm_session module.
2126  *
2127  *      @param[in]      camcorder       A handle of camcorder.
2128  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2129  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2130  *      @see            mm_camcorder_realize
2131  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_READY
2132  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_NULL
2133  *      @remarks        None
2134  *      @par example
2135  *      @code
2136
2137 #include <mm_camcorder.h>
2138
2139 gboolean unrealize_camcorder()
2140 {
2141         int err;
2142
2143         //Release all resources of camcorder handle
2144         err =  mm_camcorder_unrealize(hcam);
2145         if (err < 0) {
2146                 printf("Fail to call mm_camcorder_unrealize  = %x\n", err);
2147                 return FALSE;
2148         }
2149
2150         return TRUE;
2151 }
2152
2153  *      @endcode
2154  */
2155 int mm_camcorder_unrealize(MMHandleType camcorder);
2156
2157
2158 /**
2159  *      mm_camcorder_start:\n
2160  *   Start previewing. (Image/Video mode)
2161  *  'mm_camcorder_video_stream_callback' is activated after calling this function.
2162  *
2163  *      @param[in]      camcorder       A handle of camcorder.
2164  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2165  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2166  *      @see            mm_camcorder_stop
2167  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_READY
2168  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2169  *      @remarks        None
2170  *      @par example
2171  *      @code
2172
2173 #include <mm_camcorder.h>
2174
2175 //For image capturing
2176 gboolean initialize_image_capture()
2177 {
2178         int err;
2179         MMCamPreset cam_info;
2180         char *err_attr_name = NULL;
2181         void * hdisplay = NULL;
2182         int hsize = 0;
2183
2184         //Set video device as 'camera0' (main camera device)
2185         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2186
2187         err = mm_camcorder_create(&hcam, &cam_info);
2188
2189         if (err != MM_ERROR_NONE) {
2190                         printf("Fail to call mm_camcorder_create = %x\n", err);
2191                         return FALSE;
2192         }
2193
2194         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2195         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
2196
2197         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2198         hsize = sizeof(ad.xid);         //size of xid structure.
2199
2200         // camcorder attribute setting
2201         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2202                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
2203                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
2204                                           MMCAM_CAMERA_WIDTH, 640,
2205                                           MMCAM_CAMERA_HEIGHT, 480,
2206                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
2207                                           MMCAM_CAMERA_FPS, 30,
2208                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2209                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,
2210                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
2211                                           MMCAM_CAPTURE_WIDTH, 640,
2212                                           MMCAM_CAPTURE_HEIGHT, 480,
2213                                           NULL);
2214
2215         if (err < 0) {
2216                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2217                 if (err_attr_name) {
2218                         free(err_attr_name);
2219                         err_attr_name = NULL;
2220                         return FALSE;
2221                 }
2222         }
2223
2224         err =  mm_camcorder_realize(hcam);
2225         if (err < 0) {
2226                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2227                 return FALSE;
2228         }
2229
2230         // start camcorder
2231         err = mm_camcorder_start(hcam);
2232         if (err < 0) {
2233                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2234                 return FALSE;
2235         }
2236
2237         return TRUE;
2238 }
2239
2240 //For A/V capturing
2241 gboolean initialize_video_capture()
2242 {
2243         int err;
2244         MMCamPreset cam_info;
2245         char *err_attr_name = NULL;
2246         void * hdisplay = NULL;
2247         int hsize = 0;
2248
2249         //Set video device as 'camera0' (main camera device)
2250         cam_info.videodev_type = MM_VIDEO_DEVICE_CAMERA0;
2251
2252         err = mm_camcorder_create(&hcam, &cam_info);
2253
2254         if (err != MM_ERROR_NONE) {
2255                         printf("Fail to call mm_camcorder_create = %x\n", err);
2256                         return FALSE;
2257         }
2258
2259         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, hcam);
2260
2261         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2262         hsize = sizeof(ad.xid);         //size of xid structure.
2263
2264         // camcorder attribute setting
2265         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2266                                           MMCAM_MODE, MM_CAMCORDER_MODE_VIDEO,
2267                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2268                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2269                                           MMCAM_VIDEO_ENCODER, MM_VIDEO_CODEC_MPEG4,
2270                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2271                                           MMCAM_CAMERA_WIDTH, 1280,
2272                                           MMCAM_CAMERA_HEIGHT, 720,
2273                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_NV12,
2274                                           MMCAM_CAMERA_FPS, 30,
2275                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2276                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2277                                           MMCAM_AUDIO_CHANNEL, 2,
2278                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2279                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,               hsize,
2280                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2281                                           NULL);
2282
2283         if (err < 0) {
2284                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2285                 if (err_attr_name) {
2286                         free(err_attr_name);
2287                         err_attr_name = NULL;
2288                         return FALSE;
2289                 }
2290         }
2291
2292         err =  mm_camcorder_realize(hcam);
2293         if (err < 0) {
2294                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2295                 return FALSE;
2296         }
2297
2298         // start camcorder
2299         err = mm_camcorder_start(hcam);
2300         if (err < 0) {
2301                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2302                 return FALSE;
2303         }
2304
2305         return TRUE;
2306 }
2307
2308 //For audio(only) capturing
2309 gboolean initialize_audio_capture()
2310 {
2311         int err;
2312         MMCamPreset cam_info;
2313         char *err_attr_name = NULL;
2314         void * hdisplay = NULL;
2315         int hsize = 0;
2316
2317         //Set no video device, because audio recording doesn't need video input.
2318         cam_info.videodev_type = MM_VIDEO_DEVICE_NONE;
2319
2320         err = mm_camcorder_create(&hcam, &cam_info);
2321
2322         if (err != MM_ERROR_NONE) {
2323                 printf("Fail to call mm_camcorder_create = %x\n", err);
2324                 return FALSE;
2325         }
2326
2327         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2328
2329         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2330         hsize = sizeof(ad.xid);         //size of xid structure.
2331
2332         // camcorder attribute setting
2333         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
2334                                           MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
2335                                           MMCAM_AUDIO_DEVICE, MM_AUDIO_DEVICE_MIC,
2336                                           MMCAM_AUDIO_ENCODER, MM_AUDIO_CODEC_AAC,
2337                                           MMCAM_FILE_FORMAT, MM_FILE_FORMAT_3GP,
2338                                           MMCAM_AUDIO_SAMPLERATE, 44100,
2339                                           MMCAM_AUDIO_FORMAT, MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE,
2340                                           MMCAM_AUDIO_CHANNEL, 2,
2341                                           MMCAM_TARGET_FILENAME, TARGET_FILENAME, strlen(TARGET_FILENAME),
2342                                           MMCAM_TARGET_TIME_LIMIT, 360000,
2343                                           NULL);
2344
2345         if (err < 0) {
2346                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
2347                 if (err_attr_name) {
2348                         free(err_attr_name);
2349                         err_attr_name = NULL;
2350                         return FALSE;
2351                 }
2352         }
2353
2354         err =  mm_camcorder_realize(hcam);
2355         if (err < 0) {
2356                 printf("Fail to call mm_camcorder_realize  = %x\n", err);
2357                 return FALSE;
2358         }
2359
2360         // start camcorder
2361         err = mm_camcorder_start(hcam);
2362         if (err < 0) {
2363                 printf("Fail to call mm_camcorder_start  = %x\n", err);
2364                 return FALSE;
2365         }
2366
2367         return TRUE;
2368 }
2369  *      @endcode
2370  */
2371 int mm_camcorder_start(MMHandleType camcorder);
2372
2373
2374 /**
2375  *    mm_camcorder_stop:\n
2376  *  Stop previewing. (Image/Video mode)
2377  *  This function will change the status of pipeline. If an application doesn't return callbacks
2378  *  of camcorder, this function can be locked. For example, if your application still
2379  *  holds '#mm_camcorder_video_capture_callback' or '#mm_camcorder_video_stream_callback',
2380  *  this function could be hung. So users have to return every callback before calling this function.
2381  *
2382  *      @param[in]      camcorder       A handle of camcorder.
2383  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2384  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2385  *      @see            mm_camcorder_start
2386  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2387  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_READY
2388  *      @remarks        None
2389  *      @par example
2390  *      @code
2391
2392 #include <mm_camcorder.h>
2393
2394 gboolean stop_camcorder()
2395 {
2396         int err;
2397
2398         //Stop preview
2399         err =  mm_camcorder_stop(hcam);
2400         if (err < 0) {
2401                 printf("Fail to call mm_camcorder_stop  = %x\n", err);
2402                 return FALSE;
2403         }
2404
2405         return TRUE;
2406 }
2407
2408  *      @endcode
2409  */
2410 int mm_camcorder_stop(MMHandleType camcorder);
2411
2412
2413 /**
2414  *    mm_camcorder_capture_start:\n
2415  *  Start capturing of still images. (Image mode only)
2416  *  Captured image will be delievered through 'mm_camcorder_video_capture_callback'.
2417  *  So basically, the operation is working asynchronously. \n
2418  *  When a user call this function, MSL will stop to retrieving preview from camera device.
2419  *  Then set capture resolution, pixel format, and encoding type to camera driver. After resuming,
2420  *  camera can get still image.  A user will be notified by
2421  *  'MM_MESSAGE_CAMCORDER_CAPTURED' message when capturing succeed. When a user sets
2422  *  multishot (by setting multiple number to MMCAM_CAPTURE_COUNT), the message
2423  *  will be called multiple time. You can get the number of image from 'code' of
2424  *  'MMMessageParamType'.
2425  *
2426  *      @param[in]      camcorder       A handle of camcorder.
2427  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2428  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2429  *      @see            mm_camcorder_capture_stop
2430  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2431  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_CAPTURING
2432  *      @remarks        To call this function, preview should be started successfully.\n
2433  *                      This function is a pair of mm_camcorder_capture_stop(). 
2434  *                      So user should call mm_camcorder_capture_stop() after getting captured image.
2435  *      @par example
2436  *      @code
2437
2438 #include <mm_camcorder.h>
2439
2440 gboolean capturing_picture()
2441 {
2442         int err;
2443
2444         err =  mm_camcorder_capture_start(hcam);
2445         if (err < 0) 
2446         {
2447                 printf("Fail to call mm_camcorder_capture_start  = %x\n", err);
2448                 return FALSE;
2449         }
2450
2451         //mm_camcorder_capture_stop should be called after getting
2452         //MM_MESSAGE_CAMCORDER_CAPTURED message.
2453
2454         return TRUE;
2455 }
2456
2457
2458  *      @endcode
2459  */
2460 int mm_camcorder_capture_start(MMHandleType camcorder);
2461
2462
2463 /**
2464  *    mm_camcorder_capture_stop:\n
2465  *  Stop capturing of still images. (Image mode only)
2466  *  This function notifies the end of capturing and launch preview again.
2467  *  Just as mm_camcorder_capture_start(), this funciton stops still image stream and set preview information such as
2468  *  resolution, pixel format, and framerate to camera driver. Then it command to start preview.
2469  *  If you don't call this, preview will not be displayed even though capturing was finished.
2470  *
2471  *      @param[in]      camcorder       A handle of camcorder.
2472  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2473  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2474  *      @see            mm_camcorder_capture_start
2475  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_CAPTURING
2476  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2477  *      @remarks        To call this function, a user has to call mm_camcorder_capture_start() first.\n
2478  *                      This is not a function to stop multishot in the middle of operation. For that,
2479  *                      please use '#MMCAM_CAPTURE_BREAK_CONTINUOUS_SHOT' instead.
2480  *      @par example
2481  *      @code
2482
2483 #include <mm_camcorder.h>
2484
2485 gboolean capturing_picture_stop()
2486 {
2487         int err;
2488
2489         err =  mm_camcorder_capture_stop(hcam);
2490         if (err < 0) {
2491                 printf("Fail to call mm_camcorder_capture_stop  = %x\n", err);
2492                 return FALSE;
2493         }
2494
2495         //After calling upper function, preview will start.
2496
2497         return TRUE;
2498 }
2499
2500  *      @endcode
2501  */
2502 int mm_camcorder_capture_stop(MMHandleType camcorder);
2503
2504
2505 /**
2506  *    mm_camcorder_record:\n
2507  *  Start recording. (Audio/Video mode only)
2508  *  Camcorder starts to write a file when you call this function. You can specify the name of file
2509  *  using '#MMCAM_TARGET_FILENAME'. Beware, if you fail to call mm_camcorder_commit() or mm_camcorder_cancel(),
2510  *  the recorded file is still on the storage.
2511  *
2512  *      @param[in]      camcorder       A handle of camcorder.
2513  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2514  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2515  *      @see            mm_camcorder_pause
2516  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_PREPARE
2517  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_RECORDING
2518  *      @remarks        None
2519  *      @par example
2520  *      @code
2521
2522 #include <mm_camcorder.h>
2523
2524 gboolean record_and_cancel_video_file()
2525 {
2526         int err;
2527
2528         // Start recording
2529         err =  mm_camcorder_record(hcam);
2530         if (err < 0) {
2531                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2532                 return FALSE;
2533         }
2534
2535         return TRUE;
2536 }
2537
2538  *      @endcode
2539  */
2540 int mm_camcorder_record(MMHandleType camcorder);
2541
2542
2543 /**
2544  *    mm_camcorder_pause:\n
2545  *  Pause A/V recording or Audio recording. (Audio/Video mode only)
2546  *  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.
2547  *  If you call mm_camcorder_commit() while on pausing, the recorded file only has Audio and Video stream which were generated before pause().
2548  *
2549  *      @param[in]      camcorder       A handle of camcorder.
2550  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2551  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2552  *      @see            mm_camcorder_record
2553  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2554  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PAUSED
2555  *      @remarks        Even though this function is for pausing recording, small amount of buffers could be recorded after pause().
2556  *                      Because the buffers which are existed in the queue were created before pause(), the buffers should be recorded.
2557  *      @par example
2558  *      @code
2559
2560 #include <mm_camcorder.h>
2561
2562 gboolean record_pause_and_resume_recording()
2563 {
2564         int err;
2565
2566         // Start recording
2567         err =  mm_camcorder_record(hcam);
2568         if (err < 0) {
2569                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2570                 return FALSE;
2571         }
2572
2573         // Wait while recording...
2574
2575         // Pause
2576         err =  mm_camcorder_pause(hcam);
2577         if (err < 0) {
2578                 printf("Fail to call mm_camcorder_pause  = %x\n", err);
2579                 return FALSE;
2580         }
2581
2582         // Pausing...
2583
2584         // Resume
2585         err =  mm_camcorder_record(hcam);
2586         if (err < 0) {
2587                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2588                 return FALSE;
2589         }
2590
2591         return TRUE;
2592 }
2593
2594
2595  *      @endcode
2596  */
2597 int mm_camcorder_pause(MMHandleType camcorder);
2598
2599
2600 /**
2601  *    mm_camcorder_commit:\n
2602  *  Stop recording and save results.  (Audio/Video mode only)\n
2603  *  After starting recording, encoded data frame will be stored in the location specified in MMCAM_TARGET_FILENAME.
2604  *  Some encoder or muxer require a certain type of finalizing such as adding some information to header.
2605  *  This function takes that roll. So if you don't call this function after recording, the result file may not be playable.\n
2606  *  After committing successfully, camcorder resumes displaying preview (video recording case).
2607  *  Because this is the function for saving the recording result, the operation is available 
2608  *  only when the mode of camcorder is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO. 
2609  *
2610  *      @param[in]      camcorder       A handle of camcorder.
2611  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2612  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2613  *      @see            mm_camcorder_cancel
2614  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2615  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2616  *      @remarks        This function can take a few second when recording time is long.
2617  *                      and if there are only quite few input buffer from video src or audio src,
2618  *                      committing could be failed.
2619  *      @par example
2620  *      @code
2621
2622 #include <mm_camcorder.h>
2623
2624 gboolean record_and_save_video_file()
2625 {
2626         int err;
2627
2628         // Start recording
2629         err =  mm_camcorder_record(hcam);
2630         if (err < 0) {
2631                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2632                 return FALSE;
2633         }
2634
2635         // Wait while recording for test...
2636         // In normal case, mm_camcorder_record() and mm_camcorder_commit() aren't called in the same function.
2637
2638         // Save file
2639         err =  mm_camcorder_commit(hcam);
2640         if (err < 0) {
2641                 printf("Fail to call mm_camcorder_commit  = %x\n", err);
2642                 return FALSE;
2643         }
2644
2645         return TRUE;
2646 }
2647
2648  *      @endcode
2649  */
2650 int mm_camcorder_commit(MMHandleType camcorder);
2651
2652
2653 /**
2654  *      mm_camcorder_cancel:\n
2655  *    Stop recording and discard the result. (Audio/Video mode only)
2656  *      When a user want to finish recording without saving the result file, this function can be used.
2657  *      Like mm_camcorder_commit(), this function also stops recording, release related resources(like codec) ,and goes back to preview status.
2658  *      However, instead of saving file, this function unlinks(delete) the result.\n
2659  *      Because this is the function for canceling recording, the operation is available 
2660  *      only when mode is MM_CAMCORDER_MODE_AUDIO or MM_CAMCORDER_MODE_VIDEO. 
2661  *
2662  *      @param[in]      camcorder       A handle of camcorder.
2663  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2664  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2665  *      @see            mm_camcorder_commit
2666  *      @pre            Previous state of mm-camcorder should be MM_CAMCORDER_STATE_RECORDING
2667  *      @post           Next state of mm-camcorder will be MM_CAMCORDER_STATE_PREPARE
2668  *      @remarks        None
2669  *      @par example
2670  *      @code
2671
2672 #include <mm_camcorder.h>
2673
2674 gboolean record_and_cancel_video_file()
2675 {
2676         int err;
2677
2678         // Start recording
2679         err =  mm_camcorder_record(hcam);
2680         if (err < 0) {
2681                 printf("Fail to call mm_camcorder_record  = %x\n", err);
2682                 return FALSE;
2683         }
2684
2685         // Wait while recording...
2686
2687         // Cancel recording
2688         err =  mm_camcorder_cancel(hcam);
2689         if (err < 0) {
2690                 printf("Fail to call mm_camcorder_cancel  = %x\n", err);
2691                 return FALSE;
2692         }
2693
2694         return TRUE;
2695 }
2696
2697  *      @endcode
2698  */
2699 int mm_camcorder_cancel(MMHandleType camcorder);
2700
2701
2702 /**
2703  *    mm_camcorder_set_message_callback:\n
2704  *  Set callback for receiving messages from camcorder. Through this callback function, camcorder
2705  *  sends various message including status changes, asynchronous error, capturing, and limitations.
2706  *  One thing you have to know is that message callback is working on the main loop of application.
2707  *  So until releasing the main loop, message callback will not be called.
2708  *
2709  *      @param[in]      camcorder       A handle of camcorder.
2710  *      @param[in]      callback        Function pointer of callback function. Please refer 'MMMessageCallback'.
2711  *      @param[in]      user_data       User parameter for passing to callback function.
2712  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2713  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2714  *      @see            MMMessageCallback
2715  *      @pre            None
2716  *      @post           None
2717  *      @remarks        registered 'callback' is called on main loop of the application. So until the main loop is released, 'callback' will not be called.
2718  *      @par example
2719  *      @code
2720
2721 #include <mm_camcorder.h>
2722
2723 gboolean setting_msg_callback()
2724 {
2725         //set callback
2726         mm_camcorder_set_message_callback(hcam,(MMMessageCallback)msg_callback, (void*)hcam);
2727
2728         return TRUE;
2729 }
2730
2731
2732  *      @endcode
2733  */
2734 int mm_camcorder_set_message_callback(MMHandleType camcorder, MMMessageCallback callback, void *user_data);
2735
2736
2737 /**
2738  *    mm_camcorder_set_video_stream_callback:\n
2739  *  Set callback for user defined video stream callback function.
2740  *  Users can retrieve video frame using registered callback. 
2741  *  The callback function holds the same buffer that will be drawed on the display device.
2742  *  So if an user change the buffer, it will be displayed on the device.
2743  *
2744  *      @param[in]      camcorder       A handle of camcorder.
2745  *      @param[in]      callback        Function pointer of callback function.
2746  *      @param[in]      user_data       User parameter for passing to callback function.
2747  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2748  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2749  *      @see            mm_camcorder_video_stream_callback
2750  *      @pre            None
2751  *      @post           None
2752  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
2753  *      @par example
2754  *      @code
2755
2756 #include <mm_camcorder.h>
2757
2758 gboolean setting_video_stream_callback()
2759 {
2760         //set callback
2761         mm_camcorder_set_video_stream_callback(hcam, (mm_camcorder_video_stream_callback)camcordertest_video_stream_cb, (void*)hcam);
2762
2763         return TRUE;
2764 }
2765  *      @endcode
2766  */
2767 int mm_camcorder_set_video_stream_callback(MMHandleType camcorder, mm_camcorder_video_stream_callback callback, void *user_data);
2768
2769
2770 /**
2771  *    mm_camcorder_set_video_capture_callback:\n
2772  *  Set callback for user defined video capture callback function.  (Image mode only)
2773  *  mm_camcorder deliever captured image through the callback.\n
2774  *  Normally, this function provides main captured image and thumnail image. But depending on the environment,
2775  *  thumnail would not be available. Information related with main captured image and thumnail image is also included
2776  *  in the argument of the callback function. 
2777  *  For more detail information of callback, please refer 'mm_camcorder_video_capture_callback'.
2778  *
2779  *      @param[in]      camcorder       A handle of camcorder.
2780  *      @param[in]      callback        Function pointer of callback function.
2781  *      @param[in]      user_data       User parameter for passing to callback function.
2782  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2783  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2784  *      @see            mm_camcorder_video_capture_callback
2785  *      @pre            None
2786  *      @post           None
2787  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
2788  *      @par example
2789  *      @code
2790
2791 #include <mm_camcorder.h>
2792
2793 gboolean setting_capture_callback()
2794 {
2795         //set callback
2796         mm_camcorder_set_video_capture_callback(hcam,(mm_camcorder_video_capture_callback)camcordertest_video_capture_cb, (void*)hcam);
2797
2798         return TRUE;
2799 }
2800  *      @endcode
2801  */
2802 int mm_camcorder_set_video_capture_callback(MMHandleType camcorder, mm_camcorder_video_capture_callback callback, void *user_data);
2803
2804
2805 /**
2806  *    mm_camcorder_set_audio_stream_callback:\n
2807  *  Set callback for user defined audio stream callback function.
2808  *  Users can retrieve audio data using registered callback.
2809  *  The callback function holds the same buffer that will be recorded.
2810  *  So if an user change the buffer, the result file will has the buffer.
2811  *
2812  *      @param[in]      camcorder       A handle of camcorder.
2813  *      @param[in]      callback        Function pointer of callback function.
2814  *      @param[in]      user_data       User parameter for passing to callback function.
2815  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2816  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2817  *      @see            mm_camcorder_audio_stream_callback
2818  *      @pre            None
2819  *      @post           None
2820  *      @remarks        registered 'callback' is called on internal thread of camcorder. Regardless of the status of main loop, this function will be called.
2821  *      @par example
2822  *      @code
2823
2824 #include <mm_camcorder.h>
2825
2826 gboolean setting_audio_stream_callback()
2827 {
2828         //set callback
2829         mm_camcorder_set_audio_stream_callback(hcam, (mm_camcorder_audio_stream_callback)camcordertest_audio_stream_cb, (void*)hcam);
2830
2831         return TRUE;
2832 }
2833  *      @endcode
2834  */
2835 int mm_camcorder_set_audio_stream_callback(MMHandleType camcorder, mm_camcorder_audio_stream_callback callback, void *user_data);
2836
2837
2838 /**
2839  *    mm_camcorder_get_state:\n
2840  *  Get the current state of camcorder.
2841  *  mm_camcorder is working on the base of its state. An user should check the state of mm_camcorder before calling its functions.
2842  *  If the handle is avaiable, user can retrieve the value.
2843  *
2844  *      @param[in]      camcorder       A handle of camcorder.
2845  *      @param[out]     state           On return, it contains current state of camcorder.
2846  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2847  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2848  *      @see            MMCamcorderStateType
2849  *      @pre            None
2850  *      @post           None
2851  *      @remarks        None
2852  *      @par example
2853  *      @code
2854
2855 #include <mm_camcorder.h>
2856
2857 gboolean get_state_of_camcorder()
2858 {
2859         MMCamcorderStateType state;
2860
2861         //Get state of camcorder
2862         mm_camcorder_get_state(hcam, &state);
2863         printf("Current status is %d\n", state);
2864
2865         return TRUE;
2866 }
2867
2868  *      @endcode
2869  */
2870 int mm_camcorder_get_state(MMHandleType camcorder, MMCamcorderStateType *state);
2871
2872
2873 /**
2874  *    mm_camcorder_get_attributes:\n
2875  *  Get attributes of camcorder with given attribute names. This function can get multiple attributes
2876  *  simultaneously. If one of attribute fails, this function will stop at the point. 
2877  *  'err_attr_name' let you know the name of the attribute.
2878  *
2879  *      @param[in]      camcorder       Specifies the camcorder  handle.
2880  *      @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
2881  *                                      Free this variable after using.
2882  *      @param[in]      attribute_name  attribute name that user want to get.
2883  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2884  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2885  *      @pre            None
2886  *      @post           None
2887  *      @remarks        You can retrieve multiple attributes at the same time.  @n
2888  *                      This function must finish with 'NULL' argument.  @n
2889  *                      ex) mm_camcorder_get_attributes(....... , NULL);
2890  *      @see            mm_camcorder_set_attributes
2891  *      @par example
2892  *      @code
2893
2894 #include <mm_camcorder.h>
2895
2896 gboolean getting_attribute()
2897 {
2898         int err;
2899         MMCamPreset cam_info;
2900         char *err_attr_name = NULL;
2901         void * hdisplay = NULL;
2902         int hsize = 0;
2903
2904         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2905         hsize = sizeof(ad.xid);         //size of xid structure.
2906
2907         // camcorder attribute setting
2908         err = mm_camcorder_get_attributes(hcamcorder, NULL,     //The second is the argument for debugging. But you can skip this.
2909                                           MMCAM_MODE,  &mode,   //You have to input a pointer instead of variable itself.
2910                                           NULL);                //mm_camcorder_set_attributes() should be finished with a NULL argument.
2911
2912         return TRUE;
2913 }
2914
2915  *      @endcode
2916  */
2917 int mm_camcorder_get_attributes(MMHandleType camcorder,  char **err_attr_name, const char *attribute_name, ...) G_GNUC_NULL_TERMINATED;
2918
2919
2920
2921 /**
2922  *    mm_camcorder_set_attributes:\n
2923  *  Set attributes of camcorder with given attribute names. This function can set multiple attributes
2924  *  simultaneously. If one of attribute fails, this function will stop at the point. 
2925  *  'err_attr_name' let you know the name of the attribute.
2926  *
2927  *      @param[in]      camcorder       Specifies the camcorder  handle.
2928  *      @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
2929  *                                      Free this variable after using.
2930  *      @param[in]      attribute_name  attribute name that user want to set.
2931  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2932  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2933  *      @pre            None
2934  *      @post           None
2935  *      @remarks        You can put multiple attributes to camcorder at the same time.  @n
2936  *                      This function must finish with 'NULL' argument.  @n
2937  *                      ex) mm_camcorder_set_attributes(....... , NULL);
2938  *      @see            mm_camcorder_get_attributes
2939  *      @par example
2940  *      @code
2941
2942 #include <mm_camcorder.h>
2943
2944 gboolean setting_attribute()
2945 {
2946         int err;
2947         MMCamPreset cam_info;
2948         char *err_attr_name = NULL;
2949         void * hdisplay = NULL;
2950         int hsize = 0;
2951
2952         hdisplay = &ad.xid;             //xid of xwindow. This value can be different depending on your environment.
2953         hsize = sizeof(ad.xid);         //size of xid structure.
2954
2955         // camcorder attribute setting
2956         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,           //The second is the argument for debugging.
2957                                           MMCAM_MODE, MM_CAMCORDER_MODE_IMAGE,
2958                                           MMCAM_IMAGE_ENCODER, MM_IMAGE_CODEC_JPEG,
2959                                           MMCAM_CAMERA_WIDTH, 640,
2960                                           MMCAM_CAMERA_HEIGHT, 480,
2961                                           MMCAM_CAMERA_FORMAT, MM_PIXEL_FORMAT_YUYV,
2962                                           MMCAM_CAMERA_FPS, 30,
2963                                           MMCAM_DISPLAY_ROTATION, MM_DISPLAY_ROTATION_270,
2964                                           MMCAM_DISPLAY_HANDLE, (void*) hdisplay,          hsize,               //Beware some types require 'size' value, too. (STRING, DATA type attributes)
2965                                           MMCAM_CAPTURE_FORMAT, MM_PIXEL_FORMAT_ENCODED,
2966                                           MMCAM_CAPTURE_WIDTH, 640,
2967                                           MMCAM_CAPTURE_HEIGHT, 480,
2968                                           NULL);                //mm_camcorder_set_attributes() should be finished with a NULL argument.
2969
2970         if (err < 0) {
2971                 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.
2972                 if (err_attr_name) {
2973                         free(err_attr_name);                    //Please free 'err_attr_name', after using the argument.
2974                         err_attr_name = NULL;
2975                         return FALSE;
2976                 }
2977         }
2978
2979         return TRUE;
2980 }
2981  *      @endcode
2982  */
2983 int mm_camcorder_set_attributes(MMHandleType camcorder,  char **err_attr_name, const char *attribute_name, ...) G_GNUC_NULL_TERMINATED;
2984
2985
2986 /**
2987  *    mm_camcorder_get_attribute_info:\n
2988  *  Get detail information of the attribute. To manager attributes, an user may want to know the exact character of the attribute,
2989  *  such as type, flag, and validity. This is the function to provide such information.
2990  *  Depending on the 'validity_type', validity union would be different. To know about the type of union, please refer 'MMCamAttrsInfo'.
2991  *
2992  *      @param[in]      camcorder       Specifies the camcorder  handle.
2993  *      @param[in]      attribute_name  attribute name that user want to get information.
2994  *      @param[out]     info            a structure that holds information related with the attribute.
2995  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
2996  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
2997  *      @pre            None
2998  *      @post           None
2999  *      @remarks        If the function succeeds, 'info' holds detail information about the attribute, such as type,
3000  *                      flag, validity_type, validity_values, and default values.
3001  *      @see            mm_camcorder_get_attributes, mm_camcorder_set_attributes
3002  *      @par example
3003  *      @code
3004
3005 #include <mm_camcorder.h>
3006
3007 gboolean getting_info_from_attribute()
3008 {
3009         MMCamAttrsInfo info;
3010         int err;
3011
3012         err = mm_camcorder_get_attribute_info(handle, MMCAM_CAPTURE_HEIGHT, &info);
3013         if (err < 0) {
3014                 printf("Fail to call mm_camcorder_get_attribute_info()");
3015                 return FALSE;
3016         }
3017
3018         //Now 'info' has many information about 'MMCAM_CAPTURE_HEIGHT'
3019
3020         return TRUE;
3021 }
3022  *      @endcode
3023  */
3024 int mm_camcorder_get_attribute_info(MMHandleType camcorder, const char *attribute_name, MMCamAttrsInfo *info);
3025
3026
3027 /**
3028  *    mm_camcorder_init_focusing:\n
3029  *  Initialize focusing. \n
3030  *  This function stops focusing action and adjust the camera lens to initial position.
3031  *  Some camera applciation requires to initialize its lens position after releasing half shutter. In that case,
3032  *  this should be a good choice. Comparing with mm_camcorder_stop_focusing, this function not only stops focusing,
3033  *  but also initialize the lens. Preview image might be out-focused after calling this function.
3034  *      @param[in]      camcorder  A handle of camcorder.
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            The status of camcorder should be MM_CAMCORDER_STATE_PREPARE, MM_CAMCORDER_STATE_RECORDING, or MM_CAMCORDER_STATE_PAUSED.
3038  *      @post           None
3039  *      @remarks        None
3040  *      @see            mm_camcorder_start_focusing, mm_camcorder_stop_focusing
3041  *      @par example
3042  *      @code
3043
3044 #include <mm_camcorder.h>
3045
3046 gboolean start_autofocus()
3047 {
3048         int err;
3049         char * err_attr_name = NULL;
3050
3051         // Set focus mode to 'AUTO' and scan range to 'AF Normal'.
3052         //You just need to set these values one time. After that, just call mm_camcorder_start_focusing().
3053         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
3054                                           MMCAM_CAMERA_FOCUS_MODE, MM_CAMCORDER_FOCUS_MODE_AUTO,
3055                                           MMCAM_CAMERA_AF_SCAN_RANGE, MM_CAMCORDER_AUTO_FOCUS_NORMAL,
3056                                           NULL);
3057
3058         if (err < 0) {
3059                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
3060                 if (err_attr_name) {
3061                         free(err_attr_name);
3062                         err_attr_name = NULL;
3063                         return FALSE;
3064                 }
3065         }
3066
3067         mm_camcorder_init_focusing(hcam);
3068         mm_camcorder_start_focusing(hcam);
3069         printf("Waiting for adjusting focus\n");
3070
3071         // Waiting for 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED'
3072
3073         return TRUE;
3074 }
3075
3076  *      @endcode
3077  */
3078 int mm_camcorder_init_focusing(MMHandleType camcorder);
3079
3080
3081 /**
3082  *    mm_camcorder_start_focusing:\n
3083  *  Start focusing. \n
3084  *  This function command to start focusing opeartion. Because focusing operation depends on mechanic or electric module,
3085  *  it may take small amount of time. (For ex, 500ms ~ 3sec). \n
3086  *  This function works asynchronously. When an user call this function,  it will return immediately. 
3087  *  However, focusing operation will continue until it gets results. 
3088  *  After finishing operation, you can get 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED' message.
3089  *  'param.code' of the message structure describes the fucusing was success or not.
3090  *
3091  *      @param[in]      camcorder       A handle of camcorder.
3092  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3093  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3094  *      @pre            None
3095  *      @post           None
3096  *      @remarks        None
3097  *      @see            mm_camcorder_init_focusing, mm_camcorder_stop_focusing
3098  *      @par example
3099  *      @code
3100
3101 #include <mm_camcorder.h>
3102
3103 gboolean start_autofocus()
3104 {
3105         int err;
3106         char * err_attr_name = NULL;
3107
3108         // Set focus mode to 'AUTO' and scan range to 'AF Normal'.
3109         //You just need to set these values one time. After that, just call mm_camcorder_start_focusing().
3110         err = mm_camcorder_set_attributes((MMHandleType)hcam, &err_attr_name,
3111                                           MMCAM_CAMERA_FOCUS_MODE, MM_CAMCORDER_FOCUS_MODE_AUTO,
3112                                           MMCAM_CAMERA_AF_SCAN_RANGE, MM_CAMCORDER_AUTO_FOCUS_NORMAL,
3113                                           NULL);
3114
3115         if (err < 0) {
3116                 printf("Set attrs fail. (%s:%x)\n", err_attr_name, err);
3117                 if (err_attr_name) {
3118                         free(err_attr_name);
3119                         err_attr_name = NULL;
3120                         return FALSE;
3121                 }
3122         }
3123
3124         mm_camcorder_init_focusing(hcam);
3125         mm_camcorder_start_focusing(hcam);
3126         printf("Waiting for adjusting focus\n");
3127
3128         // Waiting for 'MM_MESSAGE_CAMCORDER_FOCUS_CHANGED'
3129
3130         return TRUE;
3131 }
3132
3133  *      @endcode
3134  */
3135 int mm_camcorder_start_focusing(MMHandleType camcorder);
3136
3137
3138 /**
3139  *    mm_camcorder_stop_focusing:\n
3140  *  Stop focusing. This function halts focusing operation.\n
3141  *  This is the function to stop focusing in the middle of the operation. So if focusing is already finished or not started yet,
3142  *  this function will do nothing.
3143  *
3144  *      @param[in]      camcorder       A handle of camcorder.
3145  *      @return         This function returns zero(MM_ERROR_NONE) on success, or negative value with error code.\n
3146  *                      Please refer 'mm_error.h' to know the exact meaning of the error.
3147  *      @see            mm_camcorder_init_focusing, mm_camcorder_start_focusing
3148  *      @pre            mm_camcorder_start_focusing() should be called before calling this function. 
3149  *      @post           None
3150  *      @remarks        None
3151  *      @par example
3152  *      @code
3153
3154 #include <mm_camcorder.h>
3155
3156 gboolean stop_autofocus()
3157 {
3158         int err;
3159
3160         //Stop focusing
3161         mm_camcorder_stop_focusing(hcam);
3162
3163         return TRUE;
3164 }
3165
3166  *      @endcode
3167  */
3168 int mm_camcorder_stop_focusing(MMHandleType camcorder);
3169
3170 /**
3171         @}
3172  */
3173
3174 #ifdef __cplusplus
3175 }
3176 #endif
3177
3178 #endif /* __MM_CAMCORDER_H__ */