aboutsummaryrefslogtreecommitdiffhomepage
path: root/libvo
diff options
context:
space:
mode:
authorGravatar wm4 <wm4@nowhere>2012-08-06 22:59:24 +0200
committerGravatar wm4 <wm4@nowhere>2012-08-07 01:09:30 +0200
commitc291f321bb6ed750474ee597e26389694b8af828 (patch)
treea5dbc4b1c1af7473ff7cf707439541302d8e738e /libvo
parentca6d8d431a05e8802291b3de587b7d6cdf1f96ae (diff)
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.c2021
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,&params));
+ DFBCHECK(dfb->EnumDisplayLayers(dfb, test_format_callback, &params));
- 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,&params));
- 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, &params));
+ 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,&params));
-
- 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, &params));
+
+ 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;
+
+ }
+ ;
+ }
+ ;
+ }
+ ;
// flipping of layer
// try triple, double... buffering
- dlc.flags = DLCONF_BUFFERMODE;
+ dlc.flags = DLCONF_BUFFERMODE;
#ifdef TRIPLE
- if (buffer_mode > 2) {
- dlc.buffermode = DLBM_TRIPLE;
- ret = layer->SetConfiguration( layer, &dlc );
- } else {
- ret=!DFB_OK;
- }
-
- if (ret!=DFB_OK) {
+ if (buffer_mode > 2) {
+ dlc.buffermode = DLBM_TRIPLE;
+ ret = layer->SetConfiguration(layer, &dlc);
+ } else
+ ret = !DFB_OK;
+
+ if (ret != DFB_OK) {
#endif
- if (buffer_mode > 1) {
- dlc.buffermode = DLBM_BACKVIDEO;
- ret = layer->SetConfiguration( layer, &dlc );
- if (ret!=DFB_OK) {
- dlc.buffermode = DLBM_BACKSYSTEM;
- ret = layer->SetConfiguration( layer, &dlc );
- }
- }
- if (ret == DFB_OK) {
- mp_msg(MSGT_VO, MSGL_V,"DirectFB: Double buffering is active\n");
- }
+ if (buffer_mode > 1) {
+ dlc.buffermode = DLBM_BACKVIDEO;
+ ret = layer->SetConfiguration(layer, &dlc);
+ if (ret != DFB_OK) {
+ dlc.buffermode = DLBM_BACKSYSTEM;
+ ret = layer->SetConfiguration(layer, &dlc);
+ }
+ }
+ if (ret == DFB_OK)
+ mp_msg(MSGT_VO, MSGL_V, "DirectFB: Double buffering is active\n");
+
#ifdef TRIPLE
- } else {
- mp_msg(MSGT_VO, MSGL_V,"DirectFB: Triple buffering is active\n");
- }
+} else
+ mp_msg(MSGT_VO, MSGL_V, "DirectFB: Triple buffering is active\n");
+
#endif
- if (field_parity != -1) {
- dlc.flags = DLCONF_OPTIONS;
- ret = layer->GetConfiguration( layer, &dlc );
- if (ret==DFB_OK) {
- dlc.options |= DLOP_FIELD_PARITY;
- ret = layer->SetConfiguration( layer, &dlc );
- if (ret==DFB_OK) {
- layer->SetFieldParity( layer, field_parity );
- }
- }
+ if (field_parity != -1) {
+ dlc.flags = DLCONF_OPTIONS;
+ ret = layer->GetConfiguration(layer, &dlc);
+ if (ret == DFB_OK) {
+ dlc.options |= DLOP_FIELD_PARITY;
+ ret = layer->SetConfiguration(layer, &dlc);
+ if (ret == DFB_OK)
+ layer->SetFieldParity(layer, field_parity);
}
- mp_msg( MSGT_VO, MSGL_DBG2, "DirectFB: Requested field parity: ");
- switch (field_parity) {
- case -1:
- mp_msg( MSGT_VO, MSGL_DBG2, "Don't care\n");
- break;
- case 0:
- mp_msg( MSGT_VO, MSGL_DBG2, "Top field first\n");
- break;
- case 1:
- mp_msg( MSGT_VO, MSGL_DBG2, "Bottom field first\n");
- break;
- }
+ }
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Requested field parity: ");
+ switch (field_parity) {
+ case -1:
+ mp_msg(MSGT_VO, MSGL_DBG2, "Don't care\n");
+ break;
+ case 0:
+ mp_msg(MSGT_VO, MSGL_DBG2, "Top field first\n");
+ break;
+ case 1:
+ mp_msg(MSGT_VO, MSGL_DBG2, "Bottom field first\n");
+ break;
+ }
// get layer surface
- ret = layer->GetSurface(layer,&primary);
+ ret = layer->GetSurface(layer, &primary);
- if (ret) {
- mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError - could not get surface\n");
- return CONFIG_ERROR; // what shall we report on failure?
- }
+ if (ret) {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "DirectFB: ConfigError - could not get surface\n");
+ return CONFIG_ERROR; // what shall we report on failure?
+ }
// test surface for flipping
- DFBCHECK(primary->GetCapabilities(primary,&caps));
- primary->Clear(primary,0,0,0,0xff);
- flipping = 0;
- if (caps & (DSCAPS_FLIPPING
+ DFBCHECK(primary->GetCapabilities(primary, &caps));
+ primary->Clear(primary, 0, 0, 0, 0xff);
+ flipping = 0;
+ if (caps & (DSCAPS_FLIPPING
#ifdef TRIPLE
- | DSCAPS_TRIPLE
+ | DSCAPS_TRIPLE
#endif
- )) {
- ret = primary->Flip(primary,NULL,0);
- if (ret==DFB_OK) {
- flipping = 1;
- primary->Clear(primary,0,0,0,0xff);
+ )) {
+ ret = primary->Flip(primary, NULL, 0);
+ if (ret == DFB_OK) {
+ flipping = 1;
+ primary->Clear(primary, 0, 0, 0, 0xff);
#ifdef TRIPLE
// if we have 3 buffers clean once more
- if (caps & DSCAPS_TRIPLE) {
- primary->Flip(primary,NULL,0);
- primary->Clear(primary,0,0,0,0xff);
- flipping = 2;
- }
+ if (caps & DSCAPS_TRIPLE) {
+ primary->Flip(primary, NULL, 0);
+ primary->Clear(primary, 0, 0, 0, 0xff);
+ flipping = 2;
+ }
#endif
- }
- };
+ }
+ }
+ ;
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - flipping = %i\n",flipping);
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Config - flipping = %i\n", flipping);
// is scale needed ? Aspect ratio and layer pos/size
- // get surface size
- DFBCHECK(primary->GetSize(primary,&width,&height));
+ // get surface size
+ DFBCHECK(primary->GetSize(primary, &width, &height));
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Config - surface size = %ix%i\n",width,height);
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Config - surface size = %ix%i\n",
+ width,
+ height);
- aspect_save_orig(s_width,s_height);
- aspect_save_prescale(d_width,d_height);
- if (params.scale) {
- aspect_save_screenres(10000,10000);
- aspect(&out_width,&out_height,A_ZOOM);
+ aspect_save_orig(vo, s_width, s_height);
+ aspect_save_prescale(vo, d_width, d_height);
+ if (params.scale) {
+ aspect_save_screenres(vo, 10000, 10000);
+ aspect(vo, &out_width, &out_height, A_ZOOM);
- ret = layer->SetScreenLocation(layer,(1-(float)out_width/10000)/2,(1-(float)out_height/10000)/2,((float)out_width/10000),((float)out_height/10000));
+ ret =
+ layer->SetScreenLocation(layer, (1 - (float)out_width / 10000) / 2,
+ (1 - (float)out_height / 10000) / 2,
+ ((float)out_width / 10000),
+ ((float)out_height / 10000));
- if (ret) mp_msg(MSGT_VO, MSGL_ERR,"DirectFB: ConfigError in layer configuration (position)\n");
+ if (ret)
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "DirectFB: ConfigError in layer configuration (position)\n");
- xoffset = 0;
- yoffset = 0;
+ xoffset = 0;
+ yoffset = 0;
- } else {
+ } else {
- aspect_save_screenres(width,height);
+ aspect_save_screenres(vo, width, height);
- if(fs) /* -fs */
- aspect(&out_width,&out_height,A_ZOOM);
- else
- aspect(&out_width,&out_height,A_NOZOOM);
+ if (fs) /* -fs */
+ aspect(vo, &out_width, &out_height, A_ZOOM);
+ else
+ aspect(vo, &out_width, &out_height, A_NOZOOM);
- xoffset = (width - out_width) / 2;
- yoffset = (height - out_height) / 2;
- }
+ xoffset = (width - out_width) / 2;
+ yoffset = (height - out_height) / 2;
+ }
- if (((s_width==out_width)&&(s_height==out_height)) || (params.scale)) {
- stretch = 0;
- } else {
- stretch = 1;
- }
+ if (((s_width == out_width) && (s_height == out_height)) || (params.scale))
+ stretch = 0;
+ else
+ stretch = 1;
// temporary buffer in case of not flipping or scaling
- if ((!flipping) || stretch) {
+ if ((!flipping) || stretch) {
- DFBCHECK (primary->GetPixelFormat (primary, &dsc.pixelformat));
+ DFBCHECK(primary->GetPixelFormat(primary, &dsc.pixelformat));
- dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH;
+ dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH;
- dsc.width = s_width;
- dsc.height = s_height;
+ dsc.width = s_width;
+ dsc.height = s_height;
- DFBCHECK (dfb->CreateSurface( dfb, &dsc, &frame));
- DFBCHECK(frame->GetSize(frame,&width,&height));
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Frame is active.\n");
- }
+ DFBCHECK(dfb->CreateSurface(dfb, &dsc, &frame));
+ DFBCHECK(frame->GetSize(frame, &width, &height));
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Frame is active.\n");
+ }
// get format for draw_alpha - should be removed soon - osd will be rendered outside vo driver
- if (frame) {
- DFBCHECK (frame->GetPixelFormat(frame,&pixel_format));
- } else {
- DFBCHECK (primary->GetPixelFormat(primary,&pixel_format));
- };
+ if (frame)
+ DFBCHECK(frame->GetPixelFormat(frame, &pixel_format));
+ else
+ DFBCHECK(primary->GetPixelFormat(primary, &pixel_format));
+
+ // finally turn on layer
+ layer->SetOpacity(layer, 255);
- // finally turn on layer
- layer->SetOpacity(layer,255);
+ //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config finished [%ix%i] - [%ix%i]\n",out_width,out_height,width,height);
- //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Config finished [%ix%i] - [%ix%i]\n",out_width,out_height,width,height);
+ return 0;
+}
-return 0;
+static int to_mp_key(int sym)
+{
+ switch (sym) {
+ case DIKS_ESCAPE: return KEY_ESC;
+ case DIKS_PAGE_UP: return KEY_PAGE_UP;
+ case DIKS_PAGE_DOWN: return KEY_PAGE_DOWN;
+ case DIKS_CURSOR_UP: return KEY_UP;
+ case DIKS_CURSOR_DOWN: return KEY_DOWN;
+ case DIKS_CURSOR_LEFT: return KEY_LEFT;
+ case DIKS_CURSOR_RIGHT: return KEY_RIGHT;
+ case DIKS_INSERT: return KEY_INSERT;
+ case DIKS_DELETE: return KEY_DELETE;
+ case DIKS_HOME: return KEY_HOME;
+ case DIKS_END: return KEY_END;
+ default: return sym;
+ }
}
-static void check_events(void)
+static void check_events(struct vo *vo)
{
-if (buffer) {
+ if (buffer) {
- DFBInputEvent event;
+ DFBInputEvent event;
//if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events entered\n");
- if (buffer->GetEvent(buffer, DFB_EVENT (&event)) == DFB_OK) {
-
- if (event.type == DIET_KEYPRESS) {
- switch (event.key_symbol) {
- case DIKS_ESCAPE:
- mplayer_put_key(KEY_ESC);
- break;
- case DIKS_PAGE_UP: mplayer_put_key(KEY_PAGE_UP);break;
- case DIKS_PAGE_DOWN: mplayer_put_key(KEY_PAGE_DOWN);break;
- case DIKS_CURSOR_UP: mplayer_put_key(KEY_UP);break;
- case DIKS_CURSOR_DOWN: mplayer_put_key(KEY_DOWN);break;
- case DIKS_CURSOR_LEFT: mplayer_put_key(KEY_LEFT);break;
- case DIKS_CURSOR_RIGHT: mplayer_put_key(KEY_RIGHT);break;
- case DIKS_INSERT: mplayer_put_key(KEY_INSERT);break;
- case DIKS_DELETE: mplayer_put_key(KEY_DELETE);break;
- case DIKS_HOME: mplayer_put_key(KEY_HOME);break;
- case DIKS_END: mplayer_put_key(KEY_END);break;
-
- default:mplayer_put_key(event.key_symbol);
- };
- };
- };
+ if (buffer->GetEvent(buffer, DFB_EVENT(&event)) == DFB_OK) {
+
+ if (event.type == DIET_KEYPRESS) {
+ mplayer_put_key(vo->key_fifo, to_mp_key(event.key_symbol));
+ }
+ }
// empty buffer, because of repeating (keyboard repeat is faster than key handling
// and this causes problems during seek)
// temporary workaround should be solved in the future
- buffer->Reset(buffer);
+ buffer->Reset(buffer);
-}
+ }
//if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf ("DirectFB: Check events finished\n");
}
-static void flip_page(void)
+static void flip_page(struct vo *vo)
{
- DFBSurfaceBlittingFlags flags=DSBLIT_NOFX;
+ DFBSurfaceBlittingFlags flags = DSBLIT_NOFX;
- unlock(); // unlock frame & primary
+ unlock(); // unlock frame & primary
// if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Flip page entered");
- DFBCHECK (primary->SetBlittingFlags(primary,flags));
+ DFBCHECK(primary->SetBlittingFlags(primary, flags));
- if (frame) {
- if (stretch) {
- DFBRectangle rect;
- rect.x=xoffset;
- rect.y=yoffset;
- rect.w=out_width;
- rect.h=out_height;
+ if (frame) {
+ if (stretch) {
+ DFBRectangle rect;
+ rect.x = xoffset;
+ rect.y = yoffset;
+ rect.w = out_width;
+ rect.h = out_height;
- DFBCHECK (primary->StretchBlit(primary,frame,NULL,&rect));
+ DFBCHECK(primary->StretchBlit(primary, frame, NULL, &rect));
- } else {
+ } else {
- DFBCHECK (primary->Blit(primary,frame,NULL,xoffset,yoffset));
+ DFBCHECK(primary->Blit(primary, frame, NULL, xoffset, yoffset));
- };
- };
+ };
+ }
+ ;
#ifdef TRIPLE
switch (flipping) {
- case 1: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAIT));
- break;
- case 2: DFBCHECK (primary->Flip (primary, NULL, DSFLIP_ONSYNC));
- break;
- default:; // should never be reached
- }
+ case 1: DFBCHECK(primary->Flip(primary, NULL, DSFLIP_WAIT));
+ break;
+ case 2: DFBCHECK(primary->Flip(primary, NULL, DSFLIP_ONSYNC));
+ break;
+ default:; // should never be reached
+ }
#else
- if (flipping) {
- DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC));
- }
+ if (flipping)
+ DFBCHECK(primary->Flip(primary, NULL, DSFLIP_WAITFORSYNC));
+
#endif
}
-static void uninit(void)
+static void uninit(struct vo *vo)
{
- //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit entered\n");
+ //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit entered\n");
- unlock();
+ unlock();
- /*
- * (Release)
- */
+ /*
+ * (Release)
+ */
/*
- mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing buffer\n");
- if (buffer) buffer->Release (buffer);
- mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing keyboard\n");
- if (keyboard) keyboard->Release (keyboard);
-*/
- if (frame) {
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing frame\n");
- frame->Release (frame);
- frame = NULL;
- };
+ mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing buffer\n");
+ if (buffer) buffer->Release (buffer);
+ mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing keyboard\n");
+ if (keyboard) keyboard->Release (keyboard);
+ */
+ if (frame) {
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Releasing frame\n");
+ frame->Release(frame);
+ frame = NULL;
+ }
+ ;
// switch off BES
// if (layer) layer->SetOpacity(layer,0);
- if (layer) {
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing layer\n");
- layer->Release(layer);
- layer = NULL;
- }
+ if (layer) {
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Releasing layer\n");
+ layer->Release(layer);
+ layer = NULL;
+ }
- if (primary) {
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: Releasing primary\n");
- primary->Release (primary);
- primary = NULL;
- }
+ if (primary) {
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: Releasing primary\n");
+ primary->Release(primary);
+ primary = NULL;
+ }
/* mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Releasing DirectFB library\n");
- dfb->Release (dfb);
-*/
- //mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit done.\n");
+ dfb->Release (dfb);
+ */
+//mp_msg(MSGT_VO, MSGL_INFO,"DirectFB: Uninit done.\n");
}
static uint32_t directfb_set_video_eq(const char *data, int value) //data==name
{
- DFBColorAdjustment ca;
- float factor = (float)0xffff / 200.0;
-
- DFBDisplayLayerDescription desc;
-
- unlock();
-
-if (layer) {
-
- layer->GetDescription(layer,&desc);
-
- ca.flags=DCAF_NONE;
-
- if (! strcmp( data,"brightness" )) {
- if (desc.caps & DLCAPS_BRIGHTNESS) {
- ca.brightness = value * factor +0x8000;
- ca.flags |= DCAF_BRIGHTNESS;
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Brightness 0x%X %i\n",ca.brightness,value);
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"contrast" )) {
- if ((desc.caps & DLCAPS_CONTRAST)) {
- ca.contrast = value * factor + 0x8000;
- ca.flags |= DCAF_CONTRAST;
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Contrast 0x%X %i\n",ca.contrast,value);
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"hue" )) {
- if ((desc.caps & DLCAPS_HUE)) {
- ca.hue = value * factor + 0x8000;
- ca.flags |= DCAF_HUE;
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Hue 0x%X %i\n",ca.hue,value);
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"saturation" )) {
- if ((desc.caps & DLCAPS_SATURATION)) {
- ca.saturation = value * factor + 0x8000;
- ca.flags |= DCAF_SATURATION;
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: SetVEq Saturation 0x%X %i\n",ca.saturation,value);
- } else return VO_FALSE;
- }
-
- if (ca.flags != DCAF_NONE) {
- layer->SetColorAdjustment(layer,&ca);
- return VO_TRUE;
- }
-}
+ DFBColorAdjustment ca;
+ float factor = (float)0xffff / 200.0;
+
+ DFBDisplayLayerDescription desc;
+
+ unlock();
+
+ if (layer) {
+
+ layer->GetDescription(layer, &desc);
+
+ ca.flags = DCAF_NONE;
+
+ if (!strcmp(data, "brightness")) {
+ if (desc.caps & DLCAPS_BRIGHTNESS) {
+ ca.brightness = value * factor + 0x8000;
+ ca.flags |= DCAF_BRIGHTNESS;
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: SetVEq Brightness 0x%X %i\n", ca.brightness,
+ value);
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "contrast")) {
+ if ((desc.caps & DLCAPS_CONTRAST)) {
+ ca.contrast = value * factor + 0x8000;
+ ca.flags |= DCAF_CONTRAST;
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: SetVEq Contrast 0x%X %i\n", ca.contrast,
+ value);
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "hue")) {
+ if ((desc.caps & DLCAPS_HUE)) {
+ ca.hue = value * factor + 0x8000;
+ ca.flags |= DCAF_HUE;
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: SetVEq Hue 0x%X %i\n",
+ ca.hue,
+ value);
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "saturation")) {
+ if ((desc.caps & DLCAPS_SATURATION)) {
+ ca.saturation = value * factor + 0x8000;
+ ca.flags |= DCAF_SATURATION;
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: SetVEq Saturation 0x%X %i\n", ca.saturation,
+ value);
+ } else
+ return VO_FALSE;
+ }
+
+ if (ca.flags != DCAF_NONE) {
+ layer->SetColorAdjustment(layer, &ca);
+ return VO_TRUE;
+ }
+ }
return VO_FALSE;
@@ -1043,138 +1154,153 @@ if (layer) {
static uint32_t directfb_get_video_eq(const char *data, int *value) // data==name
{
- DFBColorAdjustment ca;
- float factor = 200.0 / (float)0xffff;
-
- DFBDisplayLayerDescription desc;
-
-if (layer) {
-
- unlock();
-
- layer->GetDescription(layer,&desc);
-
- layer->GetColorAdjustment(layer,&ca);
-
- if (! strcmp( data,"brightness" )) {
- if (desc.caps & DLCAPS_BRIGHTNESS) {
- *value = (int) ((ca.brightness-0x8000) * factor);
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Brightness 0x%X %i\n",ca.brightness,*value);
- return VO_TRUE;
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"contrast" )) {
- if ((desc.caps & DLCAPS_CONTRAST)) {
- *value = (int) ((ca.contrast-0x8000) * factor);
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Contrast 0x%X %i\n",ca.contrast,*value);
- return VO_TRUE;
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"hue" )) {
- if ((desc.caps & DLCAPS_HUE)) {
- *value = (int) ((ca.hue-0x8000) * factor);
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Hue 0x%X %i\n",ca.hue,*value);
- return VO_TRUE;
- } else return VO_FALSE;
- }
-
- if (! strcmp( data,"saturation" )) {
- if ((desc.caps & DLCAPS_SATURATION)) {
- *value = (int) ((ca.saturation-0x8000) * factor);
- mp_msg(MSGT_VO, MSGL_DBG2,"DirectFB: GetVEq Saturation 0x%X %i\n",ca.saturation,*value);
- return VO_TRUE;
- } else return VO_FALSE;
- }
-}
+ DFBColorAdjustment ca;
+ float factor = 200.0 / (float)0xffff;
+
+ DFBDisplayLayerDescription desc;
+
+ if (layer) {
+
+ unlock();
+
+ layer->GetDescription(layer, &desc);
+
+ layer->GetColorAdjustment(layer, &ca);
+
+ if (!strcmp(data, "brightness")) {
+ if (desc.caps & DLCAPS_BRIGHTNESS) {
+ *value = (int) ((ca.brightness - 0x8000) * factor);
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: GetVEq Brightness 0x%X %i\n", ca.brightness,
+ *value);
+ return VO_TRUE;
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "contrast")) {
+ if ((desc.caps & DLCAPS_CONTRAST)) {
+ *value = (int) ((ca.contrast - 0x8000) * factor);
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: GetVEq Contrast 0x%X %i\n", ca.contrast,
+ *value);
+ return VO_TRUE;
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "hue")) {
+ if ((desc.caps & DLCAPS_HUE)) {
+ *value = (int) ((ca.hue - 0x8000) * factor);
+ mp_msg(MSGT_VO, MSGL_DBG2, "DirectFB: GetVEq Hue 0x%X %i\n",
+ ca.hue,
+ *value);
+ return VO_TRUE;
+ } else
+ return VO_FALSE;
+ }
+
+ if (!strcmp(data, "saturation")) {
+ if ((desc.caps & DLCAPS_SATURATION)) {
+ *value = (int) ((ca.saturation - 0x8000) * factor);
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "DirectFB: GetVEq Saturation 0x%X %i\n", ca.saturation,
+ *value);
+ return VO_TRUE;
+ } else
+ return VO_FALSE;
+ }
+ }
return VO_FALSE;
}
-static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y)
+static int draw_slice(struct vo *vo, uint8_t *src[], int stride[],
+ int w, int h, int x, int y)
{
- int i;
- unsigned int pitch;
- uint8_t *dst;
- uint8_t *dst2;
- uint8_t *srcp;
- unsigned int p;
+ int i;
+ unsigned int pitch;
+ uint8_t *dst;
+ uint8_t *dst2;
+ uint8_t *srcp;
+ unsigned int p;
// if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: draw_slice entered\n");
- unlock();
+ unlock();
- if (frame) {
- DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,(void *)&dst,&pitch));
- framelocked = 1;
- } else {
- DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch));
- primarylocked = 1;
- };
+ if (frame) {
+ DFBCHECK(frame->Lock(frame, DSLF_WRITE | DSLF_READ, (void *)&dst,
+ &pitch));
+ framelocked = 1;
+ } else {
+ DFBCHECK(primary->Lock(primary, DSLF_WRITE, (void *)&dst, &pitch));
+ primarylocked = 1;
+ };
- p = FFMIN(w, pitch);
+ p = FFMIN(w, pitch);
- dst += y*pitch + x;
- dst2 = dst + pitch*height - y*pitch + y*pitch/4 - x/2;
- srcp = src[0];
+ dst += y * pitch + x;
+ dst2 = dst + pitch * height - y * pitch + y * pitch / 4 - x / 2;
+ srcp = src[0];
- for (i=0;i<h;i++) {
- fast_memcpy(dst,srcp,p);
- dst += pitch;
- srcp += stride[0];
- }
+ for (i = 0; i < h; i++) {
+ fast_memcpy(dst, srcp, p);
+ dst += pitch;
+ srcp += stride[0];
+ }
- if (pixel_format == DSPF_YV12) {
+ if (pixel_format == DSPF_YV12) {
- dst = dst2;
- srcp = src[2];
- p = p/2;
+ dst = dst2;
+ srcp = src[2];
+ p = p / 2;
- for (i=0;i<h/2;i++) {
- fast_memcpy(dst,srcp,p);
- dst += pitch/2;
- srcp += stride[2];
- }
+ for (i = 0; i < h / 2; i++) {
+ fast_memcpy(dst, srcp, p);
+ dst += pitch / 2;
+ srcp += stride[2];
+ }
- dst = dst2 + pitch*height/4;
- srcp = src[1];
+ dst = dst2 + pitch * height / 4;
+ srcp = src[1];
- for (i=0;i<h/2;i++) {
- fast_memcpy(dst,srcp,p);
- dst += pitch/2;
- srcp += stride[1];
- }
+ for (i = 0; i < h / 2; i++) {
+ fast_memcpy(dst, srcp, p);
+ dst += pitch / 2;
+ srcp += stride[1];
+ }
- } else {
+ } else {
- dst = dst2;
- srcp = src[1];
- p = p/2;
+ dst = dst2;
+ srcp = src[1];
+ p = p / 2;
- for (i=0;i<h/2;i++) {
- fast_memcpy(dst,srcp,p);
- dst += pitch/2;
- srcp += stride[1];
- }
+ for (i = 0; i < h / 2; i++) {
+ fast_memcpy(dst, srcp, p);
+ dst += pitch / 2;
+ srcp += stride[1];
+ }
- dst = dst2 + pitch*height/4;
- srcp = src[2];
+ dst = dst2 + pitch * height / 4;
+ srcp = src[2];
- for (i=0;i<h/2;i++) {
- fast_memcpy(dst,srcp,p);
- dst += pitch/2;
- srcp += stride[2];
- }
+ for (i = 0; i < h / 2; i++) {
+ fast_memcpy(dst, srcp, p);
+ dst += pitch / 2;
+ srcp += stride[2];
+ }
- }
+ }
- unlock();
+ unlock();
return 0;
}
-static uint32_t put_image(mp_image_t *mpi){
+static uint32_t put_image(mp_image_t *mpi)
+{
// static IDirectFBSurface *tmp = NULL;
@@ -1186,114 +1312,115 @@ static uint32_t put_image(mp_image_t *mpi){
unlock();
// already out?
- if((mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK))) {
+ if ((mpi->flags & (MP_IMGFLAG_DIRECT | MP_IMGFLAG_DRAW_CALLBACK))) {
// if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - nothing to do\n");
- return VO_TRUE;
+ return VO_TRUE;
}
- if (mpi->flags&MP_IMGFLAG_PLANAR) {
- // memcpy all planes - sad but necessary
+ if (mpi->flags & MP_IMGFLAG_PLANAR) {
+ // memcpy all planes - sad but necessary
int i;
- unsigned int pitch;
+ unsigned int pitch;
uint8_t *dst;
- uint8_t *src;
- unsigned int p;
+ uint8_t *src;
+ unsigned int p;
// if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - planar branch\n");
- if (frame) {
- DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,(void *)&dst,&pitch));
- framelocked = 1;
+ if (frame) {
+ DFBCHECK(frame->Lock(frame, DSLF_WRITE | DSLF_READ, (void *)&dst,
+ &pitch));
+ framelocked = 1;
} else {
- DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch));
- primarylocked = 1;
+ DFBCHECK(primary->Lock(primary, DSLF_WRITE, (void *)&dst, &pitch));
+ primarylocked = 1;
};
- p = FFMIN(mpi->w, pitch);
+ p = FFMIN(mpi->w, pitch);
- src = mpi->planes[0];
+ src = mpi->planes[0];
- for (i=0;i<mpi->h;i++) {
- fast_memcpy(dst+i*pitch,src+i*mpi->stride[0],p);
- }
+ for (i = 0; i < mpi->h; i++)
+ fast_memcpy(dst + i * pitch, src + i * mpi->stride[0], p);
- if (pixel_format == DSPF_YV12) {
+ if (pixel_format == DSPF_YV12) {
- dst += pitch*height;
- p = p/2;
- src = mpi->planes[2];
+ dst += pitch * height;
+ p = p / 2;
+ src = mpi->planes[2];
- for (i=0;i<mpi->h/2;i++) {
- fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[2],p);
- }
+ for (i = 0; i < mpi->h / 2; i++)
+ fast_memcpy(dst + i * pitch / 2, src + i * mpi->stride[2], p);
- dst += pitch*height/4;
- src = mpi->planes[1];
+ dst += pitch * height / 4;
+ src = mpi->planes[1];
- for (i=0;i<mpi->h/2;i++) {
- fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[1],p);
- }
+ for (i = 0; i < mpi->h / 2; i++)
+ fast_memcpy(dst + i * pitch / 2, src + i * mpi->stride[1], p);
- } else {
+ } else {
- dst += pitch*height;
- p = p/2;
- src = mpi->planes[1];
+ dst += pitch * height;
+ p = p / 2;
+ src = mpi->planes[1];
- for (i=0;i<mpi->h/2;i++) {
- fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[1],p);
- }
+ for (i = 0; i < mpi->h / 2; i++)
+ fast_memcpy(dst + i * pitch / 2, src + i * mpi->stride[1], p);
- dst += pitch*height/4;
- src = mpi->planes[2];
+ dst += pitch * height / 4;
+ src = mpi->planes[2];
- for (i=0;i<mpi->h/2;i++) {
- fast_memcpy(dst+i*pitch/2,src+i*mpi->stride[2],p);
- }
+ for (i = 0; i < mpi->h / 2; i++)
+ fast_memcpy(dst + i * pitch / 2, src + i * mpi->stride[2], p);
- }
- unlock();
+ }
+ unlock();
} else {
// I had to disable native directfb blit because it wasn't working under some conditions :-(
/*
- dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_PREALLOCATED;
- dsc.preallocated[0].data = mpi->planes[0];
- dsc.preallocated[0].pitch = mpi->stride[0];
+ dsc.flags = DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_WIDTH | DSDESC_PREALLOCATED;
+ dsc.preallocated[0].data = mpi->planes[0];
+ dsc.preallocated[0].pitch = mpi->stride[0];
dsc.width = mpi->width;
dsc.height = mpi->height;
dsc.pixelformat = convformat(mpi->imgfmt);
- DFBCHECK (dfb->CreateSurface( dfb, &dsc, &tmp));
+ DFBCHECK (dfb->CreateSurface( dfb, &dsc, &tmp));
rect.x=mpi->x;
rect.y=mpi->y;
rect.w=mpi->w;
rect.h=mpi->h;
- if (frame) {
- DFBCHECK (tmp->Blit(tmp,frame,&rect,0,0));
+ if (frame) {
+ DFBCHECK (tmp->Blit(tmp,frame,&rect,0,0));
} else {
- DFBCHECK (tmp->Blit(tmp,primary,&rect,xoffset,yoffset));
+ DFBCHECK (tmp->Blit(tmp,primary,&rect,xoffset,yoffset));
};
tmp->Release(tmp);
-*/
+ */
- unsigned int pitch;
+ unsigned int pitch;
uint8_t *dst;
// if ( mp_msg_test(MSGT_VO,MSGL_V) ) printf("DirectFB: Put_image - non-planar branch\n");
- if (frame) {
- DFBCHECK (frame->Lock(frame,DSLF_WRITE,(void *)&dst,&pitch));
- framelocked = 1;
- mem2agpcpy_pic(dst,mpi->planes[0] ,mpi->w * (mpi->bpp >> 3),mpi->h,pitch,mpi->stride[0]);
+ if (frame) {
+ DFBCHECK(frame->Lock(frame, DSLF_WRITE, (void *)&dst, &pitch));
+ framelocked = 1;
+ mem2agpcpy_pic(dst, mpi->planes[0], mpi->w * (mpi->bpp >> 3),
+ mpi->h, pitch,
+ mpi->stride[0]);
} else {
- DFBCHECK (primary->Lock(primary,DSLF_WRITE,(void *)&dst,&pitch));
- primarylocked = 1;
- mem2agpcpy_pic(dst + yoffset * pitch + xoffset * (mpi->bpp >> 3),mpi->planes[0] ,mpi->w * (mpi->bpp >> 3),mpi->h,pitch,mpi->stride[0]);
+ DFBCHECK(primary->Lock(primary, DSLF_WRITE, (void *)&dst, &pitch));
+ primarylocked = 1;
+ mem2agpcpy_pic(dst + yoffset * pitch + xoffset * (mpi->bpp >> 3),
+ mpi->planes[0], mpi->w * (mpi->bpp >> 3), mpi->h,
+ pitch,
+ mpi->stride[0]);
};
- unlock();
+ unlock();
}
return VO_TRUE;
@@ -1301,92 +1428,110 @@ static uint32_t put_image(mp_image_t *mpi){
-static int control(uint32_t request, void *data)
+static int control(struct vo *vo, uint32_t request, void *data)
{
- switch (request) {
+ switch (request) {
case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
+ return query_format(*((uint32_t *)data));
case VOCTRL_DRAW_IMAGE:
- return put_image(data);
+ return put_image(data);
case VOCTRL_SET_EQUALIZER:
- {
- struct voctrl_set_equalizer_args *args = data;
- return directfb_set_video_eq(args->name, args->value);
- }
+ {
+ struct voctrl_set_equalizer_args *args = data;
+ return directfb_set_video_eq(args->name, args->value);
+ }
case VOCTRL_GET_EQUALIZER:
- {
- struct voctrl_get_equalizer_args *args = data;
- return directfb_get_video_eq(args->name, args->valueptr);
- }
- };
- return VO_NOTIMPL;
-}
-
-// unused function
-
-static int draw_frame(uint8_t *src[])
-{
- return -1;
+ {
+ struct voctrl_get_equalizer_args *args = data;
+ return directfb_get_video_eq(args->name, args->valueptr);
+ }
+ }
+ ;
+ return VO_NOTIMPL;
}
// hopefully will be removed soon
-static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
- unsigned char *srca, int stride)
+static void draw_osd_elem(void *ctx, int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca, int stride)
{
- void *dst;
- int pitch;
+ void *dst;
+ int pitch;
- unlock(); // isn't it silly I have to unlock surface and then lock it again :-)
+ unlock(); // isn't it silly I have to unlock surface and then lock it again :-)
- if (frame) {
- DFBCHECK (frame->Lock(frame,DSLF_WRITE|DSLF_READ,&dst,&pitch));
- framelocked = 1;
- } else {
- DFBCHECK (primary->Lock(primary,DSLF_WRITE,&dst,&pitch));
- primarylocked = 1;
- };
+ if (frame) {
+ DFBCHECK(frame->Lock(frame, DSLF_WRITE | DSLF_READ, &dst, &pitch));
+ framelocked = 1;
+ } else {
+ DFBCHECK(primary->Lock(primary, DSLF_WRITE, &dst, &pitch));
+ primarylocked = 1;
+ };
- switch(pixel_format) {
- case DSPF_RGB32:
- case DSPF_ARGB:
- vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 4*x0,pitch);
- break;
-
- case DSPF_RGB24:
- vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 3*x0,pitch);
- break;
-
- case DSPF_RGB16:
- vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch);
- break;
- case DSPF_ARGB1555:
- vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) dst)+pitch*y0 + 2*x0,pitch);
- break;
- case DSPF_ARGB4444:
- vo_draw_alpha_rgb12(w, h, src, srca, stride,
- ((uint8_t *) dst) + pitch * y0 + 2 * x0,
- pitch);
- break;
-
- case DSPF_YUY2:
- vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0,pitch);
- break;
-
- case DSPF_UYVY:
- vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 2*x0 + 1,pitch);
- break;
-
- case DSPF_I420:
- case DSPF_YV12:
- vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + 1*x0,pitch);
- break;
- }
-
- unlock();
+ switch (pixel_format) {
+ case DSPF_RGB32:
+ case DSPF_ARGB:
+ vo_draw_alpha_rgb32(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 4 * x0, pitch);
+ break;
+
+ case DSPF_RGB24:
+ vo_draw_alpha_rgb24(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 3 * x0, pitch);
+ break;
+
+ case DSPF_RGB16:
+ vo_draw_alpha_rgb16(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 2 * x0, pitch);
+ break;
+ case DSPF_ARGB1555:
+ vo_draw_alpha_rgb15(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 2 * x0, pitch);
+ break;
+ case DSPF_ARGB4444:
+ vo_draw_alpha_rgb12(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 2 * x0, pitch);
+ break;
+
+ case DSPF_YUY2:
+ vo_draw_alpha_yuy2(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 2 * x0, pitch);
+ break;
+
+ case DSPF_UYVY:
+ vo_draw_alpha_yuy2(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 2 * x0 + 1, pitch);
+ break;
+
+ case DSPF_I420:
+ case DSPF_YV12:
+ vo_draw_alpha_yv12(w, h, src, srca, stride,
+ ((uint8_t *) dst) + pitch * y0 + 1 * x0, pitch);
+ break;
+ }
+
+ unlock();
}
-static void draw_osd(void)
+static void draw_osd(struct vo *vo, struct osd_state *osd)
{
- vo_draw_text(width,height,draw_alpha);
+ osd_draw_text(osd, width, height, draw_osd_elem, NULL);
}
+
+const struct vo_driver video_out_directfb = {
+ .is_new = false,
+ .info = &(const vo_info_t) {
+ "Direct Framebuffer Device",
+ "directfb",
+ "Jiri Svoboda Jiri.Svoboda@seznam.cz",
+ "v 2.0 (for DirectFB version >=0.9.22)"
+ },
+ .preinit = preinit,
+ .config = config,
+ .control = control,
+ .draw_slice = draw_slice,
+ .draw_osd = draw_osd,
+ .flip_page = flip_page,
+ .check_events = check_events,
+ .uninit = uninit,
+};