diff --git a/bower.json b/bower.json index cb5a2695a..44b17268f 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "moviemasher.js", "main": "dist/moviemasher.js", - "version": "4.0.20", + "version": "4.0.21", "homepage": "http://www.moviemasher.com", "authors": [ {"name": "Movie Masher", "email": "support@moviemasher.com" }], "moduleType": ["amd"], diff --git a/dist/moviemasher.js b/dist/moviemasher.js index 96fc5efbd..f75ba6ab3 100644 --- a/dist/moviemasher.js +++ b/dist/moviemasher.js @@ -1,5 +1,5 @@ -/*! moviemasher.js - v4.0.20 - 2016-09-11 -* Copyright (c) 2016 Movie Masher; Licensed */ +/*! moviemasher.js - v4.0.21 - 2017-02-25 +* Copyright (c) 2017 Movie Masher; Licensed */ /*global module:true,define:true*/ (function (name, context, definition) { 'use strict'; @@ -134,8 +134,9 @@ var Action = function(player, redo_func, undo_func, destroy_func){ delete this.undo_add_objects; delete this.redo_delete_objects; }; - + })(Action.prototype); +MovieMasher.Action = Action; var Audio = { buffer_source: function(buffer){ @@ -308,6 +309,7 @@ var Audio = { __last_seconds: 0, __sync_seconds: 0, }; +MovieMasher.Audio = Audio; var Colors = { yuv2rgb: function(yuv) { @@ -557,6 +559,7 @@ var Defaults = { return ob; }, }; +MovieMasher.Defaults = Defaults; var Filter = { registered: {}, @@ -1407,6 +1410,7 @@ var Mash = { return clips; }, }; +MovieMasher.Mash = Mash; var Option = { mash: { @@ -1434,6 +1438,8 @@ var Option = { hscrollpadding: 20, } }; +MovieMasher.Option = Option; + var Player = function(evaluated) { if (! Util.isob(evaluated)) evaluated = {}; @@ -2891,6 +2897,7 @@ var Player = function(evaluated) { if (this.__mash_length === Mash.length_of_clips(track.clips)) this.mash_length_changed(); }; })(Player.prototype); +MovieMasher.Player = Player; var Players = { draw_delayed: function(){ @@ -2918,8 +2925,8 @@ var Players = { instances: [], current: null, delayed_timer: 0, - }; +MovieMasher.Players = Players; var TimeRange = function(start, rate, duration){ if (start) this.frame = Number(start) || 0; @@ -3161,6 +3168,7 @@ TimeRange.fromSomething = function(something){ this.frames = Math.min(time.frame, this.frames); }; })(TimeRange.prototype); +MovieMasher.TimeRange = TimeRange; var Util = { array_empty: function(array){ diff --git a/dist/moviemasher.min.js b/dist/moviemasher.min.js index 8c6996a0d..05677ca33 100644 --- a/dist/moviemasher.min.js +++ b/dist/moviemasher.min.js @@ -1,3 +1,3 @@ -!function(a,b,c){"use strict";"undefined"!=typeof module&&module.exports?module.exports=c():"function"==typeof define&&define.amd?define(c):b[a]=c()}("MovieMasher",this,function(){"use strict";var MovieMasher=function(){this.instance_arguments=arguments,this.MovieMasher=MovieMasher,this.initialize()};MovieMasher.prototype.initialize=function(){},MovieMasher.configure=function(a){return Util.isob(a)&&Option.set(a),Option},MovieMasher.find=function(a,b,c){var d;return Util.isob(b)&&(b=b[c||"id"]),b&&(Util.isnt(MovieMasher.registered[a])&&(MovieMasher.registered[a]=[]),d=Util.array_find(MovieMasher.registered[a],b,c),d||(d=Defaults.module_for_type(a,b),d?(MovieMasher.registered[a].push(d),MovieMasher.registered[a].sort(Util.sort_by_label)):console.error("could not find registered "+a,b))),d},MovieMasher.player=function(a){var b=null;return Util.isnt(a)&&(a={}),Util.isob(a)?(b=new Player(a),Players.instances.push(b)):b=Players.instances[a],b},MovieMasher.register=function(a,b){if(Util.isarray(b)||(b=[b]),Util.isob.apply(Util,b)){var c,d,e,f,g,h,i=b.length;if(i)for(e=Util.isnt(MovieMasher.registered[a]),e&&(MovieMasher.registered[a]=[]),h=0;hg.start&&(e=d-g.start,g.start=d,isNaN(g.start)&&console.error("Audio.clip_timing currentTime is NaN"),g.offset+=e,g.duration-=e),g},connect_source:function(a,b,c,d){var e=Audio.get_ctx();a.gainNode=e.createGain(),a.buffer_source.connect(a.gainNode),a.gainNode.connect(e.destination),a.buffer_source.start(b,c,d)},config_gain:function(a,b,c,d,e){a.cancelScheduledValues(0);var f,g,h,i,j;for(j=b.split(","),i=j.length/2,h=0;h0&&!isNaN(e.start)&&(f={},f.clip=a,f.media=b,f.url=g,f.player=c,f.quantize=d,f.buffer_source=Audio.buffer_source(Loader.cached_urls[g]),Constant.audio===b.type&&b.loops&&(Audio.__buffer_source.loop=!0),Audio.connect_source(f,e.start,e.offset,e.duration),Audio.gain_source(f),Audio.sources.push(f))),f},sync:function(a){Audio.__last_seconds=a,Audio.__sync_seconds=Audio.get_ctx().currentTime},time:function(){return Audio.__last_seconds+(Audio.get_ctx().currentTime-Audio.__sync_seconds)},zero_seconds:function(){return Audio.__sync_seconds-Audio.__last_seconds},sources:[],ctx:null,__last_seconds:0,__sync_seconds:0},Colors={yuv2rgb:function(a){var b,c={};for(b in a)a[b]=parseInt(a[b]);c.r=a.y+1.4075*(a.v-128),c.g=a.y-.3455*(a.u-128)-.7169*(a.v-128),c.b=a.y+1.779*(a.u-128);for(b in c)c[b]=Math.min(255,Math.max(0,Math.floor(c[b])));return c},rgb2hex:function(a){var b,c,d;return b=a.r.toString(16),c=a.g.toString(16),d=a.b.toString(16),b.length<2&&(b="0"+b),c.length<2&&(c="0"+c),d.length<2&&(d="0"+d),"#"+b+c+d},yuv_blend:function(a,b,c,d){var e,f,g,h=0,i=a.length;for(g=0;g1e-4?255*Math.min(1,Math.max(0,(h-c)/d)):h>c?255:0},rgb2yuv:function(a){var b,c={};for(b in a)a[b]=parseInt(a[b]);c.y=.299*a.r+.587*a.g+.114*a.b,c.u=a.r*-.168736+a.g*-.331264+.5*a.b+128,c.v=.5*a.r+a.g*-.418688+a.b*-.081312+128;for(b in c)c[b]=Math.floor(c[b]);return c}};MovieMasher.Colors=Colors;var Constant={audio:"audio",both:"both",effect:"effect",filter:"filter",font:"font",frame:"frame",freeze:"freeze",gain:"gain",image:"image",merger:"merger",mute_shorthand:"0",mute:"0,0,1,0",property_types:{rgba:{type:String,value:"#000000FF"},rgb:{type:String,value:"#000000"},font:{type:String,value:"com.moviemasher.font.default"},fontsize:{type:Number,value:13},direction4:{type:Number,values:[{id:0,identifier:"top",label:"Top"},{id:1,identifier:"right",label:"Right"},{id:2,identifier:"bottom",label:"Bottom"},{id:3,identifier:"left",label:"Left"}],value:0},direction8:{type:Number,values:[{id:0,identifier:"top",label:"Top"},{id:1,identifier:"right",label:"Right"},{id:2,identifier:"bottom",label:"Bottom"},{id:3,identifier:"left",label:"Left"},{id:4,identifier:"top_right",label:"Top Right"},{id:5,identifier:"bottom_right",label:"Bottom Right"},{id:6,identifier:"bottom_left",label:"Bottom Left"},{id:7,identifier:"top_left",label:"Top Left"}],value:0},string:{type:String,value:""},pixel:{type:Number,value:0},mode:{type:String,value:"normal",values:[{id:"burn",composite:"color-burn",label:"Color Burn"},{id:"dodge",composite:"color-dodge",label:"Color Dodge"},{id:"darken",composite:"darken",label:"Darken"},{id:"difference",composite:"difference",label:"Difference"},{id:"exclusion",composite:"exclusion",label:"Exclusion"},{id:"hardlight",composite:"hard-light",label:"Hard Light"},{id:"lighten",composite:"lighter",label:"Lighten"},{id:"multiply",composite:"multiply",label:"Multiply"},{id:"normal",composite:"normal",label:"Normal"},{id:"overlay",composite:"overlay",label:"Overlay"},{id:"screen",composite:"screen",label:"Screen"},{id:"softlight",composite:"soft-light",label:"Soft Light"},{id:"xor",composite:"xor",label:"Xor"}]},text:{type:String,value:""}},scaler:"scaler",source:"source",theme:"theme",transition:"transition",video:"video",volume:"volume"};Constant.track_types=[Constant.video,Constant.audio],MovieMasher.Constant=Constant;var Defaults={modules:{font:{label:"Blackout Two AM",id:"com.moviemasher.font.default",type:"font",source:"media/font/default.ttf",family:"Blackout Two AM"},merger:{label:"Top Left",id:"com.moviemasher.merger.default",filters:[{id:"overlay",parameters:[{name:"x",value:"0"},{name:"y",value:"0"}]}]},scaler:{label:"Stretch",id:"com.moviemasher.scaler.default",filters:[{id:"scale",parameters:[{name:"width",value:"mm_width"},{name:"height",value:"mm_height"}]},{id:"setsar",parameters:[{name:"sar",value:"1"},{name:"max",value:"1"}]}]}},module_for_type:function(a,b){var c=Defaults.modules[a];return c&&b&&c.id!==b&&(c=null),c},module_from_type:function(a){var b={},c=Defaults.module_for_type(a);return c?b.id=c.id:console.error("Defaults.module_from_type not found",a),b}},Filter={registered:{},find:function(a){return MovieMasher.find(Constant.filter,a)},load:function(a){var b,c;return c=Filter.find(a),c&&(b=Filter.registered[a],b||Loader.load_filter(c.source)),b},create_drawing:function(a,b,c,d){var e={drawings:[]};return e.container=d,e.label=c,e.canvas=document.createElement("canvas"),e.context=e.canvas.getContext("2d"),1<=a&&(e.canvas.width=a),1<=b&&(e.canvas.height=b),e.container&&(e.span=document.createElement("span"),e.span.setAttribute("alt",e.label),e.container.appendChild(e.span),e.span.appendChild(e.canvas)),e},create_drawing_like:function(a,b){var c=Filter.create_drawing(a.canvas.width,a.canvas.height,b,a.container);return a.drawings.push(c),c},destroy_drawing:function(a){a.container&&(a.container.removeChild(a.span)||console.error("could not find span in container"),a.span.removeChild(a.canvas)||console.error("could not find canvas in span"));var b;for(b in a)a[b]=null},label:function(a){return a.description||a.id},register:function(a,b){Filter.registered[a]=b},rgb_at_pixel:function(a,b){var c=Filter.index_from_pixel(a);return Filter.rgb_at_index(c,b)},array_from_rgb:function(a){return[a.r,a.g,a.b,a.a]},rgb_at_index:function(a,b){var c=null;return a>=0&&a<=b.length-4&&(c={r:b[a],g:b[a+1],b:b[a+2],a:b[a+3]}),c},pixel_from_point:function(a,b){return a.y*b+a.x},point_from_pixel:function(a,b){var c={x:0,y:0};return c.x=a%b,c.y=Math.floor(a/b),c},pixel_from_index:function(a){return a/4},index_from_pixel:function(a){return 4*a},point_from_index:function(a,b){var c=Filter.pixel_from_index(a);return Filter.point_from_pixel(c,b)},safe_pixel:function(a,b,c,d,e){var f=Filter.point_from_pixel(a,d);return f.x=Math.max(0,Math.min(d-1,f.x+b)),f.y=Math.max(0,Math.min(e-1,f.y+c)),Filter.pixel_from_point(f,d)},safe_pixels:function(a,b,c,d){d||(d=3);var e,f,g,h=[],i=Math.floor(d/2);for(f=0;f1&&a.sort(Util.sort_by_frame)},recalc_track:function(a,b){Constant.audio===b.type||b.index?Mash.recalc_clips(b.clips):Mash.recalc_video_clips(a,b.clips)},recalc_video_clips:function(a,b){var c,d,e,f,g=0;for(e=b.length,d=0;d1;c=Mash.media_range(a,b,c,d,f);var g,h,i,j,k,l=new TimeRange(Math.floor(Number(b.duration)*Number(b.fps)),b.fps),m=l.frame,n=c.copyTimeRange();for(n.minLength(l),k=n.end,j=n.frame;j<=k;j++)l=new TimeRange(j,n.fps),l.scale(b.fps),j!==n.frame&&i===l.frame||(i=l.frame,i=Math.min(i,m-1),g=String(Math.min(i,m)*b.increment+b.begin),b.zeropadding&&(g=Util.pad(g,b.zeropadding,"0")),h=b.url+b.pattern,h=h.replace("%",g),e[h]=!0);return e},urls_of_type:function(a,b){var c,d,e,f={};for(c in a){switch(e=!0,b){case Constant.audio:e=c===Constant.audio;break;case Constant.video:e=c!==Constant.audio}if(e)for(d in a[c])f[d]=c}return f},visual_clips:function(a){var b,c,d,e=[];for(d=a.video.length,c=0;c-1;break;case"redo":b=this.__action_index0,b&&(b=this.__selected_clips[0].track>0);break;case"copy":b=c>0;break;case"cut":case"remove":b=this.__selected_clips.length;break;case"split":b=1===c,b&&(b=this.__canSplitAtTime(this.__selected_clips[0],this.__time));break;case"freeze":b=c>0,b&&(b=Constant.video===Mash.media(this.__mash,this.__selected_clips[0]).type),b&&(b=this.__canSplitAtTime(this.__selected_clips[0],this.__time))}return b},pt.change=function(a,b){var c,d,e,f,g="change-property";if(e=b?this.selectedEffect:this.selectedClipOrMash,f=b?this.__pristine_effect:this.__pristine_clip,a&&e)if(this.__action_index>-1&&this.__action_index===this.__action_stack.length-1&&Util.keys_found_equal({id:g,target:e,property:a},this.__action_stack[this.__action_index]))d=this.__action_stack[this.__action_index],d.value=Util.ob_property(e,a),d._redo(),this.__redraw_moving();else{var h=function(){this.set_property(this.orig_value)},i=function(){this.set_property(this.value)},j=!1;switch(c=Mash.media(this.__mash,e),c&&Mash.is_modular_media(c)&&(j=-1-1)break;default:d<0?(e.push(a),e=e.concat(this[f])):(d&&(e=e.concat(this[f].slice(0,d))),d-1&&(this.__action_stack[this.__action_index].undo(),this.__action_index--,this.did(),this.__redraw_moving())},pt.uuid=function(){return Util.uuid()},pt.__action_add=function(a){var b,c,d;if(this.__action_index-1;j--)i=d[j],i.track=b,i.frame=c+f[j].offset;h!==g&&Mash.recalc_track(this.player.mash,g),Mash.recalc_track(this.player.mash,h),this.player.mash_length_changed()},function(){if(f.sort(function(a,b){return a.index-b.index}),h!==g)for(j=0;j-1;e--)c.splice(a,0,b[e])},function(){for(g.sort(function(a,b){return a.i-b.i}),e=0;e-1;h--)g=c[h],f.clips.splice(b,0,g),g.track=a;f!==e&&Mash.recalc_track(this.player.mash,e),Mash.recalc_track(this.player.mash,f),this.player.mash_length_changed()},function(){for(d.sort(function(a,b){return a.index-b.index}),f.clips.splice(b,i),h=0;ha.length&&a.push(this.__drawing);var e=a[0],f=a[1];c.to.filters&&(f=this.__draw_module_filters(d,b,[f],b,c.to).shift()),c.from.filters&&(e=this.__draw_module_filters(d,b,[e],b,c.from).shift()),this.__drawings_merge(d,b,c.from.merger,e,f),this.__drawings_merge(d,b,c.to.merger,this.__drawing,e)},pt.__draw_request=function(a){var b=this;requestAnimationFrame(function(){b.__draw_layer_clips(a,b.__time_drawn)})},pt.__drawings_merge=function(a,b,c,d,e){var f;c?(f=Mash.media_search(Constant.merger,c,this.__mash),f?d=this.__draw_module_filters(a,b,[d,e],c,f).shift():console.error("no merger media",c)):console.error("false merger",b)},pt.__draw_scale_and_effects=function(a,b,c){var d,e;return e=b.scaler,e?(d=Mash.media_search(Constant.scaler,e,this.__mash),d?c=this.__draw_module_filters(a,b,[c],e,d).shift():console.error("no scaler media",e),c||console.error("scaler produced no drawing",e,b)):console.error("no scaler found",b),Util.isarray(b.effects)&&b.effects.length&&(c=this.__draw_effects([c],b,a).shift()),c},pt.__draw_module_filters=function(time,layer_clip,drawings,module,module_media){var __evaluate_scope=function(time,clip,scope,module,filter_config){var eval_key,eval_str,filter,conditional_in,condition,test_bool,parameter,conditional,parameter_name,parameter_value,parameters_array,j,y,i,z,evaluated={};if(filter=Filter.load(filter_config.id))if(scope=Util.copy_ob(scope),parameters_array=filter_config.parameters,parameters_array||(parameters_array=filter.parameters),parameters_array){for(z=parameters_array.length,i=0;i-1;f--)d=b.effects[f],e=Mash.media(this.__mash,d),e?a=this.__draw_module_filters(c,b,a,d,e):console.error("could not find effect media",d,b,this.__mash.media);else console.error("invalid layer clip with no effects",b);else console.error("invalid layer clip with no frames, so no effects",b);else console.error("false layer clip, so no effects",a);return a},pt.__limit_time=function(a){var b=a.copyTime(),c=new TimeRange(this.__mash_length,this.__mash.quantize);return c.frame=Math.max(0,c.frame-1),b.min(c),b.scale(this.__fps,"floor"),b},pt.__load_timed=function(){if(this.__moving){var a=TimeRange.fromSeconds(Audio.time(),this.__fps,"ceil");a.frame!==this.__limit_time(a).frame?this.__loop?this.frame=0:this.paused=!0:a.isEqualToTime(this.__time_drawn)||(this.__time.setToTime(a),this.redraw())}},pt.__module_scope=function(a,b,c,d,e){if(!this.__drawing.canvas)return{};var f,g,h,i,j,k,l;if(g={},e.properties)for(j in e.properties)f=d[j],Util.isnt(f)?(k=e.properties[j],f=k.value,Util.isnt(f)&&(i=k.type,i&&(h=Constant.property_types[i],h&&(f=h.value)),Util.isnt(f)&&(f=""))):f=d[j],g[j]=f;var m=function(a,b,c){var d=parseFloat(b),e=parseFloat(g[a]),f=e*d;if(c){var h="mm_height"===a?"mm_width":"mm_height",i=parseFloat(g[h]);i>e&&(f=e+(d-1)*i)}return f};return g.mm_vert=function(a,b){return m("mm_height",a,b)},g.mm_horz=function(a,b){return m("mm_width",a,b)},g.mm_cmp=function(a,b,c,d){return a>b?c:d},g.mm_max=Math.max,g.mm_min=Math.min,g.floor=Math.floor,g.ceil=Math.ceil,g.mm_fps=this.__fps,b&&(g.t=g.mm_duration=b.lengthSeconds),b.scale(a.fps),g.mm_t=(a.frame-b.frame)/b.frames,g.mm_width=this.__drawing.canvas.width,g.mm_height=this.__drawing.canvas.height,l=c[c.length-1],l&&l.canvas?(g.mm_input_width=l.canvas.width,g.mm_input_height=l.canvas.height,g.mm_input_dimensions=g.mm_input_width+"x"+g.mm_input_height):console.warn("no drawing?",c),g.mm_dimensions=g.mm_width+"x"+g.mm_height,g},pt.__redraw_moving=function(a){var b=this.__moving;b&&this.__set_moving(!1),a&&this.__time.setToTime(a),this.redraw(),b&&this.__set_moving(!0)},pt.__set_moving=function(a){if(this.__moving!==a){if(this.__moving=a,this.__moving){var b=this;this.__load_timer=setInterval(function(){b.__load_timed()},500/this.__fps),Audio.start(),Audio.sync(this.__time.seconds),this.rebuffer()}else Audio.stop(),Audio.destroy_sources(),clearInterval(this.__load_timer),this.__load_timer=0;this.__set_stalling(!this.__moving&&!this.__paused)}},pt.__set_stalling=function(a){var b=!1;return this.__stalling!==a&&(this.__stalling=a,b=!0),b},pt.__stop_buffer_timer=function(){this.__bufferProcessTimer&&(clearInterval(this.__bufferProcessTimer),this.__bufferProcessTimer=0)},pt.__track_create=function(a){var b=this.__mash[a];b.push(Mash.init_track(a,b.length))},pt.__track_delete=function(a){var b=this.__mash[a].pop();this.__mash_length===Mash.length_of_clips(b.clips)&&this.mash_length_changed()}}(Player.prototype);var Players={draw_delayed:function(){Players.delayed_timer||(Players.delayed_timer=setTimeout(function(){Players.delayed_timer=0;var a,b=Players.instances.length;for(a=0;athis.frame&&(b-=b-this.frame),this.frame-=b,b},a.synchronize=function(a,b){if(b||(b="round"),a.fps!==this.fps){var c=this.__lcm(a.fps,this.fps);this.scale(c,b),a.scale(c,b)}},a.__gcd=function(a,b){for(var c;0!==b;)c=b,b=a%b,a=c;return a},a.__lcm=function(a,b){return a*b/this.__gcd(a,b)},a.copyTimeRange=function(){return new TimeRange(this.frame,this.fps,this.frames)},a.touches=function(a){return this.intersection(a,!0)},a.intersection=function(a,b){var c=null,d=this,e=a;d.fps!==e.fps&&(d=d.copyTimeRange(),e=e.copyTimeRange(),d.synchronize(e));var f=Math.max(d.frame,e.frame),g=Math.min(d.end+(d.frames?0:1),e.end+(e.frames?0:1));return(f0;)a.pop()},array_add:function(a,b){var c;a&&Util.isarray(a)&&(c=a.indexOf(b),-1===c&&a.push(b))},array_key:function(a,b,c,d){return Util.array_find(a,b,d)[c]},array_find:function(a,b,c){var d,e,f=null;if(a&&Util.isarray(a)&&(Util.isnt(c)&&(c="id"),Util.isob(b)&&(b=b[c]),!Util.isnt(b)))for(e=a.length,d=0;dg&&a--;for(e=0;e=b?a:new Array(b-a.length+1).join(c)+a},pluralize:function(a,b){return 1!==a&&(b+="s"),b},set_ob_property:function(a,b,c){var d,e;if(Util.isob(a)&&!Util.isnt(b)&&b.length){ -for(b=b.split("."),e=b.length-1,d=0;db.label?1:0},sort_numeric:function(a,b){return a-b},sort_numeric_desc:function(a,b){return b-a},uuid:function(){return function a(b){return b?(b^16*Math.random()>>b/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,a)}()}};return MovieMasher.Util=Util,MovieMasher}); \ No newline at end of file +!function(a,b,c){"use strict";"undefined"!=typeof module&&module.exports?module.exports=c():"function"==typeof define&&define.amd?define(c):b[a]=c()}("MovieMasher",this,function(){"use strict";var MovieMasher=function(){this.instance_arguments=arguments,this.MovieMasher=MovieMasher,this.initialize()};MovieMasher.prototype.initialize=function(){},MovieMasher.configure=function(a){return Util.isob(a)&&Option.set(a),Option},MovieMasher.find=function(a,b,c){var d;return Util.isob(b)&&(b=b[c||"id"]),b&&(Util.isnt(MovieMasher.registered[a])&&(MovieMasher.registered[a]=[]),d=Util.array_find(MovieMasher.registered[a],b,c),d||(d=Defaults.module_for_type(a,b),d?(MovieMasher.registered[a].push(d),MovieMasher.registered[a].sort(Util.sort_by_label)):console.error("could not find registered "+a,b))),d},MovieMasher.player=function(a){var b=null;return Util.isnt(a)&&(a={}),Util.isob(a)?(b=new Player(a),Players.instances.push(b)):b=Players.instances[a],b},MovieMasher.register=function(a,b){if(Util.isarray(b)||(b=[b]),Util.isob.apply(Util,b)){var c,d,e,f,g,h,i=b.length;if(i)for(e=Util.isnt(MovieMasher.registered[a]),e&&(MovieMasher.registered[a]=[]),h=0;hg.start&&(e=d-g.start,g.start=d,isNaN(g.start)&&console.error("Audio.clip_timing currentTime is NaN"),g.offset+=e,g.duration-=e),g},connect_source:function(a,b,c,d){var e=Audio.get_ctx();a.gainNode=e.createGain(),a.buffer_source.connect(a.gainNode),a.gainNode.connect(e.destination),a.buffer_source.start(b,c,d)},config_gain:function(a,b,c,d,e){a.cancelScheduledValues(0);var f,g,h,i,j;for(j=b.split(","),i=j.length/2,h=0;h0&&!isNaN(e.start)&&(f={},f.clip=a,f.media=b,f.url=g,f.player=c,f.quantize=d,f.buffer_source=Audio.buffer_source(Loader.cached_urls[g]),Constant.audio===b.type&&b.loops&&(Audio.__buffer_source.loop=!0),Audio.connect_source(f,e.start,e.offset,e.duration),Audio.gain_source(f),Audio.sources.push(f))),f},sync:function(a){Audio.__last_seconds=a,Audio.__sync_seconds=Audio.get_ctx().currentTime},time:function(){return Audio.__last_seconds+(Audio.get_ctx().currentTime-Audio.__sync_seconds)},zero_seconds:function(){return Audio.__sync_seconds-Audio.__last_seconds},sources:[],ctx:null,__last_seconds:0,__sync_seconds:0};MovieMasher.Audio=Audio;var Colors={yuv2rgb:function(a){var b,c={};for(b in a)a[b]=parseInt(a[b]);c.r=a.y+1.4075*(a.v-128),c.g=a.y-.3455*(a.u-128)-.7169*(a.v-128),c.b=a.y+1.779*(a.u-128);for(b in c)c[b]=Math.min(255,Math.max(0,Math.floor(c[b])));return c},rgb2hex:function(a){var b,c,d;return b=a.r.toString(16),c=a.g.toString(16),d=a.b.toString(16),b.length<2&&(b="0"+b),c.length<2&&(c="0"+c),d.length<2&&(d="0"+d),"#"+b+c+d},yuv_blend:function(a,b,c,d){var e,f,g,h=0,i=a.length;for(g=0;g1e-4?255*Math.min(1,Math.max(0,(h-c)/d)):h>c?255:0},rgb2yuv:function(a){var b,c={};for(b in a)a[b]=parseInt(a[b]);c.y=.299*a.r+.587*a.g+.114*a.b,c.u=a.r*-.168736+a.g*-.331264+.5*a.b+128,c.v=.5*a.r+a.g*-.418688+a.b*-.081312+128;for(b in c)c[b]=Math.floor(c[b]);return c}};MovieMasher.Colors=Colors;var Constant={audio:"audio",both:"both",effect:"effect",filter:"filter",font:"font",frame:"frame",freeze:"freeze",gain:"gain",image:"image",merger:"merger",mute_shorthand:"0",mute:"0,0,1,0",property_types:{rgba:{type:String,value:"#000000FF"},rgb:{type:String,value:"#000000"},font:{type:String,value:"com.moviemasher.font.default"},fontsize:{type:Number,value:13},direction4:{type:Number,values:[{id:0,identifier:"top",label:"Top"},{id:1,identifier:"right",label:"Right"},{id:2,identifier:"bottom",label:"Bottom"},{id:3,identifier:"left",label:"Left"}],value:0},direction8:{type:Number,values:[{id:0,identifier:"top",label:"Top"},{id:1,identifier:"right",label:"Right"},{id:2,identifier:"bottom",label:"Bottom"},{id:3,identifier:"left",label:"Left"},{id:4,identifier:"top_right",label:"Top Right"},{id:5,identifier:"bottom_right",label:"Bottom Right"},{id:6,identifier:"bottom_left",label:"Bottom Left"},{id:7,identifier:"top_left",label:"Top Left"}],value:0},string:{type:String,value:""},pixel:{type:Number,value:0},mode:{type:String,value:"normal",values:[{id:"burn",composite:"color-burn",label:"Color Burn"},{id:"dodge",composite:"color-dodge",label:"Color Dodge"},{id:"darken",composite:"darken",label:"Darken"},{id:"difference",composite:"difference",label:"Difference"},{id:"exclusion",composite:"exclusion",label:"Exclusion"},{id:"hardlight",composite:"hard-light",label:"Hard Light"},{id:"lighten",composite:"lighter",label:"Lighten"},{id:"multiply",composite:"multiply",label:"Multiply"},{id:"normal",composite:"normal",label:"Normal"},{id:"overlay",composite:"overlay",label:"Overlay"},{id:"screen",composite:"screen",label:"Screen"},{id:"softlight",composite:"soft-light",label:"Soft Light"},{id:"xor",composite:"xor",label:"Xor"}]},text:{type:String,value:""}},scaler:"scaler",source:"source",theme:"theme",transition:"transition",video:"video",volume:"volume"};Constant.track_types=[Constant.video,Constant.audio],MovieMasher.Constant=Constant;var Defaults={modules:{font:{label:"Blackout Two AM",id:"com.moviemasher.font.default",type:"font",source:"media/font/default.ttf",family:"Blackout Two AM"},merger:{label:"Top Left",id:"com.moviemasher.merger.default",filters:[{id:"overlay",parameters:[{name:"x",value:"0"},{name:"y",value:"0"}]}]},scaler:{label:"Stretch",id:"com.moviemasher.scaler.default",filters:[{id:"scale",parameters:[{name:"width",value:"mm_width"},{name:"height",value:"mm_height"}]},{id:"setsar",parameters:[{name:"sar",value:"1"},{name:"max",value:"1"}]}]}},module_for_type:function(a,b){var c=Defaults.modules[a];return c&&b&&c.id!==b&&(c=null),c},module_from_type:function(a){var b={},c=Defaults.module_for_type(a);return c?b.id=c.id:console.error("Defaults.module_from_type not found",a),b}};MovieMasher.Defaults=Defaults;var Filter={registered:{},find:function(a){return MovieMasher.find(Constant.filter,a)},load:function(a){var b,c;return c=Filter.find(a),c&&(b=Filter.registered[a],b||Loader.load_filter(c.source)),b},create_drawing:function(a,b,c,d){var e={drawings:[]};return e.container=d,e.label=c,e.canvas=document.createElement("canvas"),e.context=e.canvas.getContext("2d"),1<=a&&(e.canvas.width=a),1<=b&&(e.canvas.height=b),e.container&&(e.span=document.createElement("span"),e.span.setAttribute("alt",e.label),e.container.appendChild(e.span),e.span.appendChild(e.canvas)),e},create_drawing_like:function(a,b){var c=Filter.create_drawing(a.canvas.width,a.canvas.height,b,a.container);return a.drawings.push(c),c},destroy_drawing:function(a){a.container&&(a.container.removeChild(a.span)||console.error("could not find span in container"),a.span.removeChild(a.canvas)||console.error("could not find canvas in span"));var b;for(b in a)a[b]=null},label:function(a){return a.description||a.id},register:function(a,b){Filter.registered[a]=b},rgb_at_pixel:function(a,b){var c=Filter.index_from_pixel(a);return Filter.rgb_at_index(c,b)},array_from_rgb:function(a){return[a.r,a.g,a.b,a.a]},rgb_at_index:function(a,b){var c=null;return a>=0&&a<=b.length-4&&(c={r:b[a],g:b[a+1],b:b[a+2],a:b[a+3]}),c},pixel_from_point:function(a,b){return a.y*b+a.x},point_from_pixel:function(a,b){var c={x:0,y:0};return c.x=a%b,c.y=Math.floor(a/b),c},pixel_from_index:function(a){return a/4},index_from_pixel:function(a){return 4*a},point_from_index:function(a,b){var c=Filter.pixel_from_index(a);return Filter.point_from_pixel(c,b)},safe_pixel:function(a,b,c,d,e){var f=Filter.point_from_pixel(a,d);return f.x=Math.max(0,Math.min(d-1,f.x+b)),f.y=Math.max(0,Math.min(e-1,f.y+c)),Filter.pixel_from_point(f,d)},safe_pixels:function(a,b,c,d){d||(d=3);var e,f,g,h=[],i=Math.floor(d/2);for(f=0;f1&&a.sort(Util.sort_by_frame)},recalc_track:function(a,b){Constant.audio===b.type||b.index?Mash.recalc_clips(b.clips):Mash.recalc_video_clips(a,b.clips)},recalc_video_clips:function(a,b){var c,d,e,f,g=0;for(e=b.length,d=0;d1;c=Mash.media_range(a,b,c,d,f);var g,h,i,j,k,l=new TimeRange(Math.floor(Number(b.duration)*Number(b.fps)),b.fps),m=l.frame,n=c.copyTimeRange();for(n.minLength(l),k=n.end,j=n.frame;j<=k;j++)l=new TimeRange(j,n.fps),l.scale(b.fps),j!==n.frame&&i===l.frame||(i=l.frame,i=Math.min(i,m-1),g=String(Math.min(i,m)*b.increment+b.begin),b.zeropadding&&(g=Util.pad(g,b.zeropadding,"0")),h=b.url+b.pattern,h=h.replace("%",g),e[h]=!0);return e},urls_of_type:function(a,b){var c,d,e,f={};for(c in a){switch(e=!0,b){case Constant.audio:e=c===Constant.audio;break;case Constant.video:e=c!==Constant.audio}if(e)for(d in a[c])f[d]=c}return f},visual_clips:function(a){var b,c,d,e=[];for(d=a.video.length,c=0;c-1;break;case"redo":b=this.__action_index0,b&&(b=this.__selected_clips[0].track>0);break;case"copy":b=c>0;break;case"cut":case"remove":b=this.__selected_clips.length;break;case"split":b=1===c,b&&(b=this.__canSplitAtTime(this.__selected_clips[0],this.__time));break;case"freeze":b=c>0,b&&(b=Constant.video===Mash.media(this.__mash,this.__selected_clips[0]).type),b&&(b=this.__canSplitAtTime(this.__selected_clips[0],this.__time))}return b},pt.change=function(a,b){var c,d,e,f,g="change-property";if(e=b?this.selectedEffect:this.selectedClipOrMash,f=b?this.__pristine_effect:this.__pristine_clip,a&&e)if(this.__action_index>-1&&this.__action_index===this.__action_stack.length-1&&Util.keys_found_equal({id:g,target:e,property:a},this.__action_stack[this.__action_index]))d=this.__action_stack[this.__action_index],d.value=Util.ob_property(e,a),d._redo(),this.__redraw_moving();else{var h=function(){this.set_property(this.orig_value)},i=function(){this.set_property(this.value)},j=!1;switch(c=Mash.media(this.__mash,e),c&&Mash.is_modular_media(c)&&(j=-1-1)break;default:d<0?(e.push(a),e=e.concat(this[f])):(d&&(e=e.concat(this[f].slice(0,d))),d-1&&(this.__action_stack[this.__action_index].undo(),this.__action_index--,this.did(),this.__redraw_moving())},pt.uuid=function(){return Util.uuid()},pt.__action_add=function(a){var b,c,d;if(this.__action_index-1;j--)i=d[j],i.track=b,i.frame=c+f[j].offset;h!==g&&Mash.recalc_track(this.player.mash,g),Mash.recalc_track(this.player.mash,h),this.player.mash_length_changed()},function(){if(f.sort(function(a,b){return a.index-b.index}),h!==g)for(j=0;j-1;e--)c.splice(a,0,b[e])},function(){for(g.sort(function(a,b){return a.i-b.i}),e=0;e-1;h--)g=c[h],f.clips.splice(b,0,g),g.track=a;f!==e&&Mash.recalc_track(this.player.mash,e),Mash.recalc_track(this.player.mash,f),this.player.mash_length_changed()},function(){for(d.sort(function(a,b){return a.index-b.index}),f.clips.splice(b,i),h=0;ha.length&&a.push(this.__drawing);var e=a[0],f=a[1];c.to.filters&&(f=this.__draw_module_filters(d,b,[f],b,c.to).shift()),c.from.filters&&(e=this.__draw_module_filters(d,b,[e],b,c.from).shift()),this.__drawings_merge(d,b,c.from.merger,e,f),this.__drawings_merge(d,b,c.to.merger,this.__drawing,e)},pt.__draw_request=function(a){var b=this;requestAnimationFrame(function(){b.__draw_layer_clips(a,b.__time_drawn)})},pt.__drawings_merge=function(a,b,c,d,e){var f;c?(f=Mash.media_search(Constant.merger,c,this.__mash),f?d=this.__draw_module_filters(a,b,[d,e],c,f).shift():console.error("no merger media",c)):console.error("false merger",b)},pt.__draw_scale_and_effects=function(a,b,c){var d,e;return e=b.scaler,e?(d=Mash.media_search(Constant.scaler,e,this.__mash),d?c=this.__draw_module_filters(a,b,[c],e,d).shift():console.error("no scaler media",e),c||console.error("scaler produced no drawing",e,b)):console.error("no scaler found",b),Util.isarray(b.effects)&&b.effects.length&&(c=this.__draw_effects([c],b,a).shift()),c},pt.__draw_module_filters=function(time,layer_clip,drawings,module,module_media){var __evaluate_scope=function(time,clip,scope,module,filter_config){var eval_key,eval_str,filter,conditional_in,condition,test_bool,parameter,conditional,parameter_name,parameter_value,parameters_array,j,y,i,z,evaluated={};if(filter=Filter.load(filter_config.id))if(scope=Util.copy_ob(scope),parameters_array=filter_config.parameters,parameters_array||(parameters_array=filter.parameters),parameters_array){for(z=parameters_array.length,i=0;i-1;f--)d=b.effects[f],e=Mash.media(this.__mash,d),e?a=this.__draw_module_filters(c,b,a,d,e):console.error("could not find effect media",d,b,this.__mash.media);else console.error("invalid layer clip with no effects",b);else console.error("invalid layer clip with no frames, so no effects",b);else console.error("false layer clip, so no effects",a);return a},pt.__limit_time=function(a){var b=a.copyTime(),c=new TimeRange(this.__mash_length,this.__mash.quantize);return c.frame=Math.max(0,c.frame-1),b.min(c),b.scale(this.__fps,"floor"),b},pt.__load_timed=function(){if(this.__moving){var a=TimeRange.fromSeconds(Audio.time(),this.__fps,"ceil");a.frame!==this.__limit_time(a).frame?this.__loop?this.frame=0:this.paused=!0:a.isEqualToTime(this.__time_drawn)||(this.__time.setToTime(a),this.redraw())}},pt.__module_scope=function(a,b,c,d,e){if(!this.__drawing.canvas)return{};var f,g,h,i,j,k,l;if(g={},e.properties)for(j in e.properties)f=d[j],Util.isnt(f)?(k=e.properties[j],f=k.value,Util.isnt(f)&&(i=k.type,i&&(h=Constant.property_types[i],h&&(f=h.value)),Util.isnt(f)&&(f=""))):f=d[j],g[j]=f;var m=function(a,b,c){var d=parseFloat(b),e=parseFloat(g[a]),f=e*d;if(c){var h="mm_height"===a?"mm_width":"mm_height",i=parseFloat(g[h]);i>e&&(f=e+(d-1)*i)}return f};return g.mm_vert=function(a,b){return m("mm_height",a,b)},g.mm_horz=function(a,b){return m("mm_width",a,b)},g.mm_cmp=function(a,b,c,d){return a>b?c:d},g.mm_max=Math.max,g.mm_min=Math.min,g.floor=Math.floor,g.ceil=Math.ceil,g.mm_fps=this.__fps,b&&(g.t=g.mm_duration=b.lengthSeconds),b.scale(a.fps),g.mm_t=(a.frame-b.frame)/b.frames,g.mm_width=this.__drawing.canvas.width,g.mm_height=this.__drawing.canvas.height,l=c[c.length-1],l&&l.canvas?(g.mm_input_width=l.canvas.width,g.mm_input_height=l.canvas.height,g.mm_input_dimensions=g.mm_input_width+"x"+g.mm_input_height):console.warn("no drawing?",c),g.mm_dimensions=g.mm_width+"x"+g.mm_height,g},pt.__redraw_moving=function(a){var b=this.__moving;b&&this.__set_moving(!1),a&&this.__time.setToTime(a),this.redraw(),b&&this.__set_moving(!0)},pt.__set_moving=function(a){if(this.__moving!==a){if(this.__moving=a,this.__moving){var b=this;this.__load_timer=setInterval(function(){b.__load_timed()},500/this.__fps),Audio.start(),Audio.sync(this.__time.seconds),this.rebuffer()}else Audio.stop(),Audio.destroy_sources(),clearInterval(this.__load_timer),this.__load_timer=0;this.__set_stalling(!this.__moving&&!this.__paused)}},pt.__set_stalling=function(a){var b=!1;return this.__stalling!==a&&(this.__stalling=a,b=!0),b},pt.__stop_buffer_timer=function(){this.__bufferProcessTimer&&(clearInterval(this.__bufferProcessTimer),this.__bufferProcessTimer=0)},pt.__track_create=function(a){var b=this.__mash[a];b.push(Mash.init_track(a,b.length))},pt.__track_delete=function(a){var b=this.__mash[a].pop();this.__mash_length===Mash.length_of_clips(b.clips)&&this.mash_length_changed()}}(Player.prototype),MovieMasher.Player=Player;var Players={draw_delayed:function(){Players.delayed_timer||(Players.delayed_timer=setTimeout(function(){Players.delayed_timer=0;var a,b=Players.instances.length;for(a=0;athis.frame&&(b-=b-this.frame),this.frame-=b,b},a.synchronize=function(a,b){if(b||(b="round"),a.fps!==this.fps){var c=this.__lcm(a.fps,this.fps);this.scale(c,b),a.scale(c,b)}},a.__gcd=function(a,b){for(var c;0!==b;)c=b,b=a%b,a=c;return a},a.__lcm=function(a,b){return a*b/this.__gcd(a,b)},a.copyTimeRange=function(){return new TimeRange(this.frame,this.fps,this.frames)},a.touches=function(a){return this.intersection(a,!0)},a.intersection=function(a,b){var c=null,d=this,e=a;d.fps!==e.fps&&(d=d.copyTimeRange(),e=e.copyTimeRange(),d.synchronize(e));var f=Math.max(d.frame,e.frame),g=Math.min(d.end+(d.frames?0:1),e.end+(e.frames?0:1));return(f0;)a.pop()},array_add:function(a,b){var c;a&&Util.isarray(a)&&(c=a.indexOf(b),-1===c&&a.push(b))},array_key:function(a,b,c,d){return Util.array_find(a,b,d)[c]},array_find:function(a,b,c){var d,e,f=null;if(a&&Util.isarray(a)&&(Util.isnt(c)&&(c="id"),Util.isob(b)&&(b=b[c]),!Util.isnt(b)))for(e=a.length,d=0;dg&&a--;for(e=0;e=b?a:new Array(b-a.length+1).join(c)+a},pluralize:function(a,b){return 1!==a&&(b+="s"),b},set_ob_property:function(a,b,c){var d,e;if(Util.isob(a)&&!Util.isnt(b)&&b.length){for(b=b.split("."),e=b.length-1,d=0;db.label?1:0},sort_numeric:function(a,b){return a-b},sort_numeric_desc:function(a,b){return b-a},uuid:function(){return function a(b){return b?(b^16*Math.random()>>b/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,a)}()}};return MovieMasher.Util=Util,MovieMasher}); \ No newline at end of file diff --git a/package.json b/package.json index 57b42e4e0..c04dc12a4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "moviemasher.js", "description": "JavaScript library for realtime, browser-based video and audio editing", - "version": "4.0.20", + "version": "4.0.21", "author": { "name": "Movie Masher", "email": "support@moviemasher.com" diff --git a/src/others/action.js b/src/others/action.js index 16a4a9ff9..f94ce237a 100644 --- a/src/others/action.js +++ b/src/others/action.js @@ -44,5 +44,6 @@ var Action = function(player, redo_func, undo_func, destroy_func){ delete this.undo_add_objects; delete this.redo_delete_objects; }; - + })(Action.prototype); +MovieMasher.Action = Action; diff --git a/src/others/audio.js b/src/others/audio.js index 8e3e0f6f0..9bd21e356 100644 --- a/src/others/audio.js +++ b/src/others/audio.js @@ -169,3 +169,4 @@ var Audio = { __last_seconds: 0, __sync_seconds: 0, }; +MovieMasher.Audio = Audio; diff --git a/src/others/defaults.js b/src/others/defaults.js index 64e09cb0c..62f98be6f 100644 --- a/src/others/defaults.js +++ b/src/others/defaults.js @@ -67,3 +67,4 @@ var Defaults = { return ob; }, }; +MovieMasher.Defaults = Defaults; diff --git a/src/others/mash.js b/src/others/mash.js index 5bd288164..9e83a162a 100644 --- a/src/others/mash.js +++ b/src/others/mash.js @@ -607,3 +607,4 @@ var Mash = { return clips; }, }; +MovieMasher.Mash = Mash; diff --git a/src/others/option.js b/src/others/option.js index c5d325a97..430fae8f1 100644 --- a/src/others/option.js +++ b/src/others/option.js @@ -23,4 +23,5 @@ var Option = { timeline: { hscrollpadding: 20, } -}; \ No newline at end of file +}; +MovieMasher.Option = Option; diff --git a/src/others/player.js b/src/others/player.js index 7d89e260e..601794c64 100644 --- a/src/others/player.js +++ b/src/others/player.js @@ -1455,3 +1455,4 @@ var Player = function(evaluated) { if (this.__mash_length === Mash.length_of_clips(track.clips)) this.mash_length_changed(); }; })(Player.prototype); +MovieMasher.Player = Player; diff --git a/src/others/players.js b/src/others/players.js index 82778e4e8..9c79a7b16 100644 --- a/src/others/players.js +++ b/src/others/players.js @@ -24,5 +24,5 @@ var Players = { instances: [], current: null, delayed_timer: 0, - }; +MovieMasher.Players = Players; diff --git a/src/others/time.js b/src/others/time.js index 064c22382..0cb161dd2 100644 --- a/src/others/time.js +++ b/src/others/time.js @@ -238,3 +238,4 @@ TimeRange.fromSomething = function(something){ this.frames = Math.min(time.frame, this.frames); }; })(TimeRange.prototype); +MovieMasher.TimeRange = TimeRange;