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