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