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