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_audioeffect.h>
23 #include <mm_player_internal.h>
25 #include <sound_manager.h>
26 #include <sound_manager_internal.h>
30 #include <Elementary.h>
32 #include <Ecore_Wayland.h>
33 #include <tbm_bufmgr.h>
34 #include <tbm_surface_internal.h>
36 #ifdef TIZEN_FEATURE_ASM
37 #include <mm_session.h>
38 #include <mm_session_private.h>
40 #include "muse_player.h"
41 #include "legacy_player.h"
42 #include "legacy_player_private.h"
44 //#define VIDEO_MEDIA_PACKET_DUMP
45 #define __JOB_KEY_PREPARED "prepared"
46 #define __JOB_KEY_ERROR "error"
47 #define __JOB_KEY_SEEK_DONE "seek_done"
48 #define __JOB_KEY_EOS "eos"
50 #define __RELEASEIF_PREPARE_THREAD(thread_id) \
53 pthread_join(thread_id, NULL); \
55 LOGI("prepare thread released\n"); \
59 #ifndef USE_ECORE_FUNCTIONS
60 #define __RELEASEIF_MESSAGE_THREAD(thread_id) \
63 pthread_join(thread_id, NULL); \
65 LOGI("message thread released\n"); \
70 #ifdef USE_ECORE_FUNCTIONS
71 #define __DELETE_ECORE_ITEM(ecore_job) \
74 ecore_job_del(ecore_job); \
79 #define __ADD_ECORE_JOB(handle, key, job_callback) \
81 Ecore_Job *job = NULL; \
82 job = ecore_job_add(job_callback, (void *)handle); \
83 LOGI("adding %s job - %p\n", key, job); \
84 g_hash_table_insert(handle->ecore_jobs, g_strdup(key), job); \
87 #define __REMOVE_ECORE_JOB(handle, job_key) \
89 LOGI("%s done so, remove\n", job_key); \
90 g_hash_table_remove(handle->ecore_jobs, job_key); \
91 handle->is_doing_jobs = FALSE; \
94 #define __GET_MESSAGE(handle) \
96 if (handle && handle->message_queue) { \
97 g_mutex_lock(&handle->message_queue_lock); \
98 if (g_queue_is_empty(handle->message_queue)) { \
99 g_cond_wait(&handle->message_queue_cond, &handle->message_queue_lock); \
101 handle->current_message = (int)(intptr_t)g_queue_pop_head(handle->message_queue); \
102 g_mutex_unlock(&handle->message_queue_lock); \
103 LOGI("Retrieved message [%d] from queue", handle->current_message); \
105 LOGI("Failed to retrive message from queue"); \
106 handle->current_message = PLAYER_MESSAGE_NONE; \
110 #define __ADD_MESSAGE(handle, message) \
112 if (handle && handle->message_queue) { \
113 g_mutex_lock(&handle->message_queue_lock); \
114 if (message == PLAYER_MESSAGE_LOOP_EXIT) \
115 g_queue_clear(handle->message_queue); \
116 g_queue_push_tail(handle->message_queue, (gpointer)message); \
117 g_cond_signal(&handle->message_queue_cond); \
118 g_mutex_unlock(&handle->message_queue_lock); \
119 LOGI("Adding message [%d] to queue", message); \
121 LOGI("Failed to add message [%d] to queue", message); \
127 * Internal Implementation
129 int __player_convert_error_code(int code, char *func_name)
131 int ret = PLAYER_ERROR_INVALID_OPERATION;
132 char *msg = "PLAYER_ERROR_INVALID_OPERATION";
135 case MM_ERROR_PLAYER_AUDIO_CODEC_NOT_FOUND:
136 case MM_ERROR_PLAYER_VIDEO_CODEC_NOT_FOUND:
137 ret = PLAYER_ERROR_NONE;
138 msg = "PLAYER_ERROR_NONE";
140 case MM_ERROR_INVALID_ARGUMENT:
141 ret = PLAYER_ERROR_INVALID_PARAMETER;
142 msg = "PLAYER_ERROR_INVALID_PARAMETER";
144 case MM_ERROR_PLAYER_CODEC_NOT_FOUND:
145 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_AUDIO:
146 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_VIDEO:
147 case MM_ERROR_PLAYER_STREAMING_UNSUPPORTED_MEDIA_TYPE:
148 case MM_ERROR_PLAYER_NOT_SUPPORTED_FORMAT:
149 ret = PLAYER_ERROR_NOT_SUPPORTED_FILE;
150 msg = "PLAYER_ERROR_NOT_SUPPORTED_FILE";
152 case MM_ERROR_PLAYER_INVALID_STATE:
153 case MM_ERROR_PLAYER_NOT_INITIALIZED:
154 ret = PLAYER_ERROR_INVALID_STATE;
155 msg = "PLAYER_ERROR_INVALID_STATE";
157 case MM_ERROR_PLAYER_INTERNAL:
158 case MM_ERROR_PLAYER_INVALID_STREAM:
159 case MM_ERROR_PLAYER_STREAMING_FAIL:
160 case MM_ERROR_PLAYER_NO_OP:
161 ret = PLAYER_ERROR_INVALID_OPERATION;
162 msg = "PLAYER_ERROR_INVALID_OPERATION";
164 case MM_ERROR_PLAYER_SOUND_EFFECT_INVALID_STATUS:
165 case MM_ERROR_NOT_SUPPORT_API:
166 case MM_ERROR_PLAYER_SOUND_EFFECT_NOT_SUPPORTED_FILTER:
167 ret = PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE;
168 msg = "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE";
170 case MM_ERROR_PLAYER_NO_FREE_SPACE:
171 ret = PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE;
172 msg = "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE";
174 case MM_ERROR_PLAYER_FILE_NOT_FOUND:
175 ret = PLAYER_ERROR_NO_SUCH_FILE;
176 msg = "PLAYER_ERROR_NO_SUCH_FILE";
178 case MM_ERROR_PLAYER_SEEK:
179 ret = PLAYER_ERROR_SEEK_FAILED;
180 msg = "PLAYER_ERROR_SEEK_FAILED";
182 case MM_ERROR_PLAYER_INVALID_URI:
183 case MM_ERROR_PLAYER_STREAMING_INVALID_URL:
184 ret = PLAYER_ERROR_INVALID_URI;
185 msg = "PLAYER_ERROR_INVALID_URI";
187 case MM_ERROR_PLAYER_STREAMING_CONNECTION_FAIL:
188 case MM_ERROR_PLAYER_STREAMING_DNS_FAIL:
189 case MM_ERROR_PLAYER_STREAMING_SERVER_DISCONNECTED:
190 case MM_ERROR_PLAYER_STREAMING_INVALID_PROTOCOL:
191 case MM_ERROR_PLAYER_STREAMING_UNEXPECTED_MSG:
192 case MM_ERROR_PLAYER_STREAMING_OUT_OF_MEMORIES:
193 case MM_ERROR_PLAYER_STREAMING_RTSP_TIMEOUT:
194 case MM_ERROR_PLAYER_STREAMING_BAD_REQUEST:
195 case MM_ERROR_PLAYER_STREAMING_NOT_AUTHORIZED:
196 case MM_ERROR_PLAYER_STREAMING_PAYMENT_REQUIRED:
197 case MM_ERROR_PLAYER_STREAMING_FORBIDDEN:
198 case MM_ERROR_PLAYER_STREAMING_CONTENT_NOT_FOUND:
199 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_ALLOWED:
200 case MM_ERROR_PLAYER_STREAMING_NOT_ACCEPTABLE:
201 case MM_ERROR_PLAYER_STREAMING_PROXY_AUTHENTICATION_REQUIRED:
202 case MM_ERROR_PLAYER_STREAMING_SERVER_TIMEOUT:
203 case MM_ERROR_PLAYER_STREAMING_GONE:
204 case MM_ERROR_PLAYER_STREAMING_LENGTH_REQUIRED:
205 case MM_ERROR_PLAYER_STREAMING_PRECONDITION_FAILED:
206 case MM_ERROR_PLAYER_STREAMING_REQUEST_ENTITY_TOO_LARGE:
207 case MM_ERROR_PLAYER_STREAMING_REQUEST_URI_TOO_LARGE:
208 case MM_ERROR_PLAYER_STREAMING_PARAMETER_NOT_UNDERSTOOD:
209 case MM_ERROR_PLAYER_STREAMING_CONFERENCE_NOT_FOUND:
210 case MM_ERROR_PLAYER_STREAMING_NOT_ENOUGH_BANDWIDTH:
211 case MM_ERROR_PLAYER_STREAMING_NO_SESSION_ID:
212 case MM_ERROR_PLAYER_STREAMING_METHOD_NOT_VALID_IN_THIS_STATE:
213 case MM_ERROR_PLAYER_STREAMING_HEADER_FIELD_NOT_VALID_FOR_SOURCE:
214 case MM_ERROR_PLAYER_STREAMING_INVALID_RANGE:
215 case MM_ERROR_PLAYER_STREAMING_PARAMETER_IS_READONLY:
216 case MM_ERROR_PLAYER_STREAMING_AGGREGATE_OP_NOT_ALLOWED:
217 case MM_ERROR_PLAYER_STREAMING_ONLY_AGGREGATE_OP_ALLOWED:
218 case MM_ERROR_PLAYER_STREAMING_BAD_TRANSPORT:
219 case MM_ERROR_PLAYER_STREAMING_DESTINATION_UNREACHABLE:
220 case MM_ERROR_PLAYER_STREAMING_INTERNAL_SERVER_ERROR:
221 case MM_ERROR_PLAYER_STREAMING_NOT_IMPLEMENTED:
222 case MM_ERROR_PLAYER_STREAMING_BAD_GATEWAY:
223 case MM_ERROR_PLAYER_STREAMING_SERVICE_UNAVAILABLE:
224 case MM_ERROR_PLAYER_STREAMING_GATEWAY_TIME_OUT:
225 case MM_ERROR_PLAYER_STREAMING_OPTION_NOT_SUPPORTED:
226 ret = PLAYER_ERROR_CONNECTION_FAILED;
227 msg = "PLAYER_ERROR_CONNECTION_FAILED";
229 case MM_ERROR_POLICY_BLOCKED:
230 case MM_ERROR_POLICY_INTERRUPTED:
231 case MM_ERROR_POLICY_INTERNAL:
232 case MM_ERROR_POLICY_DUPLICATED:
233 ret = PLAYER_ERROR_SOUND_POLICY;
234 msg = "PLAYER_ERROR_SOUND_POLICY";
236 case MM_ERROR_PLAYER_DRM_EXPIRED:
237 ret = PLAYER_ERROR_DRM_EXPIRED;
238 msg = "PLAYER_ERROR_DRM_EXPIRED";
240 case MM_ERROR_PLAYER_DRM_NOT_AUTHORIZED:
241 case MM_ERROR_PLAYER_DRM_NO_LICENSE:
242 ret = PLAYER_ERROR_DRM_NO_LICENSE;
243 msg = "PLAYER_ERROR_DRM_NO_LICENSE";
245 case MM_ERROR_PLAYER_DRM_FUTURE_USE:
246 ret = PLAYER_ERROR_DRM_FUTURE_USE;
247 msg = "PLAYER_ERROR_DRM_FUTURE_USE";
249 case MM_ERROR_PLAYER_DRM_OUTPUT_PROTECTION:
250 ret = PLAYER_ERROR_DRM_NOT_PERMITTED;
251 msg = "PLAYER_ERROR_DRM_NOT_PERMITTED";
253 case MM_ERROR_PLAYER_RESOURCE_LIMIT:
254 ret = PLAYER_ERROR_RESOURCE_LIMIT;
255 msg = "PLAYER_ERROR_RESOURCE_LIMIT";
257 case MM_ERROR_PLAYER_PERMISSION_DENIED:
258 ret = PLAYER_ERROR_PERMISSION_DENIED;
259 msg = "PLAYER_ERROR_PERMISSION_DENIED";
261 case MM_ERROR_PLAYER_BUFFER_SPACE:
262 ret = PLAYER_ERROR_BUFFER_SPACE;
263 msg = "PLAYER_ERROR_BUFFER_SPACE";
268 LOGE("[%s] %s(0x%08x) : core fw error(0x%x)", func_name, msg, ret, code);
272 int _player_get_tbm_surface_format(int in_format, uint32_t *out_format)
274 if (in_format <= MM_PIXEL_FORMAT_INVALID || in_format >= MM_PIXEL_FORMAT_NUM || out_format == NULL) {
275 LOGE("INVALID_PARAMETER : in_format %d, out_format ptr %p", in_format, out_format);
276 return PLAYER_ERROR_INVALID_PARAMETER;
280 case MM_PIXEL_FORMAT_NV12:
281 *out_format = TBM_FORMAT_NV12;
283 case MM_PIXEL_FORMAT_NV12T:
284 *out_format = TBM_FORMAT_NV12MT;
286 case MM_PIXEL_FORMAT_NV16:
287 *out_format = TBM_FORMAT_NV16;
289 case MM_PIXEL_FORMAT_NV21:
290 *out_format = TBM_FORMAT_NV21;
292 case MM_PIXEL_FORMAT_YUYV:
293 *out_format = TBM_FORMAT_YUYV;
295 case MM_PIXEL_FORMAT_UYVY:
296 case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
297 *out_format = TBM_FORMAT_UYVY;
299 case MM_PIXEL_FORMAT_422P:
300 *out_format = TBM_FORMAT_YUV422;
302 case MM_PIXEL_FORMAT_I420:
303 *out_format = TBM_FORMAT_YUV420;
305 case MM_PIXEL_FORMAT_YV12:
306 *out_format = TBM_FORMAT_YVU420;
308 case MM_PIXEL_FORMAT_RGB565:
309 *out_format = TBM_FORMAT_RGB565;
311 case MM_PIXEL_FORMAT_RGB888:
312 *out_format = TBM_FORMAT_RGB888;
314 case MM_PIXEL_FORMAT_RGBA:
315 *out_format = TBM_FORMAT_ARGB8888;
317 case MM_PIXEL_FORMAT_ARGB:
318 *out_format = TBM_FORMAT_ARGB8888;
321 LOGE("invalid in_format %d", in_format);
322 return PLAYER_ERROR_INVALID_PARAMETER;
325 return PLAYER_ERROR_NONE;
328 int _player_get_media_packet_mimetype(int in_format, media_format_mimetype_e *mimetype)
330 if (in_format <= MM_PIXEL_FORMAT_INVALID || in_format >= MM_PIXEL_FORMAT_NUM || mimetype == NULL) {
331 LOGE("INVALID_PARAMETER : in_format %d, mimetype ptr %p", in_format, mimetype);
332 return PLAYER_ERROR_INVALID_PARAMETER;
336 case MM_PIXEL_FORMAT_NV12:
337 *mimetype = MEDIA_FORMAT_NV12;
339 case MM_PIXEL_FORMAT_NV12T:
340 *mimetype = MEDIA_FORMAT_NV12T;
342 case MM_PIXEL_FORMAT_NV16:
343 *mimetype = MEDIA_FORMAT_NV16;
345 case MM_PIXEL_FORMAT_NV21:
346 *mimetype = MEDIA_FORMAT_NV21;
348 case MM_PIXEL_FORMAT_YUYV:
349 *mimetype = MEDIA_FORMAT_YUYV;
351 case MM_PIXEL_FORMAT_UYVY:
352 case MM_PIXEL_FORMAT_ITLV_JPEG_UYVY:
353 *mimetype = MEDIA_FORMAT_UYVY;
355 case MM_PIXEL_FORMAT_422P:
356 *mimetype = MEDIA_FORMAT_422P;
358 case MM_PIXEL_FORMAT_I420:
359 *mimetype = MEDIA_FORMAT_I420;
361 case MM_PIXEL_FORMAT_YV12:
362 *mimetype = MEDIA_FORMAT_YV12;
364 case MM_PIXEL_FORMAT_RGB565:
365 *mimetype = MEDIA_FORMAT_RGB565;
367 case MM_PIXEL_FORMAT_RGB888:
368 *mimetype = MEDIA_FORMAT_RGB888;
370 case MM_PIXEL_FORMAT_RGBA:
371 *mimetype = MEDIA_FORMAT_RGBA;
373 case MM_PIXEL_FORMAT_ARGB:
374 *mimetype = MEDIA_FORMAT_ARGB;
377 LOGE("invalid in_format %d", in_format);
378 return PLAYER_ERROR_INVALID_PARAMETER;
381 return PLAYER_ERROR_NONE;
384 int _player_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
387 void *internal_buffer = NULL;
388 tbm_surface_h tsurf = NULL;
389 player_s *handle = NULL;
391 if (pkt == NULL || user_data == NULL) {
392 LOGE("invalid parameter buffer %p, user_data %p", pkt, user_data);
393 return MEDIA_PACKET_FINALIZE;
396 handle = (player_s *)user_data;
398 ret = media_packet_get_extra(pkt, &internal_buffer);
399 if (ret != MEDIA_PACKET_ERROR_NONE) {
400 LOGE("media_packet_get_extra failed 0x%x", ret);
401 return MEDIA_PACKET_FINALIZE;
404 /* LOGD("pointer gst buffer %p, ret 0x%x", internal_buffer, ret); */
405 mm_player_media_packet_video_stream_internal_buffer_unref(internal_buffer);
407 ret = media_packet_get_tbm_surface(pkt, &tsurf);
408 if (ret != MEDIA_PACKET_ERROR_NONE) {
409 LOGE("media_packet_get_tbm_surface failed 0x%x", ret);
410 return MEDIA_PACKET_FINALIZE;
414 if (tbm_surface_get_format(tsurf) == TBM_FORMAT_YUV420 ||
415 tbm_surface_get_format(tsurf) == TBM_FORMAT_ARGB8888) {
416 #define NUM_OF_SW_CODEC_BO 1
420 bo_num = tbm_surface_internal_get_num_bos(tsurf);
421 if (bo_num == NUM_OF_SW_CODEC_BO) {
422 bo = tbm_surface_internal_get_bo(tsurf, 0);
424 mm_player_release_video_stream_bo(handle->mm_handle, bo);
430 tbm_surface_destroy(tsurf);
434 return MEDIA_PACKET_FINALIZE;
437 static player_interrupted_code_e __convert_interrupted_code(int code)
439 player_interrupted_code_e ret = PLAYER_INTERRUPTED_BY_RESOURCE_CONFLICT;
441 case MM_PLAYER_FOCUS_CHANGED_COMPLETED:
442 ret = PLAYER_INTERRUPTED_COMPLETED;
444 case MM_PLAYER_FOCUS_CHANGED_BY_MEDIA:
445 case MM_PLAYER_FOCUS_CHANGED_BY_UNKNOWN:
446 ret = PLAYER_INTERRUPTED_BY_MEDIA;
448 case MM_PLAYER_FOCUS_CHANGED_BY_CALL:
449 ret = PLAYER_INTERRUPTED_BY_CALL;
451 case MM_PLAYER_FOCUS_CHANGED_BY_EARJACK_UNPLUG:
452 ret = PLAYER_INTERRUPTED_BY_EARJACK_UNPLUG;
454 case MM_PLAYER_FOCUS_CHANGED_BY_ALARM:
455 ret = PLAYER_INTERRUPTED_BY_ALARM;
457 case MM_PLAYER_FOCUS_CHANGED_BY_NOTIFICATION:
458 ret = PLAYER_INTERRUPTED_BY_NOTIFICATION;
460 case MM_PLAYER_FOCUS_CHANGED_BY_EMERGENCY:
461 ret = PLAYER_INTERRUPTED_BY_EMERGENCY;
463 case MM_PLAYER_FOCUS_CHANGED_BY_RESOURCE_CONFLICT:
465 ret = PLAYER_INTERRUPTED_BY_RESOURCE_CONFLICT;
468 LOGE("[%s] interrupted code(%d) => ret(%d)", __FUNCTION__, code, ret);
472 static player_state_e __convert_player_state(MMPlayerStateType state)
474 if (state == MM_PLAYER_STATE_NONE)
475 return PLAYER_STATE_NONE;
480 bool __player_state_validate(player_s *handle, player_state_e threshold)
482 if (handle->state < threshold)
487 static int __set_callback(muse_player_event_e type, player_h player, void *callback, void *user_data)
489 PLAYER_INSTANCE_CHECK(player);
490 PLAYER_NULL_ARG_CHECK(callback);
492 player_s *handle = (player_s *)player;
493 handle->user_cb[type] = callback;
494 handle->user_data[type] = user_data;
495 LOGI("[%s] Event type : %d ", __FUNCTION__, type);
496 return PLAYER_ERROR_NONE;
499 static int __unset_callback(muse_player_event_e type, player_h player)
501 PLAYER_INSTANCE_CHECK(player);
502 player_s *handle = (player_s *)player;
503 handle->user_cb[type] = NULL;
504 handle->user_data[type] = NULL;
505 LOGI("[%s] Event type : %d ", __FUNCTION__, type);
506 return PLAYER_ERROR_NONE;
509 #ifdef USE_ECORE_FUNCTIONS
510 static void __job_prepared_cb(void *user_data)
512 player_s *handle = (player_s *)user_data;
514 handle->is_doing_jobs = TRUE;
515 handle->state = PLAYER_STATE_READY;
516 ((player_prepared_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
517 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
518 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
519 __REMOVE_ECORE_JOB(handle, __JOB_KEY_PREPARED);
523 static void __job_error_cb(void *user_data)
525 player_s *handle = (player_s *)user_data;
527 handle->is_doing_jobs = TRUE;
528 ((player_error_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])(handle->error_code, handle->user_data[MUSE_PLAYER_EVENT_TYPE_ERROR]);
529 __REMOVE_ECORE_JOB(handle, __JOB_KEY_ERROR);
533 static void __job_seek_done_cb(void *user_data)
535 player_s *handle = (player_s *)user_data;
537 handle->is_doing_jobs = TRUE;
538 ((player_seek_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK]);
539 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
540 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
541 __REMOVE_ECORE_JOB(handle, __JOB_KEY_SEEK_DONE);
545 static void __job_eos_cb(void *user_data)
547 player_s *handle = (player_s *)user_data;
549 handle->is_doing_jobs = TRUE;
550 ((player_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_COMPLETE]);
551 __REMOVE_ECORE_JOB(handle, __JOB_KEY_EOS);
555 static void __message_cb_loop(void *data)
558 player_s *handle = (player_s *)data;
560 LOGE("null handle in __message_cb_loop");
564 __GET_MESSAGE(handle);
565 switch (handle->current_message) {
566 case PLAYER_MESSAGE_NONE:
568 LOGW("PLAYER_MESSAGE_NONE");
572 case PLAYER_MESSAGE_PREPARED:
574 LOGW("PLAYER_MESSAGE_PREPARED");
575 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
576 handle->state = PLAYER_STATE_READY;
577 ((player_prepared_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE]);
578 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
579 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
581 LOGE("null handle in PLAYER_MESSAGE_PREPARED");
585 case PLAYER_MESSAGE_ERROR:
587 LOGW("PLAYER_MESSAGE_ERROR");
588 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])
589 ((player_error_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])(handle->error_code, handle->user_data[MUSE_PLAYER_EVENT_TYPE_ERROR]);
591 LOGE("null handle in PLAYER_MESSAGE_ERROR");
594 case PLAYER_MESSAGE_SEEK_DONE:
596 LOGW("PLAYER_MESSAGE_SEEK_DONE");
597 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
598 ((player_seek_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK]);
599 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
600 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
602 LOGE("null handle in PLAYER_MESSAGE_SEEK_DONE");
606 case PLAYER_MESSAGE_EOS:
608 LOGW("PLAYER_MESSAGE_EOS");
609 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE])
610 ((player_completed_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE])(handle->user_data[MUSE_PLAYER_EVENT_TYPE_COMPLETE]);
612 LOGE("null handle in PLAYER_MESSAGE_EOS");
615 case PLAYER_MESSAGE_LOOP_EXIT:
617 LOGW("PLAYER_MESSAGE_LOOP_EXIT");
621 case PLAYER_MESSAGE_MAX:
623 LOGW("PLAYER_MESSAGE_MAX");
635 static int __msg_callback(int message, void *param, void *user_data)
637 player_s *handle = (player_s *)user_data;
638 MMMessageParamType *msg = (MMMessageParamType *)param;
639 LOGW("[%s] Got message type : 0x%x", __FUNCTION__, message);
640 player_error_e err_code = PLAYER_ERROR_NONE;
642 case MM_MESSAGE_ERROR: /* 0x01 */
643 err_code = __player_convert_error_code(msg->code, (char *)__FUNCTION__);
645 case MM_MESSAGE_STATE_CHANGED: /* 0x03 */
646 LOGI("STATE CHANGED INTERNALLY - from : %d, to : %d (CAPI State : %d)", msg->state.previous, msg->state.current, handle->state);
647 if ((handle->is_progressive_download && msg->state.previous == MM_PLAYER_STATE_NULL && msg->state.current == MM_PLAYER_STATE_READY) || (msg->state.previous == MM_PLAYER_STATE_READY && msg->state.current == MM_PLAYER_STATE_PAUSED)) {
648 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
649 /* asyc && prepared cb has been set */
650 LOGI("[%s] Prepared! [current state : %d]", __FUNCTION__, handle->state);
651 PLAYER_TRACE_ASYNC_END("MM:PLAYER:PREPARE_ASYNC", *(int *)handle);
652 #ifdef USE_ECORE_FUNCTIONS
653 __ADD_ECORE_JOB(handle, __JOB_KEY_PREPARED, __job_prepared_cb);
655 __ADD_MESSAGE(handle, PLAYER_MESSAGE_PREPARED);
660 case MM_MESSAGE_READY_TO_RESUME: /* 0x05 */
661 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])
662 ((player_interrupted_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])(PLAYER_INTERRUPTED_COMPLETED, handle->user_data[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]);
664 case MM_MESSAGE_BEGIN_OF_STREAM: /* 0x104 */
665 LOGI("[%s] Ready to streaming information (BOS) [current state : %d]", __FUNCTION__, handle->state);
667 case MM_MESSAGE_END_OF_STREAM: /* 0x105 */
668 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_COMPLETE]) {
669 #ifdef USE_ECORE_FUNCTIONS
670 __ADD_ECORE_JOB(handle, __JOB_KEY_EOS, __job_eos_cb);
672 __ADD_MESSAGE(handle, PLAYER_MESSAGE_EOS);
676 case MM_MESSAGE_BUFFERING: /* 0x103 */
677 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_BUFFERING])
678 ((player_buffering_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_BUFFERING])(msg->connection.buffering, handle->user_data[MUSE_PLAYER_EVENT_TYPE_BUFFERING]);
680 case MM_MESSAGE_STATE_INTERRUPTED: /* 0x04 */
681 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]) {
682 handle->state = __convert_player_state(msg->state.current);
683 if (handle->state == PLAYER_STATE_READY)
684 handle->is_stopped = TRUE;
685 ((player_interrupted_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_INTERRUPT])(__convert_interrupted_code(msg->code), handle->user_data[MUSE_PLAYER_EVENT_TYPE_INTERRUPT]);
688 case MM_MESSAGE_CONNECTION_TIMEOUT: /* 0x102 */
689 LOGI("[%s] PLAYER_ERROR_CONNECTION_FAILED (0x%08x) : CONNECTION_TIMEOUT", __FUNCTION__, PLAYER_ERROR_CONNECTION_FAILED);
690 err_code = PLAYER_ERROR_CONNECTION_FAILED;
692 case MM_MESSAGE_UPDATE_SUBTITLE: /* 0x109 */
693 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SUBTITLE])
694 ((player_subtitle_updated_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SUBTITLE])(msg->subtitle.duration, (char *)msg->data, handle->user_data[MUSE_PLAYER_EVENT_TYPE_SUBTITLE]);
696 case MM_MESSAGE_VIDEO_NOT_CAPTURED: /* 0x113 */
697 LOGI("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x)", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED);
698 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])
699 ((player_error_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR])(PLAYER_ERROR_VIDEO_CAPTURE_FAILED, handle->user_data[MUSE_PLAYER_EVENT_TYPE_ERROR]);
701 case MM_MESSAGE_VIDEO_CAPTURED: /* 0x110 */
702 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE]) {
705 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_WIDTH, &w, MM_PLAYER_VIDEO_HEIGHT, &h, (char *)NULL);
706 if (ret != MM_ERROR_NONE && handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR]) {
707 LOGE("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x) : Failed to get video size on video captured (0x%x)", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED, ret);
708 err_code = PLAYER_ERROR_VIDEO_CAPTURE_FAILED;
710 MMPlayerVideoCapture *capture = (MMPlayerVideoCapture *)msg->data;
712 switch (msg->captured_frame.orientation) {
716 /* use video resolution from above */
722 /* use calculated size during rotation */
723 w = msg->captured_frame.width;
724 h = msg->captured_frame.height;
731 LOGI("[%s] captured image width : %d height : %d", __FUNCTION__, w, h);
733 /* call application callback */
734 ((player_video_captured_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE])(capture->data, w, h, capture->size, handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE]);
737 g_free(capture->data);
738 capture->data = NULL;
741 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
742 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
745 case MM_MESSAGE_FILE_NOT_SUPPORTED: /* 0x10f */
746 LOGI("[%s] PLAYER_ERROR_NOT_SUPPORTED_FILE (0x%08x) : FILE_NOT_SUPPORTED", __FUNCTION__, PLAYER_ERROR_NOT_SUPPORTED_FILE);
747 err_code = PLAYER_ERROR_NOT_SUPPORTED_FILE;
749 case MM_MESSAGE_FILE_NOT_FOUND: /* 0x110 */
750 LOGI("[%s] PLAYER_ERROR_NOT_SUPPORTED_FILE (0x%08x) : FILE_NOT_FOUND", __FUNCTION__, PLAYER_ERROR_NOT_SUPPORTED_FILE);
751 err_code = PLAYER_ERROR_NOT_SUPPORTED_FILE;
753 case MM_MESSAGE_SEEK_COMPLETED: /* 0x114 */
754 if (handle->display_type != PLAYER_DISPLAY_TYPE_NONE && handle->state == PLAYER_STATE_READY) {
755 if (handle->is_display_visible)
756 mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 1, (char *)NULL);
758 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
759 #ifdef USE_ECORE_FUNCTIONS
760 __ADD_ECORE_JOB(handle, __JOB_KEY_SEEK_DONE, __job_seek_done_cb);
762 __ADD_MESSAGE(handle, PLAYER_MESSAGE_SEEK_DONE);
766 case MM_MESSAGE_UNKNOWN: /* 0x00 */
767 case MM_MESSAGE_WARNING: /* 0x02 */
768 case MM_MESSAGE_CONNECTING: /* 0x100 */
769 case MM_MESSAGE_CONNECTED: /* 0x101 */
770 case MM_MESSAGE_BLUETOOTH_ON: /* 0x106 */
771 case MM_MESSAGE_BLUETOOTH_OFF: /* 0x107 */
772 case MM_MESSAGE_RTP_SENDER_REPORT: /* 0x10a */
773 case MM_MESSAGE_RTP_RECEIVER_REPORT: /* 0x10b */
774 case MM_MESSAGE_RTP_SESSION_STATUS: /* 0x10c */
775 case MM_MESSAGE_SENDER_STATE: /* 0x10d */
776 case MM_MESSAGE_RECEIVER_STATE: /* 0x10e */
781 if (err_code != PLAYER_ERROR_NONE && handle->user_cb[MUSE_PLAYER_EVENT_TYPE_ERROR]) {
782 handle->error_code = err_code;
783 #ifdef USE_ECORE_FUNCTIONS
784 __ADD_ECORE_JOB(handle, __JOB_KEY_ERROR, __job_error_cb);
786 __ADD_MESSAGE(handle, PLAYER_MESSAGE_ERROR);
789 LOGW("[%s] End", __FUNCTION__);
793 #ifdef VIDEO_MEDIA_PACKET_DUMP
794 /* check the output content with yuv player after setting right width/height and color format */
795 static void _video_media_packet_dump(MMPlayerVideoStreamDataType *video_stream, media_packet_h pkt)
799 int stride_width = 0, stride_height = 0;
801 char filename[100] = {0};
803 int num = 0, cnt = 0;
806 if ((video_stream->format != MM_PIXEL_FORMAT_NV12) &&
807 (video_stream->format != MM_PIXEL_FORMAT_I420) &&
808 (video_stream->format != MM_PIXEL_FORMAT_RGBA)) {
809 LOGE("not support dump for [%d] video format.", video_stream->format);
813 sprintf(filename, "/tmp/dec_output_dump_%d_%d.yuv", video_stream->width, video_stream->height);
814 fp = fopen(filename, "ab");
816 media_packet_get_number_of_video_planes(pkt, (uint32_t*)&num);
817 LOGD("num of planes %d", num);
819 if (video_stream->format == MM_PIXEL_FORMAT_RGBA) {
820 media_packet_get_video_plane_data_ptr(pkt, 0, &temp);
821 media_packet_get_video_stride_width(pkt, 0, &stride_width);
822 media_packet_get_video_stride_height(pkt, 0, &stride_height);
823 LOGD("stride %d %d\n", stride_width, stride_height);
824 for (i = 0; i < video_stream->height; i++) {
825 ret = fwrite(temp, video_stream->width * 4, 1, fp);
826 temp += video_stream->width * 4;
829 if (video_stream->format == MM_PIXEL_FORMAT_I420)
830 uv_width = video_stream->width/2;
832 uv_width = video_stream->width;
834 for (cnt = 0 ; cnt < num ; cnt++) {
836 media_packet_get_video_plane_data_ptr(pkt, 0, &temp);
837 media_packet_get_video_stride_width(pkt, 0, &stride_width);
838 media_packet_get_video_stride_height(pkt, 0, &stride_height);
839 for (i = 0; i < video_stream->height; i++) {
840 ret = fwrite(temp, video_stream->width, 1, fp);
841 temp += stride_width;
843 LOGD("[%d] stride %d %d\n", cnt, stride_width, stride_height);
845 media_packet_get_video_plane_data_ptr(pkt, cnt, &temp);
846 media_packet_get_video_stride_width(pkt, cnt, &stride_width);
847 for (i = 0; i < video_stream->height/2; i++) {
848 ret = fwrite(temp, uv_width, 1, fp);
849 temp += stride_width;
855 LOGD("codec dec output dumped!!%d\n", ret);
861 static bool __video_stream_callback(void *stream, void *user_data)
863 player_s *handle = (player_s *)user_data;
864 MMPlayerVideoStreamDataType *video_stream = (MMPlayerVideoStreamDataType *)stream;
866 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
868 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME]) {
869 /* media packet and zero-copy */
870 media_packet_h pkt = NULL;
871 tbm_surface_h tsurf = NULL;
872 uint32_t bo_format = 0;
876 media_format_mimetype_e mimetype = MEDIA_FORMAT_NV12;
877 bool make_pkt_fmt = FALSE;
879 /* create tbm surface */
880 for (i = 0, bo_num = 0; i < BUFFER_MAX_PLANE_NUM; i++) {
881 if (video_stream->bo[i])
885 /* get tbm surface format */
886 ret = _player_get_tbm_surface_format(video_stream->format, &bo_format);
887 ret |= _player_get_media_packet_mimetype(video_stream->format, &mimetype);
889 if (bo_num > 0 && ret == PLAYER_ERROR_NONE) {
890 tbm_surface_info_s info;
891 memset(&info, 0, sizeof(tbm_surface_info_s));
892 info.width = video_stream->width;
893 info.height = video_stream->height;
894 info.format = bo_format;
895 info.bpp = tbm_surface_internal_get_bpp(bo_format);
896 info.num_planes = tbm_surface_internal_get_num_planes(bo_format);
898 for (i = 0; i < info.num_planes; i++) {
899 info.planes[i].stride = video_stream->stride[i];
900 info.planes[i].size = video_stream->stride[i] * video_stream->elevation[i];
902 info.planes[i].offset = 0;
904 info.planes[i].offset = info.planes[i - 1].offset + info.planes[i - 1].size;
905 info.size += info.planes[i].size;
906 if (video_stream->format == MM_PIXEL_FORMAT_RGBA)
907 info.size = video_stream->stride[0] * video_stream->height;
909 tsurf = tbm_surface_internal_create_with_bos(&info, (tbm_bo *)video_stream->bo, bo_num);
910 /*LOGD("tbm surface %p", tsurf); */
911 } else if (bo_num == 0) {
913 tbm_surface_info_s tsuri;
914 unsigned char *ptr = video_stream->data[0];
915 unsigned char *ptr2 = video_stream->data[1];
918 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
921 if (!ptr2 && video_stream->format == MM_PIXEL_FORMAT_NV12T) {
922 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
925 tsurf = tbm_surface_create(video_stream->width, video_stream->height, bo_format);
927 /* map surface to set data */
928 if (tbm_surface_map(tsurf, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &tsuri)) {
929 LOGE("tbm_surface_map failed");
930 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
934 if (video_stream->format == MM_PIXEL_FORMAT_NV12T) {
935 memcpy(tsuri.planes[0].ptr, ptr, tsuri.planes[0].size);
936 memcpy(tsuri.planes[1].ptr, ptr2, tsuri.planes[1].size);
937 } else if (video_stream->format == MM_PIXEL_FORMAT_RGBA) {
938 memcpy(tsuri.planes[0].ptr, ptr, tsuri.planes[0].size);
940 for (plane_idx = 0; plane_idx < tsuri.num_planes; plane_idx++) {
941 memcpy(tsuri.planes[plane_idx].ptr, ptr, tsuri.planes[plane_idx].size);
942 ptr += tsuri.planes[plane_idx].size;
946 LOGW("tbm_surface_create failed");
951 /* check media packet format */
952 if (handle->pkt_fmt) {
953 int pkt_fmt_width = 0;
954 int pkt_fmt_height = 0;
955 media_format_mimetype_e pkt_fmt_mimetype = MEDIA_FORMAT_NV12;
957 media_format_get_video_info(handle->pkt_fmt, &pkt_fmt_mimetype,
958 &pkt_fmt_width, &pkt_fmt_height, NULL, NULL);
959 if (pkt_fmt_mimetype != mimetype ||
960 pkt_fmt_width != video_stream->width ||
961 pkt_fmt_height != video_stream->height) {
962 LOGW("different format. current 0x%x, %dx%d, new 0x%x, %dx%d",
963 pkt_fmt_mimetype, pkt_fmt_width, pkt_fmt_height, mimetype,
964 video_stream->width, video_stream->height);
965 media_format_unref(handle->pkt_fmt);
966 handle->pkt_fmt = NULL;
973 /* create packet format */
975 LOGW("make new pkt_fmt - mimetype 0x%x, %dx%d", mimetype, video_stream->width, video_stream->height);
976 ret = media_format_create(&handle->pkt_fmt);
977 if (ret == MEDIA_FORMAT_ERROR_NONE) {
978 ret = media_format_set_video_mime(handle->pkt_fmt, mimetype);
979 ret |= media_format_set_video_width(handle->pkt_fmt, video_stream->width);
980 ret |= media_format_set_video_height(handle->pkt_fmt, video_stream->height);
981 LOGW("media_format_set_video_mime,width,height ret : 0x%x", ret);
983 LOGW("media_format_create failed");
987 /* create media packet */
988 ret = media_packet_create_from_tbm_surface(handle->pkt_fmt, tsurf, (media_packet_finalize_cb)_player_media_packet_finalize, (void *)handle, &pkt);
989 if (ret != MEDIA_PACKET_ERROR_NONE) {
990 LOGE("media_packet_create_from_tbm_surface failed");
992 tbm_surface_destroy(tsurf);
996 LOGE("failed to create tbm surface %dx%d, format %d, bo_num %d",
997 video_stream->width, video_stream->height, video_stream->format, bo_num);
1001 /* LOGD("media packet %p, internal buffer %p", pkt, stream->internal_buffer); */
1002 if (video_stream->timestamp) {
1003 ret = media_packet_set_pts(pkt, (uint64_t)video_stream->timestamp * 1000000);
1004 if (ret != MEDIA_PACKET_ERROR_NONE) {
1005 LOGE("media_packet_set_pts failed");
1007 media_packet_destroy(pkt);
1011 LOGD("media packet %p, didn't have video-stream timestamp", pkt);
1014 /* set internal buffer */
1015 if (video_stream->internal_buffer)
1016 ret = media_packet_set_extra(pkt, video_stream->internal_buffer);
1018 if (ret != MEDIA_PACKET_ERROR_NONE) {
1019 LOGE("media_packet_set_extra failed");
1021 media_packet_destroy(pkt);
1024 #ifdef VIDEO_MEDIA_PACKET_DUMP
1025 _video_media_packet_dump(video_stream, pkt);
1027 mm_player_media_packet_video_stream_internal_buffer_ref(video_stream->internal_buffer);
1029 /* call media packet callback */
1030 ((player_media_packet_video_decoded_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME])(pkt, handle->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME]);
1033 tbm_surface_unmap(tsurf);
1038 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
1042 static int __pd_message_callback(int message, void *param, void *user_data)
1044 player_s *handle = (player_s *)user_data;
1045 player_pd_message_type_e type;
1047 case MM_MESSAGE_PD_DOWNLOADER_START:
1048 type = PLAYER_PD_STARTED;
1050 case MM_MESSAGE_PD_DOWNLOADER_END:
1051 type = PLAYER_PD_COMPLETED;
1057 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
1059 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD])
1060 ((player_pd_message_cb)handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD])(type, handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD]);
1062 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
1067 #ifdef USE_ECORE_FUNCTIONS
1068 static void __job_key_to_remove(gpointer key)
1074 static void __job_value_to_destroy(gpointer value)
1076 Ecore_Job *job = (Ecore_Job *) value;
1078 __DELETE_ECORE_ITEM(job);
1082 static MMDisplaySurfaceType __player_convet_display_type(player_display_type_e type)
1085 case PLAYER_DISPLAY_TYPE_OVERLAY:
1086 return MM_DISPLAY_SURFACE_OVERLAY;
1087 case PLAYER_DISPLAY_TYPE_EVAS: /* fall through ifndef TIZEN_FEATURE_EVAS_RENDERER */
1088 #ifdef TIZEN_FEATURE_EVAS_RENDERER
1089 return MM_DISPLAY_SURFACE_REMOTE;
1091 case PLAYER_DISPLAY_TYPE_NONE: /* fall through */
1093 return MM_DISPLAY_SURFACE_NULL;
1097 bool _check_enabled_user_cb_lock(int type)
1099 if ((type == MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME) ||
1100 (type == MUSE_PLAYER_EVENT_TYPE_PD) ||
1101 (type == MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS_WITH_INFO) ||
1102 (type == MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS_WITH_INFO)) {
1110 * Public Implementation
1113 int legacy_player_create(player_h *player)
1115 PLAYER_INSTANCE_CHECK(player);
1116 PLAYER_TRACE_BEGIN("MM:PLAYER:CREATE");
1118 handle = (player_s *)malloc(sizeof(player_s));
1120 memset(handle, 0, sizeof(player_s));
1122 LOGE("[%s] PLAYER_ERROR_OUT_OF_MEMORY(0x%08x)", __FUNCTION__, PLAYER_ERROR_OUT_OF_MEMORY);
1123 return PLAYER_ERROR_OUT_OF_MEMORY;
1125 int ret = mm_player_create(&handle->mm_handle);
1126 if (ret != MM_ERROR_NONE) {
1127 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1128 handle->state = PLAYER_STATE_NONE;
1131 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1133 muse_player_event_e type = MUSE_PLAYER_EVENT_TYPE_PREPARE;
1135 *player = (player_h)handle;
1136 handle->state = PLAYER_STATE_IDLE;
1137 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
1138 handle->is_stopped = FALSE;
1139 handle->is_display_visible = TRUE;
1140 handle->is_media_stream = FALSE;
1142 for (type = MUSE_PLAYER_EVENT_TYPE_PREPARE; type < MUSE_PLAYER_EVENT_TYPE_NUM; type++) {
1143 if (_check_enabled_user_cb_lock(type))
1144 g_mutex_init(&handle->user_cb_lock[type]);
1146 #ifdef USE_ECORE_FUNCTIONS
1147 handle->ecore_jobs = g_hash_table_new_full(g_str_hash, g_str_equal, __job_key_to_remove, __job_value_to_destroy);
1149 handle->message_queue = g_queue_new();
1150 g_mutex_init(&handle->message_queue_lock);
1151 g_cond_init(&handle->message_queue_cond);
1152 ret = pthread_create(&handle->message_thread, NULL, (void *)__message_cb_loop, (void *)handle);
1154 LOGE("[%s] failed to create message thread ret = %d", __FUNCTION__, ret);
1155 return PLAYER_ERROR_OUT_OF_MEMORY;
1158 LOGI("[%s] new handle : %p", __FUNCTION__, *player);
1160 return PLAYER_ERROR_NONE;
1164 int legacy_player_destroy(player_h player)
1166 LOGI("[%s] Start, handle to destroy : %p", __FUNCTION__, player);
1167 PLAYER_TRACE_BEGIN("MM:PLAYER:DESTROY");
1168 PLAYER_INSTANCE_CHECK(player);
1169 player_s *handle = (player_s *)player;
1170 #ifdef USE_ECORE_FUNCTIONS
1171 if (handle->is_doing_jobs) {
1172 LOGE("jobs not completed. can't do destroy");
1173 return PLAYER_ERROR_INVALID_OPERATION;
1175 g_hash_table_remove_all(handle->ecore_jobs);
1176 g_hash_table_unref(handle->ecore_jobs);
1177 handle->ecore_jobs = NULL;
1179 __ADD_MESSAGE(handle, PLAYER_MESSAGE_LOOP_EXIT);
1181 __RELEASEIF_PREPARE_THREAD(handle->prepare_async_thread);
1183 #ifndef USE_ECORE_FUNCTIONS
1184 __RELEASEIF_MESSAGE_THREAD(handle->message_thread);
1187 int ret = mm_player_destroy(handle->mm_handle);
1189 if (handle->pkt_fmt) {
1190 media_format_unref(handle->pkt_fmt);
1191 handle->pkt_fmt = NULL;
1194 LOGI("[%s] Done mm_player_destroy", __FUNCTION__);
1196 if (ret != MM_ERROR_NONE) {
1197 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1198 return PLAYER_ERROR_INVALID_OPERATION;
1200 muse_player_event_e type = MUSE_PLAYER_EVENT_TYPE_PREPARE;
1202 handle->state = PLAYER_STATE_NONE;
1204 for (type = MUSE_PLAYER_EVENT_TYPE_PREPARE; type < MUSE_PLAYER_EVENT_TYPE_NUM; type++) {
1205 if (_check_enabled_user_cb_lock(type))
1206 g_mutex_clear(&handle->user_cb_lock[type]);
1209 #ifndef USE_ECORE_FUNCTIONS
1210 if (handle->message_queue) {
1211 g_queue_free(handle->message_queue);
1212 handle->message_queue = NULL;
1215 g_cond_broadcast(&handle->message_queue_cond);
1216 g_mutex_clear(&handle->message_queue_lock);
1217 g_cond_clear(&handle->message_queue_cond);
1221 LOGI("[%s] End", __FUNCTION__);
1223 return PLAYER_ERROR_NONE;
1227 static void *__prepare_async_thread_func(void *data)
1229 player_s *handle = data;
1230 int ret = MM_ERROR_NONE;
1231 LOGI("[%s]", __FUNCTION__);
1233 ret = mm_player_pause(handle->mm_handle);
1234 if (ret != MM_ERROR_NONE) {
1235 LOGE("[%s] Failed to pause - core fw error(0x%x)", __FUNCTION__, ret);
1236 if (handle->error_code == PLAYER_ERROR_NONE) {
1237 /*MM_MESSAGE_ERROR will not be posted as legacy_player_prepare(sync API) works with return value
1238 of mm_player_pause So in case of async API we post the error message to application from here */
1239 MMMessageParamType msg_param;
1240 msg_param.code = ret;
1241 __msg_callback(MM_MESSAGE_ERROR, (void *)&msg_param, (void *)handle);
1243 ret = mm_player_unrealize(handle->mm_handle);
1244 if (ret != MM_ERROR_NONE)
1245 LOGE("[%s] Failed to unrealize - 0x%x", __FUNCTION__, ret);
1247 LOGI("[%s], done", __FUNCTION__);
1251 int legacy_player_prepare_async(player_h player, player_prepared_cb callback, void *user_data)
1253 LOGI("[%s] Start", __FUNCTION__);
1254 PLAYER_INSTANCE_CHECK(player);
1255 player_s *handle = (player_s *)player;
1256 PLAYER_TRACE_ASYNC_BEGIN("MM:PLAYER:PREPARE_ASYNC", *(int *)handle);
1257 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1263 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
1264 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION (0x%08x) : preparing... we can't do any more ", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1265 return PLAYER_ERROR_INVALID_OPERATION;
1267 /* LOGI("[%s] Event type : %d ",__FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PREPARE); */
1268 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = callback;
1269 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = user_data;
1272 ret = mm_player_set_message_callback(handle->mm_handle, __msg_callback, (void *)handle);
1273 if (ret != MM_ERROR_NONE)
1274 LOGW("[%s] Failed to set message callback function (0x%x)", __FUNCTION__, ret);
1276 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE) {
1277 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", MM_DISPLAY_SURFACE_NULL, (char *)NULL);
1278 if (ret != MM_ERROR_NONE)
1279 LOGW("[%s] Failed to set display surface type 'MM_DISPLAY_SURFACE_NULL' (0x%x)", __FUNCTION__, ret);
1281 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &visible, (char *)NULL);
1282 if (ret != MM_ERROR_NONE)
1283 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1290 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
1291 if (ret != MM_ERROR_NONE)
1292 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1295 ret = mm_player_realize(handle->mm_handle);
1296 if (ret != MM_ERROR_NONE) {
1297 LOGE("[%s] Failed to realize - 0x%x", __FUNCTION__, ret);
1298 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1301 if (!handle->is_progressive_download) {
1302 ret = pthread_create(&handle->prepare_async_thread, NULL, (void *)__prepare_async_thread_func, (void *)handle);
1305 LOGE("[%s] failed to create thread ret = %d", __FUNCTION__, ret);
1306 return PLAYER_ERROR_OUT_OF_MEMORY;
1310 LOGI("[%s] End", __FUNCTION__);
1311 return PLAYER_ERROR_NONE;
1314 int legacy_player_prepare(player_h player)
1316 LOGI("[%s] Start", __FUNCTION__);
1317 PLAYER_TRACE_BEGIN("MM:PLAYER:PREPARE");
1318 PLAYER_INSTANCE_CHECK(player);
1319 player_s *handle = (player_s *)player;
1320 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1325 ret = mm_player_set_message_callback(handle->mm_handle, __msg_callback, (void *)handle);
1326 if (ret != MM_ERROR_NONE)
1327 LOGW("[%s] Failed to set message callback function (0x%x)", __FUNCTION__, ret);
1329 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE) {
1330 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", MM_DISPLAY_SURFACE_NULL, (char *)NULL);
1331 if (ret != MM_ERROR_NONE)
1332 LOGW("[%s] Failed to set display surface type 'MM_DISPLAY_SURFACE_NULL' (0x%x)", __FUNCTION__, ret);
1334 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &visible, (char *)NULL);
1335 if (ret != MM_ERROR_NONE)
1336 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1343 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
1345 if (ret != MM_ERROR_NONE)
1346 LOGW("[%s] Failed to set display display_visible '0' (0x%x)", __FUNCTION__, ret);
1349 ret = mm_player_realize(handle->mm_handle);
1350 if (ret != MM_ERROR_NONE) {
1351 LOGE("[%s] Failed to realize - 0x%x", __FUNCTION__, ret);
1352 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1355 if (!handle->is_progressive_download)
1356 ret = mm_player_pause(handle->mm_handle);
1358 if (ret != MM_ERROR_NONE) {
1360 uret = mm_player_unrealize(handle->mm_handle);
1361 if (uret != MM_ERROR_NONE)
1362 LOGE("[%s] Failed to unrealize - 0x%x", __FUNCTION__, uret);
1364 LOGE("[%s] Failed to pause - 0x%x", __FUNCTION__, ret);
1365 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1367 handle->state = PLAYER_STATE_READY;
1368 LOGI("[%s] End", __FUNCTION__);
1370 return PLAYER_ERROR_NONE;
1374 int legacy_player_unprepare(player_h player)
1376 LOGI("[%s] Start", __FUNCTION__);
1377 PLAYER_TRACE_BEGIN("MM:PLAYER:UNPREPARE");
1378 PLAYER_INSTANCE_CHECK(player);
1379 player_s *handle = (player_s *)player;
1381 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1382 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1383 return PLAYER_ERROR_INVALID_STATE;
1386 __RELEASEIF_PREPARE_THREAD(handle->prepare_async_thread);
1388 int ret = mm_player_unrealize(handle->mm_handle);
1390 if (ret != MM_ERROR_NONE) {
1391 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1393 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
1394 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1395 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1398 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE]) {
1399 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
1400 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PREPARE] = NULL;
1403 handle->state = PLAYER_STATE_IDLE;
1404 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
1405 handle->is_set_pixmap_cb = FALSE;
1406 handle->is_stopped = FALSE;
1407 handle->is_display_visible = TRUE;
1408 handle->is_progressive_download = FALSE;
1409 LOGI("[%s] End", __FUNCTION__);
1411 return PLAYER_ERROR_NONE;
1415 int legacy_player_set_uri(player_h player, const char *uri)
1417 PLAYER_INSTANCE_CHECK(player);
1418 PLAYER_NULL_ARG_CHECK(uri);
1419 player_s *handle = (player_s *)player;
1420 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1422 handle->is_media_stream = FALSE;
1423 int ret = mm_player_set_uri(handle->mm_handle, uri);
1425 if (ret != MM_ERROR_NONE)
1426 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1428 return PLAYER_ERROR_NONE;
1431 int legacy_player_set_memory_buffer(player_h player, const void *data, int size)
1433 PLAYER_INSTANCE_CHECK(player);
1434 PLAYER_NULL_ARG_CHECK(data);
1435 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1436 player_s *handle = (player_s *)player;
1437 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1441 handle->is_media_stream = FALSE;
1442 snprintf(uri, sizeof(uri), "mem:///ext=%s,size=%d", "", size);
1443 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);
1444 if (ret != MM_ERROR_NONE)
1445 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1447 return PLAYER_ERROR_NONE;
1450 int legacy_player_get_state(player_h player, player_state_e *state)
1452 PLAYER_INSTANCE_CHECK(player);
1453 PLAYER_NULL_ARG_CHECK(state);
1454 player_s *handle = (player_s *)player;
1455 *state = handle->state;
1456 MMPlayerStateType currentStat = MM_PLAYER_STATE_NULL;
1457 mm_player_get_state(handle->mm_handle, ¤tStat);
1458 /* LOGI("[%s] State : %d (FW state : %d)", __FUNCTION__,handle->state, currentStat); */
1459 return PLAYER_ERROR_NONE;
1462 int legacy_player_set_volume(player_h player, float left, float right)
1464 PLAYER_INSTANCE_CHECK(player);
1465 PLAYER_CHECK_CONDITION(left >= 0 && left <= 1.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1466 PLAYER_CHECK_CONDITION(right >= 0 && right <= 1.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1467 player_s *handle = (player_s *)player;
1468 MMPlayerVolumeType vol;
1469 vol.level[MM_VOLUME_CHANNEL_LEFT] = left;
1470 vol.level[MM_VOLUME_CHANNEL_RIGHT] = right;
1471 int ret = mm_player_set_volume(handle->mm_handle, &vol);
1472 if (ret != MM_ERROR_NONE)
1473 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1475 return PLAYER_ERROR_NONE;
1478 int legacy_player_get_volume(player_h player, float *left, float *right)
1480 PLAYER_INSTANCE_CHECK(player);
1481 PLAYER_NULL_ARG_CHECK(left);
1482 PLAYER_NULL_ARG_CHECK(right);
1483 player_s *handle = (player_s *)player;
1484 MMPlayerVolumeType vol;
1485 int ret = mm_player_get_volume(handle->mm_handle, &vol);
1486 if (ret != MM_ERROR_NONE) {
1487 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1489 *left = vol.level[MM_VOLUME_CHANNEL_LEFT];
1490 *right = vol.level[MM_VOLUME_CHANNEL_RIGHT];
1491 return PLAYER_ERROR_NONE;
1494 #ifdef TIZEN_FEATURE_ASM
1495 int legacy_player_set_sound_type(player_h player, sound_type_e type)
1497 PLAYER_INSTANCE_CHECK(player);
1498 player_s *handle = (player_s *)player;
1500 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1502 char *stream_type = NULL;
1503 int stream_index = -1;
1506 int session_type = 0;
1507 int session_flags = 0;
1509 ret = mm_player_get_client_pid(handle->mm_handle, &pid);
1510 if (ret != MM_ERROR_NONE)
1511 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1513 /* read session information */
1514 ret = _mm_session_util_read_information(pid, &session_type, &session_flags);
1515 if (ret == MM_ERROR_NONE) {
1516 /* in this case, this process is using stream info created by using sound-manager,
1517 * we're going to skip working on backward compatibility of session. */
1518 if (session_type == MM_SESSION_TYPE_REPLACED_BY_STREAM)
1519 return PLAYER_ERROR_SOUND_POLICY;
1520 } else if (ret == MM_ERROR_INVALID_HANDLE) { /* if there is no session */
1521 /* convert volume_type to stream_type */
1523 case SOUND_TYPE_SYSTEM:
1524 stream_type = "system";
1526 case SOUND_TYPE_NOTIFICATION:
1527 stream_type = "notification";
1529 case SOUND_TYPE_ALARM:
1530 stream_type = "alarm";
1532 case SOUND_TYPE_RINGTONE:
1533 stream_type = "ringtone-voip";
1535 case SOUND_TYPE_MEDIA:
1536 case SOUND_TYPE_CALL:
1537 stream_type = "media";
1539 case SOUND_TYPE_VOIP:
1540 stream_type = "voip";
1542 case SOUND_TYPE_VOICE:
1543 stream_type = "voice-information";
1546 LOGW("check the value[%d].\n", type);
1547 return PLAYER_ERROR_INVALID_PARAMETER;
1549 LOGI("[%s] sound type = %s", __FUNCTION__, stream_type);
1551 ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_stream_type", stream_type, strlen(stream_type), "sound_stream_index", stream_index, (char *)NULL);
1552 if (ret == MM_ERROR_NONE)
1553 return PLAYER_ERROR_NONE;
1555 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1558 int legacy_player_set_sound_stream_info(player_h player, sound_stream_info_h stream_info)
1560 PLAYER_INSTANCE_CHECK(player);
1561 player_s *handle = (player_s *)player;
1562 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
1564 bool is_available = FALSE;
1566 /* check if stream_info is valid */
1567 int ret = sound_manager_is_available_stream_information(stream_info, NATIVE_API_PLAYER, &is_available);
1569 if (ret != MM_ERROR_NONE) {
1570 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1572 if (is_available == FALSE)
1573 ret = MM_ERROR_NOT_SUPPORT_API;
1575 char *stream_type = NULL;
1576 int stream_index = 0;
1577 ret = sound_manager_get_type_from_stream_information(stream_info, &stream_type);
1578 ret = sound_manager_get_index_from_stream_information(stream_info, &stream_index);
1579 if (ret == SOUND_MANAGER_ERROR_NONE)
1580 ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_stream_type", stream_type, strlen(stream_type), "sound_stream_index", stream_index, (char *)NULL);
1582 ret = MM_ERROR_PLAYER_INTERNAL;
1586 if (ret != MM_ERROR_NONE)
1587 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1589 return PLAYER_ERROR_NONE;
1592 int legacy_player_set_audio_latency_mode(player_h player, audio_latency_mode_e latency_mode)
1594 PLAYER_INSTANCE_CHECK(player);
1595 player_s *handle = (player_s *)player;
1597 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_latency_mode", latency_mode, (char *)NULL);
1598 if (ret != MM_ERROR_NONE)
1599 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1601 return PLAYER_ERROR_NONE;
1604 int legacy_player_get_audio_latency_mode(player_h player, audio_latency_mode_e * latency_mode)
1606 PLAYER_INSTANCE_CHECK(player);
1607 PLAYER_NULL_ARG_CHECK(latency_mode);
1608 player_s *handle = (player_s *)player;
1610 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "sound_latency_mode", latency_mode, (char *)NULL);
1611 if (ret != MM_ERROR_NONE)
1612 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1614 return PLAYER_ERROR_NONE;
1617 int legacy_player_start(player_h player)
1619 LOGI("[%s] Start", __FUNCTION__);
1620 PLAYER_INSTANCE_CHECK(player);
1621 player_s *handle = (player_s *)player;
1623 if (handle->state == PLAYER_STATE_READY || handle->state == PLAYER_STATE_PAUSED) {
1624 if (handle->display_type == PLAYER_DISPLAY_TYPE_OVERLAY && handle->is_display_visible)
1625 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 1, (char *)NULL);
1627 if (handle->is_stopped) {
1628 if (handle->is_progressive_download) {
1629 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1630 return PLAYER_ERROR_INVALID_OPERATION;
1633 ret = mm_player_start(handle->mm_handle);
1634 LOGI("[%s] stop -> start() ", __FUNCTION__);
1636 if (handle->is_progressive_download && handle->state == PLAYER_STATE_READY)
1637 ret = mm_player_start(handle->mm_handle);
1639 ret = mm_player_resume(handle->mm_handle);
1642 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1643 return PLAYER_ERROR_INVALID_STATE;
1646 if (ret != MM_ERROR_NONE) {
1647 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1649 handle->is_stopped = FALSE;
1650 handle->state = PLAYER_STATE_PLAYING;
1651 LOGI("[%s] End", __FUNCTION__);
1652 return PLAYER_ERROR_NONE;
1656 int legacy_player_stop(player_h player)
1658 LOGI("[%s] Start", __FUNCTION__);
1659 PLAYER_INSTANCE_CHECK(player);
1660 player_s *handle = (player_s *)player;
1661 if (handle->state == PLAYER_STATE_PLAYING || handle->state == PLAYER_STATE_PAUSED) {
1662 int ret = mm_player_stop(handle->mm_handle);
1664 if (handle->display_type == PLAYER_DISPLAY_TYPE_OVERLAY)
1665 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", 0, (char *)NULL);
1667 if (ret != MM_ERROR_NONE) {
1668 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1670 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK]) {
1671 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1672 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1675 handle->state = PLAYER_STATE_READY;
1676 handle->is_stopped = TRUE;
1677 LOGI("[%s] End", __FUNCTION__);
1678 return PLAYER_ERROR_NONE;
1681 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1682 return PLAYER_ERROR_INVALID_STATE;
1686 int legacy_player_pause(player_h player)
1688 LOGI("[%s] Start", __FUNCTION__);
1689 PLAYER_INSTANCE_CHECK(player);
1690 player_s *handle = (player_s *)player;
1691 PLAYER_STATE_CHECK(handle, PLAYER_STATE_PLAYING);
1693 int ret = mm_player_pause(handle->mm_handle);
1694 if (ret != MM_ERROR_NONE) {
1695 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1697 handle->state = PLAYER_STATE_PAUSED;
1698 LOGI("[%s] End", __FUNCTION__);
1699 return PLAYER_ERROR_NONE;
1703 int legacy_player_set_play_position(player_h player, int millisecond, bool accurate, player_seek_completed_cb callback, void *user_data)
1705 PLAYER_INSTANCE_CHECK(player);
1706 PLAYER_CHECK_CONDITION(millisecond >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1707 player_s *handle = (player_s *)player;
1708 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1709 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1710 return PLAYER_ERROR_INVALID_STATE;
1713 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] && handle->is_media_stream == FALSE) {
1714 LOGE("[%s] PLAYER_ERROR_SEEK_FAILED temp (0x%08x) : seeking... we can't do any more ", __FUNCTION__, PLAYER_ERROR_SEEK_FAILED);
1715 return PLAYER_ERROR_SEEK_FAILED;
1717 LOGI("[%s] Event type : %d, pos : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_SEEK, millisecond);
1718 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = callback;
1719 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = user_data;
1721 int accurated = accurate ? 1 : 0;
1722 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "accurate_seek", accurated, (char *)NULL);
1723 if (ret != MM_ERROR_NONE)
1724 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1726 ret = mm_player_set_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, millisecond);
1727 if (ret != MM_ERROR_NONE) {
1728 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1729 handle->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = NULL;
1730 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1732 return PLAYER_ERROR_NONE;
1736 int legacy_player_get_play_position(player_h player, int *millisecond)
1738 PLAYER_INSTANCE_CHECK(player);
1739 PLAYER_NULL_ARG_CHECK(millisecond);
1740 player_s *handle = (player_s *)player;
1741 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1742 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1743 return PLAYER_ERROR_INVALID_STATE;
1746 int ret = mm_player_get_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, &pos);
1747 if (ret != MM_ERROR_NONE) {
1748 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1750 *millisecond = (int)pos;
1751 return PLAYER_ERROR_NONE;
1755 int legacy_player_set_mute(player_h player, bool muted)
1757 PLAYER_INSTANCE_CHECK(player);
1758 player_s *handle = (player_s *)player;
1760 int ret = mm_player_set_mute(handle->mm_handle, muted);
1761 if (ret != MM_ERROR_NONE)
1762 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1764 return PLAYER_ERROR_NONE;
1767 int legacy_player_is_muted(player_h player, bool *muted)
1769 PLAYER_INSTANCE_CHECK(player);
1770 PLAYER_NULL_ARG_CHECK(muted);
1771 player_s *handle = (player_s *)player;
1774 int ret = mm_player_get_mute(handle->mm_handle, &_mute);
1775 if (ret != MM_ERROR_NONE) {
1776 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1782 return PLAYER_ERROR_NONE;
1786 int legacy_player_set_looping(player_h player, bool looping)
1788 PLAYER_INSTANCE_CHECK(player);
1789 player_s *handle = (player_s *)player;
1792 if (looping == TRUE)
1795 int ret = mm_player_set_attribute(handle->mm_handle, NULL, MM_PLAYER_PLAYBACK_COUNT, value, (char *)NULL);
1797 if (ret != MM_ERROR_NONE)
1798 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1800 return PLAYER_ERROR_NONE;
1803 int legacy_player_is_looping(player_h player, bool *looping)
1805 PLAYER_INSTANCE_CHECK(player);
1806 PLAYER_NULL_ARG_CHECK(looping);
1807 player_s *handle = (player_s *)player;
1810 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_PLAYBACK_COUNT, &count, (char *)NULL);
1811 if (ret != MM_ERROR_NONE) {
1812 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1819 return PLAYER_ERROR_NONE;
1823 int legacy_player_get_duration(player_h player, int *duration)
1825 PLAYER_INSTANCE_CHECK(player);
1826 PLAYER_NULL_ARG_CHECK(duration);
1827 player_s *handle = (player_s *)player;
1828 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1829 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1830 return PLAYER_ERROR_INVALID_STATE;
1833 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_CONTENT_DURATION, &_duration, (char *)NULL);
1834 if (ret != MM_ERROR_NONE) {
1835 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1837 *duration = _duration;
1838 /* LOGI("[%s] duration : %d",__FUNCTION__,_duration); */
1839 return PLAYER_ERROR_NONE;
1843 int legacy_player_set_display(player_h player, player_display_type_e type, player_display_h display)
1845 PLAYER_INSTANCE_CHECK(player);
1846 player_s *handle = (player_s *)player;
1847 Evas_Object *obj = NULL;
1848 const char *object_type = NULL;
1849 void *set_handle = NULL;
1850 void *set_wl_display = NULL;
1851 Ecore_Wl_Window *wl_window = NULL;
1854 if (type != PLAYER_DISPLAY_TYPE_NONE && display == NULL) {
1855 LOGE("display type[%d] is not NONE, but display handle is NULL", type);
1856 return PLAYER_ERROR_INVALID_PARAMETER;
1859 if (handle->is_set_pixmap_cb) {
1860 if (handle->state < PLAYER_STATE_READY) {
1861 /* just set below and go to "changing surface case" */
1862 handle->is_set_pixmap_cb = FALSE;
1864 LOGE("[%s] pixmap callback was set, try it again after calling legacy_player_unprepare()", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1865 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
1866 return PLAYER_ERROR_INVALID_OPERATION;
1871 if (type == PLAYER_DISPLAY_TYPE_NONE) {
1873 handle->display_handle = 0;
1874 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
1877 /* get handle from overlay or evas surface */
1878 obj = (Evas_Object *) display;
1879 object_type = evas_object_type_get(obj);
1881 temp = handle->display_handle;
1882 if (type == PLAYER_DISPLAY_TYPE_OVERLAY && !strcmp(object_type, "elm_win")) {
1883 /* wayland overlay surface */
1884 LOGI("Wayland overlay surface type");
1886 wl_window = elm_win_wl_window_get(obj);
1888 /* get wl_surface */
1889 handle->display_handle = (void *)ecore_wl_window_surface_get(wl_window);
1890 set_handle = handle->display_handle;
1892 /* get wl_display */
1893 handle->wl_display = (void *)ecore_wl_display_get();
1894 set_wl_display = handle->wl_display;
1896 #ifdef TIZEN_FEATURE_EVAS_RENDERER
1897 else if (type == PLAYER_DISPLAY_TYPE_EVAS && !strcmp(object_type, "image")) {
1898 /* evas object surface */
1899 LOGI("evas surface type");
1900 handle->display_handle = display;
1901 set_handle = display;
1905 LOGE("invalid surface type");
1906 return PLAYER_ERROR_INVALID_PARAMETER;
1909 LOGE("falied to get evas object type from %p", obj);
1910 return PLAYER_ERROR_INVALID_PARAMETER;
1914 /* set display handle */
1915 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE || type == handle->display_type) {
1916 /* first time or same type */
1917 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", __player_convet_display_type(type),
1918 "use_wl_surface", TRUE,
1919 "wl_display", set_wl_display, sizeof(void *),
1920 "display_overlay", set_handle, sizeof(player_display_h), (char *)NULL);
1922 if (ret != MM_ERROR_NONE) {
1923 handle->display_handle = temp;
1924 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
1926 if (type != PLAYER_DISPLAY_TYPE_NONE) {
1927 handle->display_type = type;
1928 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
1930 LOGI("NULL surface");
1933 /* changing surface case */
1934 if (handle->state >= PLAYER_STATE_READY) {
1935 LOGE("[%s] it is not available to change display surface from %d to %d", __FUNCTION__, handle->display_type, type);
1936 return PLAYER_ERROR_INVALID_OPERATION;
1938 ret = mm_player_change_videosink(handle->mm_handle, __player_convet_display_type(type), set_handle);
1939 if (ret != MM_ERROR_NONE) {
1940 handle->display_handle = temp;
1941 if (ret == MM_ERROR_NOT_SUPPORT_API) {
1942 LOGE("[%s] change video sink is not available.", __FUNCTION__);
1943 ret = PLAYER_ERROR_NONE;
1945 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
1948 handle->display_type = type;
1949 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
1953 if (ret != MM_ERROR_NONE) {
1954 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
1955 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1957 return PLAYER_ERROR_NONE;
1961 int legacy_player_set_display_mode(player_h player, player_display_mode_e mode)
1963 PLAYER_INSTANCE_CHECK(player);
1964 player_s *handle = (player_s *)player;
1965 LOGI("[%s] mode:%d", __FUNCTION__, mode);
1967 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_method", mode, (char *)NULL);
1968 if (ret != MM_ERROR_NONE)
1969 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1971 return PLAYER_ERROR_NONE;
1974 int legacy_player_get_display_mode(player_h player, player_display_mode_e *mode)
1976 PLAYER_INSTANCE_CHECK(player);
1977 PLAYER_NULL_ARG_CHECK(mode);
1978 player_s *handle = (player_s *)player;
1979 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_method", mode, (char *)NULL);
1980 if (ret != MM_ERROR_NONE)
1981 return __player_convert_error_code(ret, (char *)__FUNCTION__);
1983 return PLAYER_ERROR_NONE;
1986 int legacy_player_set_playback_rate(player_h player, float rate)
1988 LOGI("[%s] rate : %0.1f", __FUNCTION__, rate);
1989 PLAYER_INSTANCE_CHECK(player);
1990 PLAYER_CHECK_CONDITION(rate >= -5.0 && rate <= 5.0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
1991 player_s *handle = (player_s *)player;
1993 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
1994 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
1995 return PLAYER_ERROR_INVALID_STATE;
1998 int ret = mm_player_set_play_speed(handle->mm_handle, rate, FALSE);
2002 case MM_ERROR_PLAYER_NO_OP:
2003 ret = PLAYER_ERROR_NONE;
2005 case MM_ERROR_NOT_SUPPORT_API:
2006 case MM_ERROR_PLAYER_SEEK:
2007 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x) : seek error", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
2008 ret = PLAYER_ERROR_INVALID_OPERATION;
2011 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2016 int legacy_player_set_display_rotation(player_h player, player_display_rotation_e rotation)
2018 PLAYER_INSTANCE_CHECK(player);
2019 player_s *handle = (player_s *)player;
2021 int ret = mm_player_set_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_ROTATION, rotation, (char *)NULL);
2022 if (ret != MM_ERROR_NONE)
2023 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2025 return PLAYER_ERROR_NONE;
2028 int legacy_player_get_display_rotation(player_h player, player_display_rotation_e *rotation)
2030 PLAYER_INSTANCE_CHECK(player);
2031 PLAYER_NULL_ARG_CHECK(rotation);
2032 player_s *handle = (player_s *)player;
2033 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_ROTATION, rotation, (char *)NULL);
2034 if (ret != MM_ERROR_NONE)
2035 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2037 return PLAYER_ERROR_NONE;
2040 int legacy_player_set_display_visible(player_h player, bool visible)
2042 PLAYER_INSTANCE_CHECK(player);
2043 player_s *handle = (player_s *)player;
2046 if (visible == TRUE)
2049 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_visible", value, (char *)NULL);
2050 if (ret != MM_ERROR_NONE) {
2051 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2053 handle->is_display_visible = visible;
2054 return PLAYER_ERROR_NONE;
2058 int legacy_player_is_display_visible(player_h player, bool *visible)
2060 PLAYER_INSTANCE_CHECK(player);
2061 PLAYER_NULL_ARG_CHECK(visible);
2062 player_s *handle = (player_s *)player;
2064 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_visible", &count, (char *)NULL);
2065 if (ret != MM_ERROR_NONE) {
2066 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2073 return PLAYER_ERROR_NONE;
2077 int legacy_player_get_content_info(player_h player, player_content_info_e key, char **value)
2079 PLAYER_INSTANCE_CHECK(player);
2080 PLAYER_NULL_ARG_CHECK(value);
2081 player_s *handle = (player_s *)player;
2082 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2083 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2084 return PLAYER_ERROR_INVALID_STATE;
2092 case PLAYER_CONTENT_INFO_ALBUM:
2093 attr = MM_PLAYER_TAG_ALBUM;
2095 case PLAYER_CONTENT_INFO_ARTIST:
2096 attr = MM_PLAYER_TAG_ARTIST;
2098 case PLAYER_CONTENT_INFO_AUTHOR:
2099 attr = MM_PLAYER_TAG_AUTHOUR;
2101 case PLAYER_CONTENT_INFO_GENRE:
2102 attr = MM_PLAYER_TAG_GENRE;
2104 case PLAYER_CONTENT_INFO_TITLE:
2105 attr = MM_PLAYER_TAG_TITLE;
2107 case PLAYER_CONTENT_INFO_YEAR:
2108 attr = MM_PLAYER_TAG_DATE;
2114 int ret = mm_player_get_attribute(handle->mm_handle, NULL, attr, &val, &val_len, (char *)NULL);
2115 if (ret != MM_ERROR_NONE) {
2116 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2120 *value = strndup(val, val_len);
2122 *value = strndup("", 0);
2124 if (*value == NULL) {
2125 LOGE("[%s] PLAYER_ERROR_OUT_OF_MEMORY(0x%08x) : fail to strdup ", __FUNCTION__, PLAYER_ERROR_OUT_OF_MEMORY);
2126 return PLAYER_ERROR_OUT_OF_MEMORY;
2128 return PLAYER_ERROR_NONE;
2132 int legacy_player_get_codec_info(player_h player, char **audio_codec, char **video_codec)
2134 PLAYER_INSTANCE_CHECK(player);
2135 PLAYER_NULL_ARG_CHECK(audio_codec);
2136 PLAYER_NULL_ARG_CHECK(video_codec);
2137 player_s *handle = (player_s *)player;
2138 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2139 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2140 return PLAYER_ERROR_INVALID_STATE;
2148 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_AUDIO_CODEC, &audio, &audio_len, MM_PLAYER_VIDEO_CODEC, &video, &video_len, (char *)NULL);
2149 if (ret != MM_ERROR_NONE) {
2150 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2152 *audio_codec = NULL;
2154 *audio_codec = strndup(audio, audio_len);
2156 *audio_codec = strndup("", 0);
2158 *video_codec = NULL;
2160 *video_codec = strndup(video, video_len);
2162 *video_codec = strndup("", 0);
2164 LOGD("codec info: %s, %s", *audio_codec, *video_codec);
2165 return PLAYER_ERROR_NONE;
2169 int legacy_player_get_audio_stream_info(player_h player, int *sample_rate, int *channel, int *bit_rate)
2171 PLAYER_INSTANCE_CHECK(player);
2172 PLAYER_NULL_ARG_CHECK(sample_rate);
2173 PLAYER_NULL_ARG_CHECK(channel);
2174 PLAYER_NULL_ARG_CHECK(bit_rate);
2175 player_s *handle = (player_s *)player;
2176 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2177 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2178 return PLAYER_ERROR_INVALID_STATE;
2180 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_AUDIO_SAMPLERATE, sample_rate, MM_PLAYER_AUDIO_CHANNEL, channel, MM_PLAYER_AUDIO_BITRATE, bit_rate, (char *)NULL);
2181 if (ret != MM_ERROR_NONE)
2182 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2184 return PLAYER_ERROR_NONE;
2187 int legacy_player_get_video_stream_info(player_h player, int *fps, int *bit_rate)
2189 PLAYER_INSTANCE_CHECK(player);
2190 PLAYER_NULL_ARG_CHECK(fps);
2191 PLAYER_NULL_ARG_CHECK(bit_rate);
2192 player_s *handle = (player_s *)player;
2193 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2194 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2195 return PLAYER_ERROR_INVALID_STATE;
2197 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "content_video_fps", fps, "content_video_bitrate", bit_rate, (char *)NULL);
2198 if (ret != MM_ERROR_NONE)
2199 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2201 return PLAYER_ERROR_NONE;
2204 int legacy_player_get_video_size(player_h player, int *width, int *height)
2206 PLAYER_INSTANCE_CHECK(player);
2207 PLAYER_NULL_ARG_CHECK(width);
2208 PLAYER_NULL_ARG_CHECK(height);
2209 player_s *handle = (player_s *)player;
2210 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2211 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2212 return PLAYER_ERROR_INVALID_STATE;
2216 int ret = mm_player_get_attribute(handle->mm_handle, NULL, MM_PLAYER_VIDEO_WIDTH, &w, MM_PLAYER_VIDEO_HEIGHT, &h, (char *)NULL);
2217 if (ret != MM_ERROR_NONE) {
2218 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2222 LOGI("[%s] width : %d, height : %d", __FUNCTION__, w, h);
2223 return PLAYER_ERROR_NONE;
2227 int legacy_player_get_album_art(player_h player, void **album_art, int *size)
2229 PLAYER_INSTANCE_CHECK(player);
2230 PLAYER_NULL_ARG_CHECK(size);
2231 player_s *handle = (player_s *)player;
2232 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2233 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2234 return PLAYER_ERROR_INVALID_STATE;
2237 int ret = mm_player_get_attribute(handle->mm_handle, NULL, "tag_album_cover", album_art, size, (char *)NULL);
2238 if (ret != MM_ERROR_NONE)
2239 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2241 return PLAYER_ERROR_NONE;
2244 int legacy_player_audio_effect_get_equalizer_bands_count(player_h player, int *count)
2246 PLAYER_INSTANCE_CHECK(player);
2247 PLAYER_NULL_ARG_CHECK(count);
2248 player_s *handle = (player_s *)player;
2250 int ret = mm_player_audio_effect_custom_get_eq_bands_number(handle->mm_handle, count);
2251 if (ret != MM_ERROR_NONE)
2252 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2254 return PLAYER_ERROR_NONE;
2257 int legacy_player_audio_effect_set_equalizer_all_bands(player_h player, int *band_levels, int length)
2259 PLAYER_INSTANCE_CHECK(player);
2260 PLAYER_NULL_ARG_CHECK(band_levels);
2261 player_s *handle = (player_s *)player;
2263 int ret = mm_player_audio_effect_custom_set_level_eq_from_list(handle->mm_handle, band_levels, length);
2264 if (ret != MM_ERROR_NONE) {
2265 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2267 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
2268 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
2272 int legacy_player_audio_effect_set_equalizer_band_level(player_h player, int index, int level)
2274 PLAYER_INSTANCE_CHECK(player);
2275 player_s *handle = (player_s *)player;
2277 int ret = mm_player_audio_effect_custom_set_level(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, index, level);
2278 if (ret != MM_ERROR_NONE) {
2279 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2281 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
2282 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
2286 int legacy_player_audio_effect_get_equalizer_band_level(player_h player, int index, int *level)
2288 PLAYER_INSTANCE_CHECK(player);
2289 PLAYER_NULL_ARG_CHECK(level);
2290 player_s *handle = (player_s *)player;
2292 int ret = mm_player_audio_effect_custom_get_level(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, index, level);
2293 if (ret != MM_ERROR_NONE)
2294 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2296 return PLAYER_ERROR_NONE;
2299 int legacy_player_audio_effect_get_equalizer_level_range(player_h player, int *min, int *max)
2301 PLAYER_INSTANCE_CHECK(player);
2302 PLAYER_NULL_ARG_CHECK(min);
2303 PLAYER_NULL_ARG_CHECK(max);
2304 player_s *handle = (player_s *)player;
2306 int ret = mm_player_audio_effect_custom_get_level_range(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ, min, max);
2307 if (ret != MM_ERROR_NONE)
2308 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2310 return PLAYER_ERROR_NONE;
2313 int legacy_player_audio_effect_get_equalizer_band_frequency(player_h player, int index, int *frequency)
2315 PLAYER_INSTANCE_CHECK(player);
2316 PLAYER_NULL_ARG_CHECK(frequency);
2317 player_s *handle = (player_s *)player;
2319 int ret = mm_player_audio_effect_custom_get_eq_bands_freq(handle->mm_handle, index, frequency);
2320 if (ret != MM_ERROR_NONE)
2321 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2323 return PLAYER_ERROR_NONE;
2326 int legacy_player_audio_effect_get_equalizer_band_frequency_range(player_h player, int index, int *range)
2328 PLAYER_INSTANCE_CHECK(player);
2329 PLAYER_NULL_ARG_CHECK(range);
2330 player_s *handle = (player_s *)player;
2332 int ret = mm_player_audio_effect_custom_get_eq_bands_width(handle->mm_handle, index, range);
2333 if (ret != MM_ERROR_NONE)
2334 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2336 return PLAYER_ERROR_NONE;
2339 int legacy_player_audio_effect_equalizer_clear(player_h player)
2341 PLAYER_INSTANCE_CHECK(player);
2342 player_s *handle = (player_s *)player;
2344 int ret = mm_player_audio_effect_custom_clear_eq_all(handle->mm_handle);
2345 if (ret != MM_ERROR_NONE) {
2346 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2348 ret = mm_player_audio_effect_custom_apply(handle->mm_handle);
2349 return (ret == MM_ERROR_NONE) ? PLAYER_ERROR_NONE : __player_convert_error_code(ret, (char *)__FUNCTION__);
2353 int legacy_player_audio_effect_equalizer_is_available(player_h player, bool *available)
2355 PLAYER_INSTANCE_CHECK(player);
2356 PLAYER_NULL_ARG_CHECK(available);
2357 player_s *handle = (player_s *)player;
2359 int ret = mm_player_is_supported_custom_effect_type(handle->mm_handle, MM_AUDIO_EFFECT_CUSTOM_EQ);
2360 if (ret != MM_ERROR_NONE)
2364 return PLAYER_ERROR_NONE;
2367 int legacy_player_set_subtitle_path(player_h player, const char *path)
2369 PLAYER_INSTANCE_CHECK(player);
2370 player_s *handle = (player_s *)player;
2372 if ((path == NULL) && (handle->state != PLAYER_STATE_IDLE))
2373 return PLAYER_ERROR_INVALID_PARAMETER;
2375 int ret = mm_player_set_external_subtitle_path(handle->mm_handle, path);
2376 if (ret != MM_ERROR_NONE)
2377 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2379 return PLAYER_ERROR_NONE;
2382 int legacy_player_set_subtitle_position_offset(player_h player, int millisecond)
2384 PLAYER_INSTANCE_CHECK(player);
2385 /* PLAYER_CHECK_CONDITION(millisecond>=0 ,PLAYER_ERROR_INVALID_PARAMETER ,"PLAYER_ERROR_INVALID_PARAMETER" ); */
2386 player_s *handle = (player_s *)player;
2387 if (!__player_state_validate(handle, PLAYER_STATE_PLAYING)) {
2388 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2389 return PLAYER_ERROR_INVALID_STATE;
2392 int ret = mm_player_adjust_subtitle_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_TIME, millisecond);
2393 if (ret != MM_ERROR_NONE)
2394 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2396 return PLAYER_ERROR_NONE;
2399 int legacy_player_set_progressive_download_path(player_h player, const char *path)
2401 PLAYER_INSTANCE_CHECK(player);
2402 PLAYER_NULL_ARG_CHECK(path);
2404 player_s *handle = (player_s *)player;
2405 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2407 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "pd_mode", MM_PLAYER_PD_MODE_URI, "pd_location", path, strlen(path), (char *)NULL);
2408 if (ret != MM_ERROR_NONE) {
2409 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2411 handle->is_progressive_download = 1;
2412 return PLAYER_ERROR_NONE;
2416 int legacy_player_get_progressive_download_status(player_h player, unsigned long *current, unsigned long *total_size)
2419 PLAYER_INSTANCE_CHECK(player);
2420 PLAYER_NULL_ARG_CHECK(current);
2421 PLAYER_NULL_ARG_CHECK(total_size);
2422 player_s *handle = (player_s *)player;
2423 if (handle->state != PLAYER_STATE_PLAYING && handle->state != PLAYER_STATE_PAUSED) {
2424 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2425 return PLAYER_ERROR_INVALID_STATE;
2429 int ret = mm_player_get_pd_status(handle->mm_handle, &_current, &_total);
2430 if (ret != MM_ERROR_NONE) {
2431 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2433 *current = _current;
2434 *total_size = _total;
2435 return PLAYER_ERROR_NONE;
2439 int legacy_player_capture_video(player_h player, player_video_captured_cb callback, void *user_data)
2441 PLAYER_INSTANCE_CHECK(player);
2442 PLAYER_NULL_ARG_CHECK(callback);
2444 player_s *handle = (player_s *)player;
2445 if (handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE]) {
2446 LOGE("[%s] PLAYER_ERROR_VIDEO_CAPTURE_FAILED (0x%08x) : capturing... we can't do any more ", __FUNCTION__, PLAYER_ERROR_VIDEO_CAPTURE_FAILED);
2447 return PLAYER_ERROR_VIDEO_CAPTURE_FAILED;
2449 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_CAPTURE);
2450 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = callback;
2451 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = user_data;
2454 if (handle->state >= PLAYER_STATE_READY) {
2455 int ret = mm_player_do_video_capture(handle->mm_handle);
2456 if (ret == MM_ERROR_PLAYER_NO_OP) {
2457 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2458 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2459 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION (0x%08x) : video display must be set : %d", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION, handle->display_type);
2460 return PLAYER_ERROR_INVALID_OPERATION;
2462 if (ret != MM_ERROR_NONE) {
2463 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2464 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2465 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2467 return PLAYER_ERROR_NONE;
2469 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2470 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2471 handle->user_data[MUSE_PLAYER_EVENT_TYPE_CAPTURE] = NULL;
2472 return PLAYER_ERROR_INVALID_STATE;
2476 int legacy_player_set_streaming_cookie(player_h player, const char *cookie, int size)
2478 PLAYER_INSTANCE_CHECK(player);
2479 PLAYER_NULL_ARG_CHECK(cookie);
2480 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2481 player_s *handle = (player_s *)player;
2482 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2484 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "streaming_cookie", cookie, size, (char *)NULL);
2485 if (ret != MM_ERROR_NONE)
2486 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2488 return PLAYER_ERROR_NONE;
2491 int legacy_player_set_streaming_user_agent(player_h player, const char *user_agent, int size)
2493 PLAYER_INSTANCE_CHECK(player);
2494 PLAYER_NULL_ARG_CHECK(user_agent);
2495 PLAYER_CHECK_CONDITION(size >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
2496 player_s *handle = (player_s *)player;
2497 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2499 int ret = mm_player_set_attribute(handle->mm_handle, NULL, "streaming_user_agent", user_agent, size, (char *)NULL);
2500 if (ret != MM_ERROR_NONE)
2501 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2503 return PLAYER_ERROR_NONE;
2506 int legacy_player_get_streaming_download_progress(player_h player, int *start, int *current)
2508 PLAYER_INSTANCE_CHECK(player);
2509 PLAYER_NULL_ARG_CHECK(start);
2510 PLAYER_NULL_ARG_CHECK(current);
2511 player_s *handle = (player_s *)player;
2512 if (handle->state != PLAYER_STATE_PLAYING && handle->state != PLAYER_STATE_PAUSED) {
2513 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2514 return PLAYER_ERROR_INVALID_STATE;
2516 unsigned long _current = 0;
2517 unsigned long _start = 0;
2518 int ret = mm_player_get_buffer_position(handle->mm_handle, MM_PLAYER_POS_FORMAT_PERCENT, &_start, &_current);
2519 if (ret != MM_ERROR_NONE) {
2520 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2522 *start = (int)_start;
2523 *current = (int)_current;
2524 return PLAYER_ERROR_NONE;
2528 int legacy_player_set_completed_cb(player_h player, player_completed_cb callback, void *user_data)
2530 return __set_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player, callback, user_data);
2533 int legacy_player_unset_completed_cb(player_h player)
2535 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_COMPLETE, player);
2538 int legacy_player_set_interrupted_cb(player_h player, player_interrupted_cb callback, void *user_data)
2540 return __set_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player, callback, user_data);
2543 int legacy_player_unset_interrupted_cb(player_h player)
2545 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_INTERRUPT, player);
2548 int legacy_player_set_error_cb(player_h player, player_error_cb callback, void *user_data)
2550 return __set_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player, callback, user_data);
2553 int legacy_player_unset_error_cb(player_h player)
2555 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_ERROR, player);
2558 int legacy_player_set_buffering_cb(player_h player, player_buffering_cb callback, void *user_data)
2560 return __set_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player, callback, user_data);
2563 int legacy_player_unset_buffering_cb(player_h player)
2565 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_BUFFERING, player);
2568 int legacy_player_set_subtitle_updated_cb(player_h player, player_subtitle_updated_cb callback, void *user_data)
2570 return __set_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player, callback, user_data);
2573 int legacy_player_unset_subtitle_updated_cb(player_h player)
2575 return __unset_callback(MUSE_PLAYER_EVENT_TYPE_SUBTITLE, player);
2578 int legacy_player_set_progressive_download_message_cb(player_h player, player_pd_message_cb callback, void *user_data)
2580 PLAYER_INSTANCE_CHECK(player);
2581 PLAYER_NULL_ARG_CHECK(callback);
2583 player_s *handle = (player_s *)player;
2585 if (handle->state != PLAYER_STATE_IDLE && handle->state != PLAYER_STATE_READY) {
2586 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2587 return PLAYER_ERROR_INVALID_STATE;
2590 int ret = mm_player_set_pd_message_callback(handle->mm_handle, __pd_message_callback, (void *)handle);
2591 if (ret != MM_ERROR_NONE)
2592 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2594 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD] = callback;
2595 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD] = user_data;
2596 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PD);
2597 return PLAYER_ERROR_NONE;
2600 int legacy_player_unset_progressive_download_message_cb(player_h player)
2602 PLAYER_INSTANCE_CHECK(player);
2603 player_s *handle = (player_s *)player;
2605 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
2606 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_PD] = NULL;
2607 handle->user_data[MUSE_PLAYER_EVENT_TYPE_PD] = NULL;
2608 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_PD);
2609 LOGI("[%s] Event type : %d ", __FUNCTION__, MUSE_PLAYER_EVENT_TYPE_PD);
2611 int ret = mm_player_set_pd_message_callback(handle->mm_handle, NULL, NULL);
2612 if (ret != MM_ERROR_NONE)
2613 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2615 return PLAYER_ERROR_NONE;
2618 int legacy_player_set_media_packet_video_frame_decoded_cb(player_h player, player_media_packet_video_decoded_cb callback, void *user_data)
2620 PLAYER_INSTANCE_CHECK(player);
2621 PLAYER_NULL_ARG_CHECK(callback);
2623 player_s *handle = (player_s *)player;
2624 if (handle->state != PLAYER_STATE_IDLE) {
2625 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2626 return PLAYER_ERROR_INVALID_STATE;
2629 int ret = mm_player_set_video_stream_callback(handle->mm_handle, __video_stream_callback, (void *)handle);
2630 if (ret != MM_ERROR_NONE)
2631 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2633 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME] = callback;
2634 handle->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME] = user_data;
2635 LOGI("Event type : %d ", MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
2637 return PLAYER_ERROR_NONE;
2640 int legacy_player_unset_media_packet_video_frame_decoded_cb(player_h player)
2642 PLAYER_INSTANCE_CHECK(player);
2643 player_s *handle = (player_s *)player;
2645 LEGACY_PLAYER_USER_CB_LOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
2647 handle->user_cb[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME] = NULL;
2648 handle->user_data[MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME] = NULL;
2650 LEGACY_PLAYER_USER_CB_UNLOCK(handle, MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
2652 LOGI("Event type : %d ", MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME);
2654 int ret = mm_player_set_video_stream_callback(handle->mm_handle, NULL, NULL);
2655 if (ret != MM_ERROR_NONE)
2656 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2658 return PLAYER_ERROR_NONE;
2661 static bool __video_stream_changed_callback(void *user_data)
2663 player_s *handle = (player_s *)user_data;
2664 muse_player_event_e event_type = MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED;
2666 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2668 if (handle->user_cb[event_type]) {
2669 int width = 0, height = 0, fps = 0, bit_rate = 0;
2670 int ret = mm_player_get_attribute(handle->mm_handle, NULL,
2671 MM_PLAYER_VIDEO_WIDTH, &width,
2672 MM_PLAYER_VIDEO_HEIGHT, &height,
2673 "content_video_fps", &fps,
2674 "content_video_bitrate", &bit_rate, (char *)NULL);
2676 if (ret != MM_ERROR_NONE) {
2677 LOGE("[%s] get attr is failed", __FUNCTION__);
2681 ((player_video_stream_changed_cb)handle->user_cb[event_type])(width, height, fps, bit_rate, handle->user_data[event_type]);
2683 LOGE("[%s] video stream changed cb was not set.", __FUNCTION__);
2690 int legacy_player_set_video_stream_changed_cb(player_h player, player_video_stream_changed_cb callback, void *user_data)
2693 PLAYER_INSTANCE_CHECK(player);
2694 PLAYER_NULL_ARG_CHECK(callback);
2695 player_s *handle = (player_s *)player;
2697 if (handle->state != PLAYER_STATE_IDLE) {
2698 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2699 return PLAYER_ERROR_INVALID_STATE;
2702 ret = mm_player_set_video_stream_changed_callback(handle->mm_handle, (mm_player_stream_changed_callback)__video_stream_changed_callback, (void *)handle);
2704 if (ret != MM_ERROR_NONE)
2705 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2707 return __set_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player, callback, user_data);
2710 int legacy_player_unset_video_stream_changed_cb(player_h player)
2713 PLAYER_INSTANCE_CHECK(player);
2714 player_s *handle = (player_s *)player;
2716 __unset_callback(MUSE_PLAYER_EVENT_TYPE_VIDEO_STREAM_CHANGED, player);
2718 ret = mm_player_set_video_stream_changed_callback(handle->mm_handle, NULL, NULL);
2719 if (ret != MM_ERROR_NONE)
2720 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2722 return PLAYER_ERROR_NONE;
2725 static bool __media_stream_buffer_status_callback(player_stream_type_e type, player_media_stream_buffer_status_e status, unsigned long long bytes, void *user_data)
2727 player_s *handle = (player_s *)user_data;
2728 muse_player_event_e event_type;
2730 if (type == PLAYER_STREAM_TYPE_AUDIO)
2731 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS;
2732 else if (type == PLAYER_STREAM_TYPE_VIDEO)
2733 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS;
2737 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2739 if (handle->user_cb[event_type]) {
2740 ((player_media_stream_buffer_status_cb)handle->user_cb[event_type])(status, handle->user_data[event_type]);
2742 LOGE("[%s][type:%d] buffer status cb was not set.", __FUNCTION__, type);
2749 static bool __media_stream_seek_data_callback(player_stream_type_e type, unsigned long long offset, void *user_data)
2751 player_s *handle = (player_s *)user_data;
2752 muse_player_event_e event_type;
2754 if (type == PLAYER_STREAM_TYPE_AUDIO)
2755 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK;
2756 else if (type == PLAYER_STREAM_TYPE_VIDEO)
2757 event_type = MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK;
2761 LOGE("[%s] event type %d", __FUNCTION__, event_type);
2763 if (handle->user_cb[event_type]) {
2764 ((player_media_stream_seek_cb)handle->user_cb[event_type])(offset, handle->user_data[event_type]);
2766 LOGE("[%s][type:%d] seek cb was not set.", __FUNCTION__, type);
2773 int legacy_player_set_media_stream_buffer_status_cb(player_h player, player_stream_type_e type, player_media_stream_buffer_status_cb callback, void *user_data)
2776 PLAYER_INSTANCE_CHECK(player);
2777 PLAYER_NULL_ARG_CHECK(callback);
2778 player_s *handle = (player_s *)player;
2780 if (handle->state != PLAYER_STATE_IDLE) {
2781 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2782 return PLAYER_ERROR_INVALID_STATE;
2784 /* the type can be expaned with default and text. */
2785 if ((type != PLAYER_STREAM_TYPE_VIDEO) && (type != PLAYER_STREAM_TYPE_AUDIO)) {
2786 LOGE("[%s] PLAYER_ERROR_INVALID_PARAMETER(type : %d)", __FUNCTION__, type);
2787 return PLAYER_ERROR_INVALID_PARAMETER;
2790 ret = mm_player_set_media_stream_buffer_status_callback(handle->mm_handle, type, (mm_player_media_stream_buffer_status_callback)__media_stream_buffer_status_callback, (void *)handle);
2792 if (ret != MM_ERROR_NONE)
2793 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2795 if (type == PLAYER_STREAM_TYPE_VIDEO)
2796 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS, player, callback, user_data);
2798 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS, player, callback, user_data);
2801 int legacy_player_unset_media_stream_buffer_status_cb(player_h player, player_stream_type_e type)
2804 PLAYER_INSTANCE_CHECK(player);
2805 player_s *handle = (player_s *)player;
2807 if (type == PLAYER_STREAM_TYPE_VIDEO)
2808 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_BUFFER_STATUS, player);
2809 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2810 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_BUFFER_STATUS, player);
2812 return PLAYER_ERROR_INVALID_PARAMETER;
2814 ret = mm_player_set_media_stream_buffer_status_callback(handle->mm_handle, type, NULL, NULL);
2815 if (ret != MM_ERROR_NONE)
2816 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2818 return PLAYER_ERROR_NONE;
2821 int legacy_player_set_media_stream_seek_cb(player_h player, player_stream_type_e type, player_media_stream_seek_cb callback, void *user_data)
2824 PLAYER_INSTANCE_CHECK(player);
2825 PLAYER_NULL_ARG_CHECK(callback);
2826 player_s *handle = (player_s *)player;
2828 if (handle->state != PLAYER_STATE_IDLE) {
2829 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2830 return PLAYER_ERROR_INVALID_STATE;
2832 /* the type can be expaned with default and text. */
2833 if ((type != PLAYER_STREAM_TYPE_VIDEO) && (type != PLAYER_STREAM_TYPE_AUDIO)) {
2834 LOGE("[%s] PLAYER_ERROR_INVALID_PARAMETER(type : %d)", __FUNCTION__, type);
2835 return PLAYER_ERROR_INVALID_PARAMETER;
2838 ret = mm_player_set_media_stream_seek_data_callback(handle->mm_handle, type, (mm_player_media_stream_seek_data_callback)__media_stream_seek_data_callback, (void *)handle);
2840 if (ret != MM_ERROR_NONE)
2841 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2843 if (type == PLAYER_STREAM_TYPE_VIDEO)
2844 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK, player, callback, user_data);
2846 return __set_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK, player, callback, user_data);
2849 int legacy_player_unset_media_stream_seek_cb(player_h player, player_stream_type_e type)
2852 PLAYER_INSTANCE_CHECK(player);
2853 player_s *handle = (player_s *)player;
2855 if (type == PLAYER_STREAM_TYPE_VIDEO)
2856 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_VIDEO_SEEK, player);
2857 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2858 __unset_callback(MUSE_PLAYER_EVENT_TYPE_MEDIA_STREAM_AUDIO_SEEK, player);
2860 return PLAYER_ERROR_INVALID_PARAMETER;
2862 ret = mm_player_set_media_stream_seek_data_callback(handle->mm_handle, type, NULL, NULL);
2863 if (ret != MM_ERROR_NONE)
2864 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2866 return PLAYER_ERROR_NONE;
2869 int legacy_player_push_media_stream(player_h player, media_packet_h packet)
2871 PLAYER_INSTANCE_CHECK(player);
2872 player_s *handle = (player_s *)player;
2874 PLAYER_CHECK_CONDITION(handle->error_code == PLAYER_ERROR_NONE, PLAYER_ERROR_NOT_SUPPORTED_FILE, "can't support this format");
2876 int ret = mm_player_submit_packet(handle->mm_handle, packet);
2878 if (ret != MM_ERROR_NONE)
2879 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2881 return PLAYER_ERROR_NONE;
2884 int legacy_player_set_media_stream_info(player_h player, player_stream_type_e type, media_format_h format)
2887 PLAYER_INSTANCE_CHECK(player);
2888 player_s *handle = (player_s *)player;
2889 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
2891 handle->is_media_stream = TRUE;
2893 if (type == PLAYER_STREAM_TYPE_VIDEO)
2894 ret = mm_player_set_video_info(handle->mm_handle, format);
2895 else if (type == PLAYER_STREAM_TYPE_AUDIO)
2896 ret = mm_player_set_audio_info(handle->mm_handle, format);
2898 return PLAYER_ERROR_INVALID_PARAMETER;
2900 if (ret != MM_ERROR_NONE)
2901 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2903 return PLAYER_ERROR_NONE;
2905 return PLAYER_ERROR_NONE;
2908 int legacy_player_set_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long max_size)
2911 PLAYER_INSTANCE_CHECK(player);
2912 player_s *handle = (player_s *)player;
2913 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2914 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2915 return PLAYER_ERROR_INVALID_STATE;
2918 ret = mm_player_set_media_stream_buffer_max_size(handle->mm_handle, type, max_size);
2920 if (ret != MM_ERROR_NONE)
2921 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2923 return PLAYER_ERROR_NONE;
2926 int legacy_player_get_media_stream_buffer_max_size(player_h player, player_stream_type_e type, unsigned long long *max_size)
2928 PLAYER_INSTANCE_CHECK(player);
2929 PLAYER_NULL_ARG_CHECK(max_size);
2930 player_s *handle = (player_s *)player;
2932 unsigned long long _max_size;
2933 int ret = mm_player_get_media_stream_buffer_max_size(handle->mm_handle, type, &_max_size);
2934 if (ret != MM_ERROR_NONE) {
2935 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2937 *max_size = _max_size;
2938 return PLAYER_ERROR_NONE;
2942 int legacy_player_set_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int percent)
2945 PLAYER_INSTANCE_CHECK(player);
2946 player_s *handle = (player_s *)player;
2947 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
2948 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2949 return PLAYER_ERROR_INVALID_STATE;
2952 ret = mm_player_set_media_stream_buffer_min_percent(handle->mm_handle, type, percent);
2954 if (ret != MM_ERROR_NONE)
2955 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2957 return PLAYER_ERROR_NONE;
2960 int legacy_player_get_media_stream_buffer_min_threshold(player_h player, player_stream_type_e type, unsigned int *percent)
2962 PLAYER_INSTANCE_CHECK(player);
2963 PLAYER_NULL_ARG_CHECK(percent);
2964 player_s *handle = (player_s *)player;
2966 unsigned int _value;
2967 int ret = mm_player_get_media_stream_buffer_min_percent(handle->mm_handle, type, &_value);
2968 if (ret != MM_ERROR_NONE) {
2969 return __player_convert_error_code(ret, (char *)__FUNCTION__);
2972 return PLAYER_ERROR_NONE;
2976 int legacy_player_get_track_count(player_h player, player_stream_type_e type, int *count)
2978 PLAYER_INSTANCE_CHECK(player);
2979 PLAYER_NULL_ARG_CHECK(count);
2980 player_s *handle = (player_s *)player;
2982 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
2983 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
2984 return PLAYER_ERROR_INVALID_STATE;
2987 MMPlayerTrackType track_type = 0;
2989 case PLAYER_STREAM_TYPE_AUDIO:
2990 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
2992 case PLAYER_STREAM_TYPE_TEXT:
2993 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
2996 LOGE("invalid stream type %d", type);
2997 return PLAYER_ERROR_INVALID_PARAMETER;
3000 int ret = mm_player_get_track_count(handle->mm_handle, track_type, count);
3001 if (ret != MM_ERROR_NONE)
3002 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3004 return PLAYER_ERROR_NONE;
3007 int legacy_player_get_current_track(player_h player, player_stream_type_e type, int *index)
3009 PLAYER_INSTANCE_CHECK(player);
3010 PLAYER_NULL_ARG_CHECK(index);
3011 player_s *handle = (player_s *)player;
3013 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
3014 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
3015 return PLAYER_ERROR_INVALID_STATE;
3018 MMPlayerTrackType track_type = 0;
3020 case PLAYER_STREAM_TYPE_AUDIO:
3021 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
3023 case PLAYER_STREAM_TYPE_TEXT:
3024 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
3027 LOGE("invalid stream type %d", type);
3028 return PLAYER_ERROR_INVALID_PARAMETER;
3031 int ret = mm_player_get_current_track(handle->mm_handle, track_type, index);
3032 if (ret != MM_ERROR_NONE)
3033 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3035 return PLAYER_ERROR_NONE;
3038 int legacy_player_select_track(player_h player, player_stream_type_e type, int index)
3040 PLAYER_INSTANCE_CHECK(player);
3041 PLAYER_CHECK_CONDITION(index >= 0, PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER");
3042 player_s *handle = (player_s *)player;
3044 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
3045 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
3046 return PLAYER_ERROR_INVALID_STATE;
3049 MMPlayerTrackType track_type = 0;
3051 case PLAYER_STREAM_TYPE_AUDIO:
3052 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
3054 case PLAYER_STREAM_TYPE_TEXT:
3055 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
3058 LOGE("invalid stream type %d", type);
3059 return PLAYER_ERROR_INVALID_PARAMETER;
3062 int ret = mm_player_select_track(handle->mm_handle, track_type, index);
3063 if (ret != MM_ERROR_NONE)
3064 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3066 return PLAYER_ERROR_NONE;
3069 int legacy_player_get_track_language_code(player_h player, player_stream_type_e type, int index, char **code, int *len)
3071 PLAYER_INSTANCE_CHECK(player);
3072 PLAYER_NULL_ARG_CHECK(code);
3073 PLAYER_NULL_ARG_CHECK(len);
3074 player_s *handle = (player_s *)player;
3075 if (!__player_state_validate(handle, PLAYER_STATE_READY)) {
3076 LOGE("[%s] PLAYER_ERROR_INVALID_STATE (0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
3077 return PLAYER_ERROR_INVALID_STATE;
3080 char *language_code = NULL;
3081 MMPlayerTrackType track_type = 0;
3083 case PLAYER_STREAM_TYPE_AUDIO:
3084 track_type = MM_PLAYER_TRACK_TYPE_AUDIO;
3086 case PLAYER_STREAM_TYPE_VIDEO:
3087 track_type = MM_PLAYER_TRACK_TYPE_VIDEO;
3089 case PLAYER_STREAM_TYPE_TEXT:
3090 track_type = MM_PLAYER_TRACK_TYPE_TEXT;
3093 LOGE("invalid stream type %d", type);
3094 return PLAYER_ERROR_INVALID_PARAMETER;
3097 int ret = mm_player_get_track_language_code(handle->mm_handle, track_type, index, &language_code);
3098 if (ret != MM_ERROR_NONE) {
3099 if (language_code != NULL)
3100 free(language_code);
3102 language_code = NULL;
3103 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3107 if (language_code != NULL && strncmp(language_code, "und", 3)) {
3109 *code = strndup(language_code, code_len);
3112 *code = strndup("und", code_len);
3117 free(language_code);
3119 language_code = NULL;
3120 return PLAYER_ERROR_NONE;
3124 int legacy_player_set_roi_area(player_h player, int x, int y, int w, int h)
3126 PLAYER_INSTANCE_CHECK(player);
3127 player_s *handle = (player_s *)player;
3133 /* check roi display mode */
3134 ret = mm_player_get_attribute(handle->mm_handle, NULL, "display_method", &mode, (char *)NULL);
3135 if (ret != MM_ERROR_NONE)
3136 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3137 if (mode != MM_DISPLAY_METHOD_CUSTOM_ROI) {
3138 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
3139 return PLAYER_ERROR_INVALID_OPERATION;
3143 ret = mm_player_set_attribute(handle->mm_handle, NULL, "wl_window_render_x", x, "wl_window_render_y", y, "wl_window_render_width", w, "wl_window_render_height", h, (char *)NULL);
3144 if (ret != MM_ERROR_NONE)
3145 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3147 return PLAYER_ERROR_NONE;
3150 int legacy_player_set_display_wl_for_mused(player_h player, player_display_type_e type, unsigned int wl_surface_id)
3152 PLAYER_INSTANCE_CHECK(player);
3153 player_s *handle = (player_s *)player;
3154 void *set_handle = NULL;
3155 MMDisplaySurfaceType mmType = __player_convet_display_type(type);
3158 if (!__player_state_validate(handle, PLAYER_STATE_IDLE)) {
3159 LOGE("[%s] PLAYER_ERROR_INVALID_STATE(0x%08x) : current state - %d", __FUNCTION__, PLAYER_ERROR_INVALID_STATE, handle->state);
3160 return PLAYER_ERROR_INVALID_STATE;
3162 if (handle->is_set_pixmap_cb) {
3163 if (handle->state < PLAYER_STATE_READY) {
3164 /* just set below and go to "changing surface case" */
3165 handle->is_set_pixmap_cb = FALSE;
3167 LOGE("[%s] pixmap callback was set, try it again after calling legacy_player_unprepare()", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
3168 LOGE("[%s] PLAYER_ERROR_INVALID_OPERATION(0x%08x)", __FUNCTION__, PLAYER_ERROR_INVALID_OPERATION);
3169 return PLAYER_ERROR_INVALID_OPERATION;
3174 if (type == PLAYER_DISPLAY_TYPE_NONE) {
3176 handle->display_handle = 0;
3177 handle->display_type = type;
3180 /* get handle from overlay or evas surface */
3181 temp = handle->display_handle;
3182 if (type == PLAYER_DISPLAY_TYPE_OVERLAY) {
3183 LOGI("Wayland overlay surface type");
3184 LOGI("wl_surface_id %d", wl_surface_id);
3185 handle->display_handle = (void *)(uintptr_t)wl_surface_id;
3186 set_handle = &(handle->display_handle);
3187 #ifdef TIZEN_FEATURE_EVAS_RENDERER
3188 } else if (type == PLAYER_DISPLAY_TYPE_EVAS) {
3189 LOGI("Evas surface type");
3190 set_handle = &(handle->display_handle);
3193 LOGE("invalid surface type");
3194 return PLAYER_ERROR_INVALID_PARAMETER;
3198 /* set display handle */
3199 if (handle->display_type == PLAYER_DISPLAY_TYPE_NONE || type == handle->display_type) {
3200 /* first time or same type */
3201 LOGW("first time or same type");
3202 ret = mm_player_set_attribute(handle->mm_handle, NULL, "display_surface_type", mmType, "display_overlay", set_handle, sizeof(wl_surface_id), NULL);
3204 if (ret != MM_ERROR_NONE) {
3205 handle->display_handle = temp;
3206 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
3208 if (type != PLAYER_DISPLAY_TYPE_NONE) {
3209 handle->display_type = type;
3210 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
3212 LOGI("NULL surface");
3215 /* changing surface case */
3216 ret = mm_player_change_videosink(handle->mm_handle, mmType, set_handle);
3217 if (ret != MM_ERROR_NONE) {
3218 handle->display_handle = temp;
3219 if (ret == MM_ERROR_NOT_SUPPORT_API) {
3220 LOGE("[%s] change video sink is not available.", __FUNCTION__);
3221 ret = PLAYER_ERROR_NONE;
3223 LOGE("[%s] Failed to display surface change :%d", __FUNCTION__, ret);
3226 handle->display_type = type;
3227 LOGI("[%s] video display has been changed- type :%d, addr : 0x%x", __FUNCTION__, handle->display_type, handle->display_handle);
3231 if (ret != MM_ERROR_NONE) {
3232 handle->display_type = PLAYER_DISPLAY_TYPE_NONE;
3233 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3235 return PLAYER_ERROR_NONE;
3239 int legacy_player_set_sound_stream_info_for_mused(player_h player, char *stream_type, int stream_index)
3241 PLAYER_INSTANCE_CHECK(player);
3242 player_s *handle = (player_s *)player;
3245 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
3247 ret = mm_player_set_attribute(handle->mm_handle, NULL, "sound_stream_type", stream_type, strlen(stream_type), "sound_stream_index", stream_index, NULL);
3249 if (ret != MM_ERROR_NONE)
3250 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3252 return PLAYER_ERROR_NONE;
3255 int legacy_player_sound_register(player_h player, int pid)
3257 PLAYER_INSTANCE_CHECK(player);
3258 player_s *handle = (player_s *)player;
3261 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
3263 ret = mm_player_sound_register(handle->mm_handle, pid);
3264 if (ret != MM_ERROR_NONE)
3265 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3267 return PLAYER_ERROR_NONE;
3270 int legacy_player_get_timeout_for_muse(player_h player, int *timeout)
3272 PLAYER_INSTANCE_CHECK(player);
3273 player_s *handle = (player_s *)player;
3276 ret = mm_player_get_timeout(handle->mm_handle, timeout);
3277 if (ret != MM_ERROR_NONE)
3278 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3280 return PLAYER_ERROR_NONE;
3283 int legacy_player_get_num_of_video_out_buffers(player_h player, int *num, int *extra_num)
3285 PLAYER_INSTANCE_CHECK(player);
3286 PLAYER_NULL_ARG_CHECK(num);
3287 PLAYER_NULL_ARG_CHECK(extra_num);
3288 player_s *handle = (player_s *)player;
3290 int ret = mm_player_get_num_of_video_out_buffers(handle->mm_handle, num, extra_num);
3291 if (ret != MM_ERROR_NONE)
3292 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3294 return PLAYER_ERROR_NONE;
3297 int legacy_player_set_file_buffering_path(player_h player, const char *file_path)
3299 PLAYER_INSTANCE_CHECK(player);
3300 PLAYER_NULL_ARG_CHECK(file_path);
3301 player_s *handle = (player_s *)player;
3302 PLAYER_STATE_CHECK(handle, PLAYER_STATE_IDLE);
3304 int ret = mm_player_set_file_buffering_path(handle->mm_handle, file_path);
3306 if (ret != MM_ERROR_NONE)
3307 return __player_convert_error_code(ret, (char *)__FUNCTION__);
3309 return PLAYER_ERROR_NONE;