Use media_format pixel_width/height_aspect as it was meant to be used. This

avoids rounding issues (1440x1080 -> 1920x1080 instead of 1921x1080).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31477 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2009-07-09 13:05:55 +00:00
parent 591ce51a9c
commit a920a6e2a0
4 changed files with 71 additions and 36 deletions
+10 -10
View File
@@ -359,26 +359,26 @@ Controller::PlayerActivated(bool active)
void
Controller::GetSize(int *width, int *height, float* widthToHeightRatio)
Controller::GetSize(int *width, int *height, int* widthAspect,
int* heightAspect)
{
BAutolock _(this);
if (fVideoTrackSupplier) {
media_format format = fVideoTrackSupplier->Format();
// TODO: take aspect ratio into account!
*height = format.u.raw_video.display.line_count;
*width = format.u.raw_video.display.line_width;
if (widthToHeightRatio != NULL) {
printf("pixel_width_aspect: %d\n", format.u.raw_video.pixel_width_aspect);
printf("pixel_height_aspect: %d\n", format.u.raw_video.pixel_height_aspect);
*widthToHeightRatio = (float)format.u.raw_video.pixel_width_aspect
/ format.u.raw_video.pixel_height_aspect;
}
if (widthAspect != NULL)
*widthAspect = format.u.raw_video.pixel_width_aspect;
if (heightAspect != NULL)
*heightAspect = format.u.raw_video.pixel_height_aspect;
} else {
*height = 0;
*width = 0;
if (widthToHeightRatio != NULL)
*widthToHeightRatio = 0.0f;
if (widthAspect != NULL)
*widthAspect = 1;
if (heightAspect != NULL)
*heightAspect = 1;
}
}
+2 -1
View File
@@ -86,7 +86,8 @@ public:
void PlayerActivated(bool active);
void GetSize(int *width, int *height,
float* widthToHeightRatio = NULL);
int* widthAspect = NULL,
int* heightAspect = NULL);
int AudioTrackCount();
int VideoTrackCount();
+54 -22
View File
@@ -116,8 +116,8 @@ MainWin::MainWin()
fNoInterface(false),
fSourceWidth(-1),
fSourceHeight(-1),
fWidthScale(1.0),
fHeightScale(1.0),
fWidthAspect(0),
fHeightAspect(0),
fMouseDownTracking(false),
fGlobalSettingsListener(this)
{
@@ -592,31 +592,38 @@ MainWin::MessageReceived(BMessage *msg)
break;
case M_ASPECT_100000_1:
VideoFormatChange(fSourceWidth, fSourceHeight, 1.0);
VideoFormatChange(fSourceWidth, fSourceHeight,
fSourceWidth, fSourceHeight);
break;
case M_ASPECT_106666_1:
VideoFormatChange(fSourceWidth, fSourceHeight, 1.06666);
VideoFormatChange(fSourceWidth, fSourceHeight,
lround(1.06666 * fSourceWidth), fSourceHeight);
break;
case M_ASPECT_109091_1:
VideoFormatChange(fSourceWidth, fSourceHeight, 1.09091);
VideoFormatChange(fSourceWidth, fSourceHeight,
lround(1.09091 * fSourceWidth), fSourceHeight);
break;
case M_ASPECT_141176_1:
VideoFormatChange(fSourceWidth, fSourceHeight, 1.41176);
VideoFormatChange(fSourceWidth, fSourceHeight,
lround(1.41176 * fSourceWidth), fSourceHeight);
break;
case M_ASPECT_720_576:
VideoFormatChange(720, 576, 1.06666);
VideoFormatChange(720, 576,
lround(1.06666 * fSourceWidth), fSourceHeight);
break;
case M_ASPECT_704_576:
VideoFormatChange(704, 576, 1.09091);
VideoFormatChange(704, 576,
lround(1.09091 * fSourceWidth), fSourceHeight);
break;
case M_ASPECT_544_576:
VideoFormatChange(544, 576, 1.41176);
VideoFormatChange(544, 576,
lround(1.41176 * fSourceWidth), fSourceHeight);
break;
case M_SET_PLAYLIST_POSITION:
@@ -776,17 +783,18 @@ MainWin::ShowPlaylistWindow()
void
MainWin::VideoFormatChange(int width, int height, float widthToHeightRatio)
MainWin::VideoFormatChange(int width, int height, int widthAspect,
int heightAspect)
{
// called when video format or aspect ratio changes
printf("VideoFormatChange enter: width %d, height %d, "
"widthToHeightRatio %.6f\n", width, height, widthToHeightRatio);
"aspect ratio: %d:%d\n", width, height, widthAspect, heightAspect);
fSourceWidth = width;
fSourceHeight = height;
fWidthScale = widthToHeightRatio;
fHeightScale = 1.0f;
fWidthAspect = widthAspect;
fHeightAspect = heightAspect;
FrameResized(Bounds().Width(), Bounds().Height());
@@ -829,13 +837,13 @@ MainWin::_SetupWindow()
int previousSourceWidth = fSourceWidth;
int previousSourceHeight = fSourceHeight;
if (fHasVideo) {
fController->GetSize(&fSourceWidth, &fSourceHeight, &fWidthScale);
fHeightScale = 1.0;
fController->GetSize(&fSourceWidth, &fSourceHeight,
&fWidthAspect, &fHeightAspect);
} else {
fSourceWidth = 0;
fSourceHeight = 0;
fWidthScale = 1.0;
fHeightScale = 1.0;
fWidthAspect = 1;
fHeightAspect = 1;
}
_UpdateControlsEnabledStatus();
@@ -1018,6 +1026,26 @@ MainWin::_GetMinimumWindowSize(int& width, int& height) const
}
void
MainWin::_GetUnscaledVideoSize(int& videoWidth, int& videoHeight) const
{
if (fWidthAspect != 0 && fHeightAspect != 0) {
videoWidth = fSourceHeight / fHeightAspect * fWidthAspect;
videoHeight = fSourceWidth / fWidthAspect * fHeightAspect;
// Use the scaling which produces an enlarged view.
if (videoWidth > fSourceWidth) {
// Enlarge width
videoHeight = fSourceHeight;
} else {
// Enlarge height
videoWidth = fSourceWidth;
}
} else {
videoWidth = fSourceWidth;
videoHeight = fSourceHeight;
}
}
void
MainWin::_SetWindowSizeLimits()
{
@@ -1033,13 +1061,14 @@ void
MainWin::_ResizeWindow(int percent)
{
// Get required window size
int videoWidth = lround(fSourceWidth * fWidthScale);
int videoHeight = lround(fSourceHeight * fHeightScale);
int videoWidth;
int videoHeight;
_GetUnscaledVideoSize(videoWidth, videoHeight);
videoWidth = (videoWidth * percent) / 100;
videoHeight = (videoHeight * percent) / 100;
// Calculate and set the initial window size
// Calculate and set the minimum window size
int width;
int height;
_GetMinimumWindowSize(width, height);
@@ -1060,8 +1089,11 @@ MainWin::_ResizeVideoView(int x, int y, int width, int height)
if (fKeepAspectRatio) {
// Keep aspect ratio, place video view inside
// the background area (may create black bars).
float scaledWidth = fSourceWidth * fWidthScale;
float scaledHeight = fSourceHeight * fHeightScale;
int videoWidth;
int videoHeight;
_GetUnscaledVideoSize(videoWidth, videoHeight);
float scaledWidth = videoWidth;
float scaledHeight = videoHeight;
float factor = min_c(width / scaledWidth, height / scaledHeight);
int renderWidth = lround(scaledWidth * factor);
int renderHeight = lround(scaledHeight * factor);
+5 -3
View File
@@ -59,7 +59,7 @@ public:
void ShowSettingsWindow();
void VideoFormatChange(int width, int height,
float widthToHeightRatio);
int widthAspect, int heightAspect);
private:
void _RefsReceived(BMessage* message);
@@ -73,6 +73,8 @@ private:
void _GetMinimumWindowSize(int& width,
int& height) const;
void _SetWindowSizeLimits();
void _GetUnscaledVideoSize(int& videoWidth,
int& videoHeight) const;
void _ResizeWindow(int percent);
void _ResizeVideoView(int x, int y, int width,
int height);
@@ -132,8 +134,8 @@ private:
volatile bool fNoInterface;
int fSourceWidth;
int fSourceHeight;
float fWidthScale;
float fHeightScale;
int fWidthAspect;
int fHeightAspect;
int fMenuBarWidth;
int fMenuBarHeight;
int fControlsHeight;