1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-30 23:38:10 +00:00

Add CRTC1 support.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27622 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
syrjala 2008-09-15 20:39:03 +00:00
parent 9a00106a58
commit 654db62437

View File

@ -72,6 +72,7 @@ static IDirectFBSurface *frame;
static IDirectFBSurface *subframe;
static IDirectFBSurface *besframe;
static IDirectFBSurface *c1frame;
static IDirectFBSurface *c2frame;
static IDirectFBSurface *spicframe;
@ -79,6 +80,7 @@ static DFBSurfacePixelFormat frame_format;
static DFBSurfacePixelFormat subframe_format;
static DFBRectangle besrect;
static DFBRectangle c1rect;
static DFBRectangle c2rect;
static DFBRectangle *subrect;
@ -87,9 +89,11 @@ static IDirectFBInputDevice *remote;
static IDirectFBEventBuffer *buffer;
static int blit_done;
static int c1stretch;
static int stretch;
static int use_bes;
static int use_crtc1;
static int use_crtc2;
static int use_spic;
static int use_input;
@ -231,6 +235,7 @@ preinit( const char *arg )
/* Some defaults */
use_bes = 0;
use_crtc1 = 0;
use_crtc2 = 1;
use_spic = 1;
field_parity = -1;
@ -254,6 +259,10 @@ preinit( const char *arg )
use_bes = !opt_no;
vo_subdevice += 3;
opt_no = 0;
} else if (!strncmp(vo_subdevice, "crtc1", 5)) {
use_crtc1 = !opt_no;
vo_subdevice += 5;
opt_no = 0;
} else if (!strncmp(vo_subdevice, "crtc2", 5)) {
use_crtc2 = !opt_no;
vo_subdevice += 5;
@ -358,6 +367,7 @@ preinit( const char *arg )
"Example: mplayer -vo dfbmga:nocrtc2:bes:buffermode=single\n"
"\nOptions (use 'no' prefix to disable):\n"
" bes Use Backend Scaler\n"
" crtc1 Use CRTC1\n"
" crtc2 Use CRTC2\n"
" spic Use hardware sub-picture for OSD\n"
" input Use DirectFB for keyboard input\n"
@ -378,10 +388,14 @@ preinit( const char *arg )
return -1;
}
}
if (!use_bes && !use_crtc2) {
if (!use_bes && !use_crtc1 && !use_crtc2) {
mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: No output selected\n" );
return -1;
}
if (use_bes && use_crtc1) {
mp_msg( MSGT_VO, MSGL_ERR, "vo_dfbmga: Both BES and CRTC1 outputs selected\n" );
return -1;
}
if ((res = DirectFBInit( NULL, NULL )) != DFB_OK) {
mp_msg( MSGT_VO, MSGL_ERR,
@ -419,7 +433,7 @@ preinit( const char *arg )
return -1;
}
if (use_bes) {
if (use_crtc1 || use_bes) {
struct layer_enum l = {
"FBDev Primary Layer",
&primary,
@ -554,6 +568,8 @@ static void release_config( void )
spic->Release( spic );
if (c2frame)
c2frame->Release( c2frame );
if (c1frame)
c1frame->Release( c1frame );
if (besframe)
besframe->Release( besframe );
if (bufs[0])
@ -566,6 +582,7 @@ static void release_config( void )
spicframe = NULL;
spic = NULL;
c2frame = NULL;
c1frame = NULL;
besframe = NULL;
bufs[0] = NULL;
bufs[1] = NULL;
@ -684,6 +701,63 @@ config( uint32_t width, uint32_t height,
mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: BES surface %dx%d %s\n", dlc.width, dlc.height, pixelformat_name( dlc.pixelformat ) );
}
/*
* CRTC1
*/
if (use_crtc1) {
dlc.flags = DLCONF_BUFFERMODE;
dlc.buffermode = buffermode;
if ((res = primary->TestConfiguration( primary, &dlc, &failed )) != DFB_OK) {
mp_msg( MSGT_VO, MSGL_ERR,
"vo_dfbmga: Invalid CRTC1 configuration - %s!\n",
DirectFBErrorString( res ) );
return -1;
}
if ((res = primary->SetConfiguration( primary, &dlc )) != DFB_OK) {
mp_msg( MSGT_VO, MSGL_ERR,
"vo_dfbmga: CRTC1 configuration failed - %s!\n",
DirectFBErrorString( res ) );
return -1;
}
if ((res = primary->GetConfiguration( primary, &dlc )) != DFB_OK) {
mp_msg( MSGT_VO, MSGL_ERR,
"vo_dfbmga: Getting CRTC1 configuration failed - %s!\n",
DirectFBErrorString( res ) );
return -1;
}
primary->GetSurface( primary, &c1frame );
c1frame->SetBlittingFlags( c1frame, DSBLIT_NOFX );
c1frame->SetColor( c1frame, 0, 0, 0, 0xff );
c1frame->GetSize( c1frame, &screen_width, &screen_height );
aspect_save_screenres( screen_width, screen_height );
aspect( &out_width, &out_height, (flags & VOFLAG_FULLSCREEN) ? A_ZOOM : A_NOZOOM );
if (in_width != out_width || in_height != out_height)
c1stretch = 1;
else
c1stretch = 0;
c1rect.x = (screen_width - out_width) / 2;
c1rect.y = (screen_height - out_height) / 2;
c1rect.w = out_width;
c1rect.h = out_height;
c1frame->Clear( c1frame, 0, 0, 0, 0xff );
c1frame->Flip( c1frame, NULL, 0 );
c1frame->Clear( c1frame, 0, 0, 0, 0xff );
c1frame->Flip( c1frame, NULL, 0 );
c1frame->Clear( c1frame, 0, 0, 0, 0xff );
mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: CRTC1 using %s buffering\n",
dlc.buffermode == DLBM_TRIPLE ? "triple" :
dlc.buffermode == DLBM_BACKVIDEO ? "double" : "single" );
mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: CRTC1 surface %dx%d %s\n", screen_width, screen_height, pixelformat_name( dlc.pixelformat ) );
}
/*
* CRTC2
*/
@ -865,6 +939,10 @@ config( uint32_t width, uint32_t height,
/* Draw OSD to CRTC2 surface */
subframe = c2frame;
subrect = &c2rect;
} else if (use_crtc1) {
/* Draw OSD to CRTC1 surface */
subframe = c1frame;
subrect = &c1rect;
} else {
/* Draw OSD to BES surface */
subframe = besframe;
@ -876,7 +954,8 @@ config( uint32_t width, uint32_t height,
mp_msg( MSGT_VO, MSGL_INFO, "vo_dfbmga: Sub-picture surface %dx%d %s (%s)\n",
sub_width, sub_height,
pixelformat_name( subframe_format ),
use_crtc2 ? (use_spic ? "Sub-picture layer" : "CRTC2") : "BES" );
use_crtc2 ? (use_spic ? "Sub-picture layer" : "CRTC2") :
use_crtc1 ? "CRTC1" : "BES" );
osd_dirty = 0;
osd_current = 1;
@ -889,21 +968,28 @@ static int
query_format( uint32_t format )
{
switch (format) {
case IMGFMT_BGR32:
case IMGFMT_BGR16:
case IMGFMT_BGR15:
case IMGFMT_UYVY:
case IMGFMT_YV12:
case IMGFMT_I420:
case IMGFMT_IYUV:
if (is_g200 || use_crtc1)
return 0;
break;
case IMGFMT_BGR32:
case IMGFMT_BGR16:
case IMGFMT_BGR15:
if (is_g200 && use_bes)
return 0;
break;
case IMGFMT_UYVY:
if (is_g200)
return 0;
break;
case IMGFMT_YUY2:
break;
#if DIRECTFBVERSION > DFB_VERSION(0,9,21)
case IMGFMT_NV12:
case IMGFMT_NV21:
if (!use_bes || use_crtc2)
if (use_crtc1 || use_crtc2)
return 0;
break;
#endif
@ -1096,6 +1182,18 @@ blit_to_screen( void )
srect = &besrect;
}
if (use_crtc1) {
#if DIRECTFBVERSION > DFB_VERSION(0,9,15)
if (vo_vsync && !flipping)
primary->WaitForSync( primary );
#endif
if (c1stretch)
c1frame->StretchBlit( c1frame, blitsrc, srect, &c1rect );
else
c1frame->Blit( c1frame, blitsrc, srect, c1rect.x, c1rect.y );
}
if (use_crtc2) {
#if DIRECTFBVERSION > DFB_VERSION(0,9,15)
if (vo_vsync && !flipping)
@ -1161,7 +1259,9 @@ flip_page( void )
if (flipping) {
if (use_crtc2)
c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
else
if (use_crtc1)
c1frame->Flip( c1frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
if (use_bes)
besframe->Flip( besframe, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC );
if (!use_spic) {
@ -1334,6 +1434,8 @@ set_equalizer( char *data, int value )
/* Prefer CRTC2 over BES */
if (use_crtc2)
res = crtc2->SetColorAdjustment( crtc2, &ca );
else if (use_crtc1)
res = primary->SetColorAdjustment( primary, &ca );
else
res = bes->SetColorAdjustment( bes, &ca );
@ -1353,6 +1455,8 @@ get_equalizer( char *data, int *value )
/* Prefer CRTC2 over BES */
if (use_crtc2)
res = crtc2->GetColorAdjustment( crtc2, &ca );
else if (use_crtc1)
res = primary->GetColorAdjustment( primary, &ca );
else
res = bes->GetColorAdjustment( bes, &ca );