diff options
-rw-r--r-- | include/xine.h.in | 3 | ||||
-rw-r--r-- | src/video_out/video_out_vdpau.c | 2 | ||||
-rw-r--r-- | src/xine-engine/osd.c | 15 | ||||
-rw-r--r-- | src/xine-engine/osd.h | 3 | ||||
-rw-r--r-- | src/xine-engine/xine_interface.c | 5 |
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); } |