to resolve the Prevent issues
[platform/core/multimedia/libmm-player.git] / src / mm_player.c
1 /*
2  * libmm-player
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, YeJin Cho <cho.yejin@samsung.com>,
7  * Seungbae Shin <seungbae.shin@samsung.com>, YoungHwan An <younghwan_.an@samsung.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  */
22
23 #include <gst/gst.h>
24 #include <string.h>
25
26 #include <mm_types.h>
27 #include <mm_message.h>
28
29 #include "mm_player.h"
30 #include "mm_player_priv.h"
31 #include "mm_player_attrs.h"
32 #include "mm_player_utils.h"
33 #include "mm_player_ini.h"
34 #include "mm_debug.h"
35 #include "mm_player_capture.h"
36 #include "mm_player_tracks.h"
37 #include "mm_player_es.h"
38
39 int mm_player_create(MMHandleType *player)
40 {
41         int result = MM_ERROR_NONE;
42         mm_player_t* new_player = NULL;
43
44         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
45
46
47         /* alloc player structure */
48         new_player = g_malloc(sizeof(mm_player_t));
49         if ( ! new_player )
50         {
51                 debug_error("Cannot allocate memory for player\n");
52                 goto ERROR;
53         }
54         memset(new_player, 0, sizeof(mm_player_t));
55
56         /* create player lock */
57         g_mutex_init(&new_player->cmd_lock);
58
59         /* create player lock */
60         g_mutex_init(&new_player->playback_lock);
61
62
63         /* create msg callback lock */
64         g_mutex_init(&new_player->msg_cb_lock);
65
66         /* load ini files */
67         result = mm_player_ini_load(&new_player->ini);
68         if(result != MM_ERROR_NONE)
69         {
70                 debug_error("can't load ini");
71                 goto ERROR;
72         }
73
74         result = mm_player_audio_effect_ini_load(&new_player->ini);
75         if(result != MM_ERROR_NONE)
76         {
77                 debug_error("can't load audio ini");
78                 goto ERROR;
79         }
80
81
82         /* create player */
83         result = _mmplayer_create_player((MMHandleType)new_player);
84
85         if(result != MM_ERROR_NONE)
86         {
87                 debug_error("failed to create player");
88                 goto ERROR;
89         }
90
91         *player = (MMHandleType)new_player;
92
93         return result;
94
95 ERROR:
96
97         if ( new_player )
98         {
99                 _mmplayer_destroy( (MMHandleType)new_player );
100                 g_mutex_clear(&new_player->cmd_lock);
101                 g_mutex_clear(&new_player->playback_lock);
102
103                 MMPLAYER_FREEIF( new_player );
104         }
105
106         *player = (MMHandleType)0;
107         return MM_ERROR_PLAYER_NO_FREE_SPACE; // are you sure?
108 }
109
110 int  mm_player_destroy(MMHandleType player)
111 {
112         int result = MM_ERROR_NONE;
113
114         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
115
116         MMPLAYER_CMD_LOCK( player );
117
118         result = _mmplayer_destroy(player);
119
120         MMPLAYER_CMD_UNLOCK( player );
121
122         g_mutex_clear(&((mm_player_t*)player)->cmd_lock);
123         g_mutex_clear(&((mm_player_t*)player)->playback_lock);
124
125         memset( (mm_player_t*)player, 0x00, sizeof(mm_player_t) );
126
127         /* free player */
128         g_free( (void*)player );
129
130         return result;
131 }
132
133 int mm_player_realize(MMHandleType player)
134 {
135         int result = MM_ERROR_NONE;
136
137         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
138
139         MMPLAYER_CMD_LOCK( player );
140
141         result = _mmplayer_realize(player);
142
143         MMPLAYER_CMD_UNLOCK( player );
144
145         return result;
146 }
147
148 int mm_player_unrealize(MMHandleType player)
149 {
150         int result = MM_ERROR_NONE;
151
152         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
153
154         MMPLAYER_CMD_LOCK( player );
155
156         result = _mmplayer_unrealize(player);
157
158         MMPLAYER_CMD_UNLOCK( player );
159
160         return result;
161 }
162
163 int mm_player_set_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
164 {
165         int result = MM_ERROR_NONE;
166
167         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
168
169         MMPLAYER_CMD_LOCK( player );
170
171         result = _mmplayer_set_message_callback(player, callback, user_param);
172
173         MMPLAYER_CMD_UNLOCK( player );
174
175         return result;
176 }
177
178 int mm_player_set_pd_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param)
179 {
180         int result = MM_ERROR_NONE;
181
182         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
183
184         result = _mm_player_set_pd_downloader_message_cb(player, callback, user_param);
185
186         return result;
187 }
188
189 int mm_player_set_audio_stream_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param)
190 {
191         int result = MM_ERROR_NONE;
192
193         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
194
195         MMPLAYER_CMD_LOCK( player );
196
197         result = _mmplayer_set_audiostream_cb(player, callback, user_param);
198
199         MMPLAYER_CMD_UNLOCK( player );
200
201         return result;
202 }
203
204 int mm_player_set_audio_stream_callback_ex(MMHandleType player, bool sync, mm_player_audio_stream_callback_ex callback, void *user_param)
205 {
206         int result = MM_ERROR_NONE;
207
208         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
209
210         MMPLAYER_CMD_LOCK( player );
211
212         result = _mmplayer_set_audiostream_cb_ex(player, sync, callback, user_param);
213
214         MMPLAYER_CMD_UNLOCK( player );
215
216         return result;
217 }
218
219 int mm_player_set_video_stream_callback(MMHandleType player, mm_player_video_stream_callback callback, void *user_param)
220 {
221         int result = MM_ERROR_NONE;
222
223         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
224
225         MMPLAYER_CMD_LOCK( player );
226
227         result = _mmplayer_set_videostream_cb(player, callback, user_param);
228
229         MMPLAYER_CMD_UNLOCK( player );
230
231         return result;
232 }
233
234 int mm_player_set_video_frame_render_error_callback(MMHandleType player, mm_player_video_frame_render_error_callback callback, void *user_param)
235 {
236         int result = MM_ERROR_NONE;
237
238         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
239
240         MMPLAYER_CMD_LOCK( player );
241
242         result = _mmplayer_set_videoframe_render_error_cb(player, callback, user_param);
243
244         MMPLAYER_CMD_UNLOCK( player );
245
246         return result;
247 }
248
249 int mm_player_do_video_capture(MMHandleType player)
250 {
251         int result = MM_ERROR_NONE;
252
253         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
254
255         MMPLAYER_CMD_LOCK( player );
256
257         result = _mmplayer_do_video_capture(player);
258
259         MMPLAYER_CMD_UNLOCK( player );
260
261         return result;
262 }
263
264 int mm_player_set_prepare_buffering_time(MMHandleType player, int second)
265 {
266         int result = MM_ERROR_NONE;
267
268         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
269
270         MMPLAYER_CMD_LOCK( player );
271
272         result = _mmplayer_set_prepare_buffering_time(player, second);
273
274         MMPLAYER_CMD_UNLOCK( player );
275
276         return result;
277 }
278
279 int mm_player_set_runtime_buffering_mode(MMHandleType player, MMPlayerBufferingMode mode, int second)
280 {
281         int result = MM_ERROR_NONE;
282
283         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
284
285         MMPLAYER_CMD_LOCK( player );
286
287         result = _mmplayer_set_runtime_buffering_mode(player, mode, second);
288
289         MMPLAYER_CMD_UNLOCK( player );
290
291         return result;
292 }
293
294 int mm_player_set_volume(MMHandleType player, MMPlayerVolumeType *volume)
295 {
296         int result = MM_ERROR_NONE;
297
298         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
299         return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
300
301         MMPLAYER_CMD_LOCK( player );
302
303         result = _mmplayer_set_volume(player, *volume);
304
305         MMPLAYER_CMD_UNLOCK( player );
306
307         return result;
308 }
309
310 int mm_player_get_volume(MMHandleType player, MMPlayerVolumeType *volume)
311 {
312         int result = MM_ERROR_NONE;
313
314         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
315         return_val_if_fail(volume, MM_ERROR_INVALID_ARGUMENT);
316
317         MMPLAYER_CMD_LOCK( player );
318
319         result = _mmplayer_get_volume(player, volume);
320
321         MMPLAYER_CMD_UNLOCK( player );
322
323         return result;
324 }
325
326 int mm_player_set_mute(MMHandleType player, int mute)
327 {
328         int result = MM_ERROR_NONE;
329
330         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
331
332         MMPLAYER_CMD_LOCK( player );
333
334         result = _mmplayer_set_mute(player, mute);
335
336         MMPLAYER_CMD_UNLOCK( player );
337
338         return result;
339 }
340
341 int mm_player_get_mute(MMHandleType player, int *mute)
342 {
343         int result = MM_ERROR_NONE;
344
345         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
346         return_val_if_fail(mute, MM_ERROR_INVALID_ARGUMENT);
347
348         MMPLAYER_CMD_LOCK( player );
349
350         result = _mmplayer_get_mute(player, mute);
351
352         MMPLAYER_CMD_UNLOCK( player );
353
354         return result;
355 }
356
357 int mm_player_get_state(MMHandleType player, MMPlayerStateType *state)
358 {
359         int result = MM_ERROR_NONE;
360
361         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
362         return_val_if_fail(state, MM_ERROR_COMMON_INVALID_ARGUMENT);
363
364         *state = MM_PLAYER_STATE_NULL;
365
366         result = _mmplayer_get_state(player, (int*)state);
367
368         return result;
369 }
370
371 /* NOTE : It does not support some use cases, eg using colorspace converter */
372 int mm_player_change_videosink(MMHandleType player, MMDisplaySurfaceType display_surface_type, void *display_overlay)
373 {
374         int result = MM_ERROR_NONE;
375
376         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
377
378         MMPLAYER_CMD_LOCK( player );
379
380         result = _mmplayer_change_videosink(player, display_surface_type, display_overlay);
381
382         MMPLAYER_CMD_UNLOCK( player );
383
384         return result;
385 }
386
387 int mm_player_push_buffer(MMHandleType player, unsigned char *buf, int size)
388 {
389         int result = MM_ERROR_NONE;
390
391         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
392
393         //MMPLAYER_CMD_LOCK( player );
394
395         result = _mmplayer_push_buffer(player, buf, size);
396
397         //MMPLAYER_CMD_UNLOCK( player );
398
399         return result;
400 }
401
402 int mm_player_start(MMHandleType player)
403 {
404         int result = MM_ERROR_NONE;
405
406         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
407
408         MMPLAYER_CMD_LOCK( player );
409
410         result = _mmplayer_start(player);
411
412         MMPLAYER_CMD_UNLOCK( player );
413
414         return result;
415 }
416
417 int  mm_player_stop(MMHandleType player)
418 {
419         int result = MM_ERROR_NONE;
420
421         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
422
423         MMPLAYER_CMD_LOCK( player );
424
425         result = _mmplayer_stop(player);
426
427         MMPLAYER_CMD_UNLOCK( player );
428
429         return result;
430 }
431
432 int mm_player_pause(MMHandleType player)
433 {
434         int result = MM_ERROR_NONE;
435
436         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
437
438         MMPLAYER_CMD_LOCK( player );
439
440         result = _mmplayer_pause(player);
441
442         MMPLAYER_CMD_UNLOCK( player );
443
444         return result;
445 }
446
447 int mm_player_resume(MMHandleType player)
448 {
449         int result = MM_ERROR_NONE;
450
451         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
452
453         MMPLAYER_CMD_LOCK( player );
454
455         result = _mmplayer_resume(player);
456
457         MMPLAYER_CMD_UNLOCK( player );
458
459         return result;
460 }
461
462 int mm_player_activate_section_repeat(MMHandleType player, int start_pos, int end_pos)
463 {
464         int result = MM_ERROR_NONE;
465
466         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
467
468         MMPLAYER_CMD_LOCK( player );
469
470         result = _mmplayer_activate_section_repeat(player, start_pos, end_pos);
471
472         MMPLAYER_CMD_UNLOCK( player );
473
474         return result;
475 }
476
477 int mm_player_deactivate_section_repeat(MMHandleType player)
478 {
479         int result = MM_ERROR_NONE;
480
481         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
482
483         MMPLAYER_CMD_LOCK( player );
484
485         result = _mmplayer_deactivate_section_repeat(player);
486
487         MMPLAYER_CMD_UNLOCK( player );
488
489         return result;
490 }
491
492 int mm_player_gst_set_audio_channel(MMHandleType player, MMPlayerAudioChannel ch)
493 {
494         int result = MM_ERROR_NONE;
495
496         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
497         MMPLAYER_CMD_LOCK( player );
498
499         result = _mmplayer_gst_set_audio_channel(player, ch);
500
501         MMPLAYER_CMD_UNLOCK( player );
502         return result;
503 }
504
505 int mm_player_set_play_speed(MMHandleType player, float rate)
506 {
507         int result = MM_ERROR_NONE;
508
509         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
510
511         MMPLAYER_CMD_LOCK( player );
512
513         result = _mmplayer_set_playspeed(player, rate);
514
515         MMPLAYER_CMD_UNLOCK( player );
516
517         return result;
518 }
519
520 int mm_player_set_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
521 {
522         int result = MM_ERROR_NONE;
523
524         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
525
526         if (format >= MM_PLAYER_POS_FORMAT_NUM)
527         {
528                 debug_error("wrong format\n");
529                 return MM_ERROR_COMMON_INVALID_ARGUMENT;
530         }
531
532         MMPLAYER_CMD_LOCK( player );
533
534         result = _mmplayer_set_position(player, format, pos);
535
536         MMPLAYER_CMD_UNLOCK( player );
537
538         return result;
539 }
540
541 int mm_player_get_position(MMHandleType player, MMPlayerPosFormatType format, int *pos)
542 {
543         int result = MM_ERROR_NONE;
544
545         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
546         return_val_if_fail(pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
547
548         if (format >= MM_PLAYER_POS_FORMAT_NUM)
549         {
550                 debug_error("wrong format\n");
551                 return MM_ERROR_COMMON_INVALID_ARGUMENT;
552         }
553
554         MMPLAYER_CMD_LOCK( player );
555
556         result = _mmplayer_get_position(player, (int)format, (unsigned long*)pos);
557
558         MMPLAYER_CMD_UNLOCK( player );
559
560         return result;
561 }
562
563 int mm_player_get_buffer_position(MMHandleType player, MMPlayerPosFormatType format, int  *start_pos, int  *stop_pos)
564 {
565         int result = MM_ERROR_NONE;
566
567         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
568         return_val_if_fail(start_pos && stop_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
569
570         MMPLAYER_CMD_LOCK( player );
571
572         result = _mmplayer_get_buffer_position(player, (int)format, (unsigned long*)start_pos, (unsigned long*)stop_pos );
573
574         MMPLAYER_CMD_UNLOCK( player );
575
576         return result;
577 }
578
579 int mm_player_set_external_subtitle_path(MMHandleType player, const char* path)
580 {
581         int result = MM_ERROR_NONE;
582
583         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
584
585         MMPLAYER_CMD_LOCK( player );
586
587         result = _mmplayer_set_external_subtitle_path(player, path);
588
589         MMPLAYER_CMD_UNLOCK( player );
590         return result;
591 }
592
593 int mm_player_adjust_subtitle_position(MMHandleType player, MMPlayerPosFormatType format, int pos)
594 {
595         int result = MM_ERROR_NONE;
596
597         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
598
599         if (format >= MM_PLAYER_POS_FORMAT_NUM)
600         {
601                 debug_error("wrong format(%d) \n", format);
602                 return MM_ERROR_INVALID_ARGUMENT;
603         }
604
605         MMPLAYER_CMD_LOCK( player );
606
607         result = _mmplayer_adjust_subtitle_postion(player, format, pos);
608
609         MMPLAYER_CMD_UNLOCK( player );
610
611         return result;
612 }
613
614 int mm_player_adjust_video_position(MMHandleType player, int offset)
615 {
616         int result = MM_ERROR_NONE;
617         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
618         MMPLAYER_CMD_LOCK( player );
619
620         result = _mmplayer_adjust_video_postion(player, offset);
621
622         MMPLAYER_CMD_UNLOCK( player );
623
624         return result;
625 }
626
627 int mm_player_set_subtitle_silent(MMHandleType player, int silent)
628 {
629         int result = MM_ERROR_NONE;
630
631         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
632
633         MMPLAYER_CMD_LOCK( player );
634
635         result = _mmplayer_set_subtitle_silent(player, silent);
636
637         MMPLAYER_CMD_UNLOCK( player );
638
639         return result;
640 }
641
642 int mm_player_get_subtitle_silent(MMHandleType player, int* silent)
643 {
644         int result = MM_ERROR_NONE;
645
646         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
647
648         MMPLAYER_CMD_LOCK( player );
649
650         result = _mmplayer_get_subtitle_silent(player, silent);
651
652         MMPLAYER_CMD_UNLOCK( player );
653
654         return result;
655 }
656
657 int mm_player_set_attribute(MMHandleType player,  char **err_attr_name, const char *first_attribute_name, ...)
658 {
659         int result = MM_ERROR_NONE;
660         va_list var_args;
661
662         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
663         return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
664
665         va_start (var_args, first_attribute_name);
666         result = _mmplayer_set_attribute(player, err_attr_name, first_attribute_name, var_args);
667         va_end (var_args);
668
669         return result;
670 }
671
672 int mm_player_get_attribute(MMHandleType player,  char **err_attr_name, const char *first_attribute_name, ...)
673 {
674         int result = MM_ERROR_NONE;
675         va_list var_args;
676
677         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
678         return_val_if_fail(first_attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
679
680         va_start (var_args, first_attribute_name);
681         result = _mmplayer_get_attribute(player, err_attr_name, first_attribute_name, var_args);
682         va_end (var_args);
683
684         return result;
685 }
686
687 int mm_player_get_attribute_info(MMHandleType player,  const char *attribute_name, MMPlayerAttrsInfo *info)
688 {
689         int result = MM_ERROR_NONE;
690
691
692         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
693         return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
694         return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
695
696         result = _mmplayer_get_attributes_info((MMHandleType)player, attribute_name, info);
697
698         return result;
699 }
700
701 int mm_player_get_pd_status(MMHandleType player, guint64 *current_pos, guint64 *total_size)
702 {
703         int result = MM_ERROR_NONE;
704
705         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
706         return_val_if_fail(current_pos, MM_ERROR_COMMON_INVALID_ARGUMENT);
707         return_val_if_fail(total_size, MM_ERROR_COMMON_INVALID_ARGUMENT);
708
709         result = _mmplayer_get_pd_downloader_status(player, current_pos, total_size);
710
711         return result;
712 }
713
714 int mm_player_get_track_count(MMHandleType player, MMPlayerTrackType type, int *count)
715 {
716         int result = MM_ERROR_NONE;
717
718         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
719         return_val_if_fail(count, MM_ERROR_COMMON_INVALID_ARGUMENT);
720
721         MMPLAYER_CMD_LOCK( player );
722
723         result = _mmplayer_get_track_count(player, type, count);
724
725         MMPLAYER_CMD_UNLOCK( player );
726
727         return result;
728 }
729
730 int mm_player_select_track(MMHandleType player, MMPlayerTrackType type, int index)
731 {
732         int result = MM_ERROR_NONE;
733
734         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
735
736         MMPLAYER_CMD_LOCK( player );
737
738         result = _mmplayer_select_track(player, type, index);
739
740         MMPLAYER_CMD_UNLOCK( player );
741
742         return result;
743 }
744 #ifdef _MULTI_TRACK
745 int mm_player_track_add_subtitle_language(MMHandleType player, int index)
746 {
747         int result = MM_ERROR_NONE;
748
749         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
750
751         MMPLAYER_CMD_LOCK( player );
752
753         result = _mmplayer_track_add_subtitle_language(player, index);
754
755         MMPLAYER_CMD_UNLOCK( player );
756
757         return result;
758 }
759
760 int mm_player_track_remove_subtitle_language(MMHandleType player, int index)
761 {
762         int result = MM_ERROR_NONE;
763
764         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
765
766         MMPLAYER_CMD_LOCK( player );
767
768         result = _mmplayer_track_remove_subtitle_language(player, index);
769
770         MMPLAYER_CMD_UNLOCK( player );
771
772         return result;
773
774 }
775 #endif
776 int mm_player_get_current_track(MMHandleType player, MMPlayerTrackType type, int *index)
777 {
778         int result = MM_ERROR_NONE;
779
780         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
781         return_val_if_fail(index, MM_ERROR_COMMON_INVALID_ARGUMENT);
782
783         MMPLAYER_CMD_LOCK( player );
784
785         result = _mmplayer_get_current_track(player, type, index);
786
787         MMPLAYER_CMD_UNLOCK( player );
788
789         return result;
790 }
791
792 int mm_player_get_track_language_code(MMHandleType player,  MMPlayerTrackType type, int index, char **code)
793 {
794         int result = MM_ERROR_NONE;
795
796         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
797
798         MMPLAYER_CMD_LOCK( player );
799
800         result = _mmplayer_get_track_language_code(player, type, index, code);
801
802         MMPLAYER_CMD_UNLOCK( player );
803
804         return result;
805 }
806
807 int mm_player_ignore_session(MMHandleType player)
808 {
809         int result = MM_ERROR_NONE;
810
811         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
812
813         result = _mmplayer_asm_ignore_session(player);
814
815         return result;
816 }
817
818 int mm_player_set_display_zoom(MMHandleType player, float level, int x, int y)
819 {
820         int result = MM_ERROR_NONE;
821
822         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
823
824         MMPLAYER_CMD_LOCK( player );
825
826         result = _mmplayer_set_display_zoom(player, level, x, y);
827
828         MMPLAYER_CMD_UNLOCK( player );
829
830         return result;
831 }
832
833 int mm_player_get_display_zoom(MMHandleType player, float *level, int *x, int *y)
834 {
835         int result = MM_ERROR_NONE;
836
837         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
838         return_val_if_fail(level, MM_ERROR_COMMON_INVALID_ARGUMENT);
839
840         MMPLAYER_CMD_LOCK( player );
841
842         result = _mmplayer_get_display_zoom(player, level, x, y);
843
844         MMPLAYER_CMD_UNLOCK( player );
845
846         return result;
847 }
848
849
850 int mm_player_use_system_clock(MMHandleType player)
851 {
852         int result = MM_ERROR_NONE;
853
854         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
855
856         MMPLAYER_CMD_LOCK( player );
857
858         result = _mmplayer_use_system_clock(player);
859
860         MMPLAYER_CMD_UNLOCK( player );
861
862         return result;
863 }
864
865 int mm_player_set_video_share_master_clock(MMHandleType player,
866                                                 long long clock,
867                                                 long long clock_delta,
868                                                 long long video_time,
869                                                 long long media_clock,
870                                                 long long audio_time)
871 {
872         int result = MM_ERROR_NONE;
873
874         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
875
876         MMPLAYER_CMD_LOCK( player );
877
878         result = _mmplayer_set_video_share_master_clock(player, clock, clock_delta, video_time, media_clock, audio_time);
879
880         MMPLAYER_CMD_UNLOCK( player );
881
882         return result;
883 }
884
885 int mm_player_get_video_share_master_clock(MMHandleType player,
886                                                 long long *video_time,
887                                                 long long *media_clock,
888                                                 long long *audio_time)
889 {
890         int result = MM_ERROR_NONE;
891
892         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
893         return_val_if_fail(video_time, MM_ERROR_COMMON_INVALID_ARGUMENT);
894         return_val_if_fail(media_clock, MM_ERROR_COMMON_INVALID_ARGUMENT);
895         return_val_if_fail(audio_time, MM_ERROR_COMMON_INVALID_ARGUMENT);
896
897         MMPLAYER_CMD_LOCK( player );
898
899         result = _mmplayer_get_video_share_master_clock(player, video_time, media_clock, audio_time);
900
901         MMPLAYER_CMD_UNLOCK( player );
902
903         return result;
904 }
905
906 int mm_player_get_video_rotate_angle(MMHandleType player, int *angle)
907 {
908         int result = MM_ERROR_NONE;
909
910         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
911         return_val_if_fail(angle, MM_ERROR_COMMON_INVALID_ARGUMENT);
912
913         MMPLAYER_CMD_LOCK( player );
914
915         result = _mmplayer_get_video_rotate_angle(player, angle);
916
917         MMPLAYER_CMD_UNLOCK( player );
918
919         return result;
920 }
921
922 int mm_player_set_video_hub_download_mode(MMHandleType player, bool mode)
923 {
924         int result = MM_ERROR_NONE;
925
926         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
927
928         MMPLAYER_CMD_LOCK( player );
929
930         result = _mmplayer_set_video_hub_download_mode(player, mode);
931
932         MMPLAYER_CMD_UNLOCK( player );
933
934         return result;
935 }
936
937 int mm_player_enable_sync_handler(MMHandleType player, bool enable)
938 {
939         int result = MM_ERROR_NONE;
940
941         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
942
943         MMPLAYER_CMD_LOCK( player );
944
945         result = _mmplayer_enable_sync_handler(player, enable);
946
947         MMPLAYER_CMD_UNLOCK( player );
948
949         return result;
950 }
951
952 int mm_player_set_uri(MMHandleType player, const char *uri)
953 {
954         int result = MM_ERROR_NONE;
955
956         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
957
958         MMPLAYER_CMD_LOCK( player );
959
960         result = _mmplayer_set_uri(player, uri);
961
962         MMPLAYER_CMD_UNLOCK( player );
963
964         return result;
965
966 }
967
968 int mm_player_set_next_uri(MMHandleType player, const char *uri)
969 {
970         int result = MM_ERROR_NONE;
971
972         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
973
974         MMPLAYER_CMD_LOCK( player );
975
976         result = _mmplayer_set_next_uri(player, uri, FALSE);
977
978         MMPLAYER_CMD_UNLOCK( player );
979
980         return result;
981
982 }
983
984 int mm_player_get_next_uri(MMHandleType player, char **uri)
985 {
986         int result = MM_ERROR_NONE;
987
988         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
989
990         MMPLAYER_CMD_LOCK( player );
991
992         result = _mmplayer_get_next_uri(player, uri);
993
994         MMPLAYER_CMD_UNLOCK( player );
995
996         return result;
997
998 }
999 #ifdef _MULTI_TRACK
1000 int mm_player_track_foreach_selected_subtitle_language(MMHandleType player, mm_player_track_selected_subtitle_language_callback callback, void *user_param)
1001 {
1002         int result = MM_ERROR_NONE;
1003
1004         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1005
1006         MMPLAYER_CMD_LOCK( player );
1007
1008         result = _mmplayer_track_foreach_selected_subtitle_language(player, callback, user_param);
1009
1010         MMPLAYER_CMD_UNLOCK( player );
1011
1012         return result;
1013 }
1014 #endif
1015
1016 int mm_player_has_closed_caption(MMHandleType player, bool *exist)
1017 {
1018         int result = MM_ERROR_NONE;
1019
1020         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1021         return_val_if_fail(exist, MM_ERROR_INVALID_ARGUMENT);
1022
1023         MMPLAYER_CMD_LOCK( player );
1024
1025         result = _mmplayer_has_closed_caption(player, exist);
1026
1027         MMPLAYER_CMD_UNLOCK( player );
1028
1029         return result;
1030 }
1031
1032 int mm_player_enable_media_packet_video_stream(MMHandleType player, bool enable)
1033 {
1034         int result = MM_ERROR_NONE;
1035
1036         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1037         return_val_if_fail(enable, MM_ERROR_INVALID_ARGUMENT);
1038
1039         MMPLAYER_CMD_LOCK( player );
1040
1041         result = _mmplayer_enable_media_packet_video_stream(player, enable);
1042
1043         MMPLAYER_CMD_UNLOCK( player );
1044
1045         return result;
1046 }
1047
1048 void * mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer)
1049 {
1050         void * result;
1051         result = _mm_player_media_packet_video_stream_internal_buffer_ref(buffer);
1052
1053         return result;
1054 }
1055
1056 void mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer)
1057 {
1058         _mm_player_media_packet_video_stream_internal_buffer_unref(buffer);
1059 }
1060
1061 #ifdef TEST_ES
1062 int mm_player_submit_packet(MMHandleType player, media_packet_h packet)
1063 {
1064
1065         int result = MM_ERROR_NONE;
1066
1067         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1068
1069         /* no lock here, otherwise callback for the "need-data" signal of appsrc will be blocking */
1070         //MMPLAYER_CMD_LOCK( player );
1071
1072         result = _mmplayer_submit_packet(player, packet);
1073
1074         //MMPLAYER_CMD_UNLOCK( player );
1075
1076         return result;
1077 }
1078
1079 int mm_player_set_video_info (MMHandleType player, media_format_h format)
1080 {
1081         int result = MM_ERROR_NONE;
1082
1083         debug_log("\n");
1084
1085         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1086
1087         MMPLAYER_CMD_LOCK( player );
1088
1089         result = _mmplayer_set_video_info(player, format);
1090
1091         MMPLAYER_CMD_UNLOCK( player );
1092
1093         return result;
1094
1095 }
1096
1097 int mm_player_set_audio_info (MMHandleType player, media_format_h format)
1098 {
1099         int result = MM_ERROR_NONE;
1100
1101         debug_log("\n");
1102
1103         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1104
1105         MMPLAYER_CMD_LOCK( player );
1106
1107         result = _mmplayer_set_audio_info(player, format);
1108
1109         MMPLAYER_CMD_UNLOCK( player );
1110
1111         return result;
1112 }
1113
1114 int mm_player_set_subtitle_info (MMHandleType player, MMPlayerSubtitleStreamInfo *subtitle_stream_info)
1115 {
1116         int result = MM_ERROR_NONE;
1117
1118         debug_log("\n");
1119
1120         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1121
1122         MMPLAYER_CMD_LOCK( player );
1123
1124         result = _mmplayer_set_subtitle_info(player, subtitle_stream_info);
1125
1126         MMPLAYER_CMD_UNLOCK( player );
1127
1128         return result;
1129 }
1130
1131 int mm_player_set_media_stream_buffer_max_size(MMHandleType player, MMPlayerStreamType type, unsigned long long max_size)
1132 {
1133         int result = MM_ERROR_NONE;
1134
1135         debug_log("\n");
1136
1137         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1138
1139         MMPLAYER_CMD_LOCK( player );
1140
1141         result = _mmplayer_set_media_stream_max_size(player, type, max_size);
1142
1143         MMPLAYER_CMD_UNLOCK( player );
1144
1145         return result;
1146 }
1147
1148 int mm_player_get_media_stream_buffer_max_size(MMHandleType player, MMPlayerStreamType type, unsigned long long *max_size)
1149 {
1150         int result = MM_ERROR_NONE;
1151
1152         debug_log("\n");
1153
1154         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1155         return_val_if_fail(max_size, MM_ERROR_INVALID_ARGUMENT);
1156
1157         MMPLAYER_CMD_LOCK( player );
1158
1159         result = _mmplayer_get_media_stream_max_size(player, type, max_size);
1160
1161         MMPLAYER_CMD_UNLOCK( player );
1162
1163         return result;
1164 }
1165
1166 int mm_player_set_media_stream_buffer_min_percent(MMHandleType player, MMPlayerStreamType type, unsigned min_percent)
1167 {
1168         int result = MM_ERROR_NONE;
1169
1170         debug_log("\n");
1171
1172         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1173
1174         MMPLAYER_CMD_LOCK( player );
1175
1176         result = _mmplayer_set_media_stream_min_percent(player, type, min_percent);
1177
1178         MMPLAYER_CMD_UNLOCK( player );
1179
1180         return result;
1181 }
1182
1183 int mm_player_get_media_stream_buffer_min_percent(MMHandleType player, MMPlayerStreamType type, unsigned int *min_percent)
1184 {
1185         int result = MM_ERROR_NONE;
1186
1187         debug_log("\n");
1188
1189         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1190         return_val_if_fail(min_percent, MM_ERROR_INVALID_ARGUMENT);
1191
1192         MMPLAYER_CMD_LOCK( player );
1193
1194         result = _mmplayer_get_media_stream_min_percent(player, type, min_percent);
1195
1196         MMPLAYER_CMD_UNLOCK( player );
1197
1198         return result;
1199 }
1200
1201 int mm_player_set_media_stream_buffer_status_callback(MMHandleType player, MMPlayerStreamType type, mm_player_media_stream_buffer_status_callback callback, void * user_param)
1202 {
1203         int result = MM_ERROR_NONE;
1204
1205         debug_log("\n");
1206
1207         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1208
1209         MMPLAYER_CMD_LOCK( player );
1210
1211         result = _mmplayer_set_media_stream_buffer_status_cb(player, type, callback, user_param);
1212
1213         MMPLAYER_CMD_UNLOCK( player );
1214
1215         return result;
1216 }
1217
1218 int mm_player_set_media_stream_seek_data_callback(MMHandleType player, MMPlayerStreamType type, mm_player_media_stream_seek_data_callback callback, void * user_param)
1219 {
1220         int result = MM_ERROR_NONE;
1221
1222         debug_log("\n");
1223
1224         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1225
1226         MMPLAYER_CMD_LOCK( player );
1227
1228         result = _mmplayer_set_media_stream_seek_data_cb(player, type, callback, user_param);
1229
1230         MMPLAYER_CMD_UNLOCK( player );
1231
1232         return result;
1233 }
1234
1235 int mm_player_set_audio_stream_changed_callback(MMHandleType player, mm_player_stream_changed_callback callback, void *user_param)
1236 {
1237         int result = MM_ERROR_NONE;
1238
1239         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1240
1241         MMPLAYER_CMD_LOCK( player );
1242
1243         result = _mmplayer_set_audiostream_changed_cb(player, callback, user_param);
1244
1245         MMPLAYER_CMD_UNLOCK( player );
1246
1247         return result;
1248 }
1249
1250 int mm_player_set_video_stream_changed_callback(MMHandleType player, mm_player_stream_changed_callback callback, void *user_param)
1251 {
1252         int result = MM_ERROR_NONE;
1253
1254         return_val_if_fail(player, MM_ERROR_PLAYER_NOT_INITIALIZED);
1255
1256         MMPLAYER_CMD_LOCK( player );
1257
1258         result = _mmplayer_set_videostream_changed_cb(player, callback, user_param);
1259
1260         MMPLAYER_CMD_UNLOCK( player );
1261
1262         return result;
1263 }
1264
1265 #endif