To use Samsung Product API, <script type="text/javascript" src="$WEBAPIS/webapis/webapis.js"></script> Should be loaded in index.html
To use Samsung Product API,
<script type="text/javascript" src="$WEBAPIS/webapis/webapis.js"></script>
Should be loaded in index.html
Since : 2.3
Product : TV, AV_BD, B2B (LFD, IWB)
enum AVPlayPlayerState { "NONE", "IDLE", "READY", "PLAYING", "PAUSED" };
The following values are supported
enum AVPlayDisplayMode { "PLAYER_DISPLAY_MODE_LETTER_BOX", "PLAYER_DISPLAY_MODE_FULL_SCREEN", "PLAYER_DISPLAY_MODE_AUTO_ASPECT_RATIO" };
enum AVPlayBufferOption { "PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_FOR_RESUME" };
enum AVPlayBufferSizeUnit { "PLAYER_BUFFER_SIZE_IN_BYTE", "PLAYER_BUFFER_SIZE_IN_SECOND" };
Remark :
enum AVPlayStreamingPropertyType { "COOKIE", "USER_AGENT", "PREBUFFER_MODE", "ADAPTIVE_INFO", "SET_MODE_4K", "PROPERTY_HD_AUDIO", "LISTEN_SPARSE_TRACK", "IS_LIVE", "AVAILABLE_BITRATE", "GET_LIVE_DURATION", "CURRENT_BANDWIDTH", "WIDEVINE" };
"GET_LIVE_DURATION" is available since Tizen version 2.4. "WIDEVINE" property has been deprecated from Tizen version 4.0. "PROPERTY_HD_AUDIO" property has been deprecated from Tizen version 2.4. "SET_VR360_MODE" property has been deprecated from Tizen version 5.0. "SET_MODE_4K" property has been deprecated from Tizen version 5.0.
enum AVPlayDrmType { "PLAYREADY", "VERIMATRIX", "WIDEVINE_CDM" };
enum AVPlayDrmOperation { "SetProperties", "InstallLicense", "ProcessInitiator", "GetUID", "Initialize", "Finalize", "widevine_license_data", "widevine_app_session", "widevine_data_type" };
enum AVPlayStreamType { "VIDEO", "AUDIO", "TEXT" };
enum AVPlayError{ "PLAYER_ERROR_NONE", "PLAYER_ERROR_INVALID_PARAMETER", "PLAYER_ERROR_NO_SUCH_FILE", "PLAYER_ERROR_INVALID_OPERATION", "PLAYER_ERROR_SEEK_FAILED", "PLAYER_ERROR_INVALID_STATE", "PLAYER_ERROR_NOT_SUPPORTED_FILE", "PLAYER_ERROR_INVALID_URI", "PLAYER_ERROR_CONNECTION_FAILED", "PLAYER_ERROR_GENEREIC" };
enum AVPlayEvent { "PLAYER_MSG_NONE", "PLAYER_MSG_RESOLUTION_CHANGED", "PLAYER_MSG_BITRATE_CHANGE", "PLAYER_MSG_FRAGMENT_INFO", "PLAYER_SPARSE_TRACK_DETECT", "PLAYER_STREAMING_EVENT", "PLAYER_MSG_HTTP_ERROR_CODE", "PLAYER_MSG_DRM_CHALLENGE_DATA" };
dictionary AVPlayStreamInfo { unsigned long index; AVPlayStreamType type; DOMString extra_info; };
dictionary AVPlaySubtitleAttribute { DOMString attr_type; long start_pos; long stop_pos; };
[NoInterfaceObject] interface AVPlayManagerObject { readonly attribute AVPlayManager avplay; };
WebApi implements AVPlayManagerObject;
[NoInterfaceObject] interface AVPlayManager { void open(DOMString url) ; void close() ; void prepare() ; void prepareAsync(optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback) ; void setDisplayRect( unsigned long x, unsigned long y, unsigned long width, unsigned long height ) ; void play() ; void seekTo(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); void stop() ; AVPlayPlayerState getState() ; void pause() ; void jumpForward(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback) ; void jumpBackward( long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback ) ; unsigned long getDuration() ; unsigned long getCurrentTime() ; void setTimeoutForBuffering(unsigned long seconds); void setBufferingParam(AVPlayBufferOption option, AVPlayBufferSizeUnit unit, unsigned long amount); void setSpeed(long playbackSpeed) ; void setListener(AVPlayPlaybackCallback playbackCallback) ; DOMString setDrm(AVPlayDrmType drmType, AVPlayDrmOperation drmOperation, DOMString jsonParam) ; DOMString getUID(AVPlayDrmType drmType) ; void setSoundAnalysisListener(AVPlaySoundAnalysisCallback soundAnalysisCallback) ; void unsetSoundAnalysisListener() ; void setSilentSubtitle(boolean onoff) ; void setExternalSubtitlePath(DOMString filePath) ; void setSubtitlePosition(long position) ; void setDisplayMethod(AVPlayDisplayMode displayMode) ; void setSelectTrack(AVPlayStreamType trackType, long trackIndex) ; AVPlayStreamInfo getCurrentStreamInfo() ; AVPlayStreamInfo[] getTotalTrackInfo() ; void setStreamingProperty(AVPlayStreamingPropertyType propertyType, DOMString propertyParam) ; DOMString getStreamingProperty(AVPlayStreamingPropertyType propertyType) ; DOMString getVersion() ; void suspend() ; void restore(DOMString URL, optional unsigned long? resumeTime, optional boolean? bPrepare); void restoreAsync(DOMString URL, optional unsigned long? resumeTime, optioanl boolean? bPrepare, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); };
open
void open(DOMString url);
Parameters:
Constraint
Exceptions:
with error type TypeMismatchError, if an input parameter is not compatible with its expected type.
with error type NotSupportedError, if this feature is not supported.
with error type InvalidValuesError, if any input parameter contains an invalid value.
with error type InvalidStateError, if it is called in an invalid state.
with error type UnknownError, for any other error.
Code example:
try { webapis.avplay.open(url); } catch (e) { console.log(e); }
close
void close();
try { webapis.avplay.close(); } catch (e) { console.log(e); }
prepare
void prepare();
Product : TV, AV_BD, B2B (LFD)
try { webapis.avplay.prepare(); } catch (e) { console.log(e); }
prepareAsync
void prepareAsync(optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback);
webapis.avplay.prepareAsync(successCallback, errorCallback);
setDisplayRect
void setDisplayRect( unsigned long x, unsigned long y, unsigned long width, unsigned long height );
try { webapis.avplay.setDisplayRect(0, 0, 1920, 1080); } catch (e) { console.log(e); }
play
void play();
try { webapis.avplay.play(); } catch (e) { console.log(e); }
seekTo
void seekTo(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback);
try { webapis.avplay.seekTo(10000,successCallback, errorCallback); } catch (e) { console.log(e); } // for live cases, get the live duration as : var StartTime = webapis.avplay.getStreamingProperty("GET_LIVE_DURATION").split('|')[0]; var EndTime = webapis.avplay.getStreamingProperty("GET_LIVE_DURATION").split('|')[1]; // seekpoint must be between StartTime and Endtime.
stop
void stop();
try { webapis.avplay.stop(); } catch (e) { console.log(e); }
getState
AVPlayPlayerState getState();
Return value:
var BRet = webapis.avplay.getState();
pause
void pause();
with error type InvalidAccessError, if this API couldn't operate at the moment. (E.g. During the async operation such as seekTo, etc.)
try { webapis.avplay.pause(); } catch (e) { console.log(e); }
jumpForward
void jumpForward(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback);
webapis.avplay.jumpForward(5000, successCallback, errorCallback);
jumpBackward
void jumpBackward( long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback );
webapis.avplay.jumpBackward(5000, successCallback, errorCallback);
getDuration
unsigned long getDuration();
duration = calcPlaytime(webapis.avplay.getDuration()); function calcPlaytime(totalMilisec) { var Hours = Math.floor(totalMilisec/3600000); var Minutes = Math.floor((totalMilisec - (Hours * 3600000)) / 60000); var Seconds = Math.floor((totalMilisec - (Hours * 3600000) - (Minutes * 60000)) / 1000); var Milisec = totalMilisec - (Hours * 3600000) - (Minutes * 60000) - (Seconds * 1000); return { Hours: Hours, Minutes: Minutes, Seconds: Seconds, milisec: Milisec, totalMilisec: totalMilisec } }
getCurrentTime
unsigned long getCurrentTime();
var CurrentPlayTime = webapis.avplay.getCurrentTime();
setTimeoutForBuffering
void setTimeoutForBuffering(unsigned long seconds);
Parameters
webapis.avplay.setTimeoutForBuffering(10);
setBufferingParam
void setBufferingParam(AVPlayBufferOption option, AVPlayBufferSizeUnit unit, unsigned long amount);
// For the initial buffering webapis.avplay.setBufferingParam("PLAYER_BUFFER_FOR_PLAY","PLAYER_BUFFER_SIZE_IN_SECOND", 5); // 5 is in seconds // For the rebuffering webapis.avplay. setBufferingParam("PLAYER_BUFFER_FOR_RESUME","PLAYER_BUFFER_SIZE_IN_SECOND", 15); // 15 is in seconds
Remark:
setSpeed
void setSpeed(long playbackSpeed);
try { webapis.avplay.setSpeed(2); } catch (e) { console.log(e); }
setListener
void setListener(AVPlayPlaybackCallback playbackCallback);
var Listener = { onbufferingstart: function() { console.log("Buffering start."); }, onbufferingprogress: function(percent) { console.log("Buffering progress data : " + data1); }, onbufferingcomplete: function() { console.log("Buffering complete."); }, oncurrentplaytime: function(currentTime) { console.log("Current Playtime : " + data1); }, onbufferingcomplete: function() { console.log("Buffering complete."); }, onevent: function(eventType, eventData) { console.log("event type error : " + eventType + ", data: " + eventData); }, onerror: function(eventType) { console.log("event type error : " + eventType); }, onsubtitlechange: function(duration, text, data3, data4) { console.log("Subtitle Changed."); }, ondrmevent: function(drmEvent, drmData) { console.log("DRM callback: " + drmEvent + ", data: " + drmData); }, onstreamcompleted: function() { console.log("Stream Completed"); } } webapis.avplay.setListener(Listener);
setDrm
DOMString setDrm(AVPlayDrmType drmType, AVPlayDrmOperation drmOperation, DOMString jsonParam);
Privilege level: Public
Privilege: http://developer.samsung.com/privilege/drmplay
with error type SecurityError, if the application does not have the privilege to call this method.
with error type UnknownError, for any other error. Examples of exception scenarios include an invalid DRM session, or failure to create the underlying DRM module or configuration. In these scenarios, an exception is thrown and the method call returns FALSE.
// Implementing DRM support // 1. PlayReady example: Setting license server and custom data // 1.1 PlayReady with GenChallenge var Listener = { ondrmevent: function(drmType, drmData) { if(drmData.name === 'Challenge') { // take drmData.challenge to obtain license data. } } } webapis.avplay.setListener(Listener); var appdata={DeleteLicenseAfterUse:true,GetChallenge:true,"LicenseServer":"http://license.company.com", "CustomData":"mycustom} webapis.avplay.setDrm("PLAYREADY", "SetProperties", JSON.stringify(appdata)); // The avplay will configure and provide challenged data through ondrmevent() callback. // Once challenge data is received, the application should first decode challenge data using base64, and obtain license from the license server. var license_data;// After obtaining license data, encode it using base64 and save into this 'license_data'. webapis.avplay.setDrm("PLAYREADY", "InstallLicense", license_data); // 1.2. PlayReady without GenChallenge var appdata={"DeleteLicenseAfterUse":true, "LicenseServer":"http://license.company.com", "CustomData":"mycustom"} webapis.avplay.setDrm("PLAYREADY", "SetProperties", JSON.stringify(appdata)); // 2. Verimatrix example: Initializing Verimatrix DRM // Application should call GetUID only once and save it for further use, after every open API GetUID need not be called. if (true) { // Since Tizen version 5.0 DOMString Verimatrix_UID = webapis.avplay.getUID("VERIMATRIX"); } else { // Before Tizen version 5.0 webapis.avplay.setDrm( "VERIMATRIX", "GetUID", ""); } // After open application should follow following sequence var DrmParam = {} DrmParam.CompanyName ="MyCompany"; DrmParam.IPTV="public2.verimatrix.com"; DrmParam.Web="public-ott-nodrm.verimatrix.com:80"; if (true) { // Since Tizen version 5.0 webapis.avplay.setDrm( "VERIMATRIX", "SetProperties", JSON.stringify(DrmParam)); } else { // Before Tizen version 5.0 webapis.avplay.setDrm( "VERIMATRIX", "Initialize", JSON.stringify(DrmParam)); } // 3. Widevine Modular example var sessionId; var Listener = { ondrmevent: function(drmType, drmData) { if(drmData.name === 'Challenge') { sessionId = drmData.session_id; // take drmData.challenge and drmData.serverurl to obtain license data. } } } webapis.avplay.setListener(Listener); var DrmParam = {} // Sample session value; App must set there own session id. DrmParam.AppSession = "test-session"; DrmParam.DataType = "MPEG-DASH"; if (true) { // Since Tizen version 5.0 webapis.avplay.setDrm("WIDEVINE_CDM", "SetProperties", JSON.stringify(DrmParam)); } else { // Before Tizen version 5.0 webapis.avplay.setDrm("WIDEVINE_CDM", "Initialize", ""); webapis.avplay.setDrm("WIDEVINE_CDM", "widevine_app_session", DrmParam.AppSession); webapis.avplay.setDrm("WIDEVINE_CDM", "widevine_data_type", DrmParam.DataType); } // The avplay will configure and provide challenged data and session id through ondrmevent() callback. // Once challenge data is received, the application should first decode challenge data using base64, and obtain license from the license server. var license_data;// After obtaining license data, encode it using base64 and save into this 'license_data'. var LicenseParam = sessionId + "PARAM_START_POSITION" + license_data + "PARAM_START_POSITION"; webapis.avplay.setDrm("WIDEVINE_CDM", "widevine_license_data", LicenseParam);
getUID
DOMString getUID(AVPlayDrmType drmType);
Parameters :
var verimatrixUID = webapis.avplay.getUID("VERIMATRIX"); //Verimatrix example: Retrieving the Verimatrix UID
setSoundAnalysisListener
void setSoundAnalysisListener(AVPlaySoundAnalysisCallback soundAnalysisCallback);
Deprecated : 2.4
webapis.avplay.setSoundAnalysisListener(soundAnalysisListener); function soundAnalysisListener(dataArray) { // Listener registered to and receiving data from AVPlay var BarHeight = 0; var AbsValue = 0; var Threshold = 70; for (var I = 0; I < dataArray.length; I++) { AbsValue = Math.abs(dataArray[I]); if (AbsValue > Threshold) { BarHeight = Main.barContainerHeight; } else { BarHeight = Math.round((AbsValue/Threshold) * Main.barContainerHeight); } if (BarHeight == 0) BarHeight = 1; { document.getElementById('frequencyBar' + I).style.height = BarHeight + 'px'; } console.log("Sound analysis: " + dataArray.toString()); } }
unsetSoundAnalysisListener
void unsetSoundAnalysisListener();
webapis.avplay.unsetSoundAnalysisListener();
setSilentSubtitle
void setSilentSubtitle(boolean onoff);
webapis.avplay.setSilentSubtitle(true);
setExternalSubtitlePath
void setExternalSubtitlePath(DOMString filePath);
webapis.avplay.setExternalSubtitlePath(uri);
setSubtitlePosition
void setSubtitlePosition(long position);
webapis.avplay.setSubtitlePosition(position_millisec);
setDisplayMethod
void setDisplayMethod(AVPlayDisplayMode displayMode);
webapis.avplay.setDisplayMethod("PLAYER_DISPLAY_MODE_FULL_SCREEN");
setSelectTrack
void setSelectTrack(AVPlayStreamType trackType, long trackIndex);
var totalTrackInfo = webapis.avplay.getTotalTrackInfo(); for (var i=0; i < totalTrackInfo.length; i++) { if(totalTrackInfo.type == 'TEXT') { console.log('Find subtitle track.'); console.log('subtitle track index is ' + totalTrackInfo.index); console.log('subtitle track language is ' + totalTrackInfo.extra_info.track_lang); } } // Choose subtitle track index 2 webapis.avplay.setSelectTrack('TEXT',2);
getCurrentStreamInfo
AVPlayCurrentStreamInfo getCurrentStreamInfo();
AVPlayStreamInfo structure containing tracktype, extraInfo and index for the current stream
var StreamInfo = webapis.avplay.getCurrentStreamInfo(); var Text = ''; for (var I = 0; I < StreamInfo.length; I++) { Text += 'index: ' + StreamInfo[I].index + ''; Text += 'type: ' + StreamInfo[I].type + ''; Text += 'extra_info: ' + StreamInfo[I].extra_info + ''; } //All streams have extra_info as a JSONString. //video extra_info example : "{fourCC:"H264","Width":"1920","Height":"1080","Bit_rate":" 477000"}" //audio extra_info example : "{"language":"eng","channels":"2","sample_rate":"44100","bit_rate":"96000","fourCC":"AACL"}" //text(subtitle) extra_info example : "{"track_num":"0","track_lang":"eng","subtitle_type":"-1","fourCC":"TTML"}" //If the stream is invalid, the DOMString is null and the index value is -1.
getTotalTrackInfo
AVPlayStreamInfo[] getTotalTrackInfo();
var TrackInfo = webapis.avplay.getTotalTrackInfo(); var Text = 'type of track info: ' + typeof TrackInfo + ''; Text += 'length: ' + TrackInfo.length + ''; for (var I = 0; I < TrackInfo.length; I++) { Text += 'index: ' + TrackInfo[I].index + ''; Text += 'type: ' + TrackInfo[I].type + ''; Text += 'extra_info: ' + TrackInfo[I].extra_info + ''; }
setStreamingProperty
void setStreamingProperty(AVPlayStreamingPropertyType propertyType, DOMString propertyParam);
//Smooth Streaming example: var BitRateString = "BITRATES=5000~10000|STARTBITRATE=HIGHEST|SKIPBITRATE=LOWEST"; webapis.avplay.setStreamingProperty("ADAPTIVE_INFO", BitRateString); //Prebuffer mode example: webapis.avplay.setStreamingProperty("PREBUFFER_MODE", time_in_miliseconds); Player1 => Playback of Main Content Player2 => Playback of advertisement (Buffered the ad content before playback). Player1 = webapis.avplaystore.getPlayer(); Player2 = webapis.avplaystore.getPlayer(); Player1.open('http://www.example.com/example_1.mp4'); Player1.setDisplayRect(x, y, width, height); Player1.prepare(); Player1.play(); Player2.open('http://www.example.com/example_2.mp4'); Player2.setStreamingProperty("PREBUFFER_MODE", "5000"); Player2.setDisplayRect(x, y, width, height); Player2.prepare(); Player1.stop(); Player2.play(); //User-agent example: webapis.avplay.setStreamingProperty("USERAGENT", "samsungsmooth-agent/1.1"); //Setting resolution information for HLS/DASH webapis.avplay.setStreamingProperty("ADAPTIVE_INFO", "FIXED_MAX_RESOLUTION=7680X4320");
getStreamingProperty
DOMString getStreamingProperty(AVPlayStreamingPropertyType propertyType);
var Text = 'AVAILABLE_BITRATE: ' + webapis.avplay.getStreamingProperty ("AVAILABLE_BITRATE") ; Text += 'CURRENT_BANDWIDTH: ' + webapis.avplay.getStreamingProperty ("CURRENT_BANDWIDTH") + ''; Text += 'IS_LIVE: ' + webapis.avplay.getStreamingProperty ("IS_LIVE") +''; @endparblock @code var StartTime = webapis.avplay.getStreamingProperty("GET_LIVE_DURATION").split('|')[0]; var EndTime = webapis.avplay.getStreamingProperty("GET_LIVE_DURATION").split('|')[1]; if (StartTime > targetSeekTime) { if (EndTime < targetSeekTime) { webapis.avplay.seekTo(targetSeekTime); //ms } }
getVersion
DOMString getVersion();
var Version = webapis.avplay.getVersion();
suspend
void suspend();
document.addEventListener("visibilitychange", function() { if(document.hidden) { // Something you want to do when application is paused. console.log("lifecycle [pause]"); webapis.avplay.suspend(); } else { // Something you want to do when application is resumed. console.log("lifecycle [resume]"); webapis.avplay.restore(); } });
restore
void restore(DOMString URL, optional unsigned long? resumeTime, optional boolean? bPrepare);
document.addEventListener("visibilitychange", function() { if(document.hidden) { // Something you want to do when application is paused console.log("lifecycle [pause]"); webapis.avplay.suspend(); } else { // Something you want to do when application is resumed console.log("lifecycle [resume]"); webapis.avplay.restore(url, 0, false); } });
restoreAsync
void restoreAsync(DOMString URL, optional unsigned long? resumeTime, optioanl boolean? bPrepare, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback);
document.addEventListener("visibilitychange", function() { if(document.hidden) { // Something you want to do when application is paused console.log("lifecycle [pause]"); webapis.avplay.suspend(); } else { // Something you want to do when application is resumed console.log("lifecycle [resume]"); try { var successCallback = function() { console.log("success"); } var errorCallback = function(err) { throw new Error('Error:' + err.name); } webapis.avplay.restoreAsync(url, 0, false, successCallback, errorCallback); } catch (e) { console.log(e); } } });
[Callback=FunctionOnly, NoInterfaceObject] interface AVPlayPlaybackCallback{ void onbufferingstart(); void onbufferingprogress(unsigned long percent); void onbufferingcomplete(); void oncurrentplaytime(unsigned long currentTime ); void onstreamcompleted(); void onevent(AVPlayEvent eventid, DOMString data ); void onerror(AVPlayError eventid); void ondrmevent(AVPlayDrmType type, drmData data); void onsubtitlechange(unsigned long duration, DOMString subtitles, unsigned long type, AVPlaySubtitleAttribute attributes); };
onbufferingstart
void onbufferingstart();
onbufferingstart: function() { console.log("Buffering start."); }
onbufferingprogress
void onbufferingprogress(unsigned long percent);
onbufferingprogress: function(percent) { console.log("Buffering progress data : " + percent); }
onbufferingcomplete
void onbufferingcomplete();
onbufferingcomplete: function() { console.log("Buffering complete."); }
oncurrentplaytime
void oncurrentplaytime(unsigned long currentTime );
oncurrentplaytime: function(currentTime) { console.log("Current playtime: " + currentTime); }
onstreamcompleted
void onstreamcompleted();
onstreamcompleted: function(currentTime) { console.log("Stream Completed"); }
onevent
void onevent(AVPlayEvent eventid, DOMString data );
onevent: function(eventType, eventData) { console.log("OnEvent Callback with eventType: " + eventType); }
onerror
void onerror(AVPlayError eventid);
onerror: function(eventType) { console.log("OnError Event Callback with eventType: " + eventType); }
ondrmevent
void ondrmevent(AVPlayDrmType type, drmData data);
ondrmevent: function(drmType, drmData) { console.log("DRM callback, type: " + drmType + ", data: " + drmData); if(drmData.name === 'Challenge') { var ChallengeData = { "NAME": drmData.name, "SESSION_ID": drmData.session_id, "CHALLENGE": drmData.challenge, "CHALLENGE_LEN": drmData.challenge_len, "SERV_URL": drmData.serverurl, "SERV_URL_LEN": drmData.serverurl_len } // Use challenge data to get drm license. } else if (drmData.name === 'DrmError') { var ErrorInfo = { "NAME": drmData.name, "ERROR_CODE": drmData.code, "ERROR_MESSAGE": drmData.message // Generally, it's human readable message. } } }
onsubtitlechange
void onsubtitlechange(unsigned long duration, DOMString subtitles, unsigned long type, AVPlaySubtitleAttribute attributes);
onsubtitlechange: function(duration, text, data3, data4) { console.log("Subtitle Changed."); }
module AVPlay { enum AVPlayPlayerState { "NONE", "IDLE", "READY", "PLAYING", "PAUSED" }; enum AVPlayDisplayMode { "PLAYER_DISPLAY_MODE_LETTER_BOX", "PLAYER_DISPLAY_MODE_FULL_SCREEN", "PLAYER_DISPLAY_MODE_AUTO_ASPECT_RATIO" }; enum AVPlayBufferOption { "PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_FOR_RESUME" }; enum AVPlayBufferSizeUnit { "PLAYER_BUFFER_SIZE_IN_BYTE", "PLAYER_BUFFER_SIZE_IN_SECOND" }; enum AVPlayStreamingPropertyType { "COOKIE", "USER_AGENT", "PREBUFFER_MODE", "ADAPTIVE_INFO", "SET_MODE_4K", "PROPERTY_HD_AUDIO", "LISTEN_SPARSE_TRACK", "IS_LIVE", "AVAILABLE_BITRATE", "GET_LIVE_DURATION", "CURRENT_BANDWIDTH", "WIDEVINE" }; enum AVPlayDrmType { "PLAYREADY", "VERIMATRIX", "WIDEVINE_CDM" }; enum AVPlayDrmOperation { "SetProperties", "InstallLicense", "ProcessInitiator", "GetUID", "Initialize", "Finalize", "widevine_license_data", "widevine_app_session", "widevine_data_type" }; enum AVPlayStreamType { "VIDEO", "AUDIO", "TEXT" }; enum AVPlayError{ "PLAYER_ERROR_NONE", "PLAYER_ERROR_INVALID_PARAMETER", "PLAYER_ERROR_NO_SUCH_FILE", "PLAYER_ERROR_INVALID_OPERATION", "PLAYER_ERROR_SEEK_FAILED", "PLAYER_ERROR_INVALID_STATE", "PLAYER_ERROR_NOT_SUPPORTED_FILE", "PLAYER_ERROR_INVALID_URI", "PLAYER_ERROR_CONNECTION_FAILED", "PLAYER_ERROR_GENEREIC" }; enum AVPlayEvent { "PLAYER_MSG_NONE", "PLAYER_MSG_RESOLUTION_CHANGED", "PLAYER_MSG_BITRATE_CHANGE", "PLAYER_MSG_FRAGMENT_INFO", "PLAYER_SPARSE_TRACK_DETECT", "PLAYER_STREAMING_EVENT", "PLAYER_MSG_HTTP_ERROR_CODE", "PLAYER_MSG_DRM_CHALLENGE_DATA" }; dictionary AVPlayStreamInfo { unsigned long index; unsigned long adaption_index; unsigned long alternate_index; AVPlayStreamType type; DOMString extra_info; }; dictionary AVPlaySubtitleAttribute { DOMString attr_type; long start_pos; long stop_pos; }; [NoInterfaceObject] interface AVPlayManagerObject { readonly attribute AVPlayManager avplay; }; WebApi implements AVPlayManagerObject; [NoInterfaceObject] interface AVPlayManager { void open(DOMString url); void close(); void prepare(); void prepareAsync(optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); void setDisplayRect( unsigned long x, unsigned long y, unsigned long width, unsigned long height ); void play(); void seekTo(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); void stop(); AVPlayPlayerState getState(); void pause(); void jumpForward(long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); void jumpBackward( long milliseconds, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback ); unsigned long getDuration() ; unsigned long getCurrentTime() ; void setTimeoutForBuffering(unsigned long seconds); void setBufferingParam(AVPlayBufferOption option, AVPlayBufferSizeUnit unit, unsigned long amount); void setSpeed(long playbackSpeed); void setListener(AVPlayPlaybackCallback playbackCallback); DOMString setDrm(AVPlayDrmType drmType, AVPlayDrmOperation drmOperation, DOMString jsonParam); DOMString getUID ( AVPlayDrmType drmType ) void setSoundAnalysisListener (AVPlaySoundAnalysisCallback soundAnalysisCallback); void unsetSoundAnalysisListener(); void setSilentSubtitle(boolean onoff); void setExternalSubtitlePath(DOMString filePath); void setSubtitlePosition(long position); void setDisplayMethod(AVPlayDisplayMode displayMode); void setSelectTrack(AVPlayStreamType trackType, long trackIndex); AVPlayStreamInfo getCurrentStreamInfo(); AVPlayStreamInfo[] getTotalTrackInfo(); void setStreamingProperty(AVPlayStreamingPropertyType propertyType, DOMString propertyParam); DOMString getStreamingProperty(AVPlayStreamingPropertyType propertyType); DOMString getVersion(); void suspend() ; void restore(DOMString URL, unsigned long resumeTime, boolean bPrepare); void restoreAsync(DOMString URL, optional unsigned optional long? resumeTime, optioanl optional boolean? bPrepare, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback) ; }; [Callback=FunctionOnly, NoInterfaceObject] interface AVPlayPlaybackCallback{ void onbufferingstart(); void onbufferingprogress(unsigned long percent); void onbufferingcomplete(); void oncurrentplaytime(unsigned long currentTime ); void onstreamcompleted(); void onevent(AVPlayEvent eventid, DOMString data ); void onerror(AVPlayError eventid); void ondrmevent(AVPlayDrmType type, drmData data); void onsubtitlechange(unsigned long duration, DOMString subtitles, unsigned long type, AVPlaySubtitleAttribute attributes); }; };