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