1
0
mirror of https://github.com/mpv-player/mpv synced 2025-04-11 04:01:31 +00:00

libvo: Move aspect.c static variables to vo struct

This moves non-option variables. aspect.c still defines option globals.
This commit is contained in:
Uoti Urpala 2008-05-01 11:02:26 +03:00
parent 91b3d6a955
commit c172b5355f
11 changed files with 128 additions and 110 deletions

View File

@ -1,6 +1,7 @@
/* Stuff for correct aspect scaling. */
#include "aspect.h"
#include "geometry.h"
#include "video_out.h"
//#ifndef ASPECT_TEST
#include "mp_msg.h"
#include "help_mp.h"
@ -12,79 +13,70 @@
#include <stdio.h>
#endif
int vo_panscan_x = 0;
int vo_panscan_y = 0;
float vo_panscan_amount = 0;
float vo_panscanrange = 1.0;
#include "video_out.h"
float force_monitor_aspect=0;
float monitor_aspect=0;
float monitor_pixel_aspect=1;
static struct {
int orgw; // real width
int orgh; // real height
int prew; // prescaled width
int preh; // prescaled height
int scrw; // horizontal resolution
int scrh; // vertical resolution
float asp;
} aspdat;
void aspect_save_orig(int orgw, int orgh){
void aspect_save_orig(struct vo *vo, int orgw, int orgh)
{
#ifdef ASPECT_DEBUG
printf("aspect_save_orig %dx%d \n",orgw,orgh);
#endif
aspdat.orgw = orgw;
aspdat.orgh = orgh;
vo->aspdat.orgw = orgw;
vo->aspdat.orgh = orgh;
}
void aspect_save_prescale(int prew, int preh){
void aspect_save_prescale(struct vo *vo, int prew, int preh)
{
#ifdef ASPECT_DEBUG
printf("aspect_save_prescale %dx%d \n",prew,preh);
#endif
aspdat.prew = prew;
aspdat.preh = preh;
vo->aspdat.prew = prew;
vo->aspdat.preh = preh;
}
void aspect_save_screenres(int scrw, int scrh){
void aspect_save_screenres(struct vo *vo, int scrw, int scrh)
{
#ifdef ASPECT_DEBUG
printf("aspect_save_screenres %dx%d \n",scrw,scrh);
#endif
aspdat.scrw = scrw;
aspdat.scrh = scrh;
vo->aspdat.scrw = scrw;
vo->aspdat.scrh = scrh;
if (force_monitor_aspect)
monitor_aspect = force_monitor_aspect;
vo->monitor_aspect = force_monitor_aspect;
else
monitor_aspect = monitor_pixel_aspect * scrw / scrh;
vo->monitor_aspect = monitor_pixel_aspect * scrw / scrh;
}
/* aspect is called with the source resolution and the
* resolution, that the scaled image should fit into
*/
void aspect_fit(int *srcw, int *srch, int fitw, int fith){
void aspect_fit(struct vo *vo, int *srcw, int *srch, int fitw, int fith)
{
struct aspect_data *aspdat = &vo->aspdat;
int tmpw;
#ifdef ASPECT_DEBUG
printf("aspect(0) fitin: %dx%d screenaspect: %.2f\n",aspdat.scrw,aspdat.scrh,
printf("aspect(0) fitin: %dx%d screenaspect: %.2f\n",aspdat->scrw,aspdat->scrh,
monitor_aspect);
printf("aspect(1) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat.prew,aspdat.preh);
printf("aspect(1) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat->prew,aspdat->preh);
#endif
*srcw = fitw;
*srch = (int)(((float)fitw / (float)aspdat.prew * (float)aspdat.preh)
* ((float)aspdat.scrh / ((float)aspdat.scrw / monitor_aspect)));
*srch = (int)(((float)fitw / (float)aspdat->prew * (float)aspdat->preh)
* ((float)aspdat->scrh / ((float)aspdat->scrw / vo->monitor_aspect)));
*srch+= *srch%2; // round
#ifdef ASPECT_DEBUG
printf("aspect(2) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat.prew,aspdat.preh);
printf("aspect(2) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat->prew,aspdat->preh);
#endif
if(*srch>aspdat.scrh || *srch<aspdat.orgh){
tmpw = (int)(((float)fith / (float)aspdat.preh * (float)aspdat.prew)
* ((float)aspdat.scrw / ((float)aspdat.scrh / (1.0/monitor_aspect))));
if(*srch>aspdat->scrh || *srch<aspdat->orgh){
tmpw = (int)(((float)fith / (float)aspdat->preh * (float)aspdat->prew)
* ((float)aspdat->scrw / ((float)aspdat->scrh / (1.0/vo->monitor_aspect))));
tmpw+= tmpw%2; // round
if(tmpw<=aspdat.scrw /*&& tmpw>=aspdat.orgw*/){
if(tmpw<=aspdat->scrw /*&& tmpw>=aspdat->orgw*/){
*srch = fith;
*srcw = tmpw;
}else{
@ -95,47 +87,47 @@ void aspect_fit(int *srcw, int *srch, int fitw, int fith){
#endif
}
}
aspdat.asp=*srcw / (float)*srch;
aspdat->asp=*srcw / (float)*srch;
#ifdef ASPECT_DEBUG
printf("aspect(3) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat.prew,aspdat.preh);
printf("aspect(3) wh: %dx%d (org: %dx%d)\n",*srcw,*srch,aspdat->prew,aspdat->preh);
#endif
}
void aspect(int *srcw, int *srch, int zoom){
int fitw = zoom ? aspdat.scrw : aspdat.prew;
int fith = zoom ? aspdat.scrh : aspdat.preh;
void aspect(struct vo *vo, int *srcw, int *srch, int zoom){
int fitw = zoom ? vo->aspdat.scrw : vo->aspdat.prew;
int fith = zoom ? vo->aspdat.scrh : vo->aspdat.preh;
if( !zoom && geometry_wh_changed ) {
#ifdef ASPECT_DEBUG
printf("aspect(0) no aspect forced!\n");
#endif
return; // the user doesn't want to fix aspect
}
aspect_fit(srcw, srch, fitw, fith);
aspect_fit(vo, srcw, srch, fitw, fith);
}
void panscan_init( void )
void panscan_init(struct vo *vo)
{
vo_panscan_x=0;
vo_panscan_y=0;
vo_panscan_amount=0.0f;
vo->panscan_x = 0;
vo->panscan_y = 0;
vo->panscan_amount = 0.0f;
}
void panscan_calc( void )
void panscan_calc(struct vo *vo)
{
int fwidth,fheight;
int vo_panscan_area;
if (vo_panscanrange > 0) {
aspect(&fwidth,&fheight,A_ZOOM);
vo_panscan_area = (aspdat.scrh-fheight);
if (!vo_panscan_area)
vo_panscan_area = aspdat.scrw - fwidth;
aspect(vo, &fwidth, &fheight, A_ZOOM);
vo_panscan_area = (vo->aspdat.scrh - fheight);
if (!vo_panscan_area)
vo_panscan_area = vo->aspdat.scrw - fwidth;
vo_panscan_area *= vo_panscanrange;
} else
vo_panscan_area = -vo_panscanrange * aspdat.scrh;
} else
vo_panscan_area = -vo_panscanrange * vo->aspdat.scrh;
vo_panscan_amount = vo_fs ? vo_panscan : 0;
vo_panscan_x = vo_panscan_area * vo_panscan_amount * aspdat.asp;
vo_panscan_y = vo_panscan_area * vo_panscan_amount;
vo->panscan_amount = vo_fs ? vo_panscan : 0;
vo->panscan_x = vo_panscan_area * vo->panscan_amount * vo->aspdat.asp;
vo->panscan_y = vo_panscan_area * vo->panscan_amount;
}

View File

@ -2,23 +2,35 @@
#define MPLAYER_ASPECT_H
/* Stuff for correct aspect scaling. */
extern int vo_panscan_x;
extern int vo_panscan_y;
extern float vo_panscan_amount;
struct vo;
extern void panscan_init(struct vo *vo);
extern void panscan_calc(struct vo *vo);
extern void panscan_init( void );
extern void panscan_calc( void );
void aspect_save_orig(struct vo *vo, int orgw, int orgh);
void aspect_save_orig(int orgw, int orgh);
void aspect_save_prescale(struct vo *vo, int prew, int preh);
void aspect_save_prescale(int prew, int preh);
void aspect_save_screenres(int scrw, int scrh);
void aspect_save_screenres(struct vo *vo, int scrw, int scrh);
#define A_ZOOM 1
#define A_NOZOOM 0
void aspect(int *srcw, int *srch, int zoom);
void aspect_fit(int *srcw, int *srch, int fitw, int fith);
void aspect(struct vo *vo, int *srcw, int *srch, int zoom);
void aspect_fit(struct vo *vo, int *srcw, int *srch, int fitw, int fith);
#ifdef IS_OLD_VO
#define vo_panscan_x global_vo->panscan_x
#define vo_panscan_y global_vo->panscan_y
#define vo_panscan_amount global_vo->panscan_amount
#define monitor_aspect global_vo->monitor_aspect
#define panscan_init() panscan_init(global_vo)
#define panscan_calc() panscan_calc(global_vo)
#define aspect_save_orig(...) aspect_save_orig(global_vo, __VA_ARGS__)
#define aspect_save_prescale(...) aspect_save_prescale(global_vo, __VA_ARGS__)
#define aspect_save_screenres(...) aspect_save_screenres(global_vo, __VA_ARGS__)
#define aspect(...) aspect(global_vo, __VA_ARGS__)
#endif
#endif /* MPLAYER_ASPECT_H */

View File

@ -356,12 +356,12 @@ int vo_config(struct vo *vo, uint32_t width, uint32_t height,
char *title, uint32_t format)
{
struct MPOpts *opts = vo->opts;
panscan_init();
aspect_save_orig(width, height);
aspect_save_prescale(d_width, d_height);
panscan_init(vo);
aspect_save_orig(vo, width, height);
aspect_save_prescale(vo, d_width, d_height);
if (vo_control(vo, VOCTRL_UPDATE_SCREENINFO, NULL) == VO_TRUE) {
aspect(&d_width, &d_height, A_NOZOOM);
aspect(vo, &d_width, &d_height, A_NOZOOM);
vo->dx = (int)(opts->vo_screenwidth - d_width) / 2;
vo->dy = (int)(opts->vo_screenheight - d_height) / 2;
geometry(&vo->dx, &vo->dy, &d_width, &d_height,

View File

@ -221,6 +221,20 @@ struct vo {
int dy;
int dwidth;
int dheight;
int panscan_x;
int panscan_y;
float panscan_amount;
float monitor_aspect;
struct aspect_data {
int orgw; // real width
int orgh; // real height
int prew; // prescaled width
int preh; // prescaled height
int scrw; // horizontal resolution
int scrh; // vertical resolution
float asp;
} aspdat;
};
struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,

View File

@ -28,7 +28,7 @@
#include <dxr2ioctl.h>
extern float monitor_aspect;
#include "aspect.h"
int dxr2_fd = -1;

View File

@ -300,7 +300,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_
{
int tmp1, tmp2, size;
em8300_register_t reg;
extern float monitor_aspect;
/* Softzoom turned on, downscale */
/* This activates the subpicture processor, you can safely disable this and still send */

View File

@ -61,7 +61,6 @@ static uint32_t image_format;
static int isFullscreen;
static int isOntop;
static int isRootwin;
extern float monitor_aspect;
static float old_movie_aspect;
extern int enable_mouse_movements;

View File

@ -70,7 +70,6 @@ static int EnterMoviesDone = 0;
static int get_image_done = 0;
static int vo_quartz_fs; // we are in fullscreen
extern float monitor_aspect;
static float old_movie_aspect;
static int winLevel = 1;

View File

@ -107,7 +107,8 @@ static void draw_alpha_yv12(void *p, int x0, int y0, int w, int h,
{
struct vo *vo = p;
struct xvctx *ctx = vo->priv;
x0 += ctx->image_width * (vo_panscan_x >> 1) / (vo->dwidth + vo_panscan_x);
x0 += ctx->image_width * (vo->panscan_x >> 1)
/ (vo->dwidth + vo->panscan_x);
vo_draw_alpha_yv12(w, h, src, srca, stride,
ctx->xvimage[ctx->current_buf]->data +
ctx->xvimage[ctx->current_buf]->offsets[0] +
@ -121,7 +122,8 @@ static void draw_alpha_yuy2(void *p, int x0, int y0, int w, int h,
{
struct vo *vo = p;
struct xvctx *ctx = vo->priv;
x0 += ctx->image_width * (vo_panscan_x >> 1) / (vo->dwidth + vo_panscan_x);
x0 += ctx->image_width * (vo->panscan_x >> 1)
/ (vo->dwidth + vo->panscan_x);
vo_draw_alpha_yuy2(w, h, src, srca, stride,
ctx->xvimage[ctx->current_buf]->data +
ctx->xvimage[ctx->current_buf]->offsets[0] +
@ -135,7 +137,8 @@ static void draw_alpha_uyvy(void *p, int x0, int y0, int w, int h,
{
struct vo *vo = p;
struct xvctx *ctx = vo->priv;
x0 += ctx->image_width * (vo_panscan_x >> 1) / (vo->dwidth + vo_panscan_x);
x0 += ctx->image_width * (vo->panscan_x >> 1)
/ (vo->dwidth + vo->panscan_x);
vo_draw_alpha_yuy2(w, h, src, srca, stride,
ctx->xvimage[ctx->current_buf]->data +
ctx->xvimage[ctx->current_buf]->offsets[0] +
@ -156,7 +159,7 @@ static void calc_drwXY(struct vo *vo, uint32_t *drwX, uint32_t *drwY) {
struct MPOpts *opts = vo->opts;
*drwX = *drwY = 0;
if (vo_fs) {
aspect(&vo->dwidth, &vo->dheight, A_ZOOM);
aspect(vo, &vo->dwidth, &vo->dheight, A_ZOOM);
vo->dwidth = FFMIN(vo->dwidth, opts->vo_screenwidth);
vo->dheight = FFMIN(vo->dheight, opts->vo_screenheight);
*drwX = (opts->vo_screenwidth - vo->dwidth) / 2;
@ -252,7 +255,7 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
hint.y = (opts->vo_screenheight - modeline_height) / 2;
hint.width = modeline_width;
hint.height = modeline_height;
aspect_save_screenres(modeline_width, modeline_height);
aspect_save_screenres(vo, modeline_width, modeline_height);
} else
#warning This "else" makes no sense
#endif
@ -298,7 +301,7 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
&drwBorderWidth, &drwDepth);
if (vo->dwidth <= 0) vo->dwidth = d_width;
if (vo->dheight <= 0) vo->dheight = d_height;
aspect_save_prescale(vo->dwidth, vo->dheight);
aspect_save_prescale(vo, vo->dwidth, vo->dheight);
}
} else
{
@ -362,16 +365,16 @@ static int config(struct vo *vo, uint32_t width, uint32_t height,
set_gamma_correction();
#endif
aspect(&vo->dwidth, &vo->dheight, A_NOZOOM);
aspect(vo, &vo->dwidth, &vo->dheight, A_NOZOOM);
if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) vo_fs = 1;
calc_drwXY(vo, &ctx->drwX, &ctx->drwY);
panscan_calc();
panscan_calc(vo);
vo_xv_draw_colorkey(vo, ctx->drwX - (vo_panscan_x >> 1),
ctx->drwY - (vo_panscan_y >> 1),
vo->dwidth + vo_panscan_x - 1,
vo->dheight + vo_panscan_y - 1);
vo_xv_draw_colorkey(vo, ctx->drwX - (vo->panscan_x >> 1),
ctx->drwY - (vo->panscan_y >> 1),
vo->dwidth + vo->panscan_x - 1,
vo->dheight + vo->panscan_y - 1);
mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", ctx->drwX,
ctx->drwY, vo->dwidth, vo->dheight);
@ -456,18 +459,18 @@ static inline void put_xvimage(struct vo *vo, XvImage *xvi)
{
XvShmPutImage(x11->display, x11->xv_port, x11->window, x11->vo_gc,
xvi, 0, 0, ctx->image_width,
ctx->image_height, ctx->drwX - (vo_panscan_x >> 1),
ctx->drwY - (vo_panscan_y >> 1), vo->dwidth + vo_panscan_x,
vo->dheight + vo_panscan_y,
ctx->image_height, ctx->drwX - (vo->panscan_x >> 1),
ctx->drwY - (vo->panscan_y >> 1), vo->dwidth + vo->panscan_x,
vo->dheight + vo->panscan_y,
False);
} else
#endif
{
XvPutImage(x11->display, x11->xv_port, x11->window, x11->vo_gc,
xvi, 0, 0, ctx->image_width, ctx->image_height,
ctx->drwX - (vo_panscan_x >> 1), ctx->drwY - (vo_panscan_y >> 1),
vo->dwidth + vo_panscan_x,
vo->dheight + vo_panscan_y);
ctx->drwX - (vo->panscan_x >> 1), ctx->drwY - (vo->panscan_y >> 1),
vo->dwidth + vo->panscan_x,
vo->dheight + vo->panscan_y);
}
}
@ -491,10 +494,10 @@ static void check_events(struct vo *vo)
if (e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE)
{
vo_xv_draw_colorkey(vo, ctx->drwX - (vo_panscan_x >> 1),
ctx->drwY - (vo_panscan_y >> 1),
vo->dwidth + vo_panscan_x - 1,
vo->dheight + vo_panscan_y - 1);
vo_xv_draw_colorkey(vo, ctx->drwX - (vo->panscan_x >> 1),
ctx->drwY - (vo->panscan_y >> 1),
vo->dwidth + vo->panscan_x - 1,
vo->dheight + vo->panscan_y - 1);
}
if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && ctx->is_paused)
@ -513,7 +516,7 @@ static void draw_osd(struct vo *vo)
struct xvctx *ctx = vo->priv;
osd_draw_text(ctx->image_width -
ctx->image_width * vo_panscan_x / (vo->dwidth + vo_panscan_x),
ctx->image_width * vo->panscan_x / (vo->dwidth + vo->panscan_x),
ctx->image_height, ctx->draw_alpha_fnc, vo);
}
@ -880,23 +883,23 @@ static int control(struct vo *vo, uint32_t request, void *data)
vo_x11_fullscreen(vo);
/* indended, fallthrough to update panscan on fullscreen/windowed switch */
case VOCTRL_SET_PANSCAN:
if ((vo_fs && (vo_panscan != vo_panscan_amount))
|| (!vo_fs && vo_panscan_amount))
if ((vo_fs && (vo_panscan != vo->panscan_amount))
|| (!vo_fs && vo->panscan_amount))
{
int old_y = vo_panscan_y;
int old_y = vo->panscan_y;
panscan_calc();
panscan_calc(vo);
if (old_y != vo_panscan_y)
if (old_y != vo->panscan_y)
{
vo_x11_clearwindow_part(vo, x11->window,
vo->dwidth + vo_panscan_x - 1,
vo->dheight + vo_panscan_y - 1,
vo->dwidth + vo->panscan_x - 1,
vo->dheight + vo->panscan_y - 1,
1);
vo_xv_draw_colorkey(vo, ctx->drwX - (vo_panscan_x >> 1),
ctx->drwY - (vo_panscan_y >> 1),
vo->dwidth + vo_panscan_x - 1,
vo->dheight + vo_panscan_y - 1);
vo_xv_draw_colorkey(vo, ctx->drwX - (vo->panscan_x >> 1),
ctx->drwY - (vo->panscan_y >> 1),
vo->dwidth + vo->panscan_x - 1,
vo->dheight + vo->panscan_y - 1);
flip_page(vo);
}
}

View File

@ -77,7 +77,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
xborder = (r2.right - r2.left) - (r.right - r.left);
yborder = (r2.bottom - r2.top) - (r.bottom - r.top);
wpos->cx -= xborder; wpos->cy -= yborder;
aspect_fit(&wpos->cx, &wpos->cy, wpos->cx, wpos->cy);
aspect_fit(global_vo, &wpos->cx, &wpos->cy, wpos->cx, wpos->cy);
wpos->cx += xborder; wpos->cy += yborder;
}
return 0;

View File

@ -375,7 +375,7 @@ void update_xinerama_info(struct vo *vo) {
XFree(screens);
}
#endif
aspect_save_screenres(opts->vo_screenwidth, opts->vo_screenheight);
aspect_save_screenres(vo, opts->vo_screenwidth, opts->vo_screenheight);
}
int vo_init(struct vo *vo)