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.
21 #include <mm_player.h>
22 #include <mm_player_internal.h>
25 #include <player_private.h>
31 #define LOG_TAG "TIZEN_N_PLAYER"
37 #define PLAYER_CHECK_CONDITION(condition,error,msg) \
38 if(condition) {} else \
39 { LOGE("[%s] %s(0x%08x)",__FUNCTION__, msg,error); return error;}; \
42 #define PLAYER_INSTANCE_CHECK(player) \
43 PLAYER_CHECK_CONDITION(player != NULL, PLAYER_ERROR_INVALID_PARAMETER,"PLAYER_ERROR_INVALID_PARAMETER")
45 #define PLAYER_STATE_CHECK(player,expected_state) \
46 PLAYER_CHECK_CONDITION(player->state == expected_state,PLAYER_ERROR_INVALID_STATE,"PLAYER_ERROR_INVALID_STATE")
48 #define PLAYER_NULL_ARG_CHECK(arg) \
49 PLAYER_CHECK_CONDITION(arg != NULL,PLAYER_ERROR_INVALID_PARAMETER,"PLAYER_ERROR_INVALID_PARAMETER")
52 * Internal Implementation
54 int _convert_error_code(int code, char* func_name)
56 int ret = PLAYER_ERROR_NONE;
57 char* msg="PLAYER_ERROR_NONE";
61 ret = PLAYER_ERROR_NONE;
62 msg = "PLAYER_ERROR_NONE";
64 case MM_ERROR_PLAYER_CODEC_NOT_FOUND:
65 case MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND:
66 case MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND:
67 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_AUDIO:
68 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_VIDEO:
69 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_MEDIA_TYPE:
70 case MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT:
71 ret = PLAYER_ERROR_NOT_SUPPORTED_FILE;
72 msg = "PLAYER_ERROR_NOT_SUPPORTED_FILE";
74 case MM_ERROR_PLAYER_INVALID_STATE:
75 case MM_ERROR_PLAYER_NOT_INITIALIZED:
76 ret = PLAYER_ERROR_INVALID_STATE;
77 msg = "PLAYER_ERROR_INVALID_STATE";
79 case MM_ERROR_PLAYER_INTERNAL:
80 case MM_ERROR_PLAYER_INVALID_STREAM:
81 case MM_ERROR_PLAYER_STREAMING_FAIL:
82 case MM_ERROR_PLAYER_NO_OP:
83 ret = PLAYER_ERROR_INVALID_OPERATION;
84 msg = "PLAYER_ERROR_INVALID_OPERATION";
86 case MM_ERROR_PLAYER_NO_FREE_SPACE:
87 ret = PLAYER_ERROR_OUT_OF_MEMORY;
88 msg = "PLAYER_ERROR_OUT_OF_MEMORY";
90 case MM_ERROR_PLAYER_FILE_NOT_FOUND:
91 ret = PLAYER_ERROR_NO_SUCH_FILE;
92 msg = "PLAYER_ERROR_NO_SUCH_FILE";
94 case MM_ERROR_PLAYER_SEEK:
95 ret = PLAYER_ERROR_SEEK_FAILED;
96 msg = "PLAYER_ERROR_SEEK_FAILED";
98 case MM_ERROR_PLAYER_INVALID_URI:
99 case MM_ERROR_PLAYER_STREAMING_INVALID_URL:
100 ret = PLAYER_ERROR_INVALID_URI;
101 msg = "PLAYER_ERROR_INVALID_URI";
103 case MM_ERROR_PLAYER_STREAMING_CONNECTION_FAIL:
104 case MM_ERROR_PLAYER_STREAMING_DNS_FAIL :
105 case MM_ERROR_PLAYER_STREAMING_SERVER_DISCONNECTED:
106 case MM_ERROR_PLAYER_STREAMING_INVALID_PROTOCOL:
107 case MM_ERROR_PLAYER_STREAMING_UNEXPECTED_MSG:
108 case MM_ERROR_PLAYER_STREAMING_OUT_OF_MEMORIES:
109 case MM_ERROR_PLAYER_STREAMING_RTSP_TIMEOUT:
110 case MM_ERROR_PLAYER_STREAMING_BAD_REQUEST:
111 case MM_ERROR_PLAYER_STREAMING_NOT_AUTHORIZED:
112 case MM_ERROR_PLAYER_STREAMING_PAYMENT_REQUIRED:
113 case MM_ERROR_PLAYER_STREAMING_FORBIDDEN:
114 case MM_ERROR_PLAYER_STREAMING_CONTENT_NOT_FOUND:
115 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_ALLOWED:
116 case MM_ERROR_PLAYER_STREAMING_NOT_ACCEPTABLE:
117 case MM_ERROR_PLAYER_STREAMING_PROXY_AUTHENTICATION_REQUIRED:
118 case MM_ERROR_PLAYER_STREAMING_SERVER_TIMEOUT:
119 case MM_ERROR_PLAYER_STREAMING_GONE:
120 case MM_ERROR_PLAYER_STREAMING_LENGTH_REQUIRED:
121 case MM_ERROR_PLAYER_STREAMING_PRECONDITION_FAILED:
122 case MM_ERROR_PLAYER_STREAMING_REQUEST_ENTITY_TOO_LARGE:
123 case MM_ERROR_PLAYER_STREAMING_REQUEST_URI_TOO_LARGE:
124 case MM_ERROR_PLAYER_STREAMING_PARAMETER_NOT_UNDERSTOOD:
125 case MM_ERROR_PLAYER_STREAMING_CONFERENCE_NOT_FOUND:
126 case MM_ERROR_PLAYER_STREAMING_NOT_ENOUGH_BANDWIDTH:
127 case MM_ERROR_PLAYER_STREAMING_NO_SESSION_ID:
128 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_VALID_IN_THIS_STATE:
129 case MM_ERROR_PLAYER_STREAMING_HEADER_FIELD_NOT_VALID_FOR_SOURCE:
130 case MM_ERROR_PLAYER_STREAMING_INVALID_RANGE:
131 case MM_ERROR_PLAYER_STREAMING_PARAMETER_IS_READONLY:
132 case MM_ERROR_PLAYER_STREAMING_AGGREGATE_OP_NOT_ALLOWED:
133 case MM_ERROR_PLAYER_STREAMING_ONLY_AGGREGATE_OP_ALLOWED:
134 case MM_ERROR_PLAYER_STREAMING_BAD_TRANSPORT:
135 case MM_ERROR_PLAYER_STREAMING_DESTINATION_UNREACHABLE:
136 case MM_ERROR_PLAYER_STREAMING_INTERNAL_SERVER_ERROR:
137 case MM_ERROR_PLAYER_STREAMING_NOT_IMPLEMENTED:
138 case MM_ERROR_PLAYER_STREAMING_BAD_GATEWAY:
139 case MM_ERROR_PLAYER_STREAMING_SERVICE_UNAVAILABLE:
140 case MM_ERROR_PLAYER_STREAMING_GATEWAY_TIME_OUT:
141 case MM_ERROR_PLAYER_STREAMING_OPTION_NOT_SUPPORTED:
142 ret = PLAYER_ERROR_CONNECTION_FAILED;
143 msg = "PLAYER_ERROR_CONNECTION_FAILED";
145 case MM_ERROR_POLICY_BLOCKED:
146 case MM_ERROR_POLICY_INTERRUPTED:
147 case MM_ERROR_POLICY_INTERNAL:
148 case MM_ERROR_POLICY_DUPLICATED:
149 ret = PLAYER_ERROR_SOUND_POLICY;
150 msg = "PLAYER_ERROR_SOUND_POLICY";
153 LOGE("[%s] %s(0x%08x) : core fw error(0x%x)",func_name,msg, ret, code);
157 player_state_e _convert_player_state(MMPlayerStateType state)
159 if(state == MM_PLAYER_STATE_NONE)
160 return PLAYER_STATE_NONE;
165 bool _player_state_validate(player_s * handle, player_state_e threshold)
167 if (handle->state < threshold)
172 int _set_callback(_player_event_e type, player_h player, void* callback, void *user_data)
174 PLAYER_INSTANCE_CHECK(player);
175 PLAYER_NULL_ARG_CHECK(callback);
176 player_s * handle = (player_s *) player;
177 handle->user_cb[type] = callback;
178 handle->user_data[type] = user_data;
179 LOGI("[%s] Event type : %d ",__FUNCTION__, type);
180 return PLAYER_ERROR_NONE;
183 int _unset_callback(_player_event_e type, player_h player)
185 PLAYER_INSTANCE_CHECK(player);
186 player_s * handle = (player_s *) player;
187 handle->user_cb[type] = NULL;
188 handle->user_data[type] = NULL;
189 LOGI("[%s] Event type : %d ",__FUNCTION__, type);
190 return PLAYER_ERROR_NONE;
193 player_state_e _get_current_state(player_s * handle)
195 return handle->state;
198 int _msg_callback(int message, void *param, void *user_data)
200 player_s * handle = (player_s*)user_data;
201 MMMessageParamType *msg = (MMMessageParamType*)param;
202 LOGI("[%s] Got message type : 0x%x" ,__FUNCTION__, message);
205 case MM_MESSAGE_ERROR: //0x01
206 if( handle->user_cb[_PLAYER_EVENT_TYPE_ERROR] )
208 ((player_error_cb)handle->user_cb[_PLAYER_EVENT_TYPE_ERROR])(_convert_error_code(msg->code,(char*)__FUNCTION__),handle->user_data[_PLAYER_EVENT_TYPE_ERROR]);
211 case MM_MESSAGE_STATE_CHANGED: //0x03
212 handle->state = _convert_player_state(msg->state.current);
213 if(handle->state == PLAYER_STATE_PAUSED && handle->user_cb[_PLAYER_EVENT_TYPE_PAUSE] )
215 ((player_paused_cb)handle->user_cb[_PLAYER_EVENT_TYPE_PAUSE])(handle->user_data[_PLAYER_EVENT_TYPE_PAUSE]);
218 case MM_MESSAGE_BEGIN_OF_STREAM: //0x104
219 if( handle->user_cb[_PLAYER_EVENT_TYPE_BEGIN] )
221 ((player_started_cb)handle->user_cb[_PLAYER_EVENT_TYPE_BEGIN])(handle->user_data[_PLAYER_EVENT_TYPE_BEGIN]);
224 case MM_MESSAGE_END_OF_STREAM://0x105
225 if( handle->user_cb[_PLAYER_EVENT_TYPE_COMPLETE] )
227 ((player_completed_cb)handle->user_cb[_PLAYER_EVENT_TYPE_COMPLETE])(handle->user_data[_PLAYER_EVENT_TYPE_COMPLETE]);
230 case MM_MESSAGE_BUFFERING: //0x103
231 if( handle->user_cb[_PLAYER_EVENT_TYPE_BUFFERING] )
233 ((player_buffering_cb)handle->user_cb[_PLAYER_EVENT_TYPE_BUFFERING])(msg->connection.buffering,handle->user_data[_PLAYER_EVENT_TYPE_BUFFERING]);
236 case MM_MESSAGE_STATE_INTERRUPTED: //0x04
237 if( handle->user_cb[_PLAYER_EVENT_TYPE_INTERRUPT] )
239 ((player_interrupted_cb)handle->user_cb[_PLAYER_EVENT_TYPE_INTERRUPT])(msg->code,handle->user_data[_PLAYER_EVENT_TYPE_INTERRUPT]);
242 case MM_MESSAGE_UPDATE_SUBTITLE: //0x109
243 if( handle->user_cb[_PLAYER_EVENT_TYPE_SUBTITLE] )
245 ((player_subtitle_updated_cb)handle->user_cb[_PLAYER_EVENT_TYPE_SUBTITLE])(msg->subtitle.duration, (char*)msg->data,handle->user_data[_PLAYER_EVENT_TYPE_SUBTITLE]);
248 case MM_MESSAGE_VIDEO_CAPTURED: //0x110
249 if( handle->user_cb[_PLAYER_EVENT_TYPE_CAPTURE] )
253 int ret = mm_player_get_attribute(handle->mm_handle, NULL,MM_PLAYER_VIDEO_WIDTH ,&w, MM_PLAYER_VIDEO_HEIGHT, &h, (char*)NULL);
254 if(ret != MM_ERROR_NONE)
258 LOGI("[%s] Failed to get video size on video captured : 0x%x" ,__FUNCTION__, ret);
260 MMPlayerVideoCapture* capture = (MMPlayerVideoCapture *)msg->data;
261 ((player_video_captured_cb)handle->user_cb[_PLAYER_EVENT_TYPE_CAPTURE])(capture->data, w, h, capture->size, handle->user_data[_PLAYER_EVENT_TYPE_CAPTURE]);
264 case MM_MESSAGE_UNKNOWN: //0x00
265 case MM_MESSAGE_WARNING: //0x02
266 case MM_MESSAGE_READY_TO_RESUME: //0x05
267 case MM_MESSAGE_CONNECTING: //0x100
268 case MM_MESSAGE_CONNECTED: //0x101
269 case MM_MESSAGE_CONNECTION_TIMEOUT: //0x102
270 case MM_MESSAGE_BLUETOOTH_ON: //0x106
271 case MM_MESSAGE_BLUETOOTH_OFF: //0x107
272 case MM_MESSAGE_RESUMED_BY_REW: //0x108
273 case MM_MESSAGE_RTP_SENDER_REPORT: //0x10a
274 case MM_MESSAGE_RTP_RECEIVER_REPORT: //0x10b
275 case MM_MESSAGE_RTP_SESSION_STATUS: //0x10c
276 case MM_MESSAGE_SENDER_STATE: //0x10d
277 case MM_MESSAGE_RECEIVER_STATE: //0x10e
278 case MM_MESSAGE_FILE_NOT_SUPPORTED: //0x10f
279 case MM_MESSAGE_FILE_NOT_FOUND: //0x110
280 case MM_MESSAGE_DRM_NOT_AUTHORIZED: //0x111
281 case MM_MESSAGE_VIDEO_NOT_CAPTURED: //0x113
282 case MM_MESSAGE_SEEK_COMPLETED: //0x114
291 * Public Implementation
294 int player_create (player_h *player)
296 PLAYER_INSTANCE_CHECK(player);
298 handle = (player_s*)malloc( sizeof(player_s));
300 memset(handle, 0 , sizeof(player_s));
303 LOGE("[%s] PLAYER_ERROR_OUT_OF_MEMORY" ,__FUNCTION__,PLAYER_ERROR_OUT_OF_MEMORY);
304 return PLAYER_ERROR_OUT_OF_MEMORY;
306 int ret = mm_player_create(&handle->mm_handle);
307 if( ret != MM_ERROR_NONE)
309 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)" ,__FUNCTION__,PLAYER_ERROR_INVALID_OPERATION);
310 handle->state = PLAYER_STATE_NONE;
313 return PLAYER_ERROR_INVALID_OPERATION;
317 *player = (player_h)handle;
318 handle->state = PLAYER_STATE_IDLE;
319 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
320 return PLAYER_ERROR_NONE;
325 int player_destroy (player_h player)
327 PLAYER_INSTANCE_CHECK(player);
328 player_s * handle = (player_s *) player;
329 if (mm_player_destroy(handle->mm_handle)!= MM_ERROR_NONE)
331 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)" ,__FUNCTION__,PLAYER_ERROR_INVALID_OPERATION);
332 return PLAYER_ERROR_INVALID_OPERATION;
336 handle->state = PLAYER_STATE_NONE;
339 return PLAYER_ERROR_NONE;
343 int player_prepare (player_h player)
345 PLAYER_INSTANCE_CHECK(player);
346 player_s * handle = (player_s *) player;
347 PLAYER_STATE_CHECK(handle,PLAYER_STATE_IDLE);
350 ret = mm_player_set_message_callback(handle->mm_handle, _msg_callback, (void*)handle);
351 if(ret != MM_ERROR_NONE)
353 LOGW("[%s] Failed to set message callback function (0x%x)" ,__FUNCTION__, ret);
355 ret = mm_player_realize(handle->mm_handle);
356 if(ret != MM_ERROR_NONE)
358 return _convert_error_code(ret,(char*)__FUNCTION__);
362 handle->state = PLAYER_STATE_READY;
363 return PLAYER_ERROR_NONE;
367 int player_unprepare (player_h player)
369 PLAYER_INSTANCE_CHECK(player);
370 player_s * handle = (player_s *) player;
371 if (!_player_state_validate(handle, PLAYER_STATE_READY))
373 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d" ,__FUNCTION__,PLAYER_ERROR_INVALID_STATE, handle->state);
374 return PLAYER_ERROR_INVALID_STATE;
377 int ret = mm_player_unrealize(handle->mm_handle);
378 if(ret != MM_ERROR_NONE)
380 return _convert_error_code(ret,(char*)__FUNCTION__);
384 handle->state = PLAYER_STATE_IDLE;
385 return PLAYER_ERROR_NONE;
389 int player_set_uri (player_h player, const char *uri)
391 PLAYER_INSTANCE_CHECK(player);
392 PLAYER_NULL_ARG_CHECK(uri);
393 player_s * handle = (player_s *) player;
394 PLAYER_STATE_CHECK(handle,PLAYER_STATE_IDLE);
396 int ret = mm_player_set_attribute(handle->mm_handle, NULL,MM_PLAYER_CONTENT_URI , uri, strlen(uri), (char*)NULL);
397 if(ret != MM_ERROR_NONE)
399 return _convert_error_code(ret,(char*)__FUNCTION__);
402 return PLAYER_ERROR_NONE;
405 int player_set_memory_buffer (player_h player, const void *data, int size)
407 PLAYER_INSTANCE_CHECK(player);
408 PLAYER_NULL_ARG_CHECK(data);
409 PLAYER_CHECK_CONDITION(size>=0,PLAYER_ERROR_INVALID_PARAMETER,"PLAYER_ERROR_INVALID_PARAMETER" );
410 player_s * handle = (player_s *) player;
411 PLAYER_STATE_CHECK(handle,PLAYER_STATE_IDLE);
415 snprintf(uri, sizeof(uri),"mem:///ext=%s,size=%d","", size);
416 int ret = mm_player_set_attribute(handle->mm_handle, NULL,MM_PLAYER_CONTENT_URI, uri, strlen(uri), MM_PLAYER_MEMORY_SRC, data,size,(char*)NULL);
417 if(ret != MM_ERROR_NONE)
419 return _convert_error_code(ret,(char*)__FUNCTION__);
422 return PLAYER_ERROR_NONE;
425 int player_get_state (player_h player, player_state_e *state)
427 PLAYER_INSTANCE_CHECK(player);
428 PLAYER_NULL_ARG_CHECK(state);
429 player_s * handle = (player_s *) player;
430 MMPlayerStateType currentStat = MM_PLAYER_STATE_NULL;
431 int ret = mm_player_get_state(handle->mm_handle, ¤tStat);
432 if(ret != MM_ERROR_NONE)
434 *state = handle->state;
435 return _convert_error_code(ret,(char*)__FUNCTION__);
439 handle->state = _convert_player_state(currentStat);
440 *state = handle->state;
441 return PLAYER_ERROR_NONE;
445 int player_set_volume (player_h player, float left, float right)
447 PLAYER_INSTANCE_CHECK(player);
448 PLAYER_CHECK_CONDITION(left>=0 && left <= 1.0 ,PLAYER_ERROR_INVALID_PARAMETER,"PLAYER_ERROR_INVALID_PARAMETER" );
449 PLAYER_CHECK_CONDITION(right>=0 && right <= 1.0 ,PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER" );
450 player_s * handle = (player_s *) player;
451 MMPlayerVolumeType vol;
452 vol.level[MM_VOLUME_CHANNEL_LEFT] = left;
453 vol.level[MM_VOLUME_CHANNEL_RIGHT] = right;
454 int ret = mm_player_set_volume(handle->mm_handle,&vol);
455 if(ret != MM_ERROR_NONE)
457 return _convert_error_code(ret,(char*)__FUNCTION__);
461 return PLAYER_ERROR_NONE;
465 int player_get_volume (player_h player, float *left, float *right)
467 PLAYER_INSTANCE_CHECK(player);
468 PLAYER_NULL_ARG_CHECK(left);
469 PLAYER_NULL_ARG_CHECK(right);
470 player_s * handle = (player_s *) player;
471 MMPlayerVolumeType vol;
472 int ret = mm_player_get_volume(handle->mm_handle,&vol);
473 if(ret != MM_ERROR_NONE)
475 return _convert_error_code(ret,(char*)__FUNCTION__);
479 *left = vol.level[MM_VOLUME_CHANNEL_LEFT];
480 *right = vol.level[MM_VOLUME_CHANNEL_RIGHT];
481 return PLAYER_ERROR_NONE;
485 int player_set_sound_type(player_h player, sound_type_e type)
487 PLAYER_INSTANCE_CHECK(player);
488 player_s * handle = (player_s *) player;
490 int ret = mm_player_set_attribute(handle->mm_handle, NULL,"sound_volume_type" , type, (char*)NULL);
491 if(ret != MM_ERROR_NONE)
493 return _convert_error_code(ret,(char*)__FUNCTION__);
496 return PLAYER_ERROR_NONE;
499 int player_start (player_h player)
501 PLAYER_INSTANCE_CHECK(player);
502 player_s * handle = (player_s *) player;
504 if (handle->state == PLAYER_STATE_READY )
506 ret = mm_player_start(handle->mm_handle);
508 else if ( handle->state == PLAYER_STATE_PAUSED)
510 ret = mm_player_resume(handle->mm_handle);
514 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d" ,__FUNCTION__,PLAYER_ERROR_INVALID_STATE, handle->state);
515 return PLAYER_ERROR_INVALID_STATE;
518 if(ret != MM_ERROR_NONE)
520 return _convert_error_code(ret,(char*)__FUNCTION__);
524 handle->state = PLAYER_STATE_PLAYING;
525 return PLAYER_ERROR_NONE;
529 int player_stop (player_h player)
531 PLAYER_INSTANCE_CHECK(player);
532 player_s * handle = (player_s *) player;
533 if (handle->state == PLAYER_STATE_PLAYING || handle->state == PLAYER_STATE_PAUSED)
535 int ret = mm_player_stop(handle->mm_handle);
536 if(ret != MM_ERROR_NONE)
538 return _convert_error_code(ret,(char*)__FUNCTION__);
542 handle->state = PLAYER_STATE_READY;
543 return PLAYER_ERROR_NONE;
548 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
549 return PLAYER_ERROR_INVALID_STATE;
553 int player_pause (player_h player)
555 PLAYER_INSTANCE_CHECK(player);
556 player_s * handle = (player_s *) player;
557 PLAYER_STATE_CHECK(handle,PLAYER_STATE_PLAYING);
559 int ret = mm_player_pause(handle->mm_handle);
560 if(ret != MM_ERROR_NONE)
562 return _convert_error_code(ret,(char*)__FUNCTION__);
566 handle->state = PLAYER_STATE_PAUSED;
567 return PLAYER_ERROR_NONE;
571 int player_set_position (player_h player, int millisecond)
573 PLAYER_INSTANCE_CHECK(player);
574 PLAYER_CHECK_CONDITION(millisecond>=0 ,PLAYER_ERROR_INVALID_PARAMETER ,"PLAYER_ERROR_INVALID_PARAMETER" );
575 player_s * handle = (player_s *) player;
577 int ret = mm_player_set_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, millisecond);
578 if(ret != MM_ERROR_NONE)
580 return _convert_error_code(ret,(char*)__FUNCTION__);
584 return PLAYER_ERROR_NONE;
589 int player_set_position_ratio (player_h player, int percent)
591 PLAYER_INSTANCE_CHECK(player);
592 PLAYER_CHECK_CONDITION(percent>=0 && percent <= 100 ,PLAYER_ERROR_INVALID_PARAMETER ,"PLAYER_ERROR_INVALID_PARAMETER" );
593 player_s * handle = (player_s *) player;
595 int ret = mm_player_set_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_PERCENT , percent);
596 if(ret != MM_ERROR_NONE)
598 return _convert_error_code(ret,(char*)__FUNCTION__);
602 return PLAYER_ERROR_NONE;
607 int player_get_position (player_h player, int *millisecond)
609 PLAYER_INSTANCE_CHECK(player);
610 PLAYER_NULL_ARG_CHECK(millisecond);
611 player_s * handle = (player_s *) player;
612 if (!_player_state_validate(handle, PLAYER_STATE_READY))
614 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
615 return PLAYER_ERROR_INVALID_STATE;
618 int ret = mm_player_get_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME , &pos);
619 if(ret != MM_ERROR_NONE)
621 return _convert_error_code(ret,(char*)__FUNCTION__);
626 return PLAYER_ERROR_NONE;
630 int player_get_position_ratio (player_h player,int *percent)
632 PLAYER_INSTANCE_CHECK(player);
633 PLAYER_NULL_ARG_CHECK(percent);
634 player_s * handle = (player_s *) player;
635 if (!_player_state_validate(handle, PLAYER_STATE_READY))
637 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
638 return PLAYER_ERROR_INVALID_STATE;
641 int ret = mm_player_get_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_PERCENT, &pos);
642 if(ret != MM_ERROR_NONE)
644 return _convert_error_code(ret,(char*)__FUNCTION__);
649 return PLAYER_ERROR_NONE;
653 int player_set_mute (player_h player, bool muted)
655 PLAYER_INSTANCE_CHECK(player);
656 player_s * handle = (player_s *) player;
658 int ret = mm_player_set_mute(handle->mm_handle, muted);
659 if(ret != MM_ERROR_NONE)
661 return _convert_error_code(ret,(char*)__FUNCTION__);
665 return PLAYER_ERROR_NONE;
669 int player_is_muted (player_h player, bool *muted)
671 PLAYER_INSTANCE_CHECK(player);
672 PLAYER_NULL_ARG_CHECK(muted);
673 player_s * handle = (player_s *) player;
676 int ret = mm_player_get_mute(handle->mm_handle, &_mute);
677 if(ret != MM_ERROR_NONE)
679 return _convert_error_code(ret,(char*)__FUNCTION__);
691 return PLAYER_ERROR_NONE;
695 int player_set_looping (player_h player, bool looping)
697 PLAYER_INSTANCE_CHECK(player);
698 player_s * handle = (player_s *) player;
699 if (!_player_state_validate(handle, PLAYER_STATE_IDLE))
701 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
702 return PLAYER_ERROR_INVALID_STATE;
710 int ret = mm_player_set_attribute(handle->mm_handle, NULL,MM_PLAYER_PLAYBACK_COUNT , value, (char*)NULL);
712 if(ret != MM_ERROR_NONE)
714 return _convert_error_code(ret,(char*)__FUNCTION__);
718 return PLAYER_ERROR_NONE;
722 int player_is_looping (player_h player, bool *looping)
724 PLAYER_INSTANCE_CHECK(player);
725 PLAYER_NULL_ARG_CHECK(looping);
726 player_s * handle = (player_s *) player;
727 if (!_player_state_validate(handle, PLAYER_STATE_IDLE))
729 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
730 return PLAYER_ERROR_INVALID_STATE;
733 int ret = mm_player_get_attribute(handle->mm_handle, NULL,MM_PLAYER_PLAYBACK_COUNT , &count, (char*)NULL);
734 if(ret != MM_ERROR_NONE)
736 return _convert_error_code(ret,(char*)__FUNCTION__);
748 return PLAYER_ERROR_NONE;
752 int player_get_duration (player_h player, int *duration)
754 PLAYER_INSTANCE_CHECK(player);
755 PLAYER_NULL_ARG_CHECK(duration);
756 player_s * handle = (player_s *) player;
757 if (!_player_state_validate(handle, PLAYER_STATE_PLAYING))
759 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
760 return PLAYER_ERROR_INVALID_STATE;
763 int ret = mm_player_get_attribute(handle->mm_handle, NULL,MM_PLAYER_CONTENT_DURATION, &_duration, (char*)NULL);
764 if(ret != MM_ERROR_NONE)
766 return _convert_error_code(ret,(char*)__FUNCTION__);
770 *duration = _duration;
771 return PLAYER_ERROR_NONE;
775 int player_set_display(player_h player, player_display_type_e type, player_display_h display)
777 PLAYER_INSTANCE_CHECK(player);
778 player_s * handle = (player_s *) player;
779 PLAYER_STATE_CHECK(handle,PLAYER_STATE_IDLE);
781 handle->display_handle = display;
782 handle->display_type = type;
783 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", type, "display_overlay" , type == PLAYER_DISPLAY_TYPE_X11 ? &handle->display_handle : display, sizeof(display), (char*)NULL);
784 if(ret != MM_ERROR_NONE)
786 return _convert_error_code(ret,(char*)__FUNCTION__);
789 return PLAYER_ERROR_NONE;
792 int player_set_x11_display_rotation(player_h player, player_display_rotation_e rotation)
794 PLAYER_INSTANCE_CHECK(player);
795 player_s * handle = (player_s *) player;
797 int ret = mm_player_set_attribute(handle->mm_handle, NULL,MM_PLAYER_VIDEO_ROTATION , rotation, (char*)NULL);
798 if(ret != MM_ERROR_NONE)
800 return _convert_error_code(ret,(char*)__FUNCTION__);
803 return PLAYER_ERROR_NONE;
806 int player_get_x11_display_rotation( player_h player, player_display_rotation_e *rotation)
808 PLAYER_INSTANCE_CHECK(player);
809 PLAYER_NULL_ARG_CHECK(rotation);
810 player_s * handle = (player_s *) player;
811 int ret = mm_player_get_attribute(handle->mm_handle, NULL,MM_PLAYER_VIDEO_ROTATION ,rotation, (char*)NULL);
812 if(ret != MM_ERROR_NONE)
814 return _convert_error_code(ret,(char*)__FUNCTION__);
818 return PLAYER_ERROR_NONE;
822 int player_set_x11_display_visible(player_h player, bool visible)
824 PLAYER_INSTANCE_CHECK(player);
825 player_s * handle = (player_s *) player;
833 int ret = mm_player_set_attribute(handle->mm_handle, NULL,"display_visible" , value, (char*)NULL);
834 if(ret != MM_ERROR_NONE)
836 return _convert_error_code(ret,(char*)__FUNCTION__);
839 return PLAYER_ERROR_NONE;
842 int player_is_x11_display_visible(player_h player, bool* visible)
844 PLAYER_INSTANCE_CHECK(player);
845 PLAYER_NULL_ARG_CHECK(visible);
846 player_s * handle = (player_s *) player;
848 int ret = mm_player_get_attribute(handle->mm_handle, NULL,"display_visible" ,&count, (char*)NULL);
849 if(ret != MM_ERROR_NONE)
851 return _convert_error_code(ret,(char*)__FUNCTION__);
864 return PLAYER_ERROR_NONE;
869 int player_set_x11_display_mode(player_h player, player_display_mode_e mode)
871 PLAYER_INSTANCE_CHECK(player);
872 player_s * handle = (player_s *) player;
874 int ret = mm_player_set_attribute(handle->mm_handle, NULL,"display_method" , mode, (char*)NULL);
875 if(ret != MM_ERROR_NONE)
877 return _convert_error_code(ret,(char*)__FUNCTION__);
880 return PLAYER_ERROR_NONE;
883 int player_get_x11_display_mode(player_h player, player_display_mode_e *mode)
885 PLAYER_INSTANCE_CHECK(player);
886 PLAYER_NULL_ARG_CHECK(mode);
887 player_s * handle = (player_s *) player;
888 int ret = mm_player_get_attribute(handle->mm_handle, NULL,"display_method" ,mode, (char*)NULL);
889 if(ret != MM_ERROR_NONE)
891 return _convert_error_code(ret,(char*)__FUNCTION__);
895 return PLAYER_ERROR_NONE;
899 int player_get_video_size (player_h player, int *width, int *height)
901 PLAYER_INSTANCE_CHECK(player);
902 PLAYER_NULL_ARG_CHECK(width);
903 PLAYER_NULL_ARG_CHECK(height);
904 player_s * handle = (player_s *) player;
905 if (!_player_state_validate(handle, PLAYER_STATE_READY))
907 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
908 return PLAYER_ERROR_INVALID_STATE;
912 int ret = mm_player_get_attribute(handle->mm_handle, NULL,MM_PLAYER_VIDEO_WIDTH ,&w, MM_PLAYER_VIDEO_HEIGHT, &h, (char*)NULL);
913 if(ret != MM_ERROR_NONE)
915 return _convert_error_code(ret,(char*)__FUNCTION__);
921 return PLAYER_ERROR_NONE;
925 int player_set_subtitle_path(player_h player, char* path)
927 PLAYER_INSTANCE_CHECK(player);
928 PLAYER_NULL_ARG_CHECK(path);
929 player_s * handle = (player_s *) player;
930 PLAYER_STATE_CHECK(handle,PLAYER_STATE_IDLE);
932 int ret = mm_player_set_attribute(handle->mm_handle, NULL,"subtitle_uri" , path, strlen(path),"subtitle_silent", 0, (char*)NULL);
933 if(ret != MM_ERROR_NONE)
935 return _convert_error_code(ret,(char*)__FUNCTION__);
938 return PLAYER_ERROR_NONE;
941 int player_capture_video(player_h player, player_video_captured_cb callback, void *user_data)
943 int ret =_set_callback(_PLAYER_EVENT_TYPE_CAPTURE,player,callback,user_data);
944 if(ret != PLAYER_ERROR_NONE)
947 player_s * handle = (player_s *) player;
948 if(handle->state == PLAYER_STATE_PAUSED || handle->state == PLAYER_STATE_PLAYING )
950 ret = mm_player_do_video_capture(handle->mm_handle);
951 if(ret != MM_ERROR_NONE)
953 return _convert_error_code(ret,(char*)__FUNCTION__);
956 return PLAYER_ERROR_NONE;
960 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (current state : %d)" ,__FUNCTION__, handle->state);
961 return PLAYER_ERROR_INVALID_STATE;
965 int player_set_started_cb (player_h player, player_started_cb callback, void *user_data)
967 return _set_callback(_PLAYER_EVENT_TYPE_BEGIN,player,callback,user_data);
970 int player_unset_started_cb (player_h player)
972 return _unset_callback(_PLAYER_EVENT_TYPE_BEGIN,player);
975 int player_set_completed_cb (player_h player, player_completed_cb callback, void *user_data)
977 return _set_callback(_PLAYER_EVENT_TYPE_COMPLETE,player,callback,user_data);
980 int player_unset_completed_cb (player_h player)
982 return _unset_callback(_PLAYER_EVENT_TYPE_COMPLETE,player);
985 int player_set_paused_cb (player_h player, player_paused_cb callback, void *user_data)
987 return _set_callback(_PLAYER_EVENT_TYPE_PAUSE,player,callback,user_data);
990 int player_unset_paused_cb (player_h player)
992 return _unset_callback(_PLAYER_EVENT_TYPE_PAUSE,player);
995 int player_set_interrupted_cb (player_h player, player_interrupted_cb callback, void *user_data)
997 return _set_callback(_PLAYER_EVENT_TYPE_INTERRUPT,player,callback,user_data);
1000 int player_unset_interrupted_cb (player_h player)
1002 return _unset_callback(_PLAYER_EVENT_TYPE_INTERRUPT,player);
1005 int player_set_error_cb (player_h player, player_error_cb callback, void *user_data)
1007 return _set_callback(_PLAYER_EVENT_TYPE_ERROR,player,callback,user_data);
1010 int player_unset_error_cb (player_h player)
1012 return _unset_callback(_PLAYER_EVENT_TYPE_ERROR,player);
1015 int player_set_buffering_cb (player_h player, player_buffering_cb callback, void *user_data)
1017 return _set_callback(_PLAYER_EVENT_TYPE_BUFFERING,player,callback,user_data);
1020 int player_unset_buffering_cb (player_h player)
1022 return _unset_callback(_PLAYER_EVENT_TYPE_BUFFERING,player);
1026 int player_set_subtilte_updated_cb(player_h player, player_subtitle_updated_cb callback, void* user_data )
1028 return _set_callback(_PLAYER_EVENT_TYPE_SUBTITLE,player,callback,user_data);
1031 int player_unset_subtilte_updated_cb (player_h player)
1033 return _unset_callback(_PLAYER_EVENT_TYPE_SUBTITLE,player);