180 lines
4.5 KiB
JavaScript
180 lines
4.5 KiB
JavaScript
|
webshim.register('usermedia-shim', function($, webshim, window, document, undefined, options){
|
||
|
"use strict";
|
||
|
var addMediaAPI;
|
||
|
var streamUrlPrefix = 'webshimstream';
|
||
|
var id = 0;
|
||
|
var streams = {};
|
||
|
var streamCb = {};
|
||
|
var hasSwf = swfmini.hasFlashPlayerVersion('11.3');
|
||
|
var mediaOptions = webshim.cfg.mediaelement;
|
||
|
var mediaelement = webshim.mediaelement;
|
||
|
var flashEvents = {
|
||
|
NOT_SUPPORTED_ERROR: 1,
|
||
|
PERMISSION_DENIED: 1,
|
||
|
//not implemented yet
|
||
|
MANDATORY_UNSATISFIED_ERROR: 1,
|
||
|
onUserSuccess: 1
|
||
|
};
|
||
|
var noSource = function(){
|
||
|
return !$.prop(this, 'currentSrc') && !mediaelement.srces(this).length;
|
||
|
};
|
||
|
|
||
|
function wsGetUserMedia(constraints, successCb, failCb){
|
||
|
if(hasSwf){
|
||
|
if(!webshim.mediaelement.createSWF){
|
||
|
webshim.loader.loadList(['swfmini-embed']);
|
||
|
webshim.mediaelement.loadSwf = true;
|
||
|
webshim.reTest(['mediaelement-jaris'], true);
|
||
|
webshim.ready('mediaelement-jaris', function(){
|
||
|
createMediaRequest(constraints, successCb, failCb);
|
||
|
});
|
||
|
} else {
|
||
|
createMediaRequest(constraints, successCb, failCb);
|
||
|
}
|
||
|
} else {
|
||
|
failCb({name: 'NOT_SUPPORTED_ERROR'});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function createMediaRequest(constraints, successCb, failCb){
|
||
|
var src;
|
||
|
var media = getMediaCandidate();
|
||
|
if(!media){return;}
|
||
|
|
||
|
id++;
|
||
|
src = 'webshimstream:stream'+id;
|
||
|
|
||
|
streamCb[src] = {
|
||
|
src: src,
|
||
|
success: successCb,
|
||
|
fail: failCb
|
||
|
};
|
||
|
|
||
|
addMediaAPI();
|
||
|
mediaelement.createSWF(media, {srcProp: src, streamrequest: true, type: 'jarisplayer/stream'});
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
function getMediaCandidate(){
|
||
|
var $media = $('video');
|
||
|
$media = $media.filter('.ws-usermedia');
|
||
|
if(!$media.length){
|
||
|
$media = $media.end();
|
||
|
}
|
||
|
if($media.length != 1){
|
||
|
$media = $media.filter(noSource);
|
||
|
}
|
||
|
if($media.length != 1){
|
||
|
webshim.error('for getUserMedia an empty video element has to be already in the DOM. If you provide multiple empty videos. please mark your suggested video using the "ws-usermedia" class.');
|
||
|
}
|
||
|
return $media[0];
|
||
|
}
|
||
|
|
||
|
|
||
|
function LocalMediaStream(data, api, id){
|
||
|
webshim.defineProperties(this, {
|
||
|
_swf: {
|
||
|
value: api,
|
||
|
enumerable: false
|
||
|
},
|
||
|
_data: {
|
||
|
value: data,
|
||
|
enumerable: false
|
||
|
},
|
||
|
_wsStreamId: {
|
||
|
value: id,
|
||
|
enumerable: false
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
LocalMediaStream.prototype = {
|
||
|
currentTime: 0,
|
||
|
stop: function(){
|
||
|
mediaelement.queueSwfMethod(this._data._elem, 'api_detach', [], this._data);
|
||
|
},
|
||
|
getAudioTracks: $.noop,
|
||
|
getVideoTracks: $.noop
|
||
|
};
|
||
|
|
||
|
|
||
|
webshim.usermedia = {
|
||
|
attach: function(elem, canPlaySrc, data){
|
||
|
if(data._usermedia == canPlaySrc.srcProp){
|
||
|
mediaelement.queueSwfMethod(data._elem, 'api_attach', [], data);
|
||
|
$(data._elem).trigger('loadstart');
|
||
|
} else {
|
||
|
webshim.error('something went wrong');
|
||
|
}
|
||
|
},
|
||
|
request: function(elem, canPlaySrc, data){
|
||
|
data._usermedia = canPlaySrc.srcProp;
|
||
|
if(!options.inline && !$(elem).hasClass('ws-inlineusermedia')){
|
||
|
$(data.api).css({position: 'fixed', top: 0, left: 0, width: '100%', height: 150, zIndex: '999999'});
|
||
|
} else {
|
||
|
$(data.api).css({position: 'relative', zIndex: '999999'});
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
URL._nativeCreateObjectURL = URL.createObjectURL;
|
||
|
URL._nativeRevokeObjectURL = URL.revokeObjectURL;
|
||
|
|
||
|
URL.createObjectURL = function(stream){
|
||
|
|
||
|
var url = '';
|
||
|
if(URL._nativeCreateObjectURL && !stream._wsStreamId){
|
||
|
url = URL._nativeCreateObjectURL(stream);
|
||
|
} else if(stream._wsStreamId) {
|
||
|
url = stream._wsStreamId;
|
||
|
streams[url] = stream;
|
||
|
}
|
||
|
return url;
|
||
|
};
|
||
|
|
||
|
URL.revokeObjectURL = function(url){
|
||
|
if(streams[url]){
|
||
|
delete streams[url];
|
||
|
}
|
||
|
if(URL._nativeRevokeObjectURL){
|
||
|
return URL._nativeRevokeObjectURL(url);
|
||
|
}
|
||
|
};
|
||
|
webshim.usermediastreams = streams;
|
||
|
|
||
|
addMediaAPI = function(){
|
||
|
if(!webshim.mediaelement.createSWF){return;}
|
||
|
addMediaAPI = $.noop;
|
||
|
var revert = function(data){
|
||
|
setTimeout(function(){
|
||
|
$(data.api).css({position: '', top: '', left: '', width: '', height: '', zIndex: ''});
|
||
|
if($.prop(data._elem, 'controls')){
|
||
|
$.prop(data._elem, 'controls', true);
|
||
|
}
|
||
|
}, 50);
|
||
|
};
|
||
|
var fail = function(jaris, data){
|
||
|
revert(data);
|
||
|
streamCb[data._usermedia].fail({name: jaris.type});
|
||
|
};
|
||
|
$.extend(mediaelement.onEvent, {
|
||
|
NOT_SUPPORTED_ERROR: fail,
|
||
|
PERMISSION_DENIED: fail,
|
||
|
//not implemented yet
|
||
|
MANDATORY_UNSATISFIED_ERROR: fail,
|
||
|
onUserSuccess: function(jaris, data){
|
||
|
revert(data);
|
||
|
streamCb[data._usermedia].success(new LocalMediaStream(data, data.api, data._usermedia));
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
webshim.ready('mediaelement-jaris', addMediaAPI);
|
||
|
|
||
|
webshim.getUserMedia = wsGetUserMedia;
|
||
|
navigator.wsGetUserMedia = wsGetUserMedia;
|
||
|
webshim.isReady('usermedia-api', true);
|
||
|
});
|