* added k-attribution link in credits
[lhc/web/wiklou.git] / js2 / mwEmbed / libSequencer / mvFirefoggRender.js
1 /*
2 * Handles driving the firefogg render system
3 */
4 var mvFirefoggRender = function( options ) {
5 return this.init( options );
6 };
7 var default_render_options = {
8 "videoQuality" : 10,
9 "framerate" : 30
10 }
11 var default_FirefoggRender_options = {
12 start_time:0,
13 // if we should save to disk (if false setup upload stuff below)
14 save_to_disk:true
15 }
16 // set up the mvPlaylist object
17 mvFirefoggRender.prototype = {
18 // default empty render options:
19 renderOptions: { },
20 continue_rendering:false,
21 init:function( options ) {
22 var _this = this;
23
24 // grab the mvFirefogg object to do basic tests
25 this.myFogg = new mvFirefogg( {
26 'only_fogg':true
27 } );
28
29 // check for firefogg:
30 if ( this.myFogg.getFirefogg() ) {
31 this.enabled = true;
32 } else {
33 this.enabled = false;
34 return this;
35 }
36
37 // set up local fogg pointer:
38 this.fogg = this.myFogg.fogg;
39
40 // setup player instance
41 this.player = $j( options.player_target ).get( 0 );
42 this.player_target = options.player_target;
43
44 // Extend the render options with any provided details
45 if( options['render_options'] )
46 $j.extend(this.renderOptions, options['render_options']);
47
48 // If no height width provided use target DOM width/height
49 if( !this.renderOptions.width && !this.renderOptions.height ){
50 this.renderOptions.width = $j(this.player_target).width();
51 this.renderOptions.height = $j(this.player_target).height();
52 }
53
54
55 // Setup the application options (with defaults)
56 for ( var i in default_FirefoggRender_options ) {
57 if ( options[ i ] ) {
58 this[ i ] = options[ i ];
59 } else {
60 this[ i ] = default_FirefoggRender_options[i];
61 }
62 }
63 // Should be externally controlled
64 if ( options.target_startRender ) {
65 $j( options.target_startRender ).click( function() {
66 js_log( "Start render" );
67 _this.startRender();
68 } )
69 this.target_startRender = options.target_startRender;
70 }
71 if ( options.target_stopRender ) {
72 $j( options.target_stopRender ).click( function() {
73 _this.stopRender();
74 } )
75 this.target_stopRender = options.target_stopRender;
76 }
77 if ( options.target_timeStatus ) {
78 this.target_timeStatus = options.target_timeStatus;
79 }
80 },
81 startRender:function() {
82 var _this = this;
83 var t = this.start_time;
84 // get the interval from renderOptions framerate
85 var interval = 1 / this.renderOptions.framerate
86
87 // issue a load request on the player:
88 //this.player.load();
89
90 // init the Render
91 this.fogg.initRender( JSON.stringify( _this.renderOptions ), 'foggRender' );
92
93 // add audio if we had any:
94
95 // request a target (should support rendering to temp location too)
96 //this.fogg.saveVideoAs();
97
98 // set the continue rendering flag to true:
99 this.continue_rendering = true;
100
101 // internal function to hanndle updates:
102 var doNextFrame = function() {
103 $j( _this.target_timeStatus ).val( " on " + ( Math.round( t * 10 ) / 10 ) + " of " +
104 ( Math.round( _this.player.getDuration() * 10 ) / 10 ) );
105 _this.player.setCurrentTime( t, function() {
106 //_this.fogg.addFrame( $j( _this.player_target ).attr( 'id' ) );
107 t += interval;
108 if ( t >= _this.player.getDuration() ) {
109 _this.doFinalRender();
110 } else {
111 if ( _this.continue_rendering ) {
112 doNextFrame();
113 } else {
114 js_log('done with render');
115 // else quit:
116 //_this.doFinalRender();
117 }
118 }
119 } );
120 }
121 doNextFrame();
122 },
123 stopRender:function() {
124 this.continue_rendering = false;
125 },
126 doFinalRender:function() {
127 $j( this.target_timeStatus ).val( "doing final render" );
128 this.fogg.render();
129 this.updateStatus();
130 },
131 updateStatus:function() {
132 var _this = this;
133 var doUpdateStatus = function() {
134 var rstatus = _this.fogg.renderstatus()
135 $j( _this.target_timeStatus ).val( rstatus );
136 if ( rstatus != 'done' && rstatus != 'rendering failed' ) {
137 setTimeout( doUpdateStatus, 100 );
138 } else {
139 $j( _this.target_startRender ).attr( "disabled", false );
140 }
141 }
142 doUpdateStatus();
143 }
144
145
146 }