//----------------------------------------------------------------------------- // CorrectAspectRatio // // Converts a rectangle from the source's pixel aspect ratio (PAR) to 1:1 PAR. // Returns the corrected rectangle. // // For example, a 720 x 486 rect with a PAR of 9:10, when converted to 1x1 PAR, // is stretched to 720 x 540. //----------------------------------------------------------------------------- private static Rectangle CorrectAspectRatio(Rectangle src, MFRatio srcPAR) { // Start with a rectangle the same size as src, but offset to the origin (0,0). Rectangle rc = new Rectangle(0, 0, src.Right - src.Left, src.Bottom - src.Top); int rcNewWidth = rc.Right; int rcNewHeight = rc.Bottom; if ((srcPAR.Numerator != 1) || (srcPAR.Denominator != 1)) { // Correct for the source's PAR. if (srcPAR.Numerator > srcPAR.Denominator) { // The source has "wide" pixels, so stretch the width. rcNewWidth = Kernal32.MulDiv(rc.Right, srcPAR.Numerator, srcPAR.Denominator); } else if (srcPAR.Numerator < srcPAR.Denominator) { // The source has "tall" pixels, so stretch the height. rcNewHeight = Kernal32.MulDiv(rc.Bottom, srcPAR.Denominator, srcPAR.Numerator); } // else: PAR is 1:1, which is a no-op. } rc = new Rectangle(0, 0, rcNewWidth, rcNewHeight); return(rc); }
//------------------------------------------------------------------- // LetterBoxDstRect // // Takes a src rectangle and constructs the largest possible // destination rectangle within the specifed destination rectangle // such that the video maintains its current shape. // // This function assumes that pels are the same shape within both the // source and destination rectangles. // //------------------------------------------------------------------- private static Rectangle LetterBoxRect(Rectangle rcSrc, Rectangle rcDst) { int iDstLBWidth; int iDstLBHeight; if (Kernal32.MulDiv(rcSrc.Width, rcDst.Height, rcSrc.Height) <= rcDst.Width) { // Column letter boxing ("pillar box") iDstLBWidth = Kernal32.MulDiv(rcDst.Height, rcSrc.Width, rcSrc.Height); iDstLBHeight = rcDst.Height; } else { // Row letter boxing. iDstLBWidth = rcDst.Width; iDstLBHeight = Kernal32.MulDiv(rcDst.Width, rcSrc.Height, rcSrc.Width); } // Create a centered rectangle within the current destination rect int left = rcDst.Left + ((rcDst.Width - iDstLBWidth) / 2); int top = rcDst.Top + ((rcDst.Height - iDstLBHeight) / 2); Rectangle rc = new Rectangle(left, top, iDstLBWidth, iDstLBHeight); return(rc); }