2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <mm_camcorder.h>
26 #include <legacy_camera.h>
27 #include <legacy_recorder_private.h>
36 #define LOG_TAG "LEGACY_RECORDER"
38 #define LOWSET_DECIBEL -300.0
42 * camera_private function
44 int _camera_get_mm_handle(camera_h camera , MMHandleType *handle);
45 int _camera_set_relay_mm_message_callback(camera_h camera, MMMessageCallback callback, void *user_data);
46 int _camera_set_use(camera_h camera, bool used);
48 * end of camera_private function
51 static int __mm_audio_stream_cb(MMCamcorderAudioStreamDataType *stream, void *user_param);
52 static int __mm_muxed_stream_cb(MMCamcorderMuxedStreamDataType *stream, void *user_param);
53 static int __mm_video_encode_decision_cb(MMCamcorderVideoStreamDataType *stream, void *user_param);
54 static int __mm_recorder_msg_cb(int message, void *param, void *user_data);
58 static int __convert_error_code_camera_to_recorder(int code)
63 case CAMERA_ERROR_INVALID_STATE:
64 new_code = RECORDER_ERROR_INVALID_STATE;
66 case CAMERA_ERROR_DEVICE:
67 new_code = RECORDER_ERROR_DEVICE;
69 case CAMERA_ERROR_SECURITY_RESTRICTED:
70 new_code = RECORDER_ERROR_SECURITY_RESTRICTED;
72 case CAMERA_ERROR_RESOURCE_CONFLICT:
73 new_code = RECORDER_ERROR_RESOURCE_CONFLICT;
84 int __convert_recorder_error_code(const char *func, int code)
86 int ret = RECORDER_ERROR_INVALID_OPERATION;
87 const char *errorstr = NULL;
90 case RECORDER_ERROR_INVALID_PARAMETER:
91 ret = RECORDER_ERROR_INVALID_PARAMETER;
92 errorstr = "INVALID_PARAMETER";
95 ret = RECORDER_ERROR_NONE;
96 errorstr = "ERROR_NONE";
98 case MM_ERROR_CAMCORDER_INVALID_ARGUMENT:
99 case MM_ERROR_COMMON_INVALID_ATTRTYPE:
100 ret = RECORDER_ERROR_INVALID_PARAMETER;
101 errorstr = "INVALID_PARAMETER";
103 case MM_ERROR_CAMCORDER_NOT_INITIALIZED:
104 case MM_ERROR_CAMCORDER_INVALID_STATE:
105 ret = RECORDER_ERROR_INVALID_STATE;
106 errorstr = "INVALID_STATE";
108 case MM_ERROR_CAMCORDER_GST_CORE:
109 case MM_ERROR_CAMCORDER_GST_LIBRARY:
110 case MM_ERROR_CAMCORDER_GST_RESOURCE:
111 case MM_ERROR_CAMCORDER_GST_STREAM:
112 case MM_ERROR_CAMCORDER_GST_STATECHANGE:
113 case MM_ERROR_CAMCORDER_GST_NEGOTIATION:
114 case MM_ERROR_CAMCORDER_GST_LINK:
115 case MM_ERROR_CAMCORDER_GST_FLOW_ERROR:
116 case MM_ERROR_CAMCORDER_ENCODER:
117 case MM_ERROR_CAMCORDER_ENCODER_BUFFER:
118 case MM_ERROR_CAMCORDER_ENCODER_WRONG_TYPE:
119 case MM_ERROR_CAMCORDER_ENCODER_WORKING:
120 case MM_ERROR_CAMCORDER_INTERNAL:
121 case MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT:
122 case MM_ERROR_CAMCORDER_CMD_IS_RUNNING:
123 case MM_ERROR_CAMCORDER_DSP_FAIL:
124 case MM_ERROR_CAMCORDER_AUDIO_EMPTY:
125 case MM_ERROR_CAMCORDER_CREATE_CONFIGURE:
126 case MM_ERROR_CAMCORDER_FILE_SIZE_OVER:
127 case MM_ERROR_CAMCORDER_DISPLAY_DEVICE_OFF:
128 case MM_ERROR_CAMCORDER_INVALID_CONDITION:
129 ret = RECORDER_ERROR_INVALID_OPERATION;
130 errorstr = "INVALID_OPERATION";
132 case MM_ERROR_CAMCORDER_RESOURCE_CREATION:
133 case MM_ERROR_COMMON_OUT_OF_MEMORY:
134 ret = RECORDER_ERROR_OUT_OF_MEMORY;
135 errorstr = "OUT_OF_MEMORY";
137 case MM_ERROR_COMMON_OUT_OF_ARRAY:
138 case MM_ERROR_COMMON_OUT_OF_RANGE:
139 case MM_ERROR_COMMON_ATTR_NOT_EXIST:
140 case MM_ERROR_CAMCORDER_NOT_SUPPORTED:
141 ret = RECORDER_ERROR_NOT_SUPPORTED;
142 errorstr = "NOT_SUPPORTED";
145 case MM_ERROR_COMMON_INVALID_PERMISSION:
146 ret = RECORDER_ERROR_PERMISSION_DENIED;
147 errorstr = "ERROR_PERMISSION_DENIED";
149 case MM_ERROR_CAMCORDER_DEVICE:
150 case MM_ERROR_CAMCORDER_DEVICE_NOT_FOUND:
151 case MM_ERROR_CAMCORDER_DEVICE_BUSY:
152 case MM_ERROR_CAMCORDER_DEVICE_OPEN:
153 case MM_ERROR_CAMCORDER_DEVICE_IO:
154 case MM_ERROR_CAMCORDER_DEVICE_TIMEOUT:
155 case MM_ERROR_CAMCORDER_DEVICE_WRONG_JPEG:
156 case MM_ERROR_CAMCORDER_DEVICE_LACK_BUFFER:
157 ret = RECORDER_ERROR_DEVICE;
158 errorstr = "ERROR_DEVICE";
160 case MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE:
161 ret = RECORDER_ERROR_ESD;
162 errorstr = "ERROR_ESD";
164 case MM_ERROR_POLICY_RESTRICTED:
165 ret = RECORDER_ERROR_SECURITY_RESTRICTED;
166 errorstr = "ERROR_RESTRICTED";
168 case MM_ERROR_OUT_OF_STORAGE:
169 ret = RECORDER_ERROR_OUT_OF_STORAGE;
170 errorstr = "OUT_OF_STORAGE";
172 case MM_ERROR_RESOURCE_INTERNAL:
173 ret = RECORDER_ERROR_RESOURCE_CONFLICT;
174 errorstr = "ERROR_RESOURCE_CONFLICT";
177 ret = RECORDER_ERROR_INVALID_OPERATION;
178 errorstr = "INVALID_OPERATION";
183 CAM_LOG_ERROR("[%s] %s(0x%08x) : core frameworks error code(0x%08x)", func, errorstr, ret, code);
189 static recorder_state_e __recorder_state_convert(MMCamcorderStateType mm_state, MMCamcorderStateType mm_old_state)
191 recorder_state_e state = RECORDER_STATE_NONE;
193 case MM_CAMCORDER_STATE_NONE:
194 state = RECORDER_STATE_NONE;
196 case MM_CAMCORDER_STATE_NULL:
197 state = RECORDER_STATE_CREATED;
199 case MM_CAMCORDER_STATE_READY:
200 if (mm_old_state == MM_CAMCORDER_STATE_PREPARE) {
201 state = RECORDER_STATE_READY;
202 CAM_LOG_WARNING("destroying pipeline now");
204 state = RECORDER_STATE_CREATED;
205 CAM_LOG_WARNING("preparing pipeline now");
208 case MM_CAMCORDER_STATE_PREPARE:
210 case MM_CAMCORDER_STATE_CAPTURING:
211 state = RECORDER_STATE_READY;
213 case MM_CAMCORDER_STATE_RECORDING:
214 state = RECORDER_STATE_RECORDING;
216 case MM_CAMCORDER_STATE_PAUSED:
217 state = RECORDER_STATE_PAUSED;
220 state = RECORDER_STATE_NONE;
228 static int __mm_recorder_msg_cb(int message, void *param, void *user_data)
230 recorder_s *handle = (recorder_s *)user_data;
231 MMMessageParamType *m = (MMMessageParamType *)param;
232 recorder_state_e previous_state;
233 recorder_recording_limit_type_e type;
234 recorder_policy_e policy = RECORDER_POLICY_NONE;
235 int recorder_error = 0;
238 case MM_MESSAGE_READY_TO_RESUME:
239 CAM_LOG_WARNING("not supported message");
241 case MM_MESSAGE_CAMCORDER_STATE_CHANGED:
242 case MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_SECURITY:
243 case MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_RM:
245 static int interrupt_state = -1;
247 previous_state = handle->state;
248 handle->state = __recorder_state_convert(m->state.current, m->state.previous);
251 if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_SECURITY) {
252 policy = RECORDER_POLICY_SECURITY;
253 CAM_LOG_ERROR("RECORDER_POLICY_SECURITY");
254 } else if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGED_BY_RM) {
255 policy = RECORDER_POLICY_RESOURCE_CONFLICT;
256 CAM_LOG_WARNING("RECORDER_POLICY_RESOURCE_CONFLICT");
259 if (message != MM_MESSAGE_CAMCORDER_STATE_CHANGED &&
260 interrupt_state == -1) {
261 interrupt_state = previous_state;
262 CAM_LOG_INFO("interrupt state %d", interrupt_state);
266 if (previous_state != handle->state && handle->user_cb[_RECORDER_EVENT_TYPE_STATE_CHANGE])
267 ((recorder_state_changed_cb)handle->user_cb[_RECORDER_EVENT_TYPE_STATE_CHANGE])(previous_state, handle->state, policy, handle->user_data[_RECORDER_EVENT_TYPE_STATE_CHANGE]);
270 if (policy != RECORDER_POLICY_NONE) {
271 if (policy == RECORDER_POLICY_SECURITY ||
272 m->state.current == MM_CAMCORDER_STATE_PAUSED ||
273 m->state.current == MM_CAMCORDER_STATE_NULL) {
274 CAM_LOG_INFO("call interrupted callback");
276 if (handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPTED])
277 ((recorder_interrupted_cb)handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPTED])(policy, interrupt_state, handle->state, handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPTED]);
279 CAM_LOG_WARNING("_RECORDER_EVENT_TYPE_INTERRUPTED cb is NULL");
281 /* initialize interrupt state */
282 interrupt_state = -1;
287 case MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_SECURITY:
288 case MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_RM:
289 if (handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]) {
290 if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_SECURITY)
291 policy = RECORDER_POLICY_SECURITY;
292 else if (message == MM_MESSAGE_CAMCORDER_STATE_CHANGE_STARTED_BY_RM)
293 policy = RECORDER_POLICY_RESOURCE_CONFLICT;
295 CAM_LOG_WARNING("message 0x%x -> policy %d", message, policy);
297 if (policy != RECORDER_POLICY_NONE) {
298 ((recorder_interrupt_started_cb)handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED])(policy,
299 handle->state, handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED]);
304 case MM_MESSAGE_CAMCORDER_MAX_SIZE:
305 case MM_MESSAGE_CAMCORDER_NO_FREE_SPACE:
306 case MM_MESSAGE_CAMCORDER_TIME_LIMIT:
307 if (MM_MESSAGE_CAMCORDER_MAX_SIZE == message)
308 type = RECORDER_RECORDING_LIMIT_SIZE;
309 else if (MM_MESSAGE_CAMCORDER_NO_FREE_SPACE == message)
310 type = RECORDER_RECORDING_LIMIT_FREE_SPACE;
312 type = RECORDER_RECORDING_LIMIT_TIME;
314 if (handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_LIMITED])
315 ((recorder_recording_limit_reached_cb)handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_LIMITED])(type,
316 handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_LIMITED]);
318 case MM_MESSAGE_CAMCORDER_RECORDING_STATUS:
319 if (handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_STATUS])
320 ((recorder_recording_status_cb)handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_STATUS])(m->recording_status.elapsed,
321 m->recording_status.filesize, handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_STATUS]);
324 case MM_MESSAGE_CAMCORDER_ERROR:
326 case MM_ERROR_CAMCORDER_DEVICE:
327 case MM_ERROR_CAMCORDER_DEVICE_TIMEOUT:
328 case MM_ERROR_CAMCORDER_DEVICE_WRONG_JPEG:
329 recorder_error = RECORDER_ERROR_DEVICE;
330 CAM_LOG_ERROR("ERROR_DEVICE : 0x%x", m->code);
332 case MM_ERROR_CAMCORDER_GST_CORE:
333 case MM_ERROR_CAMCORDER_GST_LIBRARY:
334 case MM_ERROR_CAMCORDER_GST_RESOURCE:
335 case MM_ERROR_CAMCORDER_GST_STREAM:
336 case MM_ERROR_CAMCORDER_GST_NEGOTIATION:
337 case MM_ERROR_CAMCORDER_GST_FLOW_ERROR:
338 case MM_ERROR_CAMCORDER_ENCODER:
339 case MM_ERROR_CAMCORDER_ENCODER_BUFFER:
340 case MM_ERROR_CAMCORDER_ENCODER_WORKING:
341 case MM_ERROR_CAMCORDER_MNOTE_CREATION:
342 case MM_ERROR_CAMCORDER_MNOTE_ADD_ENTRY:
343 case MM_ERROR_CAMCORDER_INTERNAL:
344 case MM_ERROR_FILE_NOT_FOUND:
345 case MM_ERROR_FILE_READ:
346 recorder_error = RECORDER_ERROR_INVALID_OPERATION;
347 CAM_LOG_ERROR("INVALID_OPERATION : 0x%x", m->code);
349 case MM_ERROR_CAMCORDER_LOW_MEMORY:
350 case MM_ERROR_CAMCORDER_MNOTE_MALLOC:
351 recorder_error = RECORDER_ERROR_OUT_OF_MEMORY;
352 CAM_LOG_ERROR("OUT_OF_MEMORY : 0x%x", m->code);
354 case MM_ERROR_CAMCORDER_DEVICE_REG_TROUBLE:
355 recorder_error = RECORDER_ERROR_ESD;
356 CAM_LOG_ERROR("ESD : 0x%x", m->code);
358 case MM_ERROR_OUT_OF_STORAGE:
359 recorder_error = RECORDER_ERROR_OUT_OF_STORAGE;
360 CAM_LOG_ERROR("OUT_OF_STORAGE : 0x%x", m->code);
363 recorder_error = RECORDER_ERROR_INVALID_OPERATION;
364 CAM_LOG_ERROR("INVALID_OPERATION : 0x%x", m->code);
368 if (handle->user_cb[_RECORDER_EVENT_TYPE_ERROR])
369 ((recorder_error_cb)handle->user_cb[_RECORDER_EVENT_TYPE_ERROR])(recorder_error, handle->state, handle->user_data[_RECORDER_EVENT_TYPE_ERROR]);
371 CAM_LOG_WARNING("ERROR cb was not set");
374 case MM_MESSAGE_CAMCORDER_CURRENT_VOLUME:
375 if (handle->last_max_input_level < m->rec_volume_dB)
376 handle->last_max_input_level = m->rec_volume_dB;
386 static int __mm_audio_stream_cb(MMCamcorderAudioStreamDataType *stream, void *user_param)
388 recorder_s *handle = (recorder_s *)user_param;
389 recorder_sample_type_e format = RECORDER_SAMPLE_TYPE_U8;
390 int type = _RECORDER_EVENT_TYPE_AUDIO_STREAM;
392 recorder_return_val_if_fail(handle && stream, 0);
394 if (stream->format == MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE)
395 format = RECORDER_SAMPLE_TYPE_S16_LE;
397 CAM_LOG_DEBUG("fmt[%d], ch[%d], timestamp[%u], size[%d]",
398 format, stream->channel, stream->timestamp, stream->length);
400 if (handle->user_cb[type]) {
401 ((recorder_audio_stream_cb)(handle->user_cb[type]))(stream->data, stream->length, format,
402 stream->channel, stream->timestamp, handle->user_data[type]);
404 CAM_LOG_WARNING("audio_stream_cb is NULL");
411 static int __mm_muxed_stream_cb(MMCamcorderMuxedStreamDataType *stream, void *user_param)
413 recorder_s *handle = (recorder_s *)user_param;
414 int type = _RECORDER_EVENT_TYPE_MUXED_STREAM;
416 recorder_return_val_if_fail(handle && stream, 0);
418 CAM_LOG_DEBUG("size[%d], offset[%llu]", stream->length, stream->offset);
420 if (handle->user_cb[type]) {
421 ((recorder_muxed_stream_cb)(handle->user_cb[type]))(stream->data, stream->length,
422 stream->offset, handle->user_data[type]);
424 CAM_LOG_WARNING("muxed_stream_cb is NULL");
431 static int __mm_video_encode_decision_cb(MMCamcorderVideoStreamDataType *stream, void *user_param)
433 recorder_s *handle = (recorder_s *)user_param;
434 int type = _RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION;
435 bool do_encode = true;
437 recorder_return_val_if_fail(handle && stream, 0);
439 if (!handle->user_cb[type]) {
440 CAM_LOG_WARNING("video_encode_decision_cb is NULL");
444 do_encode = ((recorder_video_encode_decision_cb)(handle->user_cb[type]))(stream, handle->user_data[type]);
446 CAM_LOG_DEBUG("do_encode[%d]", do_encode);
448 return (int)do_encode;
452 static int _recorder_check_and_set_attribute(recorder_h recorder, const char *attribute_name, int set_value)
454 bool reset_pipeline = false;
455 bool restore_set = false;
456 int ret = MM_ERROR_NONE;
457 int ret2 = MM_ERROR_NONE;
458 int current_value = -1;
459 int current_audio_disable = 0;
461 recorder_s *handle = (recorder_s *)recorder;
462 MMCamcorderStateType mmstate = MM_CAMCORDER_STATE_NONE;
464 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
466 mm_camcorder_get_state(handle->mm_handle, &mmstate);
468 recorder_return_val_if_fail(mmstate < MM_CAMCORDER_STATE_RECORDING, RECORDER_ERROR_INVALID_STATE);
470 if (handle->type == _RECORDER_TYPE_AUDIO && mmstate == MM_CAMCORDER_STATE_PREPARE) {
471 mm_camcorder_get_attributes(handle->mm_handle, NULL,
472 MMCAM_AUDIO_DISABLE, ¤t_audio_disable,
473 attribute_name, ¤t_value,
476 if (current_value != set_value) {
477 CAM_LOG_INFO("try to reset pipeline");
479 ret = mm_camcorder_stop(handle->mm_handle);
480 if (ret != MM_ERROR_NONE) {
481 CAM_LOG_ERROR("mm_camcorder_stop failed 0x%x", ret);
482 return __convert_recorder_error_code(attribute_name, ret);
485 ret = mm_camcorder_unrealize(handle->mm_handle);
486 if (ret != MM_ERROR_NONE) {
487 CAM_LOG_ERROR("mm_camcorder_unrealize failed 0x%x", ret);
488 mm_camcorder_start(handle->mm_handle);
489 return __convert_recorder_error_code(attribute_name, ret);
492 reset_pipeline = true;
496 if (!strcmp(attribute_name, MMCAM_AUDIO_ENCODER)) {
497 if (set_value == RECORDER_AUDIO_CODEC_DISABLE) {
498 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
499 MMCAM_AUDIO_DISABLE, true,
502 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
503 MMCAM_AUDIO_DISABLE, false,
504 MMCAM_AUDIO_ENCODER, set_value,
508 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
509 attribute_name, set_value,
513 if (ret != MM_ERROR_NONE)
514 CAM_LOG_ERROR("set [%s] failed 0x%x", attribute_name, ret);
516 if (reset_pipeline) {
517 ret2 = mm_camcorder_realize(handle->mm_handle);
518 if (ret2 == MM_ERROR_NONE) {
519 ret2 = mm_camcorder_start(handle->mm_handle);
520 if (ret2 == MM_ERROR_NONE) {
521 CAM_LOG_WARNING("restart pipeline done.");
523 CAM_LOG_ERROR("mm_camcorder_start failed 0x%x", ret2);
524 mm_camcorder_unrealize(handle->mm_handle);
527 CAM_LOG_ERROR("mm_camcorder_realize failed 0x%x", ret2);
530 if (ret2 != MM_ERROR_NONE) {
533 /* determine return value */
534 if (ret == MM_ERROR_NONE)
540 ret2 = mm_camcorder_set_attributes(handle->mm_handle, NULL,
541 MMCAM_AUDIO_DISABLE, current_audio_disable,
542 attribute_name, current_value,
544 CAM_LOG_WARNING("restore attribute set : 0x%x", ret2);
546 ret2 = mm_camcorder_realize(handle->mm_handle);
547 CAM_LOG_WARNING("restore mm_camcorder_realize : 0x%x", ret2);
549 ret2 = mm_camcorder_start(handle->mm_handle);
550 CAM_LOG_WARNING("restore mm_camcorder_realize : 0x%x", ret2);
551 if (ret2 != MM_ERROR_NONE) {
552 ret2 = mm_camcorder_unrealize(handle->mm_handle);
553 CAM_LOG_WARNING("restore mm_camcorder_unrealize : 0x%x", ret2);
557 return __convert_recorder_error_code(attribute_name, ret);
561 int legacy_recorder_create_videorecorder(camera_h camera, recorder_h *recorder)
563 int ret = MM_ERROR_NONE;
564 int preview_format = MM_PIXEL_FORMAT_NV12;
565 int camera_device_count = 0;
566 recorder_s *handle = NULL;
568 recorder_return_val_if_fail(camera && recorder, RECORDER_ERROR_INVALID_PARAMETER);
570 /* Check already used in another recorder */
571 if (legacy_camera_is_used(camera)) {
572 CAM_LOG_ERROR("[%s] camera is using in another recorder.", __func__);
573 return RECORDER_ERROR_INVALID_PARAMETER;
576 handle = g_new0(recorder_s, 1);
578 handle->src_type = _RECORDER_SOURCE_TYPE_CAMERA;
579 handle->last_max_input_level = LOWSET_DECIBEL;
580 handle->changed_preview_format = -1;
581 handle->mm_source.camera = camera;
583 _camera_get_mm_handle(camera, &handle->mm_handle);
584 _camera_set_relay_mm_message_callback(camera, __mm_recorder_msg_cb , (void*)handle);
585 handle->type = _RECORDER_TYPE_VIDEO;
586 legacy_recorder_get_state((recorder_h)handle, (recorder_state_e*)&handle->state);
588 mm_camcorder_get_attributes(handle->mm_handle, NULL,
589 MMCAM_CAMERA_FORMAT, &handle->origin_preview_format,
592 mm_camcorder_get_attributes(handle->mm_handle, NULL,
593 MMCAM_RECOMMEND_PREVIEW_FORMAT_FOR_RECORDING, &preview_format,
596 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
597 MMCAM_CAMERA_DEVICE_COUNT, &camera_device_count,
599 if (ret != MM_ERROR_NONE) {
601 CAM_LOG_ERROR("get device count error");
602 return __convert_recorder_error_code(__func__, ret);
605 if (camera_device_count == 0) {
607 CAM_LOG_ERROR("RECORDER_ERROR_NOT_SUPPORTED");
608 return RECORDER_ERROR_NOT_SUPPORTED;
610 handle->camera_device_count = camera_device_count;
613 legacy_camera_lock(camera, true);
614 _camera_set_use(camera, true);
615 legacy_camera_lock(camera, false);
617 if (handle->state == RECORDER_STATE_CREATED &&
618 preview_format != handle->origin_preview_format) {
619 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
620 MMCAM_CAMERA_FORMAT, preview_format,
623 if (ret == MM_ERROR_NONE)
624 handle->changed_preview_format = preview_format;
627 *recorder = (recorder_h)handle;
629 return RECORDER_ERROR_NONE;
633 int legacy_recorder_create_audiorecorder(recorder_h *recorder)
635 int ret = MM_ERROR_NONE;
636 int camera_device_count = 0;
637 recorder_s *handle = NULL;
640 recorder_return_val_if_fail(recorder, RECORDER_ERROR_INVALID_PARAMETER);
642 info.videodev_type = MM_VIDEO_DEVICE_NONE;
644 handle = g_new0(recorder_s, 1);
646 handle->last_max_input_level = LOWSET_DECIBEL;
648 ret = mm_camcorder_create(&handle->mm_handle, &info);
649 if (ret != MM_ERROR_NONE) {
651 CAM_LOG_ERROR("mm_camcorder_create fail");
652 return __convert_recorder_error_code(__func__, ret);
655 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
656 MMCAM_MODE, MM_CAMCORDER_MODE_AUDIO,
658 if (ret != MM_ERROR_NONE) {
659 mm_camcorder_destroy(handle->mm_handle);
661 CAM_LOG_ERROR("AUDIO mode setting fail");
662 return __convert_recorder_error_code(__func__, ret);
665 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
666 MMCAM_CAMERA_DEVICE_COUNT, &camera_device_count,
668 if (ret != MM_ERROR_NONE) {
669 mm_camcorder_destroy(handle->mm_handle);
671 CAM_LOG_ERROR("get device count error");
672 return __convert_recorder_error_code(__func__, ret);
674 handle->camera_device_count = camera_device_count;
676 handle->state = RECORDER_STATE_CREATED;
677 handle->mm_source.camera = NULL;
678 handle->type = _RECORDER_TYPE_AUDIO;
680 mm_camcorder_set_message_callback(handle->mm_handle, __mm_recorder_msg_cb, (void*)handle);
682 *recorder = (recorder_h)handle;
684 return RECORDER_ERROR_NONE;
688 int legacy_recorder_get_state(recorder_h recorder, recorder_state_e *state)
690 int ret = MM_ERROR_NONE;
691 recorder_s *handle = (recorder_s *)recorder;
692 MMCamcorderStateType mm_state = MM_CAMCORDER_STATE_NONE;
693 MMCamcorderStateType mm_old_state = MM_CAMCORDER_STATE_NONE;
695 recorder_return_val_if_fail(handle && state, RECORDER_ERROR_INVALID_PARAMETER);
697 ret = mm_camcorder_get_state2(handle->mm_handle, &mm_state, &mm_old_state);
698 if (ret != MM_ERROR_NONE)
699 return __convert_recorder_error_code(__func__, ret);
701 *state = __recorder_state_convert(mm_state, mm_old_state);
703 return RECORDER_ERROR_NONE;
707 int legacy_recorder_destroy(recorder_h recorder)
709 int ret = MM_ERROR_NONE;
711 recorder_s *handle = (recorder_s *)recorder;
713 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
715 if (handle->type == _RECORDER_TYPE_VIDEO) {
716 MMCamcorderStateType mm_state = MM_CAMCORDER_STATE_NONE;
719 ret = mm_camcorder_get_state(handle->mm_handle, &mm_state);
720 if (ret != MM_ERROR_NONE) {
721 CAM_LOG_ERROR("get state failed 0x%x", ret);
722 return __convert_recorder_error_code(__func__, ret);
725 if (mm_state >= MM_CAMCORDER_STATE_RECORDING) {
726 CAM_LOG_ERROR("NOW RECORDING[%d], should not destroy", mm_state);
727 return RECORDER_ERROR_INVALID_STATE;
731 legacy_camera_lock(handle->mm_source.camera, true);
733 _camera_set_use(handle->mm_source.camera, false);
735 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
736 MMCAM_CAMERA_FORMAT, &preview_format,
739 /* preview format was changed? */
740 if (ret == MM_ERROR_NONE &&
741 preview_format == handle->changed_preview_format &&
742 preview_format != handle->origin_preview_format) {
743 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
744 MMCAM_CAMERA_FORMAT, handle->origin_preview_format,
748 if (ret == MM_ERROR_NONE) {
749 _camera_set_relay_mm_message_callback(handle->mm_source.camera, NULL, NULL);
750 legacy_camera_send_signal(handle->mm_source.camera);
753 legacy_camera_lock(handle->mm_source.camera, false);
755 ret = mm_camcorder_destroy(handle->mm_handle);
758 if (ret == MM_ERROR_NONE)
761 return __convert_recorder_error_code(__func__, ret);
765 int legacy_recorder_prepare(recorder_h recorder)
767 int ret = MM_ERROR_NONE;
768 recorder_s *handle = (recorder_s *)recorder;
769 MMCamcorderStateType mmstate;
771 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
773 if (handle->type == _RECORDER_TYPE_VIDEO)
774 return __convert_error_code_camera_to_recorder(legacy_camera_start_preview(handle->mm_source.camera));
776 ret = mm_camcorder_get_state(handle->mm_handle, &mmstate);
778 if (ret == MM_ERROR_NONE && mmstate < MM_CAMCORDER_STATE_READY) {
779 ret = mm_camcorder_realize(handle->mm_handle);
780 if (ret != MM_ERROR_NONE) {
781 CAM_LOG_ERROR("mm_camcorder_realize fail");
782 return __convert_recorder_error_code(__func__, ret);
786 ret = mm_camcorder_start(handle->mm_handle);
787 if (ret != MM_ERROR_NONE) {
788 CAM_LOG_ERROR("mm_camcorder_start fail");
789 mm_camcorder_unrealize(handle->mm_handle);
790 return __convert_recorder_error_code(__func__, ret);
793 return RECORDER_ERROR_NONE;
797 int legacy_recorder_unprepare(recorder_h recorder)
799 int ret = MM_ERROR_NONE;
800 recorder_s *handle = (recorder_s *)recorder;
801 MMCamcorderStateType mmstate;
803 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
805 ret = mm_camcorder_get_state(handle->mm_handle, &mmstate);
806 if (ret == MM_ERROR_NONE && mmstate == MM_CAMCORDER_STATE_PREPARE) {
807 ret = mm_camcorder_stop(handle->mm_handle);
808 if (ret != MM_ERROR_NONE)
809 CAM_LOG_ERROR("mm_camcorder_stop fail");
812 if (ret == MM_ERROR_NONE) {
813 ret = mm_camcorder_unrealize(handle->mm_handle);
814 if (ret != MM_ERROR_NONE) {
815 CAM_LOG_ERROR("mm_camcorder_unrealize fail");
816 mm_camcorder_start(handle->mm_handle);
820 return __convert_recorder_error_code(__func__, ret);
824 int legacy_recorder_start(recorder_h recorder)
826 recorder_s *handle = (recorder_s *)recorder;
828 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
830 return __convert_recorder_error_code(__func__, mm_camcorder_record(handle->mm_handle));
834 int legacy_recorder_pause(recorder_h recorder)
836 recorder_s *handle = (recorder_s *)recorder;
838 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
840 return __convert_recorder_error_code(__func__, mm_camcorder_pause(handle->mm_handle));
844 int legacy_recorder_commit(recorder_h recorder)
846 recorder_s *handle = (recorder_s *)recorder;
848 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
850 return __convert_recorder_error_code(__func__, mm_camcorder_commit(handle->mm_handle));
854 int legacy_recorder_cancel(recorder_h recorder)
856 recorder_s *handle = (recorder_s *)recorder;
858 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
860 return __convert_recorder_error_code(__func__, mm_camcorder_cancel(handle->mm_handle));
864 int legacy_recorder_set_video_resolution(recorder_h recorder, int width, int height)
866 int ret = MM_ERROR_NONE;
867 recorder_s *handle = (recorder_s *)recorder;
868 recorder_state_e state = RECORDER_STATE_NONE;
870 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
871 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
873 legacy_recorder_get_state(recorder, &state);
874 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
876 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
877 MMCAM_VIDEO_WIDTH, width,
878 MMCAM_VIDEO_HEIGHT, height,
881 return __convert_recorder_error_code(__func__, ret);
885 int legacy_recorder_get_video_resolution(recorder_h recorder, int *width, int *height)
887 int ret = MM_ERROR_NONE;
888 recorder_s *handle = (recorder_s *)recorder;
890 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
891 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
892 recorder_return_val_if_fail(width && height, RECORDER_ERROR_INVALID_PARAMETER);
894 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
895 MMCAM_VIDEO_WIDTH, width,
896 MMCAM_VIDEO_HEIGHT, height,
899 return __convert_recorder_error_code(__func__, ret);
903 int legacy_recorder_foreach_supported_video_resolution(recorder_h recorder,
904 recorder_supported_video_resolution_cb foreach_cb, void *user_data)
907 int ret = MM_ERROR_NONE;
908 recorder_s *handle = (recorder_s *)recorder;
909 MMCamAttrsInfo video_width;
910 MMCamAttrsInfo video_height;
912 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
913 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
914 recorder_return_val_if_fail(foreach_cb, RECORDER_ERROR_INVALID_PARAMETER);
916 ret = mm_camcorder_get_attribute_info(handle->mm_handle, MMCAM_VIDEO_WIDTH, &video_width);
917 ret |= mm_camcorder_get_attribute_info(handle->mm_handle, MMCAM_VIDEO_HEIGHT, &video_height);
919 if (ret != MM_ERROR_NONE)
920 return __convert_recorder_error_code(__func__, ret);
922 for (i = 0 ; i < video_width.int_array.count ; i++) {
923 if (!foreach_cb(video_width.int_array.array[i], video_height.int_array.array[i], user_data))
927 return RECORDER_ERROR_NONE;
931 int legacy_recorder_get_audio_level(recorder_h recorder, double *level)
933 recorder_s *handle = (recorder_s *)recorder;
934 recorder_state_e state;
936 recorder_return_val_if_fail(handle && level, RECORDER_ERROR_INVALID_PARAMETER);
938 legacy_recorder_get_state(recorder, &state);
940 recorder_return_val_if_fail(state >= RECORDER_STATE_RECORDING, RECORDER_ERROR_INVALID_STATE);
942 *level = handle->last_max_input_level;
943 handle->last_max_input_level = LOWSET_DECIBEL;
945 return RECORDER_ERROR_NONE;
949 int legacy_recorder_set_filename(recorder_h recorder, const char *filename)
951 int ret = MM_ERROR_NONE;
952 recorder_s *handle = (recorder_s *)recorder;
953 MMCamcorderStateType mmstate = MM_CAMCORDER_STATE_NONE;
955 recorder_return_val_if_fail(handle && filename, RECORDER_ERROR_INVALID_PARAMETER);
957 mm_camcorder_get_state(handle->mm_handle, &mmstate);
959 recorder_return_val_if_fail(mmstate < MM_CAMCORDER_STATE_RECORDING, RECORDER_ERROR_INVALID_STATE);
961 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
962 MMCAM_TARGET_FILENAME, filename, strlen(filename),
965 return __convert_recorder_error_code(__func__, ret);
969 int legacy_recorder_get_filename(recorder_h recorder, char **filename)
971 int ret = MM_ERROR_NONE;
972 char *record_filename = NULL;
973 int record_filename_size;
974 recorder_s *handle = (recorder_s *)recorder;
976 recorder_return_val_if_fail(handle && filename, RECORDER_ERROR_INVALID_PARAMETER);
978 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
979 MMCAM_TARGET_FILENAME, &record_filename, &record_filename_size,
981 if (ret == MM_ERROR_NONE && record_filename) {
982 *filename = strdup(record_filename);
984 CAM_LOG_ERROR("internal return (0x%08x), get filename p:%p", ret, record_filename);
988 return __convert_recorder_error_code(__func__, ret);
992 int legacy_recorder_set_file_format(recorder_h recorder, recorder_file_format_e format)
994 int format_table[7] = {
995 MM_FILE_FORMAT_3GP, /* RECORDER_FILE_FORMAT_3GP */
996 MM_FILE_FORMAT_MP4, /* RECORDER_FILE_FORMAT_MP4 */
997 MM_FILE_FORMAT_AMR, /* RECORDER_FILE_FORMAT_AMR */
998 MM_FILE_FORMAT_AAC, /* RECORDER_FILE_FORMAT_ADTS */
999 MM_FILE_FORMAT_WAV, /* RECORDER_FILE_FORMAT_WAV */
1000 MM_FILE_FORMAT_OGG, /* RECORDER_FILE_FORMAT_OGG */
1001 MM_FILE_FORMAT_M2TS /* RECORDER_FILE_FORMAT_M2TS */
1004 recorder_return_val_if_fail(format <= RECORDER_FILE_FORMAT_M2TS, RECORDER_ERROR_INVALID_PARAMETER);
1006 return _recorder_check_and_set_attribute(recorder, MMCAM_FILE_FORMAT, format_table[format]);
1010 int legacy_recorder_get_file_format(recorder_h recorder, recorder_file_format_e *format)
1012 int ret = MM_ERROR_NONE;
1013 recorder_s *handle = (recorder_s *)recorder;
1016 recorder_return_val_if_fail(handle && format, RECORDER_ERROR_INVALID_PARAMETER);
1018 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1019 MMCAM_FILE_FORMAT, &mm_format,
1021 if (ret == MM_ERROR_NONE) {
1022 switch (mm_format) {
1023 case MM_FILE_FORMAT_3GP:
1024 *format = RECORDER_FILE_FORMAT_3GP;
1026 case MM_FILE_FORMAT_MP4:
1027 *format = RECORDER_FILE_FORMAT_MP4;
1029 case MM_FILE_FORMAT_AMR:
1030 *format = RECORDER_FILE_FORMAT_AMR;
1032 case MM_FILE_FORMAT_AAC:
1033 *format = RECORDER_FILE_FORMAT_ADTS;
1035 case MM_FILE_FORMAT_WAV:
1036 *format = RECORDER_FILE_FORMAT_WAV;
1038 case MM_FILE_FORMAT_OGG:
1039 *format = RECORDER_FILE_FORMAT_OGG;
1041 case MM_FILE_FORMAT_M2TS:
1042 *format = RECORDER_FILE_FORMAT_M2TS;
1045 ret = MM_ERROR_CAMCORDER_INTERNAL;
1050 return __convert_recorder_error_code(__func__, ret);
1054 int legacy_recorder_set_state_changed_cb(recorder_h recorder, recorder_state_changed_cb callback, void* user_data)
1056 recorder_s *handle = (recorder_s *)recorder;
1058 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1060 handle->user_cb[_RECORDER_EVENT_TYPE_STATE_CHANGE] = callback;
1061 handle->user_data[_RECORDER_EVENT_TYPE_STATE_CHANGE] = user_data;
1063 return RECORDER_ERROR_NONE;
1067 int legacy_recorder_unset_state_changed_cb(recorder_h recorder)
1069 recorder_s *handle = (recorder_s *)recorder;
1071 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1073 handle->user_cb[_RECORDER_EVENT_TYPE_STATE_CHANGE] = NULL;
1074 handle->user_data[_RECORDER_EVENT_TYPE_STATE_CHANGE] = NULL;
1076 return RECORDER_ERROR_NONE;
1080 int legacy_recorder_set_interrupted_cb(recorder_h recorder, recorder_interrupted_cb callback, void *user_data)
1082 recorder_s *handle = (recorder_s *)recorder;
1084 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1086 handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPTED] = callback;
1087 handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPTED] = user_data;
1089 return RECORDER_ERROR_NONE;
1093 int legacy_recorder_unset_interrupted_cb(recorder_h recorder)
1095 recorder_s *handle = (recorder_s *)recorder;
1097 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1099 handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPTED] = NULL;
1100 handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPTED] = NULL;
1102 return RECORDER_ERROR_NONE;
1106 int legacy_recorder_set_interrupt_started_cb(recorder_h recorder, recorder_interrupt_started_cb callback, void *user_data)
1108 recorder_s *handle = (recorder_s *)recorder;
1110 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1112 handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = callback;
1113 handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = user_data;
1115 return RECORDER_ERROR_NONE;
1119 int legacy_recorder_unset_interrupt_started_cb(recorder_h recorder)
1121 recorder_s *handle = (recorder_s *)recorder;
1123 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1125 handle->user_cb[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
1126 handle->user_data[_RECORDER_EVENT_TYPE_INTERRUPT_STARTED] = NULL;
1128 return RECORDER_ERROR_NONE;
1132 int legacy_recorder_set_audio_stream_cb(recorder_h recorder, recorder_audio_stream_cb callback, void* user_data)
1134 int ret = MM_ERROR_NONE;
1135 recorder_s *handle = (recorder_s *)recorder;
1137 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1139 ret = mm_camcorder_set_audio_stream_callback(handle->mm_handle, __mm_audio_stream_cb, handle);
1140 if (ret == MM_ERROR_NONE) {
1141 handle->user_cb[_RECORDER_EVENT_TYPE_AUDIO_STREAM] = callback;
1142 handle->user_data[_RECORDER_EVENT_TYPE_AUDIO_STREAM] = user_data;
1145 return __convert_recorder_error_code(__func__, ret);
1149 int legacy_recorder_unset_audio_stream_cb(recorder_h recorder)
1151 int ret = MM_ERROR_NONE;
1152 recorder_s *handle = (recorder_s *)recorder;
1154 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1156 handle->user_cb[_RECORDER_EVENT_TYPE_AUDIO_STREAM] = NULL;
1157 handle->user_data[_RECORDER_EVENT_TYPE_AUDIO_STREAM] = NULL;
1159 ret = mm_camcorder_set_audio_stream_callback(handle->mm_handle, NULL, NULL);
1161 return __convert_recorder_error_code(__func__, ret);
1165 int legacy_recorder_set_muxed_stream_cb(recorder_h recorder, recorder_muxed_stream_cb callback, void* user_data)
1167 int ret = MM_ERROR_NONE;
1168 recorder_s *handle = (recorder_s *)recorder;
1169 recorder_state_e state = RECORDER_STATE_NONE;
1171 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1173 legacy_recorder_get_state(recorder, &state);
1175 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
1177 ret = mm_camcorder_set_muxed_stream_callback(handle->mm_handle, __mm_muxed_stream_cb, handle);
1178 if (ret == MM_ERROR_NONE) {
1179 handle->user_cb[_RECORDER_EVENT_TYPE_MUXED_STREAM] = callback;
1180 handle->user_data[_RECORDER_EVENT_TYPE_MUXED_STREAM] = user_data;
1183 return __convert_recorder_error_code(__func__, ret);
1187 int legacy_recorder_unset_muxed_stream_cb(recorder_h recorder)
1189 int ret = MM_ERROR_NONE;
1190 recorder_s *handle = (recorder_s *)recorder;
1191 recorder_state_e state = RECORDER_STATE_NONE;
1193 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1195 legacy_recorder_get_state(recorder, &state);
1197 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
1199 ret = mm_camcorder_set_muxed_stream_callback(handle->mm_handle, NULL, NULL);
1200 if (ret == MM_ERROR_NONE) {
1201 handle->user_cb[_RECORDER_EVENT_TYPE_MUXED_STREAM] = NULL;
1202 handle->user_data[_RECORDER_EVENT_TYPE_MUXED_STREAM] = NULL;
1205 return __convert_recorder_error_code(__func__, ret);
1209 int legacy_recorder_set_video_encode_decision_cb(recorder_h recorder, recorder_video_encode_decision_cb callback, void *user_data)
1211 int ret = MM_ERROR_NONE;
1212 recorder_s *handle = (recorder_s *)recorder;
1213 recorder_state_e state = RECORDER_STATE_NONE;
1215 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1216 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1218 legacy_recorder_get_state(recorder, &state);
1219 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
1221 ret = mm_camcorder_set_video_encode_decision_callback(handle->mm_handle, __mm_video_encode_decision_cb, handle);
1222 if (ret == MM_ERROR_NONE) {
1223 handle->user_cb[_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION] = callback;
1224 handle->user_data[_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION] = user_data;
1227 return __convert_recorder_error_code(__func__, ret);
1231 int legacy_recorder_unset_video_encode_decision_cb(recorder_h recorder)
1233 int ret = MM_ERROR_NONE;
1234 recorder_s *handle = (recorder_s *)recorder;
1235 recorder_state_e state = RECORDER_STATE_NONE;
1237 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1238 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1240 legacy_recorder_get_state(recorder, &state);
1241 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
1243 ret = mm_camcorder_set_video_encode_decision_callback(handle->mm_handle, NULL, NULL);
1244 if (ret == MM_ERROR_NONE) {
1245 handle->user_cb[_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION] = NULL;
1246 handle->user_data[_RECORDER_EVENT_TYPE_VIDEO_ENCODE_DECISION] = NULL;
1249 return __convert_recorder_error_code(__func__, ret);
1253 int legacy_recorder_set_error_cb(recorder_h recorder, recorder_error_cb callback, void *user_data)
1255 recorder_s *handle = (recorder_s *)recorder;
1257 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1259 handle->user_cb[_RECORDER_EVENT_TYPE_ERROR] = callback;
1260 handle->user_data[_RECORDER_EVENT_TYPE_ERROR] = user_data;
1262 return RECORDER_ERROR_NONE;
1266 int legacy_recorder_unset_error_cb(recorder_h recorder)
1268 recorder_s *handle = (recorder_s *)recorder;
1270 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1272 handle->user_cb[_RECORDER_EVENT_TYPE_ERROR] = NULL;
1273 handle->user_data[_RECORDER_EVENT_TYPE_ERROR] = NULL;
1275 return RECORDER_ERROR_NONE;
1279 int legacy_recorder_set_recording_status_cb(recorder_h recorder, recorder_recording_status_cb callback, void* user_data)
1281 recorder_s *handle = (recorder_s *)recorder;
1283 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1285 handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_STATUS] = callback;
1286 handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_STATUS] = user_data;
1288 return RECORDER_ERROR_NONE;
1292 int legacy_recorder_unset_recording_status_cb(recorder_h recorder)
1294 recorder_s *handle = (recorder_s *)recorder;
1296 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1298 handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_STATUS] = NULL;
1299 handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_STATUS] = NULL;
1301 return RECORDER_ERROR_NONE;
1305 int legacy_recorder_set_recording_limit_reached_cb(recorder_h recorder, recorder_recording_limit_reached_cb callback, void* user_data)
1307 recorder_s *handle = (recorder_s *)recorder;
1309 recorder_return_val_if_fail(handle && callback, RECORDER_ERROR_INVALID_PARAMETER);
1311 handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = callback;
1312 handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = user_data;
1314 return RECORDER_ERROR_NONE;
1318 int legacy_recorder_unset_recording_limit_reached_cb(recorder_h recorder)
1320 recorder_s *handle = (recorder_s *)recorder;
1322 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1324 handle->user_cb[_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = NULL;
1325 handle->user_data[_RECORDER_EVENT_TYPE_RECORDING_LIMITED] = NULL;
1327 return RECORDER_ERROR_NONE;
1331 int legacy_recorder_foreach_supported_file_format(recorder_h recorder,
1332 recorder_supported_file_format_cb foreach_cb, const char* codec_type, int codec, void *user_data)
1335 int ret = MM_ERROR_NONE;
1336 recorder_s *handle = (recorder_s *)recorder;
1337 MMCamAttrsInfo info;
1340 recorder_return_val_if_fail(handle && foreach_cb, RECORDER_ERROR_INVALID_PARAMETER);
1342 ret = mm_camcorder_get_attribute_info(handle->mm_handle, MMCAM_FILE_FORMAT, &info);
1343 if (ret != MM_ERROR_NONE) {
1344 CAM_LOG_ERROR("mm_camcorder_get_attribute_info failed 0x%x", ret);
1345 return __convert_recorder_error_code(__func__, ret);;
1348 for (i = 0 ; i < info.int_array.count ; i++) {
1349 switch (info.int_array.array[i]) {
1350 case MM_FILE_FORMAT_3GP:
1351 format = RECORDER_FILE_FORMAT_3GP;
1353 case MM_FILE_FORMAT_MP4:
1354 format = RECORDER_FILE_FORMAT_MP4;
1356 case MM_FILE_FORMAT_AMR:
1357 format = RECORDER_FILE_FORMAT_AMR;
1359 case MM_FILE_FORMAT_AAC:
1360 format = RECORDER_FILE_FORMAT_ADTS;
1362 case MM_FILE_FORMAT_WAV:
1363 format = RECORDER_FILE_FORMAT_WAV;
1365 case MM_FILE_FORMAT_M2TS:
1366 format = RECORDER_FILE_FORMAT_M2TS;
1373 if (codec_type != NULL && format != -1)
1374 ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
1376 if (ret == MM_ERROR_NONE && format != -1 && !foreach_cb(format, user_data))
1380 return RECORDER_ERROR_NONE;
1384 int legacy_recorder_attr_set_size_limit(recorder_h recorder, int kbyte)
1386 int ret = MM_ERROR_NONE;
1387 recorder_s *handle = (recorder_s *)recorder;
1389 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1390 recorder_return_val_if_fail(kbyte >= 0, RECORDER_ERROR_INVALID_PARAMETER);
1392 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1393 MMCAM_TARGET_MAX_SIZE, kbyte,
1396 return __convert_recorder_error_code(__func__, ret);
1400 int legacy_recorder_attr_set_time_limit(recorder_h recorder, int second)
1402 int ret = MM_ERROR_NONE;
1403 recorder_s *handle = (recorder_s *)recorder;
1405 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1406 recorder_return_val_if_fail(second >= 0, RECORDER_ERROR_INVALID_PARAMETER);
1408 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1409 MMCAM_TARGET_TIME_LIMIT, second,
1412 return __convert_recorder_error_code(__func__, ret);
1416 int legacy_recorder_attr_set_audio_device(recorder_h recorder, recorder_audio_device_e device)
1418 recorder_return_val_if_fail(device <= RECORDER_AUDIO_DEVICE_MODEM, RECORDER_ERROR_INVALID_PARAMETER);
1420 return _recorder_check_and_set_attribute(recorder, MMCAM_AUDIO_DEVICE, device);
1424 int legacy_recorder_set_audio_encoder(recorder_h recorder, recorder_audio_codec_e codec)
1426 recorder_s *handle = (recorder_s *)recorder;
1427 int audio_table[5] = {
1428 MM_AUDIO_CODEC_AMR, /* RECORDER_AUDIO_CODEC_AMR */
1429 MM_AUDIO_CODEC_AAC, /* RECORDER_AUDIO_CODEC_AAC */
1430 MM_AUDIO_CODEC_VORBIS, /* RECORDER_AUDIO_CODEC_VORBIS */
1431 MM_AUDIO_CODEC_WAVE, /* RECORDER_AUDIO_CODEC_PCM */
1432 MM_AUDIO_CODEC_MP3 /* RECORDER_AUDIO_CODEC_MP3 */
1435 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1436 recorder_return_val_if_fail(codec >= RECORDER_AUDIO_CODEC_DISABLE && \
1437 codec <= RECORDER_AUDIO_CODEC_MP3, RECORDER_ERROR_INVALID_PARAMETER);
1438 recorder_return_val_if_fail(handle->type != _RECORDER_TYPE_AUDIO || \
1439 codec != RECORDER_AUDIO_CODEC_DISABLE, RECORDER_ERROR_NOT_SUPPORTED);
1441 return _recorder_check_and_set_attribute(recorder, MMCAM_AUDIO_ENCODER,
1442 codec == RECORDER_AUDIO_CODEC_DISABLE ? RECORDER_AUDIO_CODEC_DISABLE : audio_table[codec]);
1446 int legacy_recorder_get_audio_encoder(recorder_h recorder, recorder_audio_codec_e *codec)
1448 int ret = MM_ERROR_NONE;
1450 int audio_disable = 0;
1451 recorder_s *handle = (recorder_s *)recorder;
1453 recorder_return_val_if_fail(handle && codec, RECORDER_ERROR_INVALID_PARAMETER);
1455 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1456 MMCAM_AUDIO_ENCODER, &mm_codec,
1457 MMCAM_AUDIO_DISABLE, &audio_disable,
1460 if (ret == MM_ERROR_NONE && audio_disable == 0) {
1462 case MM_AUDIO_CODEC_AMR:
1463 *codec = RECORDER_AUDIO_CODEC_AMR;
1465 case MM_AUDIO_CODEC_AAC:
1466 *codec = RECORDER_AUDIO_CODEC_AAC;
1468 case MM_AUDIO_CODEC_VORBIS:
1469 *codec = RECORDER_AUDIO_CODEC_VORBIS;
1471 case MM_AUDIO_CODEC_WAVE:
1472 *codec = RECORDER_AUDIO_CODEC_PCM;
1475 ret = MM_ERROR_CAMCORDER_INTERNAL;
1478 } else if (ret == MM_ERROR_NONE && audio_disable) {
1479 *codec = RECORDER_AUDIO_CODEC_DISABLE;
1482 return __convert_recorder_error_code(__func__, ret);
1486 int legacy_recorder_set_video_encoder(recorder_h recorder, recorder_video_codec_e codec)
1488 int ret = MM_ERROR_NONE;
1489 int video_table[4] = {
1490 MM_VIDEO_CODEC_H263, /* RECORDER_VIDEO_CODEC_H263 */
1491 MM_VIDEO_CODEC_H264, /* RECORDER_VIDEO_CODEC_H264 */
1492 MM_VIDEO_CODEC_MPEG4, /* RECORDER_VIDEO_CODEC_MPEG4 */
1493 MM_VIDEO_CODEC_THEORA /* RECORDER_VIDEO_CODEC_THEORA */
1495 recorder_s *handle = (recorder_s *)recorder;
1496 recorder_state_e state = RECORDER_STATE_NONE;
1498 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1499 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1500 recorder_return_val_if_fail(codec <= RECORDER_VIDEO_CODEC_THEORA, RECORDER_ERROR_INVALID_PARAMETER);
1502 legacy_recorder_get_state(recorder, &state);
1504 recorder_return_val_if_fail(state <= RECORDER_STATE_READY, RECORDER_ERROR_INVALID_STATE);
1506 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1507 MMCAM_VIDEO_ENCODER, video_table[codec],
1510 return __convert_recorder_error_code(__func__, ret);
1514 int legacy_recorder_get_video_encoder(recorder_h recorder, recorder_video_codec_e *codec)
1516 int ret = MM_ERROR_NONE;
1518 recorder_s *handle = (recorder_s *)recorder;
1520 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1521 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1522 recorder_return_val_if_fail(codec, RECORDER_ERROR_INVALID_PARAMETER);
1524 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1525 MMCAM_VIDEO_ENCODER, &mm_codec,
1527 if (ret == MM_ERROR_NONE) {
1529 case MM_VIDEO_CODEC_H263:
1530 *codec = RECORDER_VIDEO_CODEC_H263;
1532 case MM_VIDEO_CODEC_H264:
1533 *codec = RECORDER_VIDEO_CODEC_H264;
1535 case MM_VIDEO_CODEC_MPEG4:
1536 *codec = RECORDER_VIDEO_CODEC_MPEG4;
1538 case MM_VIDEO_CODEC_THEORA:
1539 *codec = RECORDER_VIDEO_CODEC_THEORA;
1542 ret = MM_ERROR_CAMCORDER_INTERNAL;
1547 return __convert_recorder_error_code(__func__, ret);
1551 int legacy_recorder_attr_set_audio_samplerate(recorder_h recorder, int samplerate)
1553 recorder_return_val_if_fail(samplerate > 0, RECORDER_ERROR_INVALID_PARAMETER);
1555 return _recorder_check_and_set_attribute(recorder, MMCAM_AUDIO_SAMPLERATE, samplerate);
1559 int legacy_recorder_attr_set_audio_encoder_bitrate(recorder_h recorder, int bitrate)
1561 recorder_return_val_if_fail(bitrate > 0, RECORDER_ERROR_INVALID_PARAMETER);
1563 return _recorder_check_and_set_attribute(recorder, MMCAM_AUDIO_ENCODER_BITRATE, bitrate);
1567 int legacy_recorder_attr_set_video_encoder_bitrate(recorder_h recorder, int bitrate)
1569 int ret = MM_ERROR_NONE;
1570 recorder_s *handle = (recorder_s *)recorder;
1572 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1573 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1574 recorder_return_val_if_fail(bitrate > 0, RECORDER_ERROR_INVALID_PARAMETER);
1576 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1577 MMCAM_VIDEO_ENCODER_BITRATE, bitrate,
1580 return __convert_recorder_error_code(__func__, ret);
1584 int legacy_recorder_attr_get_size_limit(recorder_h recorder, int *kbyte)
1586 int ret = MM_ERROR_NONE;
1587 recorder_s *handle = (recorder_s *)recorder;
1589 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1591 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1592 MMCAM_TARGET_MAX_SIZE, kbyte,
1595 return __convert_recorder_error_code(__func__, ret);
1599 int legacy_recorder_attr_get_time_limit(recorder_h recorder, int *second)
1601 int ret = MM_ERROR_NONE;
1602 recorder_s *handle = (recorder_s *)recorder;
1604 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1606 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1607 MMCAM_TARGET_TIME_LIMIT, second,
1610 return __convert_recorder_error_code(__func__, ret);
1614 int legacy_recorder_attr_get_audio_device(recorder_h recorder, recorder_audio_device_e *device)
1616 int ret = MM_ERROR_NONE;
1617 recorder_s *handle = (recorder_s *)recorder;
1619 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1621 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1622 MMCAM_AUDIO_DEVICE, device,
1625 return __convert_recorder_error_code(__func__, ret);
1629 int legacy_recorder_attr_get_audio_samplerate(recorder_h recorder, int *samplerate)
1631 int ret = MM_ERROR_NONE;
1632 recorder_s *handle = (recorder_s *)recorder;
1634 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1636 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1637 MMCAM_AUDIO_SAMPLERATE, samplerate,
1640 return __convert_recorder_error_code(__func__, ret);
1644 int legacy_recorder_attr_get_audio_encoder_bitrate(recorder_h recorder, int *bitrate)
1646 int ret = MM_ERROR_NONE;
1647 recorder_s *handle = (recorder_s *)recorder;
1649 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1651 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1652 MMCAM_AUDIO_ENCODER_BITRATE, bitrate,
1655 return __convert_recorder_error_code(__func__, ret);
1659 int legacy_recorder_attr_get_video_encoder_bitrate(recorder_h recorder, int *bitrate)
1661 int ret = MM_ERROR_NONE;
1662 recorder_s *handle = (recorder_s *)recorder;
1664 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1665 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1667 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1668 MMCAM_VIDEO_ENCODER_BITRATE, bitrate,
1671 return __convert_recorder_error_code(__func__, ret);
1675 int legacy_recorder_foreach_supported_audio_encoder(recorder_h recorder,
1676 recorder_supported_audio_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data)
1679 int ret = MM_ERROR_NONE;
1681 recorder_s *handle = (recorder_s *)recorder;
1682 MMCamAttrsInfo info;
1684 recorder_return_val_if_fail(handle && foreach_cb, RECORDER_ERROR_INVALID_PARAMETER);
1686 ret = mm_camcorder_get_attribute_info(handle->mm_handle, MMCAM_AUDIO_ENCODER, &info);
1687 if (ret != MM_ERROR_NONE)
1688 return __convert_recorder_error_code(__func__, ret);
1690 for (i = 0 ; i < info.int_array.count ; i++) {
1691 switch (info.int_array.array[i]) {
1692 case MM_AUDIO_CODEC_AMR:
1693 codec = RECORDER_AUDIO_CODEC_AMR;
1695 case MM_AUDIO_CODEC_AAC:
1696 codec = RECORDER_AUDIO_CODEC_AAC;
1698 case MM_AUDIO_CODEC_VORBIS:
1699 codec = RECORDER_AUDIO_CODEC_VORBIS;
1701 case MM_AUDIO_CODEC_WAVE:
1702 codec = RECORDER_AUDIO_CODEC_PCM;
1709 if (codec_type != NULL && codec != -1)
1710 ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
1712 if (ret == MM_ERROR_NONE && codec != -1 && !foreach_cb(codec, user_data))
1716 return RECORDER_ERROR_NONE;
1720 int legacy_recorder_foreach_supported_video_encoder(recorder_h recorder,
1721 recorder_supported_video_encoder_cb foreach_cb, const char* codec_type, int format, void *user_data)
1724 int ret = MM_ERROR_NONE;
1726 recorder_s *handle = (recorder_s *)recorder;
1727 MMCamAttrsInfo info;
1729 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1730 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1731 recorder_return_val_if_fail(foreach_cb, RECORDER_ERROR_INVALID_PARAMETER);
1733 ret = mm_camcorder_get_attribute_info(handle->mm_handle, MMCAM_VIDEO_ENCODER, &info);
1734 if (ret != MM_ERROR_NONE)
1735 return __convert_recorder_error_code(__func__, ret);
1737 for (i = 0 ; i < info.int_array.count ; i++) {
1738 switch (info.int_array.array[i]) {
1739 case MM_VIDEO_CODEC_H263:
1740 codec = RECORDER_VIDEO_CODEC_H263;
1742 case MM_VIDEO_CODEC_H264:
1743 codec = RECORDER_VIDEO_CODEC_H264;
1745 case MM_VIDEO_CODEC_MPEG4:
1746 codec = RECORDER_VIDEO_CODEC_MPEG4;
1748 case MM_VIDEO_CODEC_THEORA:
1749 codec = RECORDER_VIDEO_CODEC_THEORA;
1756 if (codec_type != NULL && codec != -1)
1757 ret = mm_camcorder_check_codec_fileformat_compatibility((const char*)codec_type, codec, format);
1759 if (ret == MM_ERROR_NONE && codec != -1 && !foreach_cb(codec, user_data))
1763 return RECORDER_ERROR_NONE;
1767 int legacy_recorder_attr_set_mute(recorder_h recorder, bool enable)
1769 int ret = MM_ERROR_NONE;
1770 recorder_s *handle = (recorder_s *)recorder;
1772 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1774 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1775 MMCAM_AUDIO_VOLUME, enable ? 0.0 : 1.0,
1778 return __convert_recorder_error_code(__func__, ret);
1782 bool legacy_recorder_attr_is_muted(recorder_h recorder)
1784 int ret = MM_ERROR_NONE;
1785 double volume = 1.0;
1786 recorder_s *handle = (recorder_s *)recorder;
1788 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1790 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1791 MMCAM_AUDIO_VOLUME, &volume,
1794 set_last_result(__convert_recorder_error_code(__func__, ret));
1803 int legacy_recorder_attr_set_recording_motion_rate(recorder_h recorder, double rate)
1805 int ret = MM_ERROR_NONE;
1806 recorder_s *handle = (recorder_s *)recorder;
1808 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1809 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1810 recorder_return_val_if_fail(rate > 0.0, RECORDER_ERROR_INVALID_PARAMETER);
1812 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1813 MMCAM_CAMERA_RECORDING_MOTION_RATE, rate,
1816 return __convert_recorder_error_code(__func__, ret);
1820 int legacy_recorder_attr_get_recording_motion_rate(recorder_h recorder, double *rate)
1822 int ret = MM_ERROR_NONE;
1823 recorder_s *handle = (recorder_s *)recorder;
1825 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1826 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1827 recorder_return_val_if_fail(rate, RECORDER_ERROR_INVALID_PARAMETER);
1829 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1830 MMCAM_CAMERA_RECORDING_MOTION_RATE, rate,
1833 return __convert_recorder_error_code(__func__, ret);
1837 int legacy_recorder_attr_set_audio_channel(recorder_h recorder, int channel_count)
1839 recorder_return_val_if_fail(channel_count == 1 || channel_count == 2, RECORDER_ERROR_INVALID_PARAMETER);
1841 return _recorder_check_and_set_attribute(recorder, MMCAM_AUDIO_CHANNEL, channel_count);
1845 int legacy_recorder_attr_get_audio_channel(recorder_h recorder, int *channel_count)
1847 int ret = MM_ERROR_NONE;
1848 recorder_s *handle = (recorder_s *)recorder;
1850 recorder_return_val_if_fail(handle && channel_count, RECORDER_ERROR_INVALID_PARAMETER);
1852 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1853 MMCAM_AUDIO_CHANNEL, channel_count,
1856 return __convert_recorder_error_code(__func__, ret);
1860 int legacy_recorder_attr_set_orientation_tag(recorder_h recorder, recorder_rotation_e orientation)
1862 int ret = MM_ERROR_NONE;
1863 recorder_s *handle = (recorder_s *)recorder;
1865 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1866 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1867 recorder_return_val_if_fail(orientation <= RECORDER_ROTATION_270, RECORDER_ERROR_INVALID_PARAMETER);
1869 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1870 MMCAM_RECORDER_TAG_ENABLE, true,
1871 MMCAM_TAG_VIDEO_ORIENTATION, orientation,
1874 return __convert_recorder_error_code(__func__, ret);
1878 int legacy_recorder_attr_get_orientation_tag(recorder_h recorder, recorder_rotation_e *orientation)
1880 int ret = MM_ERROR_NONE;
1881 recorder_s *handle = (recorder_s *)recorder;
1883 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1884 recorder_return_val_if_fail(handle->camera_device_count > 0, RECORDER_ERROR_NOT_SUPPORTED);
1885 recorder_return_val_if_fail(orientation, RECORDER_ERROR_INVALID_PARAMETER);
1887 ret = mm_camcorder_get_attributes(handle->mm_handle, NULL,
1888 MMCAM_TAG_VIDEO_ORIENTATION, orientation,
1891 return __convert_recorder_error_code(__func__, ret);
1895 int legacy_recorder_attr_set_root_directory(recorder_h recorder, const char *root_directory)
1897 int ret = MM_ERROR_NONE;
1898 recorder_s *handle = (recorder_s *)recorder;
1899 MMCamcorderStateType mmstate = MM_CAMCORDER_STATE_NONE;
1901 recorder_return_val_if_fail(handle && root_directory, RECORDER_ERROR_INVALID_PARAMETER);
1903 mm_camcorder_get_state(handle->mm_handle, &mmstate);
1905 recorder_return_val_if_fail(mmstate < MM_CAMCORDER_STATE_RECORDING, RECORDER_ERROR_INVALID_STATE);
1907 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1908 MMCAM_ROOT_DIRECTORY, root_directory, strlen(root_directory),
1911 return __convert_recorder_error_code(__func__, ret);
1915 int legacy_recorder_set_sound_stream_info(recorder_h recorder, char *stream_type, int stream_index)
1917 int ret = MM_ERROR_NONE;
1918 recorder_s *handle = (recorder_s *)recorder;
1919 MMCamcorderStateType mmstate = MM_CAMCORDER_STATE_NONE;
1921 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1922 recorder_return_val_if_fail(stream_type && stream_index >= 0, RECORDER_ERROR_INVALID_PARAMETER);
1924 mm_camcorder_get_state(handle->mm_handle, &mmstate);
1926 recorder_return_val_if_fail(mmstate < MM_CAMCORDER_STATE_RECORDING, RECORDER_ERROR_INVALID_STATE);
1928 ret = mm_camcorder_set_attributes(handle->mm_handle, NULL,
1929 MMCAM_SOUND_STREAM_TYPE, stream_type, strlen(stream_type),
1930 MMCAM_SOUND_STREAM_INDEX, stream_index,
1933 return __convert_recorder_error_code(__func__, ret);
1937 int legacy_recorder_manage_external_storage_state(recorder_h recorder, int storage_state)
1939 int ret = MM_ERROR_NONE;
1940 recorder_s *handle = (recorder_s *)recorder;
1942 recorder_return_val_if_fail(handle, RECORDER_ERROR_INVALID_PARAMETER);
1944 CAM_LOG_WARNING("storage state %d", storage_state);
1946 ret = mm_camcorder_manage_external_storage_state(handle->mm_handle, storage_state);
1948 return __convert_recorder_error_code(__func__, ret);