1 /* Stuff for correct aspect scaling. */
10 #if defined(ASPECT_DEBUG) || defined(ASPECT_TEST)
16 float vo_panscan_amount
= 0;
18 #include "video_out.h"
20 float monitor_aspect
=4.0/3.0;
21 extern float movie_aspect
;
24 int orgw
; // real width
25 int orgh
; // real height
26 int prew
; // prescaled width
27 int preh
; // prescaled height
28 int scrw
; // horizontal resolution
29 int scrh
; // vertical resolution
33 void aspect_save_orig(int orgw
, int orgh
){
35 printf("aspect_save_orig %dx%d \n",orgw
,orgh
);
41 void aspect_save_prescale(int prew
, int preh
){
43 printf("aspect_save_prescale %dx%d \n",prew
,preh
);
49 void aspect_save_screenres(int scrw
, int scrh
){
51 printf("aspect_save_screenres %dx%d \n",scrw
,scrh
);
57 /* aspect is called with the source resolution and the
58 * resolution, that the scaled image should fit into
61 void aspect(int *srcw
, int *srch
, int zoom
){
64 if( !zoom
&& geometry_wh_changed
) {
66 printf("aspect(0) no aspect forced!\n");
68 return; // the user doesn't want to fix aspect
72 printf("aspect(0) fitin: %dx%d zoom: %d screenaspect: %.2f\n",aspdat
.scrw
,aspdat
.scrh
,
74 printf("aspect(1) wh: %dx%d (org: %dx%d)\n",*srcw
,*srch
,aspdat
.prew
,aspdat
.preh
);
78 *srch
= (int)(((float)aspdat
.scrw
/ (float)aspdat
.prew
* (float)aspdat
.preh
)
79 * ((float)aspdat
.scrh
/ ((float)aspdat
.scrw
/ monitor_aspect
)));
82 *srch
= (int)((float)aspdat
.preh
83 * ((float)aspdat
.scrh
/ ((float)aspdat
.scrw
/ monitor_aspect
)));
85 *srch
+= *srch
%2; // round
87 printf("aspect(2) wh: %dx%d (org: %dx%d)\n",*srcw
,*srch
,aspdat
.prew
,aspdat
.preh
);
89 if(*srch
>aspdat
.scrh
|| *srch
<aspdat
.orgh
){
91 tmpw
= (int)(((float)aspdat
.scrh
/ (float)aspdat
.preh
* (float)aspdat
.prew
)
92 * ((float)aspdat
.scrw
/ ((float)aspdat
.scrh
/ (1.0/monitor_aspect
))));
94 tmpw
= (int)((float)aspdat
.prew
95 * ((float)aspdat
.scrw
/ ((float)aspdat
.scrh
/ (1.0/monitor_aspect
))));
96 tmpw
+= tmpw
%2; // round
97 if(tmpw
<=aspdat
.scrw
/*&& tmpw>=aspdat.orgw*/){
98 *srch
= zoom
?aspdat
.scrh
:aspdat
.preh
;
102 mp_msg(MSGT_VO
,MSGL_WARN
,"aspect: Warning: no suitable new res found!\n");
104 printf("error: no new size found that fits into res!\n");
108 aspdat
.asp
=*srcw
/ (float)*srch
;
110 printf("aspect(3) wh: %dx%d (org: %dx%d)\n",*srcw
,*srch
,aspdat
.prew
,aspdat
.preh
);
114 void panscan_init( void )
118 vo_panscan_amount
=0.0f
;
121 void panscan_calc( void )
126 aspect(&fwidth
,&fheight
,A_ZOOM
);
127 vo_panscan_area
= (aspdat
.scrh
-fheight
);
129 vo_panscan_amount
= vo_fs
? vo_panscan
: 0;
130 vo_panscan_x
= vo_panscan_area
* vo_panscan_amount
* aspdat
.asp
;
131 vo_panscan_y
= vo_panscan_area
* vo_panscan_amount
;