summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-05 11:46:51 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-05 11:46:51 +0000
commitf3dc8147636161e21bbb96dca0b02305df417e35 (patch)
tree3717a620867eb00ebeb6c80c93c1bd0cc007a71f /libvo
parent52083dde7e6ce906ab5febb3f49f9c4af292f936 (diff)
downloadmpv-f3dc8147636161e21bbb96dca0b02305df417e35.tar.bz2
mpv-f3dc8147636161e21bbb96dca0b02305df417e35.tar.xz
updates, using DIRECTFBVERSION and video EQ support by Jiri.Svoboda@seznam.cz
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6921 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libvo')
-rw-r--r--libvo/vo_directfb.c203
1 files changed, 135 insertions, 68 deletions
diff --git a/libvo/vo_directfb.c b/libvo/vo_directfb.c
index ebfb99d0cf..e3c5a45cfe 100644
--- a/libvo/vo_directfb.c
+++ b/libvo/vo_directfb.c
@@ -115,7 +115,7 @@ static IDirectFBSurface *frame = NULL;
* A buffer for input events.
*/
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
static IDirectFBEventBuffer *buffer = NULL;
#else
static IDirectFBInputBuffer *buffer = NULL;
@@ -178,7 +178,7 @@ static int framelocked=0;
#endif
#define FLIPPING
#ifdef FLIPPING
-static int do_flipping=0; // turn (on) off flipping - prepared for cmd line switch
+static int do_flipping=1; // turn (on) off flipping - prepared for cmd line switch
static int wait_vsync_after_flip=0;
static int flipping=0; // flipping is active
static int invram=0; // backbuffer in video memory
@@ -222,10 +222,18 @@ return DFENUM_OK;
}
+#if DIRECTFBVERSION > 912
+DFBEnumerationResult enum_layers_callback( DFBDisplayLayerID id,
+ DFBDisplayLayerDescription desc,
+ void *data )
+{
+ DFBDisplayLayerCapabilities caps = desc.caps;
+#else
DFBEnumerationResult enum_layers_callback( unsigned int id,
DFBDisplayLayerCapabilities caps,
void *data )
{
+#endif
IDirectFBDisplayLayer **layer = (IDirectFBDisplayLayer **)data;
if (verbose) {
printf("\nDirectFB: Layer %d:\n", id );
@@ -236,7 +244,7 @@ if (verbose) {
if (caps & DLCAPS_ALPHACHANNEL)
printf( " - Supports blending based on alpha channel.\n" );
-#ifdef HAVE_DIRECTFB0910
+#if DIRECTFBVERSION > 909
if (caps & DLCAPS_SRC_COLORKEY)
printf( " - Supports source based color keying.\n" );
@@ -344,7 +352,7 @@ if (verbose) printf("DirectFB: Preinit entered\n");
// uncomment this if you want to allow vt switching
// DFBCHECK (DirectFBSetOption ("vt-switching",""));
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
// uncomment this if you want to hide gfx cursor (req dfb >=0.9.9)
DFBCHECK (DirectFBSetOption ("no-cursor",""));
#endif
@@ -374,7 +382,7 @@ if (verbose) printf("DirectFB: Preinit entered\n");
if (verbose) printf("DirectFB: Testing videolayer caps\n");
dlc.flags = DLCONF_PIXELFORMAT;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
dlc.pixelformat = DSPF_YV12;
ret = videolayer->TestConfiguration( videolayer, &dlc, &failed );
if (ret==DFB_OK) {
@@ -421,7 +429,13 @@ if (verbose) printf("DirectFB: Preinit entered\n");
// test for color caps
{
DFBDisplayLayerCapabilities caps;
+#if DIRECTFBVERSION > 912
+ DFBDisplayLayerDescription desc;
+ videolayer->GetDescription(videolayer,&desc);
+ caps = desc.caps;
+#else
videolayer->GetCapabilities(videolayer,&caps);
+#endif
if (caps & DLCAPS_BRIGHTNESS) {
videolayercaps.brightness=1;
} else {
@@ -501,7 +515,7 @@ if (verbose) printf("DirectFB: Preinit entered\n");
/*
* Create an input buffer for the keyboard.
*/
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
if (keyboard) DFBCHECK (keyboard->CreateEventBuffer (keyboard, &buffer));
#else
if (keyboard) DFBCHECK (keyboard->CreateInputBuffer (keyboard, &buffer));
@@ -630,7 +644,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
dlc.pixelformat = 0;
switch (pixel_format) {
case IMGFMT_YV12:
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
if (videolayercaps.i420==1) {
dlc.pixelformat=DSPF_I420;
break;
@@ -648,7 +662,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
dlc.pixelformat=DSPF_UYVY;
break;
*/
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
} else if (videolayercaps.i420==1) {
dlc.pixelformat=DSPF_I420;
break;
@@ -685,7 +699,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
break;
case DSPF_UYVY: printf("DirectFB: layer format UYVY\n");
break;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
case DSPF_YV12: printf("DirectFB: layer format YV12\n");
break;
case DSPF_I420: printf("DirectFB: layer format I420\n");
@@ -852,7 +866,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
/*
* Create a surface based on the description of the source frame
*/
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
if (((dsc.pixelformat==DSPF_YV12)||(dsc.pixelformat==DSPF_I420)) && buggyYV12BitBlt) {
memcpyBitBlt = 1;
} else {
@@ -947,7 +961,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
case DSPF_UYVY: if (verbose) printf("DirectFB: frame format UYVY\n");
frame_pixel_size = 2;
break;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
case DSPF_YV12: if (verbose) printf("DirectFB: frame format YV12\n");
frame_pixel_size = 1;
break;
@@ -980,7 +994,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
(format==IMGFMT_BGR16)&&(frame_format ==DSPF_RGB16) ||
(format==IMGFMT_RGB15)&&(frame_format ==DSPF_RGB15) ||
(format==IMGFMT_BGR15)&&(frame_format ==DSPF_RGB15) ||
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
(format==IMGFMT_YUY2)&&(frame_format ==DSPF_YUY2) ||
(format==IMGFMT_YV12)&&(frame_format ==DSPF_I420) ||
(format==IMGFMT_YV12)&&(frame_format ==DSPF_YV12)){
@@ -1120,7 +1134,7 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + frame_pixel_size*x0 + 1,pitch);
break;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
case DSPF_I420:
case DSPF_YV12:
vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) dst) + pitch*y0 + frame_pixel_size*x0,pitch);
@@ -1200,7 +1214,7 @@ static uint32_t draw_frame(uint8_t *src[])
};
break;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
case DSPF_YV12:
switch (pixel_format) {
case IMGFMT_YV12: {
@@ -1311,7 +1325,7 @@ static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, int x, in
}
break;
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
case DSPF_YV12:
switch (pixel_format) {
case IMGFMT_YV12: {
@@ -1411,13 +1425,13 @@ static void check_events(void)
DFBInputEvent event;
//if (verbose) printf ("DirectFB: Check events entered\n");
-#ifdef HAVE_DIRECTFB0910
+#if DIRECTFBVERSION > 909
if (buffer->GetEvent(buffer, DFB_EVENT (&event)) == DFB_OK) {
#else
if (buffer->GetEvent(buffer, &event) == DFB_OK) {
#endif
if (event.type == DIET_KEYPRESS) {
-#ifdef HAVE_DIRECTFB0911
+#if DIRECTFBVERSION > 910
switch (event.key_symbol) {
case DIKS_ESCAPE:
mplayer_put_key('q');
@@ -1543,11 +1557,11 @@ static void flip_page(void)
#ifdef FLIPPING
if (!flipping) {
#endif
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
if (!memcpyBitBlt) {
#endif
DFBCHECK (primary->Blit(primary,frame,NULL,xoffset,yoffset));
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
} else {
int err,err2;
@@ -1631,7 +1645,7 @@ static void uninit(void)
// switch off BES
if (videolayer) videolayer->SetOpacity(videolayer,0);
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
if (verbose&&videolayer ) printf("DirectFB: Release videolayer\n");
if (videolayer) videolayer->Release(videolayer);
@@ -1642,83 +1656,117 @@ static void uninit(void)
if (verbose ) printf("DirectFB: Uninit done.\n");
}
-static int directfb_set_video_eq( const vidix_video_eq_t *info)
+static uint32_t directfb_set_video_eq(char *data, int value) //data==name
{
- if (videolayeractive) {
+
DFBColorAdjustment ca;
- float factor = (float)0xffff / 2000.0;
+ float factor = (float)0xffff / 200.0;
+ DFBDisplayLayerCapabilities caps;
+
+if (videolayer) {
+#if DIRECTFBVERSION > 912
+ DFBDisplayLayerDescription desc;
+ videolayer->GetDescription(videolayer,&desc);
+ caps = desc.caps;
+#else
+ videolayer->GetCapabilities(videolayer,&caps);
+#endif
ca.flags=DCAF_NONE;
- if ((videolayercaps.brightness)&&(info->cap&VEQ_CAP_BRIGHTNESS)) {
- ca.brightness = info->brightness * factor +0x8000;
+ if (! strcmp( data,"brightness" )) {
+ if (caps & DLCAPS_BRIGHTNESS) {
+ ca.brightness = value * factor +0x8000;
ca.flags |= DCAF_BRIGHTNESS;
- if (verbose) printf("DirectFB: SetVEq Brightness 0x%X %i\n",ca.brightness,info->brightness);
+ if (verbose) printf("DirectFB: SetVEq Brightness 0x%X %i\n",ca.brightness,value);
+ } else return VO_FALSE;
}
- if ((videolayercaps.contrast)&&(info->cap&VEQ_CAP_CONTRAST)) {
- ca.contrast = info->contrast * factor + 0x8000;
+ if (! strcmp( data,"contrast" )) {
+ if ((caps & DLCAPS_CONTRAST)) {
+ ca.contrast = value * factor + 0x8000;
ca.flags |= DCAF_CONTRAST;
- if (verbose) printf("DirectFB: SetVEq Contrast 0x%X %i\n",ca.contrast,info->contrast);
+ if (verbose) printf("DirectFB: SetVEq Contrast 0x%X %i\n",ca.contrast,value);
+ } else return VO_FALSE;
}
- if ((videolayercaps.hue)&&(info->cap&VEQ_CAP_HUE)) {
- ca.hue = info->hue * factor + 0x8000;
+ if (! strcmp( data,"hue" )) {
+ if ((caps & DLCAPS_HUE)) {
+ ca.hue = value * factor + 0x8000;
ca.flags |= DCAF_HUE;
- if (verbose) printf("DirectFB: SetVEq Hue 0x%X %i\n",ca.hue,info->hue);
+ if (verbose) printf("DirectFB: SetVEq Hue 0x%X %i\n",ca.hue,value);
+ } else return VO_FALSE;
}
- if ((videolayercaps.saturation)&&(info->cap&VEQ_CAP_SATURATION)) {
- ca.saturation = info->saturation * factor + 0x8000;
+ if (! strcmp( data,"saturation" )) {
+ if ((caps & DLCAPS_SATURATION)) {
+ ca.saturation = value * factor + 0x8000;
ca.flags |= DCAF_SATURATION;
- if (verbose) printf("DirectFB: SetVEq Saturation 0x%X %i\n",ca.saturation,info->saturation);
+ if (verbose) printf("DirectFB: SetVEq Saturation 0x%X %i\n",ca.saturation,value);
+ } else return VO_FALSE;
}
+ if (ca.flags != DCAF_NONE) {
videolayer->SetColorAdjustment(videolayer,&ca);
- };
- return 0;
+ return VO_TRUE;
+ }
+}
+
+ return VO_FALSE;
}
-static int directfb_get_video_eq( vidix_video_eq_t *info)
+static uint32_t directfb_get_video_eq(char *data, int *value) // data==name
{
- if (videolayeractive) {
+
DFBColorAdjustment ca;
- float factor = 2000.0 / (float)0xffff;
+ float factor = 200.0 / (float)0xffff;
+ DFBDisplayLayerCapabilities caps;
+
+if (videolayer) {
+#if DIRECTFBVERSION > 912
+ DFBDisplayLayerDescription desc;
+ videolayer->GetDescription(videolayer,&desc);
+ caps = desc.caps;
+#else
+ videolayer->GetCapabilities(videolayer,&caps);
+#endif
+
videolayer->GetColorAdjustment(videolayer,&ca);
- if ((videolayercaps.brightness)&&(ca.flags&DCAF_BRIGHTNESS)) {
- info->brightness = (ca.brightness-0x8000) * factor;
- info->cap |= VEQ_CAP_BRIGHTNESS;
- if (verbose) printf("DirectFB: GetVEq Brightness 0x%X %i\n",ca.brightness,info->brightness);
+ if (! strcmp( data,"brightness" )) {
+ if (caps & DLCAPS_BRIGHTNESS) {
+ *value = (int) ((ca.brightness-0x8000) * factor);
+ if (verbose) printf("DirectFB: GetVEq Brightness 0x%X %i\n",ca.brightness,*value);
+ return VO_TRUE;
+ } else return VO_FALSE;
}
- if ((videolayercaps.contrast)&&(ca.flags&DCAF_CONTRAST)) {
- info->contrast = (ca.contrast-0x8000) * factor;
- info->cap |= VEQ_CAP_CONTRAST;
- if (verbose) printf("DirectFB: GetVEq Contrast 0x%X %i\n",ca.contrast,info->contrast);
+ if (! strcmp( data,"contrast" )) {
+ if ((caps & DLCAPS_CONTRAST)) {
+ *value = (int) ((ca.contrast-0x8000) * factor);
+ if (verbose) printf("DirectFB: GetVEq Contrast 0x%X %i\n",ca.contrast,*value);
+ return VO_TRUE;
+ } else return VO_FALSE;
}
- if ((videolayercaps.hue)&&(ca.flags&DCAF_HUE)) {
- info->hue = (ca.hue-0x8000) * factor;
- info->cap |= VEQ_CAP_HUE;
- if (verbose) printf("DirectFB: GetVEq Hue 0x%X %i\n",ca.hue,info->hue);
+ if (! strcmp( data,"hue" )) {
+ if ((caps & DLCAPS_HUE)) {
+ *value = (int) ((ca.hue-0x8000) * factor);
+ if (verbose) printf("DirectFB: GetVEq Hue 0x%X %i\n",ca.hue,*value);
+ return VO_TRUE;
+ } else return VO_FALSE;
}
- if ((videolayercaps.saturation)&&(ca.flags&DCAF_SATURATION)) {
- info->saturation = (ca.saturation-0x8000) * factor;
- info->cap |= VEQ_CAP_SATURATION;
- if (verbose) printf("DirectFB: GetVEq Saturation 0x%X %i\n",ca.saturation,info->saturation);
+ if (! strcmp( data,"saturation" )) {
+ if ((caps & DLCAPS_SATURATION)) {
+ *value = (int) ((ca.saturation-0x8000) * factor);
+ if (verbose) printf("DirectFB: GetVEq Saturation 0x%X %i\n",ca.saturation,*value);
+ return VO_TRUE;
+ } else return VO_FALSE;
}
-
- };
- return 0;
}
-static void query_vaa(vo_vaa_t *vaa)
-{
- memset(vaa,0,sizeof(vo_vaa_t));
- vaa->get_video_eq = directfb_get_video_eq;
- vaa->set_video_eq = directfb_set_video_eq;
+ return VO_FALSE;
}
#ifdef DIRECTRENDER
@@ -1739,7 +1787,7 @@ static uint32_t get_image(mp_image_t *mpi){
// we're lucky or codec accepts stride => ok, let's go!
if(mpi->flags&MP_IMGFLAG_PLANAR){
-#ifdef HAVE_DIRECTFB099
+#if DIRECTFBVERSION > 908
err = frame->Lock(frame,DSLF_WRITE/*|DSLF_READ*/,&dst,&pitch);
// err = primary->Lock(primary,DSLF_WRITE,&dst,&pitch); // for real direct rendering
@@ -1795,9 +1843,28 @@ static uint32_t get_image(mp_image_t *mpi){
static uint32_t control(uint32_t request, void *data, ...)
{
switch (request) {
- case VOCTRL_QUERY_VAA:
- query_vaa((vo_vaa_t*)data);
- return VO_TRUE;
+ case VOCTRL_SET_EQUALIZER:
+ {
+ va_list ap;
+ int value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int);
+ va_end(ap);
+
+ return(directfb_set_video_eq(data, value));
+ }
+ case VOCTRL_GET_EQUALIZER:
+ {
+ va_list ap;
+ int *value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int*);
+ va_end(ap);
+
+ return(directfb_get_video_eq(data, value));
+ }
case VOCTRL_QUERY_FORMAT:
return query_format(*((uint32_t*)data));
#ifdef DIRECTRENDER