Integration with resource manager (Murphy resource)
[platform/core/multimedia/libmm-player.git] / src / include / mm_player.h
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 #ifndef __MM_PLAYER_H__
24 #define __MM_PLAYER_H__
25
26
27 /*===========================================================================================
28 |                                                                                           |
29 |  INCLUDE FILES                                        |
30 |                                                                                           |
31 ========================================================================================== */
32
33 #include <glib.h>
34
35 #include <mm_types.h>
36 #include <mm_message.h>
37 #include <media_packet.h>
38
39 #ifdef __cplusplus
40         extern "C" {
41 #endif
42
43 /**
44         @addtogroup PLAYER
45         @{
46
47         @par
48         This part describes APIs used for playback of multimedia contents.
49         All multimedia contents are created by a media player through handle of playback.
50         In creating a player, it displays the player's status or information
51         by registering callback function.
52
53         @par
54         In case of streaming playback, network has to be opend by using datanetwork API.
55         If proxy, cookies and the other attributes for streaming playback are needed,
56         set those attributes using mm_player_set_attribute() before create player.
57
58         @par
59         The subtitle for local video playback is supported. Set "subtitle_uri" attribute
60         using mm_player_set_attribute() before the application creates the player.
61         Then the application could receive MMMessageParamType which includes subtitle string and duration.
62
63         @par
64         Player can have 5 states, and each state can be changed by calling
65         described functions on "Figure1. State of Player".
66
67         @par
68         @image html             player_state.jpg        "Figure1. State of Player"      width=12cm
69         @image latex    player_state.jpg        "Figure1. State of Player"      width=12cm
70
71         @par
72         Most of functions which change player state work as synchronous. But, mm_player_start() should be used
73         asynchronously. Both mm_player_pause() and mm_player_resume() should also be used asynchronously
74         in the case of streaming data.
75         So, application have to confirm the result of those APIs through message callback function.
76
77         @par
78         Note that "None" and Null" state could be reached from any state
79         by calling mm_player_destroy() and mm_player_unrealize().
80
81         @par
82         <div><table>
83         <tr>
84         <td><B>FUNCTION</B></td>
85         <td><B>PRE-STATE</B></td>
86         <td><B>POST-STATE</B></td>
87         <td><B>SYNC TYPE</B></td>
88         </tr>
89         <tr>
90         <td>mm_player_create()</td>
91         <td>NONE</td>
92         <td>NULL</td>
93         <td>SYNC</td>
94         </tr>
95         <tr>
96         <td>mm_player_destroy()</td>
97         <td>NULL</td>
98         <td>NONE</td>
99         <td>SYNC</td>
100         </tr>
101         <tr>
102         <td>mm_player_realize()</td>
103         <td>NULL</td>
104         <td>READY</td>
105         <td>SYNC</td>
106         </tr>
107         <tr>
108         <td>mm_player_unrealize()</td>
109         <td>READY</td>
110         <td>NULL</td>
111         <td>SYNC</td>
112         </tr>
113         <tr>
114         <td>mm_player_start()</td>
115         <td>READY</td>
116         <td>PLAYING</td>
117         <td>ASYNC</td>
118         </tr>
119         <tr>
120         <td>mm_player_stop()</td>
121         <td>PLAYING</td>
122         <td>READY</td>
123         <td>SYNC</td>
124         </tr>
125         <tr>
126         <td>mm_player_pause()</td>
127         <td>PLAYING</td>
128         <td>PAUSED</td>
129         <td>ASYNC</td>
130         </tr>
131         <tr>
132         <td>mm_player_resume()</td>
133         <td>PAUSED</td>
134         <td>PLAYING</td>
135         <td>ASYNC</td>
136         </tr>
137         <tr>
138         <td>mm_player_set_message_callback()</td>
139         <td>N/A</td>
140         <td>N/A</td>
141         <td>SYNC</td>
142         </tr>
143         <tr>
144         <td>mm_player_get_state()</td>
145         <td>N/A</td>
146         <td>N/A</td>
147         <td>SYNC</td>
148         </tr>
149         <tr>
150         <td>mm_player_set_volume()</td>
151         <td>N/A</td>
152         <td>N/A</td>
153         <td>SYNC</td>
154         </tr>
155         <tr>
156         <td>mm_player_get_volume()</td>
157         <td>N/A</td>
158         <td>N/A</td>
159         <td>SYNC</td>
160         </tr>
161         <tr>
162         <td>mm_player_set_position()</td>
163         <td>N/A</td>
164         <td>N/A</td>
165         <td>SYNC</td>
166         </tr>
167         <tr>
168         <td>mm_player_get_position()</td>
169         <td>N/A</td>
170         <td>N/A</td>
171         <td>SYNC</td>
172         </tr>
173         <tr>
174         <td>mm_player_get_attribute()</td>
175         <td>N/A</td>
176         <td>N/A</td>
177         <td>SYNC</td>
178         </tr>
179         <tr>
180         <td>mm_player_set_attribute()</td>
181         <td>N/A</td>
182         <td>N/A</td>
183         <td>SYNC</td>
184         </tr>
185         </table></div>
186
187         @par
188         Following are the attributes supported in player which may be set after initialization. \n
189         Those are handled as a string.
190
191         @par
192         <div><table>
193         <tr>
194         <td>PROPERTY</td>
195         <td>TYPE</td>
196         <td>VALID TYPE</td>
197         </tr>
198         <tr>
199         <td>"profile_uri"</td>
200         <td>string</td>
201         <td>N/A</td>
202         </tr>
203         <tr>
204         <td>"content_duration"</td>
205         <td>int</td>
206         <td>range</td>
207         </tr>
208         <tr>
209         <td>"content_video_width"</td>
210         <td>int</td>
211         <td>range</td>
212         </tr>
213         <tr>
214         <td>"content_video_height"</td>
215         <td>int</td>
216         <td>range</td>
217         </tr>
218         <tr>
219         <td>"display_evas_do_scaling"</td>
220         <td>int</td>
221         <td>range</td>
222         </tr>
223         <tr>
224         <td>"display_evas_surface_sink"</td>
225         <td>string</td>
226         <td>N/A</td>
227         </tr>
228         <tr>
229         <td>"profile_user_param"</td>
230         <td>data</td>
231         <td>N/A</td>
232         </tr>
233         <tr>
234         <td>"profile_play_count"</td>
235         <td>int</td>
236         <td>range</td>
237         </tr>
238         <tr>
239         <td>"streaming_type"</td>
240         <td>int</td>
241         <td>range</td>
242         </tr>
243         <tr>
244         <td>"streaming_udp_timeout"</td>
245         <td>int</td>
246         <td>range</td>
247         </tr>
248         <tr>
249         <td>"streaming_user_agent"</td>
250         <td>string</td>
251         <td>N/A</td>
252         </tr>
253         <tr>
254         <td>"streaming_wap_profile"</td>
255         <td>string</td>
256         <td>N/A</td>
257         </tr>
258         <tr>
259         <td>"streaming_network_bandwidth"</td>
260         <td>int</td>
261         <td>range</td>
262         </tr>
263         <tr>
264         <td>"streaming_cookie"</td>
265         <td>string</td>
266         <td>N/A</td>
267         </tr>
268         <tr>
269         <td>"streaming_proxy_ip"</td>
270         <td>string</td>
271         <td>N/A</td>
272         </tr>
273         <tr>
274         <td>"streaming_proxy_port"</td>
275         <td>int</td>
276         <td>range</td>
277         </tr>
278         <tr>
279         <td>"streaming_timeout"</td>
280         <td>int</td>
281         <td>range</td>
282         </tr>
283         <tr>
284         <td>"display_overlay"</td>
285         <td>data</td>
286         <td>N/A</td>
287         </tr>
288         <tr>
289         <td>"display_rotation"</td>
290         <td>int</td>
291         <td>range</td>
292         </tr>
293         <tr>
294         <td>"subtitle_uri"</td>
295         <td>string</td>
296         <td>N/A</td>
297         </tr>
298         </table></div>
299
300         @par
301         Following attributes are supported for playing stream data. Those value can be readable only and valid after starting playback.\n
302         Please use mm_fileinfo for local playback.
303
304         @par
305         <div><table>
306         <tr>
307         <td>PROPERTY</td>
308         <td>TYPE</td>
309         <td>VALID TYPE</td>
310         </tr>
311         <tr>
312         <td>"content_video_found"</td>
313         <td>string</td>
314         <td>N/A</td>
315         </tr>
316         <tr>
317         <td>"content_video_codec"</td>
318         <td>string</td>
319         <td>N/A</td>
320         </tr>
321         <tr>
322         <td>"content_video_track_num"</td>
323         <td>int</td>
324         <td>range</td>
325         </tr>
326         <tr>
327         <td>"content_audio_found"</td>
328         <td>string</td>
329         <td>N/A</td>
330         </tr>
331         <tr>
332         <td>"content_audio_codec"</td>
333         <td>string</td>
334         <td>N/A</td>
335         </tr>
336         <tr>
337         <td>"content_audio_bitrate"</td>
338         <td>int</td>
339         <td>array</td>
340         </tr>
341         <tr>
342         <td>"content_audio_channels"</td>
343         <td>int</td>
344         <td>range</td>
345         </tr>
346         <tr>
347         <td>"content_audio_samplerate"</td>
348         <td>int</td>
349         <td>array</td>
350         </tr>
351         <tr>
352         <td>"content_audio_track_num"</td>
353         <td>int</td>
354         <td>range</td>
355         </tr>
356         <tr>
357         <td>"content_text_track_num"</td>
358         <td>int</td>
359         <td>range</td>
360         </tr>
361         <tr>
362         <td>"tag_artist"</td>
363         <td>string</td>
364         <td>N/A</td>
365         </tr>
366         <tr>
367         <td>"tag_title"</td>
368         <td>string</td>
369         <td>N/A</td>
370         </tr>
371         <tr>
372         <td>"tag_album"</td>
373         <td>string</td>
374         <td>N/A</td>
375         </tr>
376         <tr>
377         <td>"tag_genre"</td>
378         <td>string</td>
379         <td>N/A</td>
380         </tr>
381         <tr>
382         <td>"tag_author"</td>
383         <td>string</td>
384         <td>N/A</td>
385         </tr>
386         <tr>
387         <td>"tag_copyright"</td>
388         <td>string</td>
389         <td>N/A</td>
390         </tr>
391         <tr>
392         <td>"tag_date"</td>
393         <td>string</td>
394         <td>N/A</td>
395         </tr>
396         <tr>
397         <td>"tag_description"</td>
398         <td>string</td>
399         <td>N/A</td>
400         </tr>
401         <tr>
402         <td>"tag_track_num"</td>
403         <td>int</td>
404         <td>range</td>
405         </tr>
406         </table></div>
407
408  */
409
410
411 /*===========================================================================================
412 |                                                                                           |
413 |  GLOBAL DEFINITIONS AND DECLARATIONS                                        |
414 |                                                                                           |
415 ========================================================================================== */
416
417 /**
418  * MM_PLAYER_URI:
419  *
420  * uri to play (string)
421  *
422  */
423 #define MM_PLAYER_CONTENT_URI                                   "profile_uri"
424 /**
425  * MM_PLAYER_CONTENT_DURATION:
426  *
427  * get the duration (int) as millisecond, It's guaranteed after calling mm_player_start() or
428  * receiving MM_MESSAGE_BEGIN_OF_STREAM.
429  *
430  */
431 #define MM_PLAYER_CONTENT_DURATION                      "content_duration"
432 /**
433  * MM_PLAYER_VIDEO_ROTATION
434  *
435  * can change video angle (int)
436  * @see MMDisplayRotationType
437  */
438 #define MM_PLAYER_VIDEO_ROTATION                                "display_rotation"
439 /**
440  * MM_PLAYER_VIDEO_WIDTH:
441  *
442  * get the video width (int), It's guaranteed after calling mm_player_start() or
443  * receiving MM_MESSAGE_BEGIN_OF_STREAM.
444  *
445  */
446 #define MM_PLAYER_VIDEO_WIDTH                           "content_video_width"
447 /**
448  * MM_PLAYER_VIDEO_HEIGHT:
449  *
450  * get the video height (int), It's guaranteed after calling mm_player_start() or
451  * receiving MM_MESSAGE_BEGIN_OF_STREAM.
452  *
453  */
454 #define MM_PLAYER_VIDEO_HEIGHT                          "content_video_height"
455 /**
456  * MM_PLAYER_VIDEO_EVAS_SURFACE_DO_SCALING:
457  *
458  * set whether or not to scale frames size for evas surface.
459  * if TRUE, it scales down width, height size of frames with given size.
460  * if FALSE, it does not scale down any frames.
461  *
462  */
463 #define MM_PLAYER_VIDEO_EVAS_SURFACE_DO_SCALING         "display_evas_do_scaling"
464 /**
465  * MM_PLAYER_VIDEO_EVAS_SURFACE_SINK:
466  *
467  * get the video evas surface sink plugin name (string), It's guaranteed after calling mm_player_create()
468  *
469  */
470 #define MM_PLAYER_VIDEO_EVAS_SURFACE_SINK               "display_evas_surface_sink"
471 /**
472  * MM_PLAYER_MEM_SRC:
473  *
474  * set memory pointer to play (data)
475  *
476  */
477 #define MM_PLAYER_MEMORY_SRC                                    "profile_user_param"
478 /**
479  * MM_PLAYER_PLAYBACK_COUNT
480  *
481  * can set playback count (int), Default value is 1 and -1 is for infinity playing until releasing it.
482  *
483  */
484 #define MM_PLAYER_PLAYBACK_COUNT                                "profile_play_count"
485 /**
486  * MM_PLAYER_SUBTITLE_URI
487  *
488  * set the subtitle path (string)
489  */
490 #define MM_PLAYER_SUBTITLE_URI                                  "subtitle_uri"
491 /**
492  * MM_PLAYER_STREAMING_TYPE
493  *
494  * set the streaming type (int)
495  * @see MMStreamingType
496  */
497 #define MM_PLAYER_STREAMING_TYPE                                "streaming_type"
498 /**
499  * MM_PLAYER_STREAMING_UDP_TIMEOUT
500  *
501  * set the streaming udp timeout(int)
502  */
503 #define MM_PLAYER_STREAMING_UDP_TIMEOUT         "streaming_udp_timeout"
504 /**
505  * MM_PLAYER_STREAMING_USER_AGENT
506  *
507  * set the streaming user agent (string)
508  */
509 #define MM_PLAYER_STREAMING_USER_AGENT          "streaming_user_agent"
510 /**
511  * MM_PLAYER_STREAMING_WAP_PROFILE
512  *
513  * set the streaming wap profile (int)
514  */
515 #define MM_PLAYER_STREAMING_WAP_PROFILE         "streaming_wap_profile"
516 /**
517  * MM_PLAYER_STREAMING_NET_BANDWIDTH
518  *
519  * set the streaming network bandwidth (int)
520  */
521 #define MM_PLAYER_STREAMING_NET_BANDWIDTH       "streaming_network_bandwidth"
522 /**
523  * MM_PLAYER_STREAMING_COOKIE
524  *
525  * set the streaming cookie (int)
526  */
527 #define MM_PLAYER_STREAMING_COOKIE                      "streaming_cookie"
528 /**
529  * MM_PLAYER_STREAMING_PROXY_IP
530  *
531  * set the streaming proxy ip (string)
532  */
533 #define MM_PLAYER_STREAMING_PROXY_IP                    "streaming_proxy_ip"
534 /**
535  * MM_PLAYER_STREAMING_PROXY_PORT
536  *
537  * set the streaming proxy port (int)
538  */
539 #define MM_PLAYER_STREAMING_PROXY_PORT          "streaming_proxy_port"
540 /**
541  * MM_PLAYER_STREAMING_TIMEOUT
542  *
543  * set the streaming timeout (int)
544  */
545 #define MM_PLAYER_STREAMING_TIMEOUT                     "streaming_timeout"
546 /**
547  * MM_PLAYER_VIDEO_CODEC
548  *
549  * codec the video data is stored in (string)
550  */
551 #define MM_PLAYER_VIDEO_CODEC                           "content_video_codec"
552 /**
553  * MM_PLAYER_VIDEO_TRACK_NUM
554  *
555  * track number inside a collection  (int)
556  */
557 #define MM_PLAYER_VIDEO_TRACK_NUM                       "content_video_track_num"
558 /**
559  * MM_PLAYER_AUDIO_CODEC
560  *
561  * codec the audio data is stored in (string)
562  */
563 #define MM_PLAYER_AUDIO_CODEC                           "content_audio_codec"
564 /**
565  * MM_PLAYER_AUDIO_BITRATE
566  *
567  * set the streaming proxy port (int)
568  */
569 #define MM_PLAYER_AUDIO_BITRATE                         "content_audio_bitrate"
570 /**
571  * MM_PLAYER_AUDIO_CHANNEL
572  *
573  * the number of audio channel (int)
574  */
575 #define MM_PLAYER_AUDIO_CHANNEL                         "content_audio_channels"
576 /**
577  * MM_PLAYER_AUDIO_SAMPLERATE
578  *
579  * audio samplerate  (int)
580  */
581 #define MM_PLAYER_AUDIO_SAMPLERATE                      "content_audio_samplerate"
582 /**
583  * MM_PLAYER_AUDIO_TRACK_NUM
584  *
585  * track number inside a collection (int)
586  */
587 #define MM_PLAYER_AUDIO_TRACK_NUM                       "content_audio_track_num"
588 /**
589  * MM_PLAYER_TEXT_TRACK_NUM
590  *
591  * track number inside a collection (int)
592  */
593 #define MM_PLAYER_TEXT_TRACK_NUM                        "content_text_track_num"
594 /**
595  * MM_PLAYER_TAG_ARTIST
596  *
597  * person(s) responsible for the recording (string)
598  */
599 #define MM_PLAYER_TAG_ARTIST                                    "tag_artist"
600 /**
601  * MM_PLAYER_TAG_ARTIST
602  *
603  * title (string)
604  */
605 #define MM_PLAYER_TAG_TITLE                                     "tag_title"
606 /**
607  * MM_PLAYER_TAG_ARTIST
608  *
609  * album containing this data (string)
610  */
611 #define MM_PLAYER_TAG_ALBUM                                     "tag_album"
612 /**
613  * MM_PLAYER_TAG_ARTIST
614  *
615  * genre this data belongs to (string)
616  */
617 #define MM_PLAYER_TAG_GENRE                                     "tag_genre"
618 /**
619  * MM_PLAYER_TAG_ARTIST
620  *
621  * author (string)
622  */
623 #define MM_PLAYER_TAG_AUTHOUR                           "tag_author"
624 /**
625  * MM_PLAYER_TAG_ARTIST
626  *
627  * copyright notice of the data (string)
628  */
629 #define MM_PLAYER_TAG_COPYRIGHT                         "tag_copyright"
630 /**
631  * MM_PLAYER_TAG_ARTIST
632  *
633  * date the data was created (string)
634  */
635 #define MM_PLAYER_TAG_DATE                                      "tag_date"
636 /**
637  * MM_PLAYER_TAG_ARTIST
638  *
639  * short text describing the content of the data (string)
640  */
641 #define MM_PLAYER_TAG_DESCRIPRION                               "tag_description"
642 /**
643  * MM_PLAYER_TAG_ARTIST
644  *
645  * track number inside a collection (int)
646  */
647 #define MM_PLAYER_TAG_TRACK_NUM                         "tag_track_num"
648 /**
649  * MM_PLAYER_PD_MODE
650  *
651  * progressive download mode (int)
652  */
653 #define MM_PLAYER_PD_MODE                                               "pd_mode"
654
655 #define BUFFER_MAX_PLANE_NUM (4)
656
657 typedef struct {
658         MMPixelFormatType format;                       /**< image format */
659         int width;                                              /**< width of video buffer */
660         int height;                                             /**< height of video buffer */
661         unsigned int timestamp;                         /**< timestamp of stream buffer (msec)*/
662         unsigned int length_total;                      /**< total length of stream buffer (in byte)*/
663         void *data[BUFFER_MAX_PLANE_NUM];
664         void *bo[BUFFER_MAX_PLANE_NUM];  /**< TBM buffer object */
665         void *internal_buffer;                          /**< Internal buffer pointer */
666         int stride[BUFFER_MAX_PLANE_NUM];               /**< stride of plane */
667         int elevation[BUFFER_MAX_PLANE_NUM];    /**< elevation of plane */
668 }MMPlayerVideoStreamDataType;
669
670 /**
671  * Enumerations of player state.
672  */
673 typedef enum {
674         MM_PLAYER_STATE_NULL,                           /**< Player is created, but not realized yet */
675         MM_PLAYER_STATE_READY,                          /**< Player is ready to play media */
676         MM_PLAYER_STATE_PLAYING,                        /**< Player is now playing media */
677         MM_PLAYER_STATE_PAUSED,                         /**< Player is paused while playing media */
678         MM_PLAYER_STATE_NONE,                           /**< Player is not created yet */
679         MM_PLAYER_STATE_NUM,                            /**< Number of player states */
680 } MMPlayerStateType;
681
682 /**
683  * Enumerations of position formats.
684  * Used while invoking mm_player_get_position/mm_player_set_position APIs
685  */
686 typedef enum {
687         MM_PLAYER_POS_FORMAT_TIME,                      /**< Format for time based */
688         MM_PLAYER_POS_FORMAT_PERCENT,                   /**< Format for percentage */
689         MM_PLAYER_POS_FORMAT_NUM,                       /**< Number of position formats */
690 } MMPlayerPosFormatType;
691
692 /**
693  * Enumeration for attribute values types.
694  */
695 typedef enum {
696  MM_PLAYER_ATTRS_TYPE_INVALID = -1,        /**< Type is invalid */
697  MM_PLAYER_ATTRS_TYPE_INT,                 /**< Integer type */
698  MM_PLAYER_ATTRS_TYPE_DOUBLE,              /**< Double type */
699  MM_PLAYER_ATTRS_TYPE_STRING,              /**< UTF-8 String type */
700  MM_PLAYER_ATTRS_TYPE_DATA,                /**< Pointer type */
701  MM_PLAYER_ATTRS_TYPE_ARRAY,               /**< Array type */
702  MM_PLAYER_ATTRS_TYPE_RANGE,               /**< Range type */
703  MM_PLAYER_ATTRS_TYPE_NUM,                 /**< Number of attribute type */
704 } MMPlayerAttrsType;
705
706 /**
707  * Enumeration for attribute validation type.
708  */
709 typedef enum {
710  MM_PLAYER_ATTRS_VALID_TYPE_INVALID = -1,               /**< Invalid validation type */
711  MM_PLAYER_ATTRS_VALID_TYPE_NONE,                               /**< Do not check validity */
712  MM_PLAYER_ATTRS_VALID_TYPE_INT_ARRAY,          /**< validity checking type of integer array */
713  MM_PLAYER_ATTRS_VALID_TYPE_INT_RANGE,          /**< validity checking type of integer range */
714  MM_PLAYER_ATTRS_VALID_TYPE_DOUBLE_ARRAY,               /**< validity checking type of double array */
715  MM_PLAYER_ATTRS_VALID_TYPE_DOUBLE_RANGE,       /**< validity checking type of double range */
716 } MMPlayerAttrsValidType;
717
718 /**
719  * Enumeration for attribute access flag.
720  */
721 typedef enum {
722  MM_PLAYER_ATTRS_FLAG_NONE = 0,                                 /**< None flag is set */
723  MM_PLAYER_ATTRS_FLAG_READABLE = 1 << 0,                        /**< Readable */
724  MM_PLAYER_ATTRS_FLAG_WRITABLE = 1 << 1,                        /**< Writable */
725  MM_PLAYER_ATTRS_FLAG_MODIFIED = 1 << 2,                        /**< Modified */
726
727  MM_PLAYER_ATTRS_FLAG_RW = MM_PLAYER_ATTRS_FLAG_READABLE | MM_PLAYER_ATTRS_FLAG_WRITABLE, /**< Readable and Writable */
728 } MMPlayerAttrsFlag;
729
730 /**
731  * Enumeration for progressive download
732  */
733 typedef enum {
734         MM_PLAYER_PD_MODE_NONE,
735         MM_PLAYER_PD_MODE_URI,
736         MM_PLAYER_PD_MODE_FILE  // not tested yet, because of no fixed scenario
737 }MMPlayerPDMode;
738
739 /**
740  * Enumeration of track types
741  */
742 typedef enum {
743         MM_PLAYER_TRACK_TYPE_AUDIO = 0,
744         MM_PLAYER_TRACK_TYPE_VIDEO,
745         MM_PLAYER_TRACK_TYPE_TEXT,
746         MM_PLAYER_TRACK_TYPE_MAX
747 }MMPlayerTrackType;
748
749 /**
750  * Enumeration of runtime buffering mode
751  */
752 typedef enum {
753         MM_PLAYER_BUFFERING_MODE_ADAPTIVE = 0,  /**< default, If buffering is occurred, player will consider the bandwidth to adjust buffer setting. */
754         MM_PLAYER_BUFFERING_MODE_FIXED,                 /**< player will set buffer size with this fixed size value. */
755         MM_PLAYER_BUFFERING_MODE_SLINK,                 /**< If buffering is occurred, player will adjust buffer setting and no more buffering will be occurred again. */
756         MM_PLAYER_BUFFERING_MODE_MAX = MM_PLAYER_BUFFERING_MODE_SLINK,
757 }MMPlayerBufferingMode;
758
759 /**
760  * Enumeration of audio channel for video share
761  */
762 typedef enum
763 {
764         MM_PLAYER_AUDIO_CH_MONO_LEFT = 0,
765         MM_PLAYER_AUDIO_CH_MONO_RIGHT,
766         MM_PLAYER_AUDIO_CH_STEREO,
767 } MMPlayerAudioChannel;
768
769 typedef enum
770 {
771         MM_PLAYER_FOCUS_CHANGED_COMPLETED = 0,
772         MM_PLAYER_FOCUS_CHANGED_BY_MEDIA,
773         MM_PLAYER_FOCUS_CHANGED_BY_CALL,
774         MM_PLAYER_FOCUS_CHANGED_BY_EARJACK_UNPLUG,
775         MM_PLAYER_FOCUS_CHANGED_BY_RESOURCE_CONFLICT,
776         MM_PLAYER_FOCUS_CHANGED_BY_ALARM,
777         MM_PLAYER_FOCUS_CHANGED_BY_EMERGENCY,
778         MM_PLAYER_FOCUS_CHANGED_BY_NOTIFICATION,
779         MM_PLAYER_FOCUS_CHANGED_BY_UNKNOWN,
780 } MMPlayerFocusChangedMsg;
781
782
783 /**
784  * Edge Properties of the text.
785  */
786 typedef enum {
787         MM_PLAYER_EDGE_NO,
788         MM_PLAYER_EDGE_RAISED,
789         MM_PLAYER_EDGE_DEPRESSED,
790         MM_PLAYER_EDGE_UNIFORM,
791         MM_PLAYER_EDGE_DROPSHADOW
792 } MMPlayerSubtitleEdge;
793
794 /**
795  * Enumeration of media stream buffer status
796  */
797 typedef enum
798 {
799         MM_PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN,
800         MM_PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW,
801 } MMPlayerMediaStreamBufferStatus;
802
803 /**
804  * Enumeration for stream type.
805  */
806 typedef enum
807 {
808         MM_PLAYER_STREAM_TYPE_DEFAULT,  /**< Container type */
809         MM_PLAYER_STREAM_TYPE_AUDIO,    /**< Audio element stream type */
810         MM_PLAYER_STREAM_TYPE_VIDEO,    /**< Video element stream type */
811         MM_PLAYER_STREAM_TYPE_TEXT,     /**< Text type */
812         MM_PLAYER_STREAM_TYPE_MAX,
813 } MMPlayerStreamType;
814
815 /**
816  * Enumeration for pipeline type.
817  */
818 typedef enum
819 {
820         MM_PLAYER_PIPELINE_LEGACY,      /**< Legacy pipeline */
821         MM_PLAYER_PIPELINE_SERVER,      /**< Pipeline for server(src,decoder,demux...) */
822         MM_PLAYER_PIPELINE_CLIENT,      /**< Pipeline for client(sink)*/
823         MM_PLAYER_PIPELINE_MAX
824 } MMPlayerPipelineType;
825
826 /**
827  * Attribute validity structure
828  */
829 typedef struct {
830          MMPlayerAttrsType type;
831          MMPlayerAttrsValidType validity_type;
832          MMPlayerAttrsFlag flag;
833         /**
834           * a union that describes validity of the attribute.
835           * Only when type is 'MM_ATTRS_TYPE_INT' or 'MM_ATTRS_TYPE_DOUBLE',
836           * the attribute can have validity.
837          */
838          union {
839                 /**
840                    * Validity structure for integer array.
841                  */
842                 struct {
843                         int *array;  /**< a pointer of array */
844                         int count;   /**< size of array */
845                         int d_val;
846                 } int_array;
847                 /**
848                    * Validity structure for integer range.
849                  */
850                 struct {
851                         int min;   /**< minimum range */
852                         int max;   /**< maximum range */
853                         int d_val;
854                 } int_range;
855                 /**
856                 * Validity structure for double array.
857                 */
858                 struct {
859                         double   * array;  /**< a pointer of array */
860                         int    count;   /**< size of array */
861                         double d_val;
862                 } double_array;
863                 /**
864                 * Validity structure for double range.
865                 */
866                 struct {
867                         double   min;   /**< minimum range */
868                         double   max;   /**< maximum range */
869                         double d_val;
870                 } double_range;
871         };
872 } MMPlayerAttrsInfo;
873
874 /**
875  * Volume type.
876  *
877  * @see         mm_player_set_volume, mm_player_get_volume
878  */
879 typedef struct {
880         float   level[MM_VOLUME_CHANNEL_NUM];   /**< Relative volume factor for each channels */
881 } MMPlayerVolumeType;
882
883 /**
884  * Video stream info in external demux case
885  *
886 **/
887 typedef struct _VideoStreamInfo
888 {
889         const char *mime;
890         unsigned int framerate_num;
891         unsigned int framerate_den;
892         unsigned int width;
893         unsigned int height;
894         unsigned char *codec_extradata;
895         unsigned int extradata_size;
896         unsigned int version;
897 }MMPlayerVideoStreamInfo;
898
899 /**
900  * Audio stream info in external demux case
901  *
902 **/
903 typedef struct _AudioStreamInfo
904 {
905         const char *mime;
906         unsigned int channels;
907         unsigned int sample_rate;
908         unsigned char *codec_extradata;
909         unsigned int extradata_size;
910         unsigned int version;
911         unsigned int user_info;
912
913         /* for pcm */
914 //      unsigned int width;
915 //      unsigned int depth;
916 //      unsigned int endianness;
917 //      bool signedness;
918 }MMPlayerAudioStreamInfo;
919
920 /**
921  * Subtitle stream info in external demux case
922  *
923 **/
924 typedef struct _SubtitleStreamInfo
925 {
926         const char *mime;
927         unsigned int codec_tag;
928         void *context;  //for smpte text
929 }MMPlayerSubtitleStreamInfo;
930
931 /**
932  * Audio stream callback function type.
933  *
934  * @param       stream          [in]    Reference pointer to audio frame data
935  * @param       stream_size     [in]    Size of audio frame data
936  * @param       user_param      [in]    User defined parameter which is passed when set
937  *                                                              audio stream callback
938  *
939  * @return      This callback function have to return MM_ERROR_NONE.
940  */
941 typedef bool    (*mm_player_audio_stream_callback) (void *stream, int stream_size, void *user_param);
942
943
944 /**
945  * selected subtitle track number callback function type.
946  *
947  * @param       track_num       [in]    Track number of subtitle
948  * @param       user_param      [in]    User defined parameter
949  *
950  *
951  * @return      This callback function have to return MM_ERROR_NONE.
952  */
953 typedef bool            (*mm_player_track_selected_subtitle_language_callback)(int track_num, void *user_param);
954
955 /**
956  * Buffer underrun / overflow data callback function type.
957  *
958  * @param       status     [in] buffer status
959  * @param       user_param [in] User defined parameter which is passed when set
960  *                              to enough data callback or need data callback
961  *
962  * @return      This callback function have to return MM_ERROR_NONE.
963  */
964 typedef bool    (*mm_player_media_stream_buffer_status_callback) (MMPlayerStreamType type, MMPlayerMediaStreamBufferStatus status, void *user_param);
965
966 /**
967  * Buffer seek data callback function type.
968  *
969  * @param       offset     [in] offset for the buffer playback
970  * @param       user_param [in] User defined parameter which is passed when set
971  *                              to seek data callback
972  *
973  * @return      This callback function have to return MM_ERROR_NONE.
974  */
975 typedef bool    (*mm_player_media_stream_seek_data_callback) (MMPlayerStreamType type, unsigned long long offset, void *user_param);
976
977 /**
978  * Called to notify the stream changed.
979  *
980  * @param user_data [in] The user data passed from the callback registration function
981  *
982  * @return      This callback function have to return MM_ERROR_NONE.
983  */
984 typedef bool    (*mm_player_stream_changed_callback) (void *user_param);
985
986
987 /*===========================================================================================
988 |                                                                                           |
989 |  GLOBAL FUNCTION PROTOTYPES                                        |
990 |                                                                                           |
991 ========================================================================================== */
992
993 /**
994  * This function creates a player object for playing multimedia contents. \n
995  * The attributes of player are created to get/set some values with application. \n
996  * And, mutex, gstreamer and other resources are initialized at this time. \n
997  * If player is created, the state will become MM_PLAYER_STATE_NULL.
998  *
999  * @param       player          [out]   Handle of player
1000  *
1001  * @return      This function returns zero on success, or negative value with error code. \n
1002  *                      Please refer 'mm_error.h' to know it in detail.
1003  * @pre         None
1004  * @post        MM_PLAYER_STATE_NULL
1005  * @see         mm_player_destroy
1006  * @remark      You can create multiple handles on a context at the same time. \n
1007  *                      However, player cannot guarantee proper operation because of limitation of resources, \n
1008  *                      such as audio device or display device.
1009  *
1010  * @par Example
1011  * @code
1012 char *g_err_attr_name = NULL;
1013
1014 if (mm_player_create(&g_player) != MM_ERROR_NONE)
1015 {
1016         LOGE("failed to create player\n");
1017 }
1018
1019 if (mm_player_set_attribute(g_player,
1020                                                 &g_err_attr_name,
1021                                                 "profile_uri", filename, strlen(filename),
1022                                                 "display_overlay", (void*)&g_win.xid, sizeof(g_win.xid),
1023                                                 NULL) != MM_ERROR_NONE)
1024 {
1025         LOGE("failed to set %s attribute\n", g_err_attr_name);
1026         free(g_err_attr_name);
1027 }
1028
1029 mm_player_set_message_callback(g_player, msg_callback, (void*)g_player);
1030  * @endcode
1031  */
1032 int mm_player_create(MMHandleType *player);
1033
1034 /**
1035  * This function releases player object and all resources which were created by mm_player_create(). \n
1036  * And, player handle will also be destroyed.
1037  *
1038  * @param       player          [in]    Handle of player
1039  *
1040  * @return      This function returns zero on success, or negative value with error code.
1041  * @pre         Player state may be MM_PLAYER_STATE_NULL. \n
1042  *                      But, it can be called in any state.
1043  * @post                Because handle is released, there is no any state.
1044  * @see         mm_player_create
1045  * @remark      This method can be called with a valid player handle from any state to \n
1046  *                      completely shutdown the player operation.
1047  *
1048  * @par Example
1049  * @code
1050 if (mm_player_destroy(g_player) != MM_ERROR_NONE)
1051 {
1052         LOGE("failed to destroy player\n");
1053 }
1054  * @endcode
1055  */
1056 int mm_player_destroy(MMHandleType player);
1057
1058 /**
1059  * This function register the sound focus using application PID \n
1060  * So, application PID should be set before realizing with mm_player_set_attribute(). \n
1061  *
1062  * @param       player          [in]    Handle of player
1063  *
1064  * @return      This function returns zero on success, or negative value with error code.
1065  *
1066  * @pre         Player state should be MM_PLAYER_STATE_NULL.
1067  * @remark      None
1068  */
1069 int mm_player_sound_register(MMHandleType player, int pid);
1070
1071 /**
1072  * This function parses uri and makes gstreamer pipeline by uri scheme. \n
1073  * So, uri should be set before realizing with mm_player_set_attribute(). \n
1074  *
1075  * @param       player          [in]    Handle of player
1076  *
1077  * @return      This function returns zero on success, or negative value with error code.
1078  *
1079  * @pre         Player state should be MM_PLAYER_STATE_NULL.
1080  * @post                Player state will be MM_PLAYER_STATE_READY.
1081  * @see         mm_player_unrealize
1082  * @remark      None
1083  * @par Example
1084  * @code
1085 if (mm_player_realize(g_player) != MM_ERROR_NONE)
1086 {
1087         LOGE("failed to realize player\n");
1088 }
1089  * @endcode
1090  */
1091 int mm_player_realize(MMHandleType player) ;
1092
1093 /**
1094  * This function uninitializes player object. So, resources and allocated memory \n
1095  * will be freed. And, gstreamer pipeline is also destroyed. So, if you want to play \n
1096  * other contents, player should be created again after destruction or realized with new uri.
1097  *
1098  * @param       player          [in]    Handle of player
1099  *
1100  * @return      This function returns zero on success, or negative value with error code.
1101  * @pre         Player state may be MM_PLAYER_STATE_READY to unrealize. \n
1102  *                      But, it can be called in any state.
1103  * @post                Player state will be MM_PLAYER_STATE_NULL.
1104  * @see         mm_player_realize
1105  * @remark      This method can be called with a valid player handle from any state.
1106  *
1107  * @par Example
1108  * @code
1109 if (mm_player_unrealize(g_player) != MM_ERROR_NONE)
1110 {
1111         LOGE("failed to unrealize player\n");
1112 }
1113  * @endcode
1114  */
1115 int mm_player_unrealize(MMHandleType player);
1116
1117 /**
1118  * This function is to get current state of player. \n
1119  * Application have to check current state before doing some action.
1120  *
1121  * @param       player          [in]    Handle of player
1122  * @param       state       [out] current state of player on success
1123  *
1124  * @return      This function returns zero on success, or negative value with error code.
1125  *
1126  * @see         MMPlayerStateType
1127  * @remark      None
1128  * @par Example
1129  * @code
1130 if (mm_player_get_state(g_player, &state) != MM_ERROR_NONE)
1131 {
1132         LOGE("failed to get state\n");
1133 }
1134  * @endcode
1135  */
1136 int mm_player_get_state(MMHandleType player, MMPlayerStateType *state);
1137
1138 /**
1139  * This function is to set relative volume of player. \n
1140  * So, It controls logical volume value. \n
1141  * But, if developer want to change system volume, mm sound api should be used.
1142  *
1143  * @param       player          [in]    Handle of player
1144  * @param       volume          [in]    Volume factor of each channel
1145  *
1146  * @return      This function returns zero on success, or negative value with error code.
1147  * @see         MMPlayerVolumeType, mm_player_get_volume
1148  * @remark      The range of factor range is from 0 to 1.0. (1.0 = 100%) And, default value is 1.0.
1149  * @par Example
1150  * @code
1151 MMPlayerVolumeType volume;
1152 int i = 0;
1153
1154 for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++)
1155         volume.level[i] = MM_VOLUME_LEVEL_MAX;
1156
1157 if (mm_player_set_volume(g_player, &volume) != MM_ERROR_NONE)
1158 {
1159     LOGE("failed to set volume\n");
1160 }
1161  * @endcode
1162  */
1163 int mm_player_set_volume(MMHandleType player, MMPlayerVolumeType *volume);
1164
1165 /**
1166  * This function is to get current volume factor of player.
1167  *
1168  * @param       player          [in]    Handle of player.
1169  * @param       volume          [out]   Volume factor of each channel.
1170  *
1171  * @return      This function returns zero on success, or negative value with error code.
1172  *
1173  * @see         MMPlayerVolumeType, mm_player_set_volume
1174  * @remark      None
1175  * @par Example
1176  * @code
1177 MMPlayerVolumeType volume;
1178 int i;
1179
1180 if (mm_player_get_volume(g_player, &volume) != MM_ERROR_NONE)
1181 {
1182         LOGW("failed to get volume\n");
1183 }
1184
1185 for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++)
1186         LOGD("channel[%d] = %d \n", i, volume.level[i]);
1187  * @endcode
1188  */
1189 int mm_player_get_volume(MMHandleType player, MMPlayerVolumeType *volume);
1190
1191 /**
1192  * This function is to start playing media contents. Demux(parser), codec and related plugins are decided \n
1193  * at this time. And, MM_MESSAGE_BEGIN_OF_STREAM will be posted through callback function registered \n
1194  * by mm_player_set_message_callback().
1195  *
1196  * @param       player          [in]    Handle of player
1197  *
1198  * @return      This function returns zero on success, or negative value with error code.
1199  * @remark
1200  *
1201  * @pre         Player state may be MM_PLAYER_STATE_READY.
1202  * @post                Player state will be MM_PLAYER_STATE_PLAYING.
1203  * @see         mm_player_stop
1204  * @remark      None
1205  * @par Example
1206  * @code
1207 if (mm_player_start(g_player) != MM_ERROR_NONE)
1208 {
1209         LOGE("failed to start player\n");
1210 }
1211  * @endcode
1212  */
1213 int mm_player_start(MMHandleType player);
1214
1215 /**
1216  * This function is to stop playing media contents and it's different with pause. \n
1217  * If mm_player_start() is called after this, content will be started again from the beginning. \n
1218  * So, it can be used to close current playback.
1219  *
1220  * @param       player          [in]    Handle of player
1221  *
1222  * @return      This function returns zero on success, or negative value with error code.
1223  *
1224  * @pre         Player state may be MM_PLAYER_STATE_PLAYING.
1225  * @post                Player state will be MM_PLAYER_STATE_READY.
1226  * @see         mm_player_start
1227  * @remark      None
1228  * @par Example
1229  * @code
1230 if (mm_player_stop(g_player) != MM_ERROR_NONE)
1231 {
1232         LOGE("failed to stop player\n");
1233 }
1234  * @endcode
1235  */
1236 int mm_player_stop(MMHandleType player);
1237
1238 /**
1239  * This function is to pause playing media contents.
1240  *
1241  * @param       player          [in]    Handle of player.
1242  *
1243  * @return      This function returns zero on success, or negative value with error code.
1244  *
1245  * @pre         Player state may be MM_PLAYER_STATE_PLAYING.
1246  * @post                Player state will be MM_PLAYER_STATE_PAUSED.
1247  * @see         mm_player_resume
1248  * @remark      None
1249  * @par Example
1250  * @code
1251 if (mm_player_pause(g_player) != MM_ERROR_NONE)
1252 {
1253         LOGE("failed to pause player\n");
1254 }
1255  * @endcode
1256  */
1257 int mm_player_pause(MMHandleType player);
1258
1259 /**
1260  * This function is to resume paused media contents.
1261  *
1262  * @param       player          [in]    Handle of player.
1263  *
1264  * @return      This function returns zero on success, or negative value with error code.
1265  *
1266  * @pre         Player state may be MM_PLAYER_STATE_PAUSED.
1267  * @post                Player state will be MM_PLAYER_STATE_PLAYING.
1268  * @see         mm_player_pause
1269  * @remark      None
1270  * @par Example
1271  * @code
1272 if (mm_player_resume(g_player) != MM_ERROR_NONE)
1273 {
1274         LOGE("failed to resume player\n");
1275 }
1276  * @endcode
1277  */
1278 int mm_player_resume(MMHandleType player);
1279
1280 /**
1281  * This function is to set the position for playback. \n
1282  * So, it can be seeked to requested position. \n
1283  *
1284  * @param       player          [in]    Handle of player
1285  * @param       format          [in]    Format of position.
1286  * @param       pos                     [in]    Position for playback
1287  *
1288  * @return      This function returns zero on success, or negative value with error code.
1289  * @see         MMPlayerPosFormatType, mm_player_get_position
1290  * @remark  the unit of time-based format is millisecond and other case is percent.
1291  * @par Example
1292  * @code
1293 int position = 1000; //1sec
1294
1295 if (mm_player_set_position(g_player, MM_PLAYER_POS_FORMAT_TIME, position) != MM_ERROR_NONE)
1296 {
1297         LOGE("failed to set position\n");
1298 }
1299  * @endcode
1300  */
1301 int mm_player_set_position(MMHandleType player, MMPlayerPosFormatType format, int pos);
1302
1303 /**
1304  * This function is to get current position of playback content.
1305  *
1306  * @param       player          [in]    Handle of player.
1307  * @param       format          [in]    Format of position.
1308  * @param    pos        [out] contains current position on success or zero in case of failure.
1309  *
1310  * @return      This function returns zero on success, or negative value with errors
1311  * @see         MMPlayerPosFormatType, mm_player_set_position
1312  * @remark      the unit of time-based format is millisecond and other case is percent.
1313  * @par Example
1314  * @code
1315 int position = 0;
1316 int duration = 0;
1317
1318 mm_player_get_position(g_player, MM_PLAYER_POS_FORMAT_TIME, &position);
1319
1320 mm_player_get_attribute(g_player, &g_err_name, "content_duration", &duration, NULL);
1321
1322 LOGD("pos: [%d/%d] msec\n", position, duration);
1323  * @endcode
1324  */
1325 int mm_player_get_position(MMHandleType player, MMPlayerPosFormatType format, unsigned long *pos);
1326
1327 /**
1328  * This function is to get current buffer position of playback content.
1329  *
1330  * @param       player          [in]    Handle of player.
1331  * @param       format          [in]    Format of position.
1332  * @param       start_pos               [out] contains buffer start  position on success or zero in case of failure.
1333  * @param       stop_pos        [out] contains buffer current  position on success or zero in case of failure.
1334  *
1335  * @return      This function returns zero on success, or negative value with errors
1336  * @see         MMPlayerPosFormatType, mm_player_set_position
1337  * @remark      the unit of time-based format is millisecond and other case is percent.
1338  * @par Example
1339  * @code
1340 int start_pos = 0, stop_pos = 0;
1341
1342 mm_player_get_buffer_position(g_player, MM_PLAYER_POS_FORMAT_PERCENT, &start_pos, &stop_pos );
1343
1344 LOGD("buffer position: [%d] ~ [%d] \%\n", start_pos, stop_pos );
1345  * @endcode
1346  */
1347 int mm_player_get_buffer_position(MMHandleType player, MMPlayerPosFormatType format, unsigned long *start_pos, unsigned long *stop_pos);
1348
1349 /**
1350  * This function is to activate the section repeat. If it's set, selected section will be played \n
1351  * continually before deactivating it by mm_player_deactivate_section_repeat(). \n
1352  * The unit for setting is millisecond.
1353  *
1354  * @param       player          [in]    Handle of player.
1355  * @param       start_pos               [in]    start position.
1356  * @param       end_pos                 [in]    end position.
1357  *
1358  * @return      This function returns zero on success, or negative value with error code.
1359  * @see         mm_player_deactivate_section_repeat
1360  * @remark      None
1361  * @par Example
1362  * @code
1363 int position;
1364 int endtime = 4000; //msec
1365
1366 mm_player_get_position(g_player, MM_PLAYER_POS_FORMAT_TIME, &position);
1367
1368 mm_player_activate_section_repeat(g_player, position, position+endtime);
1369  * @endcode
1370  */
1371 int mm_player_activate_section_repeat(MMHandleType player, int start_pos, int end_pos);
1372
1373 /**
1374  * This function is to deactivate the section repeat.
1375  *
1376  * @param       player          [in]    Handle of player.
1377  *
1378  * @return      This function returns zero on success, or negative value with error code.
1379  * @see         mm_player_activate_section_repeat
1380  * @remark      None
1381  * @par Example
1382  * @code
1383 if ( mm_player_deactivate_section_repeat(g_player) != MM_ERROR_NONE)
1384 {
1385         LOGW("failed to deactivate section repeat\n");
1386 }
1387  * @endcode
1388  */
1389 int mm_player_deactivate_section_repeat(MMHandleType player);
1390
1391 /**
1392  * This function sets callback function for receiving messages from player.
1393  * So, player can notify warning, error and normal cases to application.
1394  *
1395  * @param       player          [in]    Handle of player.
1396  * @param       callback        [in]    Message callback function.
1397  * @param       user_param      [in]    User parameter which is passed to callback function.
1398  *
1399  * @return      This function returns zero on success, or negative value with error code.
1400  * @see         MMMessageCallback
1401  * @remark      None
1402  * @par Example
1403  * @code
1404 int msg_callback(int message, MMMessageParamType *param, void *user_param)
1405 {
1406         switch (message)
1407         {
1408                 case MM_MESSAGE_ERROR:
1409                         //do something
1410                         break;
1411
1412                 case MM_MESSAGE_END_OF_STREAM:
1413                         //do something
1414                         break;
1415
1416                 case MM_MESSAGE_STATE_CHANGED:
1417                         //do something
1418                         break;
1419
1420                 case MM_MESSAGE_BEGIN_OF_STREAM:
1421                         //do something
1422                         break;
1423
1424                 default:
1425                         break;
1426         }
1427         return TRUE;
1428 }
1429
1430 mm_player_set_message_callback(g_player, msg_callback, (void*)g_player);
1431  * @endcode
1432  */
1433 int mm_player_set_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param);
1434
1435 /**
1436  * This function set callback function for receiving audio stream from player. \n
1437  * So, application can get raw audio data and modify it. \n
1438  * But, if callback don't return or holds it for long time, performance can be deteriorated. \n
1439  * It's only supported when audio stream is included in file. \n
1440  * So, if there is video stream or DRM content, it can't be used.
1441  *
1442  * @param       player          [in]    Handle of player.
1443  * @param       callback                [in]    Audio stream callback function.
1444  * @param       user_param      [in]    User parameter.
1445  *
1446  * @return      This function returns zero on success, or negative value with error
1447  *                      code.
1448  * @see         mm_player_audio_stream_callback
1449  * @remark      It can be used for audio playback only.
1450  * @par Example
1451  * @code
1452 bool audio_callback(void *stream, int stream_size, void *user_param)
1453 {
1454         LOGD("audio stream callback\n");
1455         return TRUE;
1456 }
1457 mm_player_set_audio_stream_callback(g_player, audio_callback, NULL);
1458  * @endcode
1459  */
1460  int mm_player_set_audio_stream_callback(MMHandleType player, mm_player_audio_stream_callback callback, void *user_param);
1461
1462 /**
1463  * This function is to mute volume of player
1464  *
1465  * @param       player  [in]    Handle of player
1466  * @param       mute    [in]    Mute(1) or not mute(0)
1467  *
1468  * @return      This function returns zero on success, or negative value with error code
1469  * @see         mm_player_get_mute
1470  * @remark      None
1471  * @par Example
1472  * @code
1473 if (mm_player_set_mute(g_player, TRUE) != MM_ERROR_NONE)
1474 {
1475         LOGW("failed to set mute\n");
1476 }
1477  * @endcode
1478  */
1479 int mm_player_set_mute(MMHandleType player, int mute);
1480
1481 /**
1482  * This function is to get mute value of player
1483  *
1484  * @param       player  [in]    Handle of player
1485  * @param       mute    [out]   Sound is muted
1486  *
1487  * @return      This function returns zero on success, or negative value with error code
1488  * @see         mm_player_set_mute
1489  * @remark      None
1490  * @par Example
1491  * @code
1492 int mute;
1493
1494 if (mm_player_get_mute(g_player, &mute) != MM_ERROR_NONE)
1495 {
1496         LOGW("failed to get mute\n");
1497 }
1498
1499 LOGD("mute status:%d\n", mute);
1500  * @endcode
1501  */
1502 int mm_player_get_mute(MMHandleType player, int *mute);
1503
1504 /**
1505  * This function is to adjust subtitle postion. So, subtitle can show at the adjusted position. \n
1506  * If pos is negative, subtitle will be displayed previous time, the other hand forward time. \n
1507  *
1508  * @param       player  [in]    Handle of player
1509  * @param       pos             [in]    postion to be adjusted
1510  *
1511  * @return      This function returns zero on success, or negative value with error
1512  *                      code
1513  * @see         mm_player_adjust_subtitle_position
1514  * @remark      None
1515  * @par Example
1516  * @code
1517 int pos;
1518
1519 pos = 5000;
1520 if (mm_player_adjust_subtitle_position(g_player, MM_PLAYER_POS_FORMAT_TIME, pos) != MM_ERROR_NONE)
1521 {
1522         LOGW("failed to adjust subtitle postion.\n");
1523 }
1524  * @endcode
1525  */
1526
1527 int mm_player_adjust_subtitle_position(MMHandleType player, MMPlayerPosFormatType format, int pos);
1528
1529 /**
1530  * This function is to set the offset in timestamps of video so as to bring the a/v sync
1531  * @param      player          Handle of player
1532  * @param      offset          offset to be set in milliseconds(can be positive or negative both)
1533  * postive offset to make video lag
1534  * negative offset to make video lead
1535  */
1536 int mm_player_adjust_video_position(MMHandleType player,int offset);
1537 /**
1538  * This function is to set subtitle silent status. So, subtitle can show or hide during playback \n
1539  * by this value. But, one subtitle file should be set with "subtitle_uri" attribute before calling mm_player_realize(); \n
1540  * Player FW parses subtitle file and send text data including timestamp to application \n
1541  * through message callback with MM_MESSAGE_UPDATE_SUBTITLE will be. \n
1542  * So, application have to render it. And, subtitle can be supported only in a seprate file. \n
1543  * So, it's not supported for embedded case.
1544  *
1545  * @param       player  [in]    Handle of player
1546  * @param       silent  [in]    silent(integer value except 0) or not silent(0)
1547  *
1548  * @return      This function returns zero on success, or negative value with error
1549  *                      code
1550  * @see         mm_player_get_subtitle_silent, MM_MESSAGE_UPDATE_SUBTITLE
1551  * @remark      None
1552  * @par Example
1553  * @code
1554 mm_player_set_attribute(g_player,
1555                                         &g_err_name,
1556                                         "subtitle_uri", g_subtitle_uri, strlen(g_subtitle_uri),
1557                                         NULL
1558                                         );
1559
1560 if (mm_player_set_subtitle_silent(g_player, TRUE) != MM_ERROR_NONE)
1561 {
1562         LOGW("failed to set subtitle silent\n");
1563 }
1564  * @endcode
1565  */
1566 int mm_player_set_subtitle_silent(MMHandleType player, int silent);
1567
1568 /**
1569  * This function is to get silent status of subtitle.
1570  *
1571  * @param       player  [in]    Handle of player
1572  * @param       silent  [out]   subtitle silent property
1573  *
1574  * @return      This function returns zero on success, or negative value with error
1575  *                      code
1576  * @see         mm_player_set_subtitle_silent, MM_MESSAGE_UPDATE_SUBTITLE
1577  * @remark      None
1578  * @par Example
1579  * @code
1580 int silent = FALSE;
1581
1582 if (mm_player_get_subtitle_silent(g_player, &silent) != MM_ERROR_NONE)
1583 {
1584         LOGW("failed to set subtitle silent\n");
1585 }
1586  * @endcode
1587  */
1588 int mm_player_get_subtitle_silent(MMHandleType player, int *silent);
1589
1590 /**
1591  * This function is to set attributes into player. Multiple attributes can be set simultaneously. \n
1592  * If one of attribute fails, this function will stop at the point and let you know the name which is failed. \n
1593  *
1594  * @param       player                          [in]    Handle of player.
1595  * @param       err_attr_name                   [out]  Name of attribute which is failed to set
1596  * @param       first_attribute_name    [in]    Name of the first attribute to set
1597  * @param   ...                                 [in]    Value for the first attribute, followed optionally by more name/value pairs, terminated by NULL.
1598  *                                                                       But, in the case of data or string type, it should be name/value/size.
1599  *
1600  * @return      This function returns zero on success, or negative value with error code.
1601  *
1602  * @see         mm_player_get_attribute
1603  * @remark      This function must be terminated by NULL argument.
1604  *                      And, if this function is failed, err_attr_name param must be free.
1605  * @par Example
1606  * @code
1607 char *g_err_attr_name = NULL;
1608
1609 if (mm_player_set_attribute(g_player,
1610                                                 &g_err_attr_name,
1611                                                 "profile_uri", filename, strlen(filename),
1612                                                 "profile_play_count", count,
1613                                                 NULL) != MM_ERROR_NONE)
1614 {
1615         LOGW("failed to set %s attribute\n", g_err_attr_name);
1616         free(g_err_attr_name);
1617 }
1618
1619  * @endcode
1620  */
1621 int mm_player_set_attribute(MMHandleType player,  char **err_attr_name, const char *first_attribute_name, ...)G_GNUC_NULL_TERMINATED;
1622
1623 /**
1624  * This function is to get attributes from player. Multiple attributes can be got simultaneously.
1625  *
1626  * @param       player                          [in]    Handle of player.
1627  * @param       err_attr_name                   [out]  Name of attribute which is failed to get
1628  * @param       first_attribute_name    [in]    Name of the first attribute to get
1629  * @param       ...                                     [out] Value for the first attribute, followed optionally by more name/value pairs, terminated by NULL.
1630  *                                                                       But, in the case of data or string type, it should be name/value/size.
1631  *
1632  * @return      This function returns zero on success, or negative value with error
1633  *                      code.
1634  * @see         mm_player_set_attribute
1635  * @remark      This function must be terminated by NULL argument.
1636  *                      And, if this function is failed, err_attr_name param must be free.
1637  * @par Example
1638  * @code
1639 char *g_err_attr_name = NULL;
1640
1641 if (mm_player_get_attribute(g_player, &g_err_attr_name, "content_duration", &duration, NULL) != MM_ERROR_NONE)
1642 {
1643         LOGW("failed to set %s attribute\n", g_err_attr_name);
1644         free(g_err_attr_name);
1645 }
1646  * @endcode
1647  */
1648 int mm_player_get_attribute(MMHandleType player,  char **err_attr_name, const char *first_attribute_name, ...)G_GNUC_NULL_TERMINATED;
1649
1650 /**
1651  * This function is to get detail information of attribute.
1652  *
1653  * @param       player                           [in]   Handle of player.
1654  * @param   attribute_name               [in]   Name of the attribute to get
1655  * @param   info                                 [out]  Attribute infomation
1656  *
1657  * @return      This function returns zero on success, or negative value with error
1658  *                      code.
1659  *
1660  * @see         mm_player_set_attribute, mm_player_get_attribute
1661  * @remark      None
1662  * @par Example
1663  * @code
1664 if (mm_player_get_attribute_info (g_player, "display_method", &method_info) != MM_ERROR_NONE)
1665 {
1666         LOGW("failed to get info\n");
1667 }
1668
1669 LOGD("type:%d \n", method_info.type); //int, double..
1670 LOGD("flag:%d \n", method_info.flag); //readable, writable..
1671 LOGD("validity type:%d \n", method_info.validity_type); //range, array..
1672
1673 if (method_info. validity_type == MM_PLAYER_ATTRS_VALID_TYPE_INT_RANGE)
1674 {
1675         LOGD("range min:%d\n", method_info.int_range.min);
1676         LOGD("range max:%d\n", method_info.int_range.max);
1677 }
1678  * @endcode
1679  */
1680 int mm_player_get_attribute_info(MMHandleType player,  const char *attribute_name, MMPlayerAttrsInfo *info);
1681
1682 /**
1683  * This function is to get download position and total size of progressive download
1684  *
1685  * @param       player          [in]    Handle of player.
1686  * @param       current_pos     [in]    Download position currently (bytes)
1687  * @param       total_size      [in]    Total size of file (bytes)
1688  *
1689  * @return      This function returns zero on success, or negative value with error code.
1690  *
1691  * @see
1692  * @remark
1693  * @par Example
1694  * @code
1695 guint64 current_pos = 0LLU;
1696 guint64 total_size = 0LLU;
1697
1698 if (mm_player_get_pd_status(g_player, &current_pos, &total_size, NULL) != MM_ERROR_NONE)
1699 {
1700         LOGD("current download pos = %llu, total size = %llu\n", current_pos, total_size);
1701 }
1702  * @endcode
1703  */
1704 int mm_player_get_pd_status(MMHandleType player, guint64 *current_pos, guint64 *total_size);
1705
1706 /**
1707  * This function sets callback function for receiving messages of PD downloader.
1708  *
1709  * @param       player          [in]    Handle of player.
1710  * @param       callback                [in]    Message callback function.
1711  * @param       user_param      [in]    User parameter which is passed to callback function.
1712  *
1713  * @return      This function returns zero on success, or negative value with error code.
1714  * @see
1715  * @remark      None
1716  * @par Example
1717  * @code
1718 int msg_callback(int message, MMMessageParamType *param, void *user_param)
1719 {
1720         switch (message)
1721         {
1722                 case MM_MESSAGE_PD_DOWNLOADER_START:
1723                         LOGD("Progressive download is started...\n");
1724                         break;
1725                 case MM_MESSAGE_PD_DOWNLOADER_END:
1726                         LOGD("Progressive download is ended...\n");
1727                         break;
1728                 default:
1729                         break;
1730         }
1731         return TRUE;
1732 }
1733
1734 mm_player_set_pd_message_callback(g_player, msg_callback, NULL);
1735  * @endcode
1736  */
1737 int mm_player_set_pd_message_callback(MMHandleType player, MMMessageCallback callback, void *user_param);
1738
1739 /**
1740  * This function is to get the track count
1741  *
1742  * @param       player          [in]    handle of player.
1743  * @param       track                   [in]    type of the track type
1744  * @param       info                    [out]   the count of the track
1745  *
1746  * @return      This function returns zero on success, or negative value with error
1747  *                      code.
1748  *
1749  * @see
1750  * @remark      None
1751  * @par Example
1752  * @code
1753 gint audio_count = 0;
1754
1755 if (mm_player_get_track_count (g_player, MM_PLAYER_TRACK_TYPE_AUDIO, &audio_count) != MM_ERROR_NONE)
1756 {
1757         LOGW("failed to get audio track count\n");
1758 }
1759
1760 LOGD("audio track count : %d \n", audio_count);
1761  * @endcode
1762  */
1763 int mm_player_get_track_count(MMHandleType player,  MMPlayerTrackType type, int *count);
1764
1765 /**
1766  * This function is to select the track
1767  *
1768  * @param       player          [in]    handle of player.
1769  * @param       type                    [in]    type of the track type
1770  * @param       index           [in]    the index of the track
1771  *
1772  * @return      This function returns zero on success, or negative value with error
1773  *                      code.
1774  *
1775  * @see
1776  * @remark      None
1777  */
1778 int mm_player_select_track(MMHandleType player, MMPlayerTrackType type, int index);
1779 #ifdef _MULTI_TRACK
1780 /**
1781  * This function is to add the track when user want multi subtitle
1782  *
1783  * @param       player          [in]    handle of player.
1784  * @param       index           [in]    the index of the track
1785  *
1786  * @return      This function returns zero on success, or negative value with error
1787  *                      code.
1788  *
1789  * @see
1790  * @remark      None
1791  */
1792 int mm_player_track_add_subtitle_language(MMHandleType player, int index);
1793
1794 /**
1795  * This function is to remove the track when user want multi subtitle
1796  *
1797  * @param       player          [in]    handle of player.
1798  * @param       index           [in]    the index of the track
1799  *
1800  * @return      This function returns zero on success, or negative value with error
1801  *                      code.
1802  *
1803  * @see
1804  * @remark      None
1805  */
1806 int mm_player_track_remove_subtitle_language(MMHandleType player, int index);
1807
1808 /**
1809  * This function is to notify which sutitle track is in use
1810  *
1811  * @param       player          [in]    handle of player.
1812  * @param       callback                        [in]    callback function to register
1813  * @param       user_data       [in]    user data to be passed to the callback function
1814  *
1815  * @return      This function returns zero on success, or negative value with error
1816  *                      code.
1817  *
1818  * @see
1819  * @remark      None
1820  */
1821 int mm_player_track_foreach_selected_subtitle_language(MMHandleType player, mm_player_track_selected_subtitle_language_callback callback, void *user_param);
1822 #endif
1823 /**
1824  * This function is to get the track language
1825  *
1826  * @param       player          [in]    handle of player.
1827  * @param       type                    [in]    type of the track type
1828  * @param       index           [in]    the index of the track
1829  * @param       code                    [out] language code in ISO 639-1(string)
1830  *
1831  * @return      This function returns zero on success, or negative value with error
1832  *                      code.
1833  *
1834  * @see
1835  * @remark      None
1836  */
1837 int mm_player_get_track_language_code(MMHandleType player,  MMPlayerTrackType type, int index, char **code);
1838
1839 /**
1840  * This function is to get the current running track
1841  *
1842  * @param       player          [in]    handle of player.
1843  * @param       type                    [in]    type of the track type
1844  * @param       index           [out]    the index of the track
1845  *
1846  * @return      This function returns zero on success, or negative value with error
1847  *                      code.
1848  *
1849  * @see
1850  * @remark      None
1851  */
1852
1853 int mm_player_get_current_track(MMHandleType hplayer, MMPlayerTrackType type, int *index);
1854
1855 /**
1856  * This function is to set the buffer size for streaming playback. \n
1857  *
1858  * @param       player          [in]    Handle of player
1859  * @param       second          [in]    Size of initial buffer
1860  *
1861  * @return      This function returns zero on success, or negative value with error code.
1862  * @remark  None
1863  * @par Example
1864  * @code
1865 gint second = 10; //10sec
1866
1867 if (mm_player_set_prepare_buffering_time(g_player, second) != MM_ERROR_NONE)
1868 {
1869         LOGE("failed to set buffer size\n");
1870 }
1871  * @endcode
1872  */
1873
1874 int mm_player_set_prepare_buffering_time(MMHandleType player, int second);
1875
1876 /**
1877  * This function is to set the runtime buffering mode for streaming playback. \n
1878  *
1879  * @param       player          [in]    Handle of player
1880  * @param       mode            [in]    mode of runtime buffering
1881  * @param       second          [in]    max size of buffering
1882  *
1883  * @return      This function returns zero on success, or negative value with error code.
1884  * @remark  None
1885  * @par Example
1886  * @code
1887
1888 if (mm_player_set_runtime_buffering_mode(g_player, MM_PLAYER_BUFFERING_MODE_ADAPTIVE, 10) != MM_ERROR_NONE)
1889 {
1890         LOGE("failed to set buffering mode\n");
1891 }
1892  * @endcode
1893  */
1894
1895 int mm_player_set_runtime_buffering_mode(MMHandleType player, MMPlayerBufferingMode mode, int second);
1896
1897 /**
1898  * This function is to set the start position of zoom
1899  *
1900  * @param       player          [in]    handle of player
1901  * @param       level           [in]    level of zoom
1902  * @param       x               [in]    start x position
1903  * @param       y               [in]    start y position
1904  *
1905  * @return      This function returns zero on success, or negative value with error
1906  *                      code.
1907  *
1908  * @see
1909  * @remark      None
1910  */
1911 int mm_player_set_display_zoom(MMHandleType player, float level, int x, int y);
1912
1913 /**
1914  * This function is to get the start position of zoom
1915  *
1916  * @param       player           [in]    handle of player
1917  * @param       type            [out]    current level of zoom
1918  * @param       x               [out]    start x position
1919  * @param       y               [out]    start y position
1920  *
1921  * @return      This function returns zero on success, or negative value with error
1922  *                      code.
1923  *
1924  * @see
1925  * @remark      None
1926  */
1927 int mm_player_get_display_zoom(MMHandleType player, float *level, int *x, int *y);
1928
1929 /**
1930  * This function is to set the subtitle path
1931  *
1932  * @param       player  [in]    handle of player
1933  * @param       path    [in]    subtitle path
1934  *
1935  * @return      This function returns zero on success, or negative value with error code.
1936  *
1937  * @see
1938  * @remark      None
1939  */
1940 int mm_player_set_external_subtitle_path(MMHandleType player, const char* path);
1941
1942 /**
1943  * This function is to set the clock which is from master player
1944  *
1945  * @param       player  [in]    handle of player
1946  * @param       clock   [in]    clock of master player
1947  * @param       clock_delta [in]        clock difference between master and slave
1948  * @param       video_time      [in]    current playing position
1949  * @param       media_clock     [in]    media clock information
1950  * @param       audio_time      [in]    audio timestamp information
1951  * @return      This function returns zero on success, or negative value with error code.
1952  *
1953  * @see
1954  * @remark      None
1955  */
1956 int mm_player_set_video_share_master_clock(MMHandleType player, long long clock, long long clock_delta, long long video_time, long long media_clock, long long audio_time);
1957 /**
1958  * This function is to get the master clock
1959  *
1960  * @param       player          [in]    handle of player
1961  * @param       video_time      [out]   current playing position
1962  * @param       media_clock     [out]   media clock information
1963  * @param       audio_time      [out]   audio timestamp information
1964  * @return      This function returns zero on success, or negative value with error code.
1965  *
1966  * @see
1967  * @remark      None
1968  */
1969 int mm_player_get_video_share_master_clock(MMHandleType player, long long *video_time, long long *media_clock, long long *audio_time);
1970 /**
1971  * This function is to set audio channel
1972  *
1973  * @param       player          [in]    handle of player
1974  * @param       ch                      [in]    audio channel
1975  * @return      This function returns zero on success, or negative value with error code.
1976  *
1977  * @see
1978  * @remark      None
1979  */
1980 int mm_player_gst_set_audio_channel(MMHandleType player, MMPlayerAudioChannel ch);
1981
1982 /**
1983  * This function is to get the content angle
1984  *
1985  * @param       player          [in]    handle of player
1986  * @param       angle           [out]   orignal angle from content
1987  * @return      This function returns zero on success, or negative value with error code.
1988  *
1989  * @see
1990  * @remark      None
1991  */
1992 int mm_player_get_video_rotate_angle(MMHandleType player, int *angle);
1993
1994 /**
1995  * This function is to set download mode of video hub
1996  *
1997  * @param       player          [in]    handle of player
1998  * @param       mode            [in]    download mode
1999  * @return      This function returns zero on success, or negative value with error code.
2000  *
2001  * @see
2002  * @remark      None
2003  */
2004 int mm_player_set_video_hub_download_mode(MMHandleType player, bool mode);
2005
2006 /**
2007  * This function is to set using sync handler.
2008  *
2009  * @param       player          [in]    handle of player
2010  * @param       enable          [in]    enable/disable
2011  * @return      This function returns zero on success, or negative value with error code.
2012  *
2013  * @see
2014  * @remark      None
2015  */
2016 int mm_player_enable_sync_handler(MMHandleType player, bool enable);
2017
2018 /**
2019  * This function is to set uri.
2020  *
2021  * @param       player          [in]    handle of player
2022  * @param       uri             [in]    uri
2023  * @return      This function returns zero on success, or negative value with error code.
2024  *
2025  * @see
2026  * @remark      None
2027  */
2028 int mm_player_set_uri(MMHandleType player, const char *uri);
2029
2030 /**
2031  * This function is to set next uri.
2032  *
2033  * @param       player          [in]    handle of player
2034  * @param       uri             [in]    uri
2035  * @return      This function returns zero on success, or negative value with error code.
2036  *
2037  * @see
2038  * @remark      None
2039  */
2040 int mm_player_set_next_uri(MMHandleType player, const char *uri);
2041
2042 /**
2043  * This function is to get next uri.
2044  *
2045  * @param       player          [in]    handle of player
2046  * @param       uri             [out]   uri
2047  * @return      This function returns zero on success, or negative value with error code.
2048  *
2049  * @see
2050  * @remark      None
2051  */
2052 int mm_player_get_next_uri(MMHandleType player, char **uri);
2053
2054 int mm_player_enable_media_packet_video_stream(MMHandleType player, bool enable);
2055
2056 /**
2057  * This function is to increase reference count of internal buffer.
2058  *
2059  * @param       buffer          [in]   video callback internal buffer
2060  * @return      This function returns buffer point;
2061  *
2062  * @see
2063  * @remark      None
2064  */
2065 void * mm_player_media_packet_video_stream_internal_buffer_ref(void *buffer);
2066
2067 /**
2068  * This function is to decrease reference count of internal buffer.
2069  *
2070  * @param       buffer          [in]   video callback internal buffer
2071  * @return      None;
2072  *
2073  * @see
2074  * @remark      None
2075  */
2076 void mm_player_media_packet_video_stream_internal_buffer_unref(void *buffer);
2077
2078 /**mm_player_submit_packet
2079  * This function is to submit buffer to appsrc.  \n
2080  * @param       player                  [in]    Handle of player.
2081  * @param       buf             [in]    buffer to be submit in appsrc in external feeder case.
2082  * @param       len                             [in]    length of buffer.
2083  * @param       pts                             [in]    timestamp of buffer.
2084  * @param       streamtype              [in]    stream type of buffer.
2085  * @return      This function returns zero on success, or negative value with error code.
2086  * @par Example
2087  *
2088  * @endcode
2089  */
2090 int mm_player_submit_packet(MMHandleType player, media_packet_h packet);
2091
2092 /**mm_player_set_video_info
2093  * This function is to set caps of src pad of video appsrc in external feeder case.  \n
2094  * @param       player                          [in]    Handle of player.
2095  * @param       media_format_h                  [in]    Video stream info.
2096  * @return      This function returns zero on success, or negative value with error code.
2097  * @par Example
2098  *
2099  * @endcode
2100  */
2101 int mm_player_set_video_info (MMHandleType player, media_format_h format);
2102
2103 /**mm_player_set_audio_info
2104  * This function is to set caps of src pad of Audio appsrc in external feeder case.  \n
2105  * @param       player                       [in]    Handle of player.
2106  * @param       media_format_h               [in]    Audio stream info.
2107  * @return      This function returns zero on success, or negative value with error code.
2108  * @par Example
2109  *
2110  * @endcode
2111  */
2112 int mm_player_set_audio_info (MMHandleType player, media_format_h format);
2113
2114 /**mm_player_set_subtitle_info
2115  * This function is to set caps of src pad of subtitle appsrc in external feeder case.  \n
2116  * @param       player                          [in]    Handle of player.
2117  * @param       subtitle_stream_info               [in]    Subtitle stream info.
2118  * @return      This function returns zero on success, or negative value with error code.
2119  * @par Example
2120  *
2121  * @endcode
2122  */
2123 int mm_player_set_subtitle_info (MMHandleType player, MMPlayerSubtitleStreamInfo *info);
2124
2125 /**
2126  * This function set callback function for receiving need or enough data message from player.
2127  *
2128  * @param       player          [in]    Handle of player.
2129  * @param       type            [in]    stream type
2130  * @param       callback        [in]    data callback function for stream type.
2131  * @param       user_param      [in]    User parameter.
2132  *
2133  * @return      This function returns zero on success, or negative value with error
2134  *                      code.
2135  * @remark
2136  * @see
2137  * @since
2138  */
2139 int mm_player_set_media_stream_buffer_status_callback(MMHandleType player, MMPlayerStreamType type, mm_player_media_stream_buffer_status_callback callback, void * user_param);
2140
2141 /**
2142  * This function set callback function for receiving seek data message from player.
2143  *
2144  * @param       player          [in]    Handle of player.
2145  * @param       type            [in]    stream type
2146  * @param       callback        [in]    Seek data callback function for stream type.
2147  * @param       user_param      [in]    User parameter.
2148  *
2149  * @return      This function returns zero on success, or negative value with error
2150  *                      code.
2151  * @remark
2152  * @see
2153  * @since
2154  */
2155 int mm_player_set_media_stream_seek_data_callback(MMHandleType player, MMPlayerStreamType type, mm_player_media_stream_seek_data_callback callback, void * user_param);
2156
2157 /**
2158  * This function is to set max size of buffer(appsrc).
2159  *
2160  * @param       player          [in]    Handle of player.
2161  * @param       type            [in]    stream type
2162  * @param       max_size        [in]    max bytes of buffer.
2163  *
2164  * @return      This function returns zero on success, or negative value with error
2165  *                      code.
2166  * @remark
2167  * @see
2168  * @since
2169  */
2170 int mm_player_set_media_stream_buffer_max_size(MMHandleType player, MMPlayerStreamType type, unsigned long long max_size);
2171
2172 /**
2173  * This function is to get max size of buffer(appsrc).
2174  *
2175  * @param       player          [in]    Handle of player.
2176  * @param       type            [in]    stream type
2177  * @param       max_size        [out]   max bytes of buffer.
2178  *
2179  * @return      This function returns zero on success, or negative value with error
2180  *                      code.
2181  * @remark
2182  * @see
2183  * @since
2184  */
2185 int mm_player_get_media_stream_buffer_max_size(MMHandleType player, MMPlayerStreamType type, unsigned long long *max_size);
2186
2187 /**
2188  * This function is to set min percent of buffer(appsrc).
2189  *
2190  * @param       player          [in]    Handle of player.
2191  * @param       type            [in]    stream type
2192  * @param       min_percent     [in]    min percent of buffer.
2193  *
2194  * @return      This function returns zero on success, or negative value with error
2195  *                      code.
2196  * @remark
2197  * @see
2198  * @since
2199  */
2200 int mm_player_set_media_stream_buffer_min_percent(MMHandleType player, MMPlayerStreamType type, unsigned min_percent);
2201
2202 /**
2203  * This function is to get min percent of buffer(appsrc).
2204  *
2205  * @param       player          [in]    Handle of player.
2206  * @param       type            [in]    stream type
2207  * @param       min_percent     [out]   min percent of buffer.
2208  *
2209  * @return      This function returns zero on success, or negative value with error
2210  *                      code.
2211  * @remark
2212  * @see
2213  * @since
2214  */
2215 int mm_player_get_media_stream_buffer_min_percent(MMHandleType player, MMPlayerStreamType type, unsigned int *min_percent);
2216
2217 /**
2218  * This function set callback function for changing audio stream from player. \n
2219  * It's only supported when audio stream is included in file. \n
2220  *
2221  * @param       player   [in] Handle of player.
2222  * @param       callback [in] Audio stream changed callback function.
2223  * @param       user_param [in] User parameter.
2224  *
2225  * @return      This function returns zero on success, or negative value with error
2226  *                      code.
2227  * @see         mm_player_stream_changed_callback
2228  * @since
2229  */
2230 int mm_player_set_audio_stream_changed_callback(MMHandleType player, mm_player_stream_changed_callback callback, void *user_param);
2231
2232 /**
2233  * This function set callback function for changing video stream from player. \n
2234  * It's only supported when video stream is included in file. \n
2235  *
2236  * @param       player   [in] Handle of player.
2237  * @param       callback [in] Video stream changed callback function.
2238  * @param       user_param [in] User parameter.
2239  *
2240  * @return      This function returns zero on success, or negative value with error
2241  *                      code.
2242  * @see         mm_player_stream_changed_callback
2243  * @since
2244  */
2245 int mm_player_set_video_stream_changed_callback(MMHandleType player, mm_player_stream_changed_callback callback, void *user_param);
2246
2247 /**
2248  * This function check the content is streaming or not\n
2249  * It's only supported when video stream is included in file. \n
2250  *
2251  * @param       player   [in] Handle of player.
2252  * @param       is_streaming [out] flag of content type.
2253  *
2254  * @return      This function returns zero on success, or negative value with error
2255  *                      code.
2256  * @since 3.0
2257  */
2258 int mm_player_is_streaming(MMHandleType player, bool *is_streaming);
2259
2260 /**
2261         @}
2262  */
2263
2264 #ifdef __cplusplus
2265         }
2266 #endif
2267
2268 #endif  /* __MM_PLAYER_H__ */