2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Runtime.InteropServices;
20 using Tizen.Multimedia;
22 internal static partial class Interop
24 internal static partial class NativePlayer
27 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
28 internal delegate void PlaybackCompletedCallback(IntPtr userData);
30 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
31 internal delegate void PlaybackInterruptedCallback(PlaybackInterruptionReason code, IntPtr userData);
33 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
34 internal delegate void PlaybackErrorCallback(int code, IntPtr userData);
36 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
37 internal delegate void VideoFrameDecodedCallback(IntPtr packetHandle, IntPtr userData);
39 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
40 internal delegate void SubtitleUpdatedCallback(uint duration, string text, IntPtr userData);
42 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
43 internal delegate void BufferingProgressCallback(int percent, IntPtr userData);
45 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
46 internal delegate void VideoStreamChangedCallback(int width, int height, int fps, int bitrate, IntPtr userData);
48 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
49 internal delegate void MediaStreamBufferStatusCallback(MediaStreamBufferStatus status, IntPtr userData);
51 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
52 internal delegate void MediaStreamSeekCallback(ulong offset, IntPtr userData);
54 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
55 internal delegate void VideoCaptureCallback(IntPtr data, int width, int height, uint size, IntPtr userData);
57 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
58 internal delegate void PrepareCallback(IntPtr userData);
60 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
61 internal delegate void SeekCompletedCallback(IntPtr userData);
63 [DllImport(Libraries.Player, EntryPoint = "player_create")]
64 internal static extern PlayerErrorCode Create(out PlayerHandle player);
66 [DllImport(Libraries.Player, EntryPoint = "player_destroy")]
67 internal static extern PlayerErrorCode Destroy(IntPtr player);
69 [DllImport(Libraries.Player, EntryPoint = "player_prepare")]
70 internal static extern PlayerErrorCode Prepare(IntPtr player);
72 [DllImport(Libraries.Player, EntryPoint = "player_unprepare")]
73 internal static extern PlayerErrorCode Unprepare(IntPtr player);
75 [DllImport(Libraries.Player, EntryPoint = "player_set_uri")]
76 internal static extern PlayerErrorCode SetUri(IntPtr player, string uri);
78 [DllImport(Libraries.Player, EntryPoint = "player_set_display")]
79 internal static extern PlayerErrorCode SetDisplay(IntPtr player, DisplayType type, IntPtr display);
81 [DllImport(Libraries.Player, EntryPoint = "player_start")]
82 internal static extern PlayerErrorCode Start(IntPtr player);
84 [DllImport(Libraries.Player, EntryPoint = "player_stop")]
85 internal static extern PlayerErrorCode Stop(IntPtr player);
87 [DllImport(Libraries.Player, EntryPoint = "player_pause")]
88 internal static extern PlayerErrorCode Pause(IntPtr player);
90 [DllImport(Libraries.Player, EntryPoint = "player_set_memory_buffer")]
91 internal static extern PlayerErrorCode SetMemoryBuffer(IntPtr player, byte[] data, int size);
93 [DllImport(Libraries.Player, EntryPoint = "player_get_state")]
94 internal static extern PlayerErrorCode GetState(IntPtr player, out int state);
96 [DllImport(Libraries.Player, EntryPoint = "player_set_volume")]
97 internal static extern PlayerErrorCode SetVolume(IntPtr player, float left, float right);
99 [DllImport(Libraries.Player, EntryPoint = "player_get_volume")]
100 internal static extern PlayerErrorCode GetVolume(IntPtr player, out float left, out float right);
102 [DllImport(Libraries.Player, EntryPoint = "player_set_sound_stream_info")]
103 internal static extern PlayerErrorCode SetAudioPolicyInfo(IntPtr player, IntPtr streamInfo);
105 [DllImport(Libraries.Player, EntryPoint = "player_set_audio_latency_mode")]
106 internal static extern PlayerErrorCode SetAudioLatencyMode(IntPtr player, AudioLatencyMode latencyMode);
108 [DllImport(Libraries.Player, EntryPoint = "player_get_audio_latency_mode")]
109 internal static extern PlayerErrorCode GetAudioLatencyMode(IntPtr player, out AudioLatencyMode latencyMode);
111 [DllImport(Libraries.Player, EntryPoint = "player_get_play_position")]
112 internal static extern PlayerErrorCode GetPlayPosition(IntPtr player, out int millisecond);
114 [DllImport(Libraries.Player, EntryPoint = "player_set_play_position")]
115 internal static extern PlayerErrorCode SetPlayPosition(IntPtr player, int millisecond,
116 bool accurate, SeekCompletedCallback cb, IntPtr userData = default(IntPtr));
118 [DllImport(Libraries.Player, EntryPoint = "player_set_mute")]
119 internal static extern PlayerErrorCode SetMute(IntPtr player, bool muted);
121 [DllImport(Libraries.Player, EntryPoint = "player_is_muted")]
122 internal static extern PlayerErrorCode IsMuted(IntPtr player, out bool muted);
124 [DllImport(Libraries.Player, EntryPoint = "player_set_looping")]
125 internal static extern PlayerErrorCode SetLooping(IntPtr player, bool looping);
127 [DllImport(Libraries.Player, EntryPoint = "player_is_looping")]
128 internal static extern PlayerErrorCode IsLooping(IntPtr player, out bool looping);
130 [DllImport(Libraries.Player, EntryPoint = "player_set_completed_cb")]
131 internal static extern PlayerErrorCode SetCompletedCb(IntPtr player,
132 PlaybackCompletedCallback callback, IntPtr userData = default(IntPtr));
134 [DllImport(Libraries.Player, EntryPoint = "player_unset_completed_cb")]
135 internal static extern PlayerErrorCode UnsetCompletedCb(IntPtr player);
137 [DllImport(Libraries.Player, EntryPoint = "player_set_interrupted_cb")]
138 internal static extern PlayerErrorCode SetInterruptedCb(IntPtr player,
139 PlaybackInterruptedCallback callback, IntPtr userData = default(IntPtr));
141 [DllImport(Libraries.Player, EntryPoint = "player_unset_interrupted_cb")]
142 internal static extern PlayerErrorCode UnsetInterruptedCb(IntPtr player);
144 [DllImport(Libraries.Player, EntryPoint = "player_set_error_cb")]
145 internal static extern PlayerErrorCode SetErrorCb(IntPtr player, PlaybackErrorCallback callback,
146 IntPtr userData = default(IntPtr));
148 [DllImport(Libraries.Player, EntryPoint = "player_unset_error_cb")]
149 internal static extern PlayerErrorCode UnsetErrorCb(IntPtr player);
151 [DllImport(Libraries.Player, EntryPoint = "player_capture_video")]
152 internal static extern PlayerErrorCode CaptureVideo(IntPtr player, VideoCaptureCallback callback,
153 IntPtr userData = default(IntPtr));
155 [DllImport(Libraries.Player, EntryPoint = "player_set_media_packet_video_frame_decoded_cb")]
156 internal static extern PlayerErrorCode SetVideoFrameDecodedCb(IntPtr player, VideoFrameDecodedCallback callback,
157 IntPtr userData = default(IntPtr));
159 [DllImport(Libraries.Player, EntryPoint = "player_unset_media_packet_video_frame_decoded_cb")]
160 internal static extern PlayerErrorCode UnsetVideoFrameDecodedCb(IntPtr player);
162 [DllImport(Libraries.Player, EntryPoint = "player_set_streaming_cookie")]
163 internal static extern PlayerErrorCode SetStreamingCookie(IntPtr player, string cookie, int size);
165 [DllImport(Libraries.Player, EntryPoint = "player_set_streaming_user_agent")]
166 internal static extern PlayerErrorCode SetStreamingUserAgent(IntPtr player, string userAgent, int size);
168 [DllImport(Libraries.Player, EntryPoint = "player_get_streaming_download_progress")]
169 internal static extern PlayerErrorCode GetStreamingDownloadProgress(IntPtr player, out int start, out int current);
171 [DllImport(Libraries.Player, EntryPoint = "player_set_buffering_cb")]
172 internal static extern PlayerErrorCode SetBufferingCb(IntPtr player,
173 BufferingProgressCallback callback, IntPtr userData = default(IntPtr));
175 [DllImport(Libraries.Player, EntryPoint = "player_unset_buffering_cb")]
176 internal static extern PlayerErrorCode UnsetBufferingCb(IntPtr player);
178 [DllImport(Libraries.Player, EntryPoint = "player_set_playback_rate")]
179 internal static extern PlayerErrorCode SetPlaybackRate(IntPtr player, float rate);
181 [DllImport(Libraries.Player, EntryPoint = "player_push_media_stream")]
182 internal static extern PlayerErrorCode PushMediaStream(IntPtr player, IntPtr packet);
184 [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_info")]
185 internal static extern PlayerErrorCode SetMediaStreamInfo(IntPtr player, int type, IntPtr format);
187 [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_status_cb")]
188 internal static extern PlayerErrorCode SetMediaStreamBufferStatusCb(IntPtr player, StreamType type,
189 MediaStreamBufferStatusCallback callback, IntPtr userData = default(IntPtr));
191 [DllImport(Libraries.Player, EntryPoint = "player_unset_media_stream_buffer_status_cb")]
192 internal static extern PlayerErrorCode UnsetMediaStreamBufferStatusCb(IntPtr player, int type);
194 [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_seek_cb")]
195 internal static extern PlayerErrorCode SetMediaStreamSeekCb(IntPtr player, StreamType type,
196 MediaStreamSeekCallback callback, IntPtr userData = default(IntPtr));
198 [DllImport(Libraries.Player, EntryPoint = "player_unset_media_stream_seek_cb")]
199 internal static extern PlayerErrorCode UnsetMediaStreamSeekCb(IntPtr player, int type);
201 [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_max_size")]
202 internal static extern PlayerErrorCode SetMediaStreamBufferMaxSize(IntPtr player, StreamType type, ulong maxSize);
204 [DllImport(Libraries.Player, EntryPoint = "player_get_media_stream_buffer_max_size")]
205 internal static extern PlayerErrorCode GetMediaStreamBufferMaxSize(IntPtr player, StreamType type, out ulong maxSize);
207 [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_min_threshold")]
208 internal static extern PlayerErrorCode SetMediaStreamBufferMinThreshold(IntPtr player, StreamType type, uint percent);
210 [DllImport(Libraries.Player, EntryPoint = "player_get_media_stream_buffer_min_threshold")]
211 internal static extern PlayerErrorCode GetMediaStreamBufferMinThreshold(IntPtr player, int type, out uint percent);
213 [DllImport(Libraries.Player, EntryPoint = "player_get_content_info")]
214 internal static extern PlayerErrorCode GetContentInfo(IntPtr player, StreamMetadataKey key, out IntPtr value);
216 [DllImport(Libraries.Player, EntryPoint = "player_get_codec_info")]
217 internal static extern PlayerErrorCode GetCodecInfo(IntPtr player, out IntPtr audioCodec, out IntPtr videoCodec);
219 [DllImport(Libraries.Player, EntryPoint = "player_get_audio_stream_info")]
220 internal static extern PlayerErrorCode GetAudioStreamInfo(IntPtr player, out int sampleRate, out int channel, out int bitRate);
222 [DllImport(Libraries.Player, EntryPoint = "player_get_video_stream_info")]
223 internal static extern PlayerErrorCode GetVideoStreamInfo(IntPtr player, out int fps, out int bitRate);
225 [DllImport(Libraries.Player, EntryPoint = "player_get_album_art")]
226 internal static extern PlayerErrorCode GetAlbumArt(IntPtr player, out IntPtr albumArt, out int size);
228 [DllImport(Libraries.Player, EntryPoint = "player_get_video_size")]
229 internal static extern PlayerErrorCode GetVideoSize(IntPtr player, out int width, out int height);
231 [DllImport(Libraries.Player, EntryPoint = "player_get_duration")]
232 internal static extern PlayerErrorCode GetDuration(IntPtr player, out int duration);
234 [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_path")]
235 internal static extern PlayerErrorCode SetSubtitlePath(IntPtr player, string path);
237 [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_updated_cb")]
238 internal static extern PlayerErrorCode SetSubtitleUpdatedCb(IntPtr player,
239 SubtitleUpdatedCallback callback, IntPtr userData = default(IntPtr));
241 [DllImport(Libraries.Player, EntryPoint = "player_unset_subtitle_updated_cb")]
242 internal static extern PlayerErrorCode UnsetSubtitleUpdatedCb(IntPtr player);
244 [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_position_offset")]
245 internal static extern PlayerErrorCode SetSubtitlePositionOffset(IntPtr player, int millisecond);
247 [DllImport(Libraries.Player, EntryPoint = "player_set_video_stream_changed_cb")]
248 internal static extern PlayerErrorCode SetVideoStreamChangedCb(IntPtr player,
249 VideoStreamChangedCallback callback, IntPtr userData = default(IntPtr));
251 [DllImport(Libraries.Player, EntryPoint = "player_unset_video_stream_changed_cb")]
252 internal static extern PlayerErrorCode UnsetVideoStreamChangedCb(IntPtr player);
254 [DllImport(Libraries.Player, EntryPoint = "player_get_track_count")]
255 internal static extern PlayerErrorCode GetTrackCount(IntPtr player, int type, out int count);
257 [DllImport(Libraries.Player, EntryPoint = "player_select_track")]
258 internal static extern PlayerErrorCode SelectTrack(IntPtr player, int type, int index);
260 [DllImport(Libraries.Player, EntryPoint = "player_get_current_track")]
261 internal static extern PlayerErrorCode GetCurrentTrack(IntPtr player, int type, out int index);
263 [DllImport(Libraries.Player, EntryPoint = "player_get_track_language_code")]
264 internal static extern PlayerErrorCode GetTrackLanguageCode(IntPtr player, int type, int index, out IntPtr code);
267 internal class PlayerHandle : SafeHandle
269 protected PlayerHandle() : base(IntPtr.Zero, true)
273 public override bool IsInvalid => handle == IntPtr.Zero;
275 protected override bool ReleaseHandle()
277 var ret = NativePlayer.Destroy(handle);
278 if (ret != PlayerErrorCode.None)
280 Log.Debug(GetType().FullName, $"Failed to release native {GetType().Name}");