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