Mercurial > mplayer.hg
changeset 11147:59e7beccdee0
Updates by Ville Syrj¸«£l¸«£ <syrjala@sci.fi>
- Add black bars around the video when using the BES.
- Clean up properly in uninit().
- Advertise only YUY2 on a G200.
- Add "G200" to the description :)
- Remove/fix a few leftovers from old patches.
author | alex |
---|---|
date | Thu, 16 Oct 2003 12:18:12 +0000 |
parents | f5629a5b79f7 |
children | a972dc6432f7 |
files | libvo/vo_dfbmga.c |
diffstat | 1 files changed, 82 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_dfbmga.c Thu Oct 16 12:12:49 2003 +0000 +++ b/libvo/vo_dfbmga.c Thu Oct 16 12:18:12 2003 +0000 @@ -1,5 +1,5 @@ /* - MPlayer video driver for DirectFB / Matrox G400/G450/G550 + MPlayer video driver for DirectFB / Matrox G200/G400/G450/G550 Copyright (C) 2002,2003 Ville Syrjala <syrjala@sci.fi> @@ -39,7 +39,7 @@ #include "aspect.h" static vo_info_t info = { - "DirectFB / Matrox G400/G450/G550", + "DirectFB / Matrox G200/G400/G450/G550", "dfbmga", "Ville Syrjala <syrjala@sci.fi>", "" @@ -75,13 +75,13 @@ static DFBSurfacePixelFormat frame_format; static DFBSurfacePixelFormat subframe_format; -static DFBRectangle drect; +static DFBRectangle besrect; +static DFBRectangle c2rect; +static DFBRectangle *subrect; static IDirectFBInputDevice *keyboard; static IDirectFBEventBuffer *buffer; -static int inited = 0; - static int blit_done; static int stretch; @@ -98,6 +98,8 @@ static int osd_current; static int osd_max; +static int is_g200 = 0; + /****************************** * vo_dfbmga * ******************************/ @@ -161,7 +163,7 @@ switch (format) { case IMGFMT_RGB32: case IMGFMT_BGR32: - return DSPF_ARGB; + return DSPF_RGB32; case IMGFMT_RGB24: case IMGFMT_BGR24: return DSPF_RGB24; @@ -206,7 +208,8 @@ return DFENUM_CANCEL; #else /* Fake it according to id */ - if ((id == 1 && !strcmp( l->name, "Matrox Backend Scaler" )) || + if ((id == 0 && !strcmp( l->name, "FBDev Primary Layer" )) || + (id == 1 && !strcmp( l->name, "Matrox Backend Scaler" )) || (id == 2 && !strcmp( l->name, "Matrox CRTC2" )) || (id == 3 && !strcmp( l->name, "Matrox CRTC2 Sub-Picture" ))) if ((l->res = dfb->GetDisplayLayer( dfb, id, l->layer )) == DFB_OK) @@ -350,7 +353,6 @@ return -1; } - if (!inited) { if ((res = DirectFBInit( NULL, NULL )) != DFB_OK) { mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: DirectFBInit() failed - %s\n", @@ -371,10 +373,9 @@ return -1; } - inited = 1; - } - if (use_bes) { + DFBDisplayLayerConfig dlc; + DFBDisplayLayerConfigFlags failed; struct layer_enum l = { "Matrox Backend Scaler", &bes, @@ -392,6 +393,12 @@ DirectFBErrorString( res ) ); return -1; } + dlc.flags = DLCONF_PIXELFORMAT; + dlc.pixelformat = DSPF_RGB16; + if (bes->TestConfiguration( bes, &dlc, &failed ) != DFB_OK) { + is_g200 = 1; + use_crtc2 = 0; + } bes->SetOpacity( bes, 0 ); } @@ -500,9 +507,37 @@ * BES */ if (use_bes) { + IDirectFBDisplayLayer *primary; + DFBDisplayLayerConfig pdlc; + struct layer_enum l = { + "FBDev Primary Layer", + &primary, + DFB_UNSUPPORTED + }; + dfb->EnumDisplayLayers( dfb, get_layer_by_name, &l ); + if (l.res != DFB_OK) { + mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: Can't get primary layer - %s\n", + DirectFBErrorString( l.res ) ); + return -1; + } + if ((res = primary->GetConfiguration( primary, &pdlc )) != DFB_OK) { + mp_msg( MSGT_VO, MSGL_ERR, + "vo_dfbmga: Can't get primary layer configuration - %s!\n", + DirectFBErrorString( res ) ); + return -1; + } + primary->Release( primary ); + + aspect_save_screenres( pdlc.width, pdlc.height ); + aspect( &out_width, &out_height, A_ZOOM ); + besrect.x = (pdlc.width - out_width) * in_width / pdlc.width / 2; + besrect.y = (pdlc.height - out_height) * in_height / pdlc.height / 2; + besrect.w = in_width; + besrect.h = in_height; + dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE; - dlc.width = in_width; - dlc.height = in_height; + dlc.width = besrect.w + besrect.x * 2; + dlc.height = besrect.h + besrect.y * 2; if (use_crtc2) dlc.buffermode = DLBM_FRONTONLY; @@ -524,13 +559,7 @@ bes->GetSurface( bes, &besframe ); besframe->SetBlittingFlags( besframe, DSBLIT_NOFX ); - aspect_save_screenres( 10000, 10000 ); - aspect( &out_width, &out_height, A_ZOOM ); - bes->SetScreenLocation( bes, - (1.0f - (float) out_width / 10000.0f) / 2.0f, - (1.0f - (float) out_height / 10000.0f) / 2.0f, - (float) out_width / 10000.0f, - (float) out_height / 10000.0f ); + bes->SetScreenLocation( bes, 0.0, 0.0, 1.0, 1.0 ); besframe->Clear( besframe, 0, 0, 0, 0xff ); besframe->Flip( besframe, NULL, 0 ); @@ -554,7 +583,7 @@ #if DIRECTFBVERSION > 916 if (field_parity != -1) { - dlc.options = DLOP_FIELD_PARITY; + dlc.options |= DLOP_FIELD_PARITY; } #endif @@ -620,10 +649,10 @@ else stretch = 0; - drect.x = (screen_width - out_width) / 2; - drect.y = (screen_height - out_height) / 2; - drect.w = out_width; - drect.h = out_height; + c2rect.x = (screen_width - out_width) / 2; + c2rect.y = (screen_height - out_height) / 2; + c2rect.w = out_width; + c2rect.h = out_height; c2frame->Clear( c2frame, 0, 0, 0, 0xff ); c2frame->Flip( c2frame, NULL, 0 ); @@ -710,9 +739,11 @@ } else if (use_crtc2) { /* Draw OSD to CRTC2 surface */ subframe = c2frame; + subrect = &c2rect; } else { /* Draw OSD to BES surface */ subframe = besframe; + subrect = &besrect; } subframe->GetSize( subframe, &sub_width, &sub_height ); @@ -749,11 +780,13 @@ case IMGFMT_BGR16: case IMGFMT_RGB15: case IMGFMT_BGR15: - case IMGFMT_YUY2: case IMGFMT_UYVY: case IMGFMT_YV12: case IMGFMT_I420: case IMGFMT_IYUV: + if (is_g200) + return 0; + case IMGFMT_YUY2: return (VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_CSP_SUPPORTED_BY_HW | @@ -807,11 +840,11 @@ if (!osd_changed || (!flipping && !vo_osd_changed)) return; osd_dirty |= osd_current; - } else if (use_crtc2) { - if (x0 < drect.x || - y0 < drect.y || - x0 + w > drect.x + drect.w || - y0 + h > drect.y + drect.h) + } else { + if (x0 < subrect->x || + y0 < subrect->y || + x0 + w > subrect->x + subrect->w || + y0 + h > subrect->y + subrect->h) osd_dirty |= osd_current; } @@ -915,13 +948,15 @@ blit_to_screen( void ) { IDirectFBSurface *blitsrc = frame; + DFBRectangle *srect = NULL; if (use_bes) { if (vo_vsync && !flipping && !use_crtc2) bes->WaitForSync( bes ); - besframe->Blit( besframe, blitsrc, NULL, 0, 0 ); + besframe->Blit( besframe, blitsrc, NULL, besrect.x, besrect.y ); blitsrc = besframe; + srect = &besrect; } if (use_crtc2) { @@ -929,9 +964,9 @@ crtc2->WaitForSync( crtc2 ); if (stretch) - c2frame->StretchBlit( c2frame, blitsrc, NULL, &drect ); + c2frame->StretchBlit( c2frame, blitsrc, srect, &c2rect ); else - c2frame->Blit( c2frame, blitsrc, NULL, drect.x, drect.y ); + c2frame->Blit( c2frame, blitsrc, srect, c2rect.x, c2rect.y ); } } @@ -946,20 +981,20 @@ if (use_spic) { if (flipping) subframe->Clear( subframe, 0, 0, 0, 0 ); - } else if (use_crtc2) { + } else { /* Clear black bars around the picture */ subframe->FillRectangle( subframe, 0, 0, - screen_width, drect.y ); + sub_width, subrect->y ); subframe->FillRectangle( subframe, - 0, drect.y + drect.h, - screen_width, drect.y ); + 0, subrect->y + subrect->h, + sub_width, subrect->y ); subframe->FillRectangle( subframe, - 0, drect.y, - drect.x, drect.h ); + 0, subrect->y, + subrect->x, subrect->h ); subframe->FillRectangle( subframe, - drect.x + drect.w, drect.y, - drect.x, drect.h ); + subrect->x + subrect->w, subrect->y, + subrect->x, subrect->h ); } osd_dirty &= ~osd_current; } @@ -998,7 +1033,7 @@ } blit_done = 0; - current_buf = 0;//vo_directrendering ? 0 : (current_buf + 1) % num_bufs; + current_buf = 0; } static void @@ -1041,13 +1076,10 @@ subframe = NULL; spic = NULL; } - - /* - * Don't release. Segfault in preinit() if - * DirectFBCreate() called more than once. - * - * dfb->Release( dfb ); - */ + if (dfb) { + dfb->Release( dfb ); + dfb = NULL; + } } static uint32_t @@ -1057,11 +1089,6 @@ void *dst; int pitch; - if (use_bes && - (mpi->type == MP_IMGTYPE_STATIC || - mpi->flags & MP_IMGFLAG_READABLE)) - return VO_FALSE; - if (mpi->flags & MP_IMGFLAG_READABLE && (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP)) { if (num_bufs < 2)