diff options
author | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-05-21 17:09:38 +0000 |
---|---|---|
committer | tobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c> | 2008-05-21 17:09:38 +0000 |
commit | 4cbefb8f24d2ccb0238a5e442701811d20b476a0 (patch) | |
tree | b57f841cdf97f3f28f5e8370caab4f1eba18d42e | |
parent | c7f30437ac8404b36521c18b03eec84839cafe5d (diff) | |
download | usdx-4cbefb8f24d2ccb0238a5e442701811d20b476a0.tar.gz usdx-4cbefb8f24d2ccb0238a5e442701811d20b476a0.tar.xz usdx-4cbefb8f24d2ccb0238a5e442701811d20b476a0.zip |
Video Aspect-Ratio fix (e.g. for 16:9 displays)
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1113 b956fd51-792f-4845-bead-9b4dfca2ff2c
-rw-r--r-- | Game/Code/Classes/UVideo.pas | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/Game/Code/Classes/UVideo.pas b/Game/Code/Classes/UVideo.pas index d29b713b..b03f29bf 100644 --- a/Game/Code/Classes/UVideo.pas +++ b/Game/Code/Classes/UVideo.pas @@ -87,8 +87,7 @@ type fVideoTex: GLuint;
TexWidth, TexHeight: Cardinal;
- ScaledVideoWidth, ScaledVideoHeight: Real;
-
+
VideoAspect: Real;
VideoTimeBase, VideoTime: Extended;
fLoopTime: Extended;
@@ -135,6 +134,7 @@ begin AVERROR_NOFMT: Result := 'AVERROR_NOFMT';
AVERROR_NOTSUPP: Result := 'AVERROR_NOTSUPP';
AVERROR_NOENT: Result := 'AVERROR_NOENT';
+ AVERROR_PATCHWELCOME: Result := 'AVERROR_PATCHWELCOME';
else Result := 'AVERROR_#'+inttostr(Errnum);
end;
end;
@@ -469,9 +469,9 @@ var TexVideoRightPos, TexVideoLowerPos: Single;
ScreenLeftPos, ScreenRightPos: Single;
ScreenUpperPos, ScreenLowerPos: Single;
-const
- ScreenMidPosX = 400.0;
- ScreenMidPosY = 300.0;
+ ScaledVideoWidth, ScaledVideoHeight: Single;
+ ScreenMidPosX, ScreenMidPosY: Single;
+ ScreenAspect, RenderAspect: Single;
begin
// have a nice black background to draw on (even if there were errors opening the vid)
if (Screen = 1) then
@@ -488,17 +488,32 @@ begin Log.BenchmarkStart(15);
{$ENDIF}
- TexVideoRightPos := VideoCodecContext^.width / TexWidth;
- TexVideoLowerPos := VideoCodecContext^.height / TexHeight;
+ ScreenAspect := ScreenW / ScreenH;
+ RenderAspect := RenderW / RenderH;
+ ScaledVideoWidth := RenderW;
+ ScaledVideoHeight := ScaledVideoWidth/VideoAspect * ScreenAspect/RenderAspect;
+
+ // Note: Scaling the width does not look good because the video might contain
+ // black borders at the top already
+ //ScaledVideoHeight := RenderH;
+ //ScaledVideoWidth := ScaledVideoHeight*VideoAspect * RenderAspect/ScreenAspect;
+
+ // center the video
+ ScreenMidPosX := RenderW/2;
+ ScreenMidPosY := RenderH/2;
ScreenLeftPos := ScreenMidPosX - ScaledVideoWidth/2;
ScreenRightPos := ScreenMidPosX + ScaledVideoWidth/2;
ScreenUpperPos := ScreenMidPosY - ScaledVideoHeight/2;
ScreenLowerPos := ScreenMidPosY + ScaledVideoHeight/2;
+ // the video-texture contains empty borders because its width and height must be
+ // a power of 2. So we have to determine the texture coords of the video.
+ TexVideoRightPos := VideoCodecContext^.width / TexWidth;
+ TexVideoLowerPos := VideoCodecContext^.height / TexHeight;
// we could use blending for brightness control, but do we need this?
glDisable(GL_BLEND);
- // TODO: disable other stuff like lightning, etc.
+ // TODO: disable other stuff like lightning, etc.
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fVideoTex);
@@ -721,9 +736,6 @@ begin VideoAspect := VideoAspect * VideoCodecContext^.width /
VideoCodecContext^.height;
- ScaledVideoWidth := 800.0;
- ScaledVideoHeight := 800.0 / VideoAspect;
-
VideoTimeBase := 1/av_q2d(VideoStream^.r_frame_rate);
// hack to get reasonable timebase (for divx and others)
|