diff options
author | wm4 <wm4@nowhere> | 2012-08-06 22:59:24 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-08-07 01:09:30 +0200 |
commit | c291f321bb6ed750474ee597e26389694b8af828 (patch) | |
tree | a5dbc4b1c1af7473ff7cf707439541302d8e738e /libvo | |
parent | ca6d8d431a05e8802291b3de587b7d6cdf1f96ae (diff) | |
download | mpv-c291f321bb6ed750474ee597e26389694b8af828.tar.bz2 mpv-c291f321bb6ed750474ee597e26389694b8af828.tar.xz |
vo_directfb2: reformat and convert to new VO API
No effort was put into moving static variables into a priv struct. The
VO wasn't tested, because DirectFB's X11 backend didn't work for me (it
crashed, not just with mplayer, but also SDL applications).
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/vo_directfb2.c | 2021 |
1 files changed, 1083 insertions, 938 deletions
diff --git a/libvo/vo_directfb2.c b/libvo/vo_directfb2.c index b5db7a3ff7..c83bdccbae 100644 --- a/libvo/vo_directfb2.c +++ b/libvo/vo_directfb2.c @@ -31,7 +31,6 @@ #include "config.h" #include "video_out.h" -#include "video_out_internal.h" #include "fastmemcpy.h" #include "sub/sub.h" #include "mp_msg.h" @@ -39,35 +38,29 @@ #include "subopt-helper.h" #include "mp_fifo.h" #include "input/keycodes.h" +#include "libmpcodecs/mp_image.h" +#include "libmpcodecs/vfcap.h" +#include "osd.h" // triple buffering #define TRIPLE 1 -static const vo_info_t info = { - "Direct Framebuffer Device", - "directfb", - "Jiri Svoboda Jiri.Svoboda@seznam.cz", - "v 2.0 (for DirectFB version >=0.9.22)" -}; - -const LIBVO_EXTERN(directfb) - /****************************** * vo_directfb globals * ******************************/ -#define DFBCHECK(x...) \ - { \ - DFBResult err = x; \ - \ - if (err != DFB_OK) \ - { \ - fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ - DirectFBErrorFatal( #x, err ); \ - } \ - } - - /* +#define DFBCHECK(x ...) \ + do { \ + DFBResult err = x; \ + \ + if (err != DFB_OK) \ + { \ + fprintf(stderr, "%s <%d>:\n\t", __FILE__, __LINE__); \ + DirectFBErrorFatal(# x, err); \ + } \ + } while (0) + +/* * filled by preinit */ @@ -78,7 +71,7 @@ static IDirectFBInputDevice *keyboard = NULL; // A buffer for input events. static IDirectFBEventBuffer *buffer = NULL; - /* +/* * filled during config */ @@ -95,18 +88,18 @@ static int flipping = 0; // scaling flag static int stretch = 0; // picture position -static int xoffset=0,yoffset=0; +static int xoffset = 0, yoffset = 0; // picture size -static int out_width=0,out_height=0; +static int out_width = 0, out_height = 0; // frame/primary size -static int width=0,height=0; +static int width = 0, height = 0; // frame primary format DFBSurfacePixelFormat pixel_format; /* -static void (*draw_alpha_p)(int w, int h, unsigned char *src, - unsigned char *srca, int stride, unsigned char *dst, - int dstride); -*/ + static void (*draw_alpha_p)(int w, int h, unsigned char *src, + unsigned char *srca, int stride, unsigned char *dst, + int dstride); + */ /****************************** * cmd line parameteres * @@ -124,123 +117,134 @@ static int field_parity = -1; static void unlock(void) { -if (frame && framelocked) frame->Unlock(frame); -if (primary && primarylocked) primary->Unlock(primary); + if (frame && framelocked) + frame->Unlock(frame); + if (primary && primarylocked) + primary->Unlock(primary); } -static int get_parity(strarg_t *arg) { - if (strargcmp(arg, "top") == 0) - return 0; - if (strargcmp(arg, "bottom") == 0) - return 1; - return -1; +static int get_parity(strarg_t *arg) +{ + if (strargcmp(arg, "top") == 0) + return 0; + if (strargcmp(arg, "bottom") == 0) + return 1; + return -1; } -static int check_parity(void *arg) { - return get_parity(arg) != -1; +static int check_parity(void *arg) +{ + return get_parity(arg) != -1; } -static int get_mode(strarg_t *arg) { - if (strargcmp(arg, "single") == 0) - return 1; - if (strargcmp(arg, "double") == 0) - return 2; - if (strargcmp(arg, "triple") == 0) - return 3; - return 0; +static int get_mode(strarg_t *arg) +{ + if (strargcmp(arg, "single") == 0) + return 1; + if (strargcmp(arg, "double") == 0) + return 2; + if (strargcmp(arg, "triple") == 0) + return 3; + return 0; } -static int check_mode(void *arg) { - return get_mode(arg) != 0; +static int check_mode(void *arg) +{ + return get_mode(arg) != 0; } -static int preinit(const char *arg) +static int preinit(struct vo *vo, const char *arg) { DFBResult ret; - strarg_t mode_str = {0, NULL}; - strarg_t par_str = {0, NULL}; - strarg_t dfb_params = {0, NULL}; + strarg_t mode_str = { + 0, NULL + }; + strarg_t par_str = { + 0, NULL + }; + strarg_t dfb_params = { + 0, NULL + }; const opt_t subopts[] = { - {"input", OPT_ARG_BOOL, &use_input, NULL}, - {"buffermode", OPT_ARG_STR, &mode_str, check_mode}, - {"fieldparity", OPT_ARG_STR, &par_str, check_parity}, - {"layer", OPT_ARG_INT, &layer_id, NULL}, - {"dfbopts", OPT_ARG_STR, &dfb_params, NULL}, - {NULL} + {"input", OPT_ARG_BOOL, &use_input, NULL}, + {"buffermode", OPT_ARG_STR, &mode_str, check_mode}, + {"fieldparity", OPT_ARG_STR, &par_str, check_parity}, + {"layer", OPT_ARG_INT, &layer_id, NULL}, + {"dfbopts", OPT_ARG_STR, &dfb_params, NULL}, + {NULL} }; //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Preinit entered\n"); - if (dfb) return 0; // we are already initialized! + if (dfb) + return 0; // we are already initialized! // set defaults buffer_mode = 1 + vo_doublebuffering; // honor -double switch layer_id = -1; use_input = 1; field_parity = -1; - if (subopt_parse(arg, subopts) != 0) { - mp_msg( MSGT_VO, MSGL_ERR, - "\n-vo directfb command line help:\n" - "Example: mplayer -vo directfb:layer=1:buffermode=single\n" - "\nOptions (use 'no' prefix to disable):\n" - " input Use DirectFB for keyboard input\n" - "\nOther options:\n" - " layer=n\n" - " n=0..xx Use layer with id n for output (0=primary)\n" - " buffermode=(single|double|triple)\n" - " single Use single buffering\n" - " double Use double buffering\n" - " triple Use triple buffering\n" - " fieldparity=(top|bottom)\n" - " top Top field first\n" - " bottom Bottom field first\n" - " dfbopts=<str>\n" - " Specify a parameter list for DirectFB\n" - "\n" ); - return -1; - } + if (subopt_parse(arg, subopts) != 0) { + mp_msg(MSGT_VO, MSGL_ERR, + "\n-vo directfb command line help:\n" + "Example: mplayer -vo directfb:layer=1:buffermode=single\n" + "\nOptions (use 'no' prefix to disable):\n" + " input Use DirectFB for keyboard input\n" + "\nOther options:\n" + " layer=n\n" + " n=0..xx Use layer with id n for output (0=primary)\n" + " buffermode=(single|double|triple)\n" + " single Use single buffering\n" + " double Use double buffering\n" + " triple Use triple buffering\n" + " fieldparity=(top|bottom)\n" + " top Top field first\n" + " bottom Bottom field first\n" + " dfbopts=<str>\n" + " Specify a parameter list for DirectFB\n" + "\n"); + return -1; + } if (mode_str.len) - buffer_mode = get_mode(&mode_str); + buffer_mode = get_mode(&mode_str); if (par_str.len) - field_parity = get_parity(&par_str); + field_parity = get_parity(&par_str); - if (dfb_params.len > 0) - { - int argc = 2; - char arg0[10] = "mplayer"; - char *arg1 = malloc(dfb_params.len + 7); - char* argv[3]; - char ** a; + if (dfb_params.len > 0) { + int argc = 2; + char arg0[10] = "mplayer"; + char *arg1 = malloc(dfb_params.len + 7); + char *argv[3]; + char **a; - a = &argv[0]; + a = &argv[0]; - strcpy(arg1, "--dfb:"); - strncat(arg1, dfb_params.str, dfb_params.len); + strcpy(arg1, "--dfb:"); + strncat(arg1, dfb_params.str, dfb_params.len); - argv[0]=arg0; - argv[1]=arg1; - argv[2]=NULL; + argv[0] = arg0; + argv[1] = arg1; + argv[2] = NULL; - DFBCHECK (DirectFBInit (&argc,&a)); + DFBCHECK(DirectFBInit(&argc, &a)); - free(arg1); - } else { + free(arg1); + } else { - DFBCHECK (DirectFBInit (NULL,NULL)); - } + DFBCHECK(DirectFBInit(NULL, NULL)); + } - if (((directfb_major_version <= 0) && - (directfb_minor_version <= 9) && - (directfb_micro_version < 15))) - { - mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: Unsupported DirectFB version\n"); - return 1; - } + if (((directfb_major_version <= 0) && + (directfb_minor_version <= 9) && + (directfb_micro_version < 15))) { + mp_msg(MSGT_VO, MSGL_ERR, "DirectFB: Unsupported DirectFB version\n"); + return 1; + } - /* - * (set options) - */ + /* + * (set options) + */ // uncomment this if you do not wish to create a new VT for DirectFB // DFBCHECK (DirectFBSetOption ("no-vt-switch","")); @@ -249,792 +253,899 @@ static int preinit(const char *arg) // DFBCHECK (DirectFBSetOption ("vt-switching","")); // uncomment this if you want to hide gfx cursor (req dfb >=0.9.9) - DFBCHECK (DirectFBSetOption ("no-cursor","")); + DFBCHECK(DirectFBSetOption("no-cursor", "")); // bg color fix - DFBCHECK (DirectFBSetOption ("bg-color","00000000")); + DFBCHECK(DirectFBSetOption("bg-color", "00000000")); - /* - * (Initialize) - */ + /* + * (Initialize) + */ - DFBCHECK (DirectFBCreate (&dfb)); + DFBCHECK(DirectFBCreate(&dfb)); - /* - * (Get keyboard) - */ + /* + * (Get keyboard) + */ - if (use_input) { - ret = dfb->GetInputDevice (dfb, DIDID_KEYBOARD, &keyboard); - if (ret==DFB_OK) { - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Keyboard init OK\n"); - } else { - keyboard = NULL; - mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: Keyboard init FAILED\n"); + if (use_input) { + ret = dfb->GetInputDevice(dfb, DIDID_KEYBOARD, &keyboard); + if (ret == DFB_OK) + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Keyboard init OK\n"); + else { + keyboard = NULL; + mp_msg(MSGT_VO, MSGL_ERR, "DirectFB: Keyboard init FAILED\n"); + } } - } - /* - * Create an input buffer for the keyboard. - */ - if (keyboard) DFBCHECK (keyboard->CreateEventBuffer (keyboard, &buffer)); + /* + * Create an input buffer for the keyboard. + */ + if (keyboard) + DFBCHECK(keyboard->CreateEventBuffer(keyboard, &buffer)); - // just to start clean ... - if (buffer) buffer->Reset(buffer); + // just to start clean ... + if (buffer) + buffer->Reset(buffer); - //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Preinit OK\n"); + //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Preinit OK\n"); - return 0; + return 0; } static DFBSurfacePixelFormat convformat(uint32_t format) { // add more formats !!! - switch (format) { - case IMGFMT_RGB32: return DSPF_RGB32; break; - case IMGFMT_BGR32: return DSPF_RGB32; break; - case IMGFMT_RGB24: return DSPF_RGB24; break; - case IMGFMT_BGR24: return DSPF_RGB24; break; - case IMGFMT_RGB16: return DSPF_RGB16; break; - case IMGFMT_BGR16: return DSPF_RGB16; break; - case IMGFMT_RGB15: return DSPF_ARGB1555; break; - case IMGFMT_BGR15: return DSPF_ARGB1555; break; - case IMGFMT_RGB12: return DSPF_ARGB4444; break; - case IMGFMT_BGR12: return DSPF_ARGB4444; break; - case IMGFMT_YUY2: return DSPF_YUY2; break; - case IMGFMT_UYVY: return DSPF_UYVY; break; - case IMGFMT_YV12: return DSPF_YV12; break; - case IMGFMT_I420: return DSPF_I420; break; -// case IMGFMT_IYUV: return DSPF_IYUV; break; - case IMGFMT_RGB8: return DSPF_RGB332; break; - case IMGFMT_BGR8: return DSPF_RGB332; break; - - default: return 0; - } -return 0; + switch (format) { + case IMGFMT_RGB32: return DSPF_RGB32; + break; + case IMGFMT_BGR32: return DSPF_RGB32; + break; + case IMGFMT_RGB24: return DSPF_RGB24; + break; + case IMGFMT_BGR24: return DSPF_RGB24; + break; + case IMGFMT_RGB16: return DSPF_RGB16; + break; + case IMGFMT_BGR16: return DSPF_RGB16; + break; + case IMGFMT_RGB15: return DSPF_ARGB1555; + break; + case IMGFMT_BGR15: return DSPF_ARGB1555; + break; + case IMGFMT_RGB12: return DSPF_ARGB4444; + break; + case IMGFMT_BGR12: return DSPF_ARGB4444; + break; + case IMGFMT_YUY2: return DSPF_YUY2; + break; + case IMGFMT_UYVY: return DSPF_UYVY; + break; + case IMGFMT_YV12: return DSPF_YV12; + break; + case IMGFMT_I420: return DSPF_I420; + break; +// case IMGFMT_IYUV: return DSPF_IYUV; break; + case IMGFMT_RGB8: return DSPF_RGB332; + break; + case IMGFMT_BGR8: return DSPF_RGB332; + break; + + default: return 0; + } + return 0; } typedef struct enum1_s { -uint32_t format; -int scale; -int result; -unsigned int id; -unsigned int width; -unsigned int height; -int setsize; + uint32_t format; + int scale; + int result; + unsigned int id; + unsigned int width; + unsigned int height; + int setsize; } enum1_t; -static DFBEnumerationResult test_format_callback(unsigned int id, - DFBDisplayLayerDescription desc, - void *data) +static DFBEnumerationResult test_format_callback( + unsigned int id, + DFBDisplayLayerDescription + desc, + void *data) { - enum1_t *params =(enum1_t *)data; - IDirectFBDisplayLayer *layer; - DFBResult ret; + enum1_t *params = (enum1_t *)data; + IDirectFBDisplayLayer *layer; + DFBResult ret; - if ((layer_id == -1 )||(layer_id == id)) { + if ((layer_id == -1) || (layer_id == id)) { - ret = dfb->GetDisplayLayer( dfb, id, &layer); - if (ret) { - DirectFBError( "dfb->GetDisplayLayer failed", ret ); - return DFENUM_OK; - } else { - DFBDisplayLayerConfig dlc; + ret = dfb->GetDisplayLayer(dfb, id, &layer); + if (ret) { + DirectFBError("dfb->GetDisplayLayer failed", ret); + return DFENUM_OK; + } else { + DFBDisplayLayerConfig dlc; - if (params->setsize) { - dlc.flags = DLCONF_WIDTH |DLCONF_HEIGHT; - dlc.width = params->width; - dlc.height = params->height; - layer->SetConfiguration(layer,&dlc); - } + if (params->setsize) { + dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; + dlc.width = params->width; + dlc.height = params->height; + layer->SetConfiguration(layer, &dlc); + } - dlc.flags = DLCONF_PIXELFORMAT; - dlc.pixelformat = convformat(params->format); + dlc.flags = DLCONF_PIXELFORMAT; + dlc.pixelformat = convformat(params->format); - layer->SetOpacity(layer,0); + layer->SetOpacity(layer, 0); - ret = layer->TestConfiguration(layer,&dlc,NULL); + ret = layer->TestConfiguration(layer, &dlc, NULL); - layer->Release(layer); + layer->Release(layer); - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); + mp_msg(MSGT_VO, MSGL_DBG2, + "DirectFB: Test format - layer %i scale/pos %i\n", id, + (desc.caps & DLCAPS_SCREEN_LOCATION)); - if (ret==DFB_OK) { + if (ret == DFB_OK) { // printf("Test OK\n"); - if (params->result) { - if ((!params->scale) && (desc.caps & DLCAPS_SCREEN_LOCATION)) { - params->scale=1; - params->id=id; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - added layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); - } - } else { - params->result=1; - params->id=id; - if (desc.caps & DLCAPS_SCREEN_LOCATION) params->scale=1; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Test format - added layer %i scale/pos %i\n",id,(desc.caps & DLCAPS_SCREEN_LOCATION)); - }; - }; - }; + if (params->result) { + if ((!params->scale) && + (desc.caps & DLCAPS_SCREEN_LOCATION)) { + params->scale = 1; + params->id = id; + mp_msg( + MSGT_VO, MSGL_DBG2, + "DirectFB: Test format - added layer %i scale/pos %i\n", + id, (desc.caps & DLCAPS_SCREEN_LOCATION)); + } + } else { + params->result = 1; + params->id = id; + if (desc.caps & DLCAPS_SCREEN_LOCATION) + params->scale = 1; + mp_msg( + MSGT_VO, MSGL_DBG2, + "DirectFB: Test format - added layer %i scale/pos %i\n", + id, + (desc.caps & DLCAPS_SCREEN_LOCATION)); + }; + } + ; + }; - }; + } + ; return DFENUM_OK; } static int query_format(uint32_t format) { - int ret = VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD; // osd should be removed the in future -> will be handled outside... - enum1_t params; + int ret = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD; // osd should be removed the in future -> will be handled outside... + enum1_t params; - if (!convformat(format)) return 0; + if (!convformat(format)) + return 0; // temporarily disable YV12 // if (format == IMGFMT_YV12) return 0; // if (format == IMGFMT_I420) return 0; - if (format == IMGFMT_IYUV) return 0; + if (format == IMGFMT_IYUV) + return 0; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Format query: %s\n",vo_format_name(format)); + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Format query: %s\n", + vo_format_name(format)); - params.format=format; - params.scale=0; - params.result=0; - params.setsize=0; + params.format = format; + params.scale = 0; + params.result = 0; + params.setsize = 0; - DFBCHECK (dfb->EnumDisplayLayers(dfb,test_format_callback,¶ms)); + DFBCHECK(dfb->EnumDisplayLayers(dfb, test_format_callback, ¶ms)); - if (params.result) { - if (params.scale) ret |=VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN; - return ret; - } + if (params.result) { + if (params.scale) + ret |= VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN; + return ret; + } - return 0; + return 0; } typedef struct videomode_s { -int width; -int height; -int out_width; -int out_height; -int overx; -int overy; -int bpp; + int width; + int height; + int out_width; + int out_height; + int overx; + int overy; + int bpp; } videomode_t; static DFBEnumerationResult video_modes_callback(int width, int height, int bpp, void *data) { - videomode_t *params =(videomode_t *)data; + videomode_t *params = (videomode_t *)data; -int overx=0,overy=0,closer=0,over=0; -int we_are_under=0; + int overx = 0, overy = 0, closer = 0, over = 0; + int we_are_under = 0; //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Validator entered %i %i %i\n",width,height,bpp); -overx=width-params->out_width; -overy=height-params->out_height; - -if (!params->width) { - params->width=width; - params->height=height; - params->overx=overx; - params->overy=overy; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Mode added %i %i %i\n",width,height,bpp); -} + overx = width - params->out_width; + overy = height - params->out_height; + + if (!params->width) { + params->width = width; + params->height = height; + params->overx = overx; + params->overy = overy; + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Mode added %i %i %i\n", width, + height, + bpp); + } -if ((params->overy<0)||(params->overx<0)) we_are_under=1; // stored mode is smaller than req mode -if (abs(overx*overy)<abs(params->overx * params->overy)) closer=1; // current mode is closer to desired res -if ((overx>=0)&&(overy>=0)) over=1; // current mode is bigger or equaul to desired res -if ((closer && (over || we_are_under)) || (we_are_under && over)) { - params->width=width; - params->height=height; - params->overx=overx; - params->overy=overy; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Better mode added %i %i %i\n",width,height,bpp); - }; + if ((params->overy < 0) || (params->overx < 0)) + we_are_under = 1; // stored mode is smaller than req mode + if (abs(overx * overy) < abs(params->overx * params->overy)) + closer = 1; // current mode is closer to desired res + if ((overx >= 0) && (overy >= 0)) + over = 1; // current mode is bigger or equaul to desired res + if ((closer && (over || we_are_under)) || (we_are_under && over)) { + params->width = width; + params->height = height; + params->overx = overx; + params->overy = overy; + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Better mode added %i %i %i\n", + width, height, + bpp); + } + ; -return DFENUM_OK; + return DFENUM_OK; } #define CONFIG_ERROR -1 -static int config(uint32_t s_width, uint32_t s_height, uint32_t d_width, - uint32_t d_height, uint32_t flags, char *title, - uint32_t format) +static int config(struct vo *vo, uint32_t s_width, uint32_t s_height, + uint32_t d_width, uint32_t d_height, uint32_t flags, + uint32_t format) { - /* - * (Locals) - */ + /* + * (Locals) + */ // decode flags - int fs = flags & VOFLAG_FULLSCREEN; - int vm = flags & VOFLAG_MODESWITCHING; + int fs = flags & VOFLAG_FULLSCREEN; + int vm = flags & VOFLAG_MODESWITCHING; - DFBSurfaceDescription dsc; - DFBResult ret; - DFBDisplayLayerConfig dlc; - DFBSurfaceCapabilities caps; + DFBSurfaceDescription dsc; + DFBResult ret; + DFBDisplayLayerConfig dlc; + DFBSurfaceCapabilities caps; - enum1_t params; + enum1_t params; - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config entered [%ix%i]\n",s_width,s_height); - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: With requested format: %s\n",vo_format_name(format)); + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Config entered [%ix%i]\n", s_width, + s_height); + mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: With requested format: %s\n", + vo_format_name( + format)); // initial cleanup - if (frame) { - frame->Release(frame); - frame=NULL; - } + if (frame) { + frame->Release(frame); + frame = NULL; + } - if (primary) { - primary->Release(primary); - primary=NULL; - } + if (primary) { + primary->Release(primary); + primary = NULL; + } - if (layer) { - layer->Release(layer); - layer=NULL; - } + if (layer) { + layer->Release(layer); + layer = NULL; + } // vm things - if (vm) { - videomode_t params; - params.out_width=d_width; - params.out_height=d_height; - params.width=0; - params.height=0; - switch (format) { - case IMGFMT_RGB32: - case IMGFMT_BGR32: - params.bpp=32; - break; - case IMGFMT_RGB24: - case IMGFMT_BGR24: - params.bpp=24; - break; - case IMGFMT_RGB16: - case IMGFMT_BGR16: - case IMGFMT_RGB15: - case IMGFMT_BGR15: - case IMGFMT_RGB12: - case IMGFMT_BGR12: - params.bpp=16; - break; - default: params.bpp=0; - - } - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - trying to change videomode\n"); - DFBCHECK (dfb->EnumVideoModes(dfb,video_modes_callback,¶ms)); - ret=dfb->SetVideoMode(dfb,params.width,params.height,params.bpp); - if (ret) { - ret=dfb->SetVideoMode(dfb,params.width,params.height,24); - if (ret) { - ret=dfb->SetVideoMode(dfb,params.width,params.height,32); - if (ret) { - ret=dfb->SetVideoMode(dfb,params.width,params.height,16); - if (ret) { - ret=dfb->SetVideoMode(dfb,params.width,params.height,8); - } - } - } - } - } // vm end + if (vm) { + videomode_t params; + params.out_width = d_width; + params.out_height = d_height; + params.width = 0; + params.height = 0; + switch (format) { + case IMGFMT_RGB32: + case IMGFMT_BGR32: + params.bpp = 32; + break; + case IMGFMT_RGB24: + case IMGFMT_BGR24: + params.bpp = 24; + break; + case IMGFMT_RGB16: + case IMGFMT_BGR16: + case IMGFMT_RGB15: + case IMGFMT_BGR15: + case IMGFMT_RGB12: + case IMGFMT_BGR12: + params.bpp = 16; + break; + default: params.bpp = 0; + + } + mp_msg(MSGT_VO, MSGL_DBG2, + "DirectFB: Config - trying to change videomode\n"); + DFBCHECK(dfb->EnumVideoModes(dfb, video_modes_callback, ¶ms)); + ret = dfb->SetVideoMode(dfb, params.width, params.height, params.bpp); + if (ret) { + ret = dfb->SetVideoMode(dfb, params.width, params.height, 24); + if (ret) { + ret = dfb->SetVideoMode(dfb, params.width, params.height, 32); + if (ret) { + ret = dfb->SetVideoMode(dfb, params.width, params.height, + 16); + if (ret) + ret = + dfb->SetVideoMode(dfb, params.width, params.height, + 8); + } + } + } + } // vm end // just to be sure clear primary layer - ret = dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer); - if (ret==DFB_OK) { - ret = layer->GetSurface(layer,&primary); - if (ret==DFB_OK) { - primary->Clear(primary,0,0,0,0xff); - ret = primary->Flip(primary,NULL,0); - if (ret==DFB_OK) { - primary->Clear(primary,0,0,0,0xff); - } - primary->Release(primary); - } - primary=NULL; + ret = dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &layer); + if (ret == DFB_OK) { + ret = layer->GetSurface(layer, &primary); + if (ret == DFB_OK) { + primary->Clear(primary, 0, 0, 0, 0xff); + ret = primary->Flip(primary, NULL, 0); + if (ret == DFB_OK) + primary->Clear(primary, 0, 0, 0, 0xff); + primary->Release(primary); + } + primary = NULL; layer->Release(layer); - } - layer=NULL; + } + layer = NULL; // find best layer - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - looking for suitable layer\n"); - params.format=format; - params.scale=0; - params.result=0; - params.width=s_width; - params.height=s_height; - params.setsize=1; - - DFBCHECK (dfb->EnumDisplayLayers(dfb,test_format_callback,¶ms)); - - if (!params.result) { - mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - no suitable layer found\n"); - params.id = DLID_PRIMARY; - } - - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - layer %i\n",params.id); - - // setup layer - - DFBCHECK (dfb->GetDisplayLayer( dfb, params.id, &layer)); - - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - switching layer to exclusive mode\n"); - ret = layer->SetCooperativeLevel (layer, DLSCL_EXCLUSIVE); - - if (DFB_OK != ret) { - mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - cannot switch layer to exclusive mode. This could cause\nproblems. You may need to select correct pixel format manually!\n"); - DirectFBError("MPlayer - Switch layer to exlusive mode.",ret); - }; - if (params.scale) { - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - changing layer configuration (size)\n"); - dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; - dlc.width = s_width; - dlc.height = s_height; - - ret = layer->SetConfiguration(layer,&dlc); - - if (ret) { - mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (size)\n"); - DirectFBError("MPlayer - Layer size change.",ret); - }; - } - - // look if we need to change the pixel format of the layer - // and just to be sure also fetch all layer properties - dlc.flags = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_OPTIONS | DLCONF_BUFFERMODE; - - ret = layer->GetConfiguration(layer,&dlc); - - dlc.flags = DLCONF_PIXELFORMAT | DLCONF_WIDTH | DLCONF_HEIGHT; - - if (ret) { - mp_msg(MSGT_VO, MSGL_WARN,"DirectFB: Warning - could not get layer properties!\n"); - } else { - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Layer reports format:%x\n",dlc.pixelformat); - } - - if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) { - - dlc.flags = DLCONF_PIXELFORMAT; - dlc.pixelformat = convformat(params.format); - - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Desired pixelformat: %x\n",dlc.pixelformat); - - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - changing layer configuration (format)\n"); - ret = layer->SetConfiguration(layer,&dlc); - - if (ret) { - unsigned int bpp; - mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (format, flags=%x)\n",dlc.flags); - DirectFBError("MPlayer - layer pixelformat change",ret); - - // ugly fbdev workaround - try to switch pixelformat via videomode change - switch (dlc.pixelformat) { - case DSPF_ARGB: - case DSPF_RGB32: bpp=32;break; - case DSPF_RGB24: bpp=24;break; - case DSPF_RGB16: bpp=16;break; - case DSPF_ARGB1555: bpp=15;break; - case DSPF_ARGB4444: bpp=12; break; - case DSPF_RGB332 : bpp=8;break; - } - - switch (dlc.pixelformat) { - case DSPF_ARGB: - case DSPF_RGB32: - case DSPF_RGB24: - case DSPF_RGB16: - case DSPF_ARGB1555: - case DSPF_ARGB4444: - case DSPF_RGB332: - mp_msg(MSGT_VO, MSGL_V,"DirectFB: Trying to recover via videomode change (VM).\n"); - // get size - dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT; - if (DFB_OK==layer->GetConfiguration(layer,&dlc)) { - // try to set videomode - mp_msg(MSGT_VO, MSGL_V,"DirectFB: Videomode %ix%i BPP %i\n",dlc.width,dlc.height,bpp); - ret = dfb->SetVideoMode(dfb,dlc.width,dlc.height,bpp); - if (ret) DirectFBError("MPlayer - VM - pixelformat change",ret); - - }; - - //get current pixel format - dlc.flags = DLCONF_PIXELFORMAT; - ret = layer->GetConfiguration(layer,&dlc); - if (ret) { - DirectFBError("MPlayer - VM - Layer->GetConfiguration",ret); - } else { - mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Layer now has pixelformat [%x]\n",dlc.pixelformat); - }; - - // check if we were succesful - if ((dlc.pixelformat != convformat(params.format)) || (ret != DFB_OK)) { - mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Recovery failed!.\n"); - return CONFIG_ERROR; - } - - break; - - default: return CONFIG_ERROR; - - }; - }; - }; + mp_msg(MSGT_VO, MSGL_DBG2, + "DirectFB: Config - looking for suitable layer\n"); + params.format = format; + params.scale = 0; + params.result = 0; + params.width = s_width; + params.height = s_height; + params.setsize = 1; + + DFBCHECK(dfb->EnumDisplayLayers(dfb, test_format_callback, ¶ms)); |