Code:
/*
* var divx_video = new DivXVideo();
*/
function DivXVideo()
{
/*
* default values
*/
this.VideoLength = 0;
this.AspectRatio = 16 / 9;
this.Width = 720;
this.Height = 480;
this.CroppingTop = 0;
this.CroppingRight = 0;
this.CroppingBottom = 0;
this.CroppingLeft = 0;
this.FramesPerSecond = 23.976;
this.OutputFileSize = 703.125;
this.ResXModulus = 4;
this.ResYModulus = 2;
this.AudioBitrateModulus = 16;
/*
* videoLength();
* videoLength( seconds );
* videoLength( minutes, seconds );
* videoLength( hours, minutes, seconds );
*/
this.videoLength = function()
{
if (arguments.length > 2)
this.VideoLength = arguments[0] * 3600 + arguments[1] * 60 + arguments[2];
else if (arguments.length > 1)
this.VideoLength = arguments[0] * 60 + arguments[1];
else if (arguments.length)
this.VideoLength = arguments[0];
return this.VideoLength;
}
/*
* aspectRatio( [ ratio ] );
*/
this.aspectRatio = function()
{
if (arguments.length)
this.AspectRatio = arguments[0];
return this.AspectRatio;
}
/*
* width( [ n ] );
*/
this.width = function()
{
if (arguments.length)
this.Width = arguments[0];
return this.Width;
}
/*
* height( [ n ] );
*/
this.height = function()
{
if (arguments.length)
this.Height = arguments[0];
return this.Height;
}
/*
* croppingTop( [ n ] );
*/
this.croppingTop = function()
{
if (arguments.length)
this.CroppingTop = arguments[0];
return this.CroppingTop;
}
/*
* croppingRight( [ n ] );
*/
this.croppingRight = function()
{
if (arguments.length)
this.CroppingRight = arguments[0];
return this.CroppingRight;
}
/*
* croppingBottom( [ n ] );
*/
this.croppingBottom = function()
{
if (arguments.length)
this.CroppingBottom = arguments[0];
return this.CroppingBottom;
}
/*
* croppingLeft( [ n ] );
*/
this.croppingLeft = function()
{
if (arguments.length)
this.CroppingLeft = arguments[0];
return this.CroppingLeft;
}
/*
* framesPerSecond( [ fps ] );
*/
this.framesPerSecond = function()
{
if (arguments.length)
this.FramesPerSecond = arguments[0];
return this.FramesPerSecond;
}
/*
* outputFileSize( [ MB ] );
*/
this.outputFileSize = function()
{
if (arguments.length)
this.OutputFileSize = arguments[0];
return this.OutputFileSize;
}
/*
* resXModulus( [ modulus ] );
*/
this.resXModulus = function()
{
if (arguments.length)
this.ResXModulus = arguments[0];
return this.ResXModulus;
}
/*
* resYModulus( [ modulus ] );
*/
this.resYModulus = function()
{
if (arguments.length)
this.ResYModulus = arguments[0];
return this.ResYModulus;
}
/*
* audioBitrateModulus( [ modulus ] );
*/
this.audioBitrateModulus = function()
{
if (arguments.length)
this.AudioBitrateModulus = arguments[0];
return this.AudioBitrateModulus;
}
/*
* audioBitrate();
*
* Assume MP3 compression.
* Variable dependencies:
* - outputFileSize
* - videoLength
* - audioBitrateModulus
*/
this.audioBitrate = function()
{
var kbps = Math.round(this.OutputFileSize * 8192 / (this.VideoLength * 7.09375));
kbps -= kbps % this.AudioBitrateModulus;
return kbps > 128 ? 128 : kbps;
}
/*
* videoBitrate();
*
* Variable dependencies:
* - outputFileSize
* - videoLength
* - audioBitrateModulus
*/
this.videoBitrate = function()
{
return Math.floor((this.OutputFileSize - this.kbps2MB(this.audioBitrate(), this.VideoLength)) * 8192 / this.VideoLength);
}
/*
* resX();
*
* Variable dependencies:
* - width
* - croppingLeft
* - croppingRight
* - height
* - croppingTop
* - croppingBottom
* - aspectRatio
* - outputFileSize
* - videoLength
* - audioBitrateModulus
* - framesPerSecond
* - resXModulus
*/
this.resX = function()
{
var x = this.Width - this.CroppingLeft - this.CroppingRight;
var y = this.Height - this.CroppingTop - this.CroppingBottom;
if (Math.round(this.Width / this.AspectRatio) > this.Height)
x /= this.Width / Math.round(this.Height * this.AspectRatio)
else
y /= this.Height / Math.round(this.Width / this.AspectRatio);
var optimum_res_x = Math.sqrt(1024 * this.videoBitrate() * (x / y) / (.2 * this.FramesPerSecond));
if (optimum_res_x < x)
x = optimum_res_x;
x = Math.round(x);
x -= x % this.ResXModulus;
return x;
}
/*
* resY();
*
* Variable dependencies:
* - width
* - croppingLeft
* - croppingRight
* - height
* - croppingTop
* - croppingBottom
* - aspectRatio
* - outputFileSize
* - videoLength
* - audioBitrateModulus
* - framesPerSecond
* - resXModulus
* - resYModulus
*/
this.resY = function()
{
var x = this.Width - this.CroppingLeft - this.CroppingRight;
var y = this.Height - this.CroppingTop - this.CroppingBottom;
if (Math.round(this.Width / this.AspectRatio) > this.Height)
x /= this.Width / Math.round(this.Height * this.AspectRatio)
else
y /= this.Height / Math.round(this.Width / this.AspectRatio);
y = Math.round(this.resX() / (x / y));
y -= y % this.ResYModulus;
return y
}
/*
* kbps2MB( bitrate, seconds );
*
* Convert kbps for a given number of seconds to file size in MB.
*/
this.kbps2MB = function(bitrate, seconds)
{
return bitrate * seconds / 8192;
}
}