summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/xine.h.in3
-rw-r--r--src/video_out/video_out_vdpau.c2
-rw-r--r--src/xine-engine/osd.c15
-rw-r--r--src/xine-engine/osd.h3
-rw-r--r--src/xine-engine/xine_interface.c5
5 files changed, 18 insertions, 10 deletions
diff --git a/include/xine.h.in b/include/xine.h.in
index 79db9024e..f66ed0d3e 100644
--- a/include/xine.h.in
+++ b/include/xine.h.in
@@ -2205,7 +2205,8 @@ void xine_osd_set_palette (xine_osd_t *self,
* set an argb buffer to be blended into video
* this is currently only supported with vdpau
*/
-void xine_osd_set_argb_buffer(xine_osd_t *self, uint32_t *argb_buffer) XINE_PROTECTED;
+void xine_osd_set_argb_buffer(xine_osd_t *self, uint32_t *argb_buffer,
+ int x, int y, int width, int height) XINE_PROTECTED;
/*
* close osd rendering engine
diff --git a/src/video_out/video_out_vdpau.c b/src/video_out/video_out_vdpau.c
index cbbed7c68..645ff7301 100644
--- a/src/video_out/video_out_vdpau.c
+++ b/src/video_out/video_out_vdpau.c
@@ -299,8 +299,8 @@ static int vdpau_process_argb_ovl( vdpau_driver_t *this_gen, vo_overlay_t *overl
uint32_t pitch = this->argb_overlay_width*4;
VdpRect dest = { 0, overlay->y, this->argb_overlay_width, overlay->y + overlay->height };
printf("Update ARGB: %d, %d - %dx%d\n", dest.x0, dest.y0, dest.x1, dest.y1);
- printf("buf offset: %d\n", overlay->y*this->argb_overlay_width);
uint32_t *buffer_start = overlay->argb_buffer + overlay->y*this->argb_overlay_width;
+ printf("buf offset: %d, %p -> %p\n", overlay->y*this->argb_overlay_width, overlay->argb_buffer, buffer_start);
VdpStatus st = vdp_output_surface_put_bits( this->argb_overlay, (void*)&(buffer_start), &pitch, &dest );
if ( st != VDP_STATUS_OK ) {
printf( "vdpau_process_argb_ovl: vdp_output_surface_put_bits_native failed : %s\n", vdp_get_error_string(st) );
diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c
index 0bc1574ca..4b521e539 100644
--- a/src/xine-engine/osd.c
+++ b/src/xine-engine/osd.c
@@ -1542,13 +1542,18 @@ static void osd_draw_bitmap(osd_object_t *osd, uint8_t *bitmap,
}
}
-static void osd_set_argb_buffer(osd_object_t *osd, uint32_t *argb_buffer)
+static void osd_set_argb_buffer(osd_object_t *osd, uint32_t *argb_buffer,
+ int x, int y, int width, int height)
{
osd->argb_buffer = argb_buffer;
- osd->x2 = osd->width;
- osd->x1 = 0;
- osd->y2 = osd->height;
- osd->y1 = 0;
+ if(osd->x1 == 0 || x < osd->x1)
+ osd->x1 = x;
+ if(osd->x2 == 0 || (x + width) > osd->x2)
+ osd->x2 = x + width;
+ if(osd->y1 == 0 || y < osd->y1)
+ osd->y1 = y;
+ if(osd->y2 == 0 || (y + height) > osd->y2)
+ osd->y2 = y + height;
}
static uint32_t osd_get_capabilities (osd_object_t *osd) {
diff --git a/src/xine-engine/osd.h b/src/xine-engine/osd.h
index ed3118a05..a6acc11ab 100644
--- a/src/xine-engine/osd.h
+++ b/src/xine-engine/osd.h
@@ -221,7 +221,8 @@ struct osd_renderer_s {
/*
* set a buffer to an argb buffer
*/
- void (*set_argb_buffer) (osd_object_t *osd, uint32_t *argb_buffer);
+ void (*set_argb_buffer) (osd_object_t *osd, uint32_t *argb_buffer,
+ int x, int y, int width, int height);
/* private stuff */
diff --git a/src/xine-engine/xine_interface.c b/src/xine-engine/xine_interface.c
index 1f6175a06..4f59785a1 100644
--- a/src/xine-engine/xine_interface.c
+++ b/src/xine-engine/xine_interface.c
@@ -855,8 +855,9 @@ void xine_osd_draw_bitmap(xine_osd_t *this, uint8_t *bitmap,
this->osd.renderer->draw_bitmap(&this->osd, bitmap, x1, y1, width, height, palette_map);
}
-void xine_osd_set_argb_buffer(xine_osd_t *this, uint32_t *argb_buffer) {
- this->osd.renderer->set_argb_buffer(&this->osd, argb_buffer);
+void xine_osd_set_argb_buffer(xine_osd_t *this, uint32_t *argb_buffer,
+ int x, int y, int width, int height) {
+ this->osd.renderer->set_argb_buffer(&this->osd, argb_buffer, x, y, width, height);
}