It’s part of Excalibur. I have not made that function as a standalone free version.
Here’s an extremely old one (MatchAspectSony.js) from 2011 that I did not write:
// "Match Output Aspect" on all selected video events.
// No selection = ALL
import System.Windows.Forms;
import Sony.Vegas;
var zero : int = 0;
function GetSelectionCount (mediaType)
{
var cTracks = Vegas.Project.Tracks.Count;
var cSelected = zero;
var ii;
for (ii = zero; ii < cTracks; ii ++)
{
var track = Vegas.Project.Tracks[ii];
if (track.MediaType == mediaType)
{
var eventEnum : Enumerator = new Enumerator(track.Events);
while ( ! eventEnum.atEnd() )
{
if (eventEnum.item().Selected)
{
cSelected ++;
}
eventEnum.moveNext();
}
}
}
return cSelected;
}
function GetActiveMediaStream (trackEvent : TrackEvent)
{
try
{
if ( ! trackEvent.ActiveTake.IsValid())
{
throw "empty or invalid take";
}
var media = Vegas.Project.MediaPool.Find (trackEvent.ActiveTake.MediaPath);
if (null == media)
{
throw "missing media";
}
var mediaStream = media.Streams.GetItemByMediaType (MediaType.Video, trackEvent.ActiveTake.StreamIndex);
return mediaStream;
}
catch (e)
{
//MessageBox.Show(e);
return null;
}
}
function MatchOutputAspect (keyframe : VideoMotionKeyframe, dMediaPixelAspect : double, dAspectOut : double)
{
var keyframeSave = keyframe;
try
{
var rotation = keyframe.Rotation;
// undo rotation so that we can get at correct aspect ratio.
//
keyframe.RotateBy (-rotation);
var dWidth = Math.abs(keyframe.TopRight.X - keyframe.TopLeft.X);
var dHeight = Math.abs(keyframe.BottomLeft.Y - keyframe.TopLeft.Y);
var dCurrentAspect = dMediaPixelAspect * dWidth / dHeight;
var centerY = keyframe.Center.Y;
var centerX = keyframe.Center.X;
var dFactor;
var bounds = new VideoMotionBounds(keyframe.TopLeft, keyframe.TopRight, keyframe.BottomRight, keyframe.BottomLeft);
if (dCurrentAspect < dAspectOut)
{
// alter y coords
dFactor = dCurrentAspect / dAspectOut;
bounds.TopLeft.Y = (bounds.TopLeft.Y - centerY) * dFactor + centerY;
bounds.TopRight.Y = (bounds.TopRight.Y - centerY) * dFactor + centerY;
bounds.BottomLeft.Y = (bounds.BottomLeft.Y - centerY) * dFactor + centerY;
bounds.BottomRight.Y = (bounds.BottomRight.Y - centerY) * dFactor + centerY;
}
else
{
// alter x coords
dFactor = dAspectOut / dCurrentAspect;
bounds.TopLeft.X = (bounds.TopLeft.X - centerX) * dFactor + centerX;
bounds.TopRight.X = (bounds.TopRight.X - centerX) * dFactor + centerX;
bounds.BottomLeft.X = (bounds.BottomLeft.X - centerX) * dFactor + centerX;
bounds.BottomRight.X = (bounds.BottomRight.X - centerX) * dFactor + centerX;
}
// set it to new bounds
keyframe.Bounds = bounds;
// restore rotation.
keyframe.RotateBy (rotation);
}
catch (e)
{
// restore original settings on error
keyframe = keyframeSave;
MessageBox.Show("MatchOuput: " + e);
}
}
var dWidthProject = Vegas.Project.Video.Width;
var dHeightProject = Vegas.Project.Video.Height;
var dPixelAspect = Vegas.Project.Video.PixelAspectRatio;
var dAspect = dPixelAspect * dWidthProject / dHeightProject;
var cSelected = GetSelectionCount (MediaType.Video);
var cTracks = Vegas.Project.Tracks.Count;
var ii;
for (ii = zero; ii < cTracks; ii ++)
{
var track = Vegas.Project.Tracks[ii];
if (! track.IsVideo())
{
continue;
}
var eventEnum : Enumerator = new Enumerator(track.Events);
while ( ! eventEnum.atEnd() )
{
var trackEvent : TrackEvent = eventEnum.item();
if ( !cSelected || trackEvent.Selected )
{
var mediaStream = GetActiveMediaStream (trackEvent);
if (mediaStream)
{
var videoStream = VideoStream (mediaStream);
var dMediaPixelAspect = videoStream.PixelAspectRatio;
var videoEvent = VideoEvent(eventEnum.item());
var keyframes = videoEvent.VideoMotion.Keyframes;
var cKeyframes = keyframes.Count;
var jj;
for (jj = zero; jj < cKeyframes; jj ++)
{
MatchOutputAspect (keyframes[jj], dMediaPixelAspect, dAspect);
}
}
}
eventEnum.moveNext();
}
}
Vegas.UpdateUI();
Edward Troxel