summaryrefslogtreecommitdiff
path: root/src/xine-engine/osd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-engine/osd.c')
-rw-r--r--src/xine-engine/osd.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c
index 70213606a..4e16f06e6 100644
--- a/src/xine-engine/osd.c
+++ b/src/xine-engine/osd.c
@@ -48,6 +48,8 @@
#define LOG
*/
+#define XINE_ENGINE_INTERNAL
+
#include "xine_internal.h"
#include "video_out/alphablend.h"
#include "xine-engine/bswap.h"
@@ -173,14 +175,20 @@ static osd_object_t *osd_new_object (osd_renderer_t *this, int width, int height
static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) {
osd_renderer_t *this = osd->renderer;
+ video_overlay_manager_t *ovl_manager;
rle_elem_t rle, *rle_p=0;
int x, y, spare;
uint8_t *c;
lprintf("osd=%p vpts=%lld\n", osd, vpts);
+
+ this->stream->xine->port_ticket->acquire(this->stream->xine->port_ticket, 1);
+
+ ovl_manager = this->stream->video_out->get_overlay_manager(this->stream->video_out);
if( osd->handle < 0 ) {
- if( (osd->handle = this->video_overlay->get_handle(this->video_overlay,0)) == -1 ) {
+ if( (osd->handle = ovl_manager->get_handle(ovl_manager, 0)) == -1 ) {
+ this->stream->xine->port_ticket->release(this->stream->xine->port_ticket, 1);
return 0;
}
}
@@ -258,10 +266,12 @@ static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) {
this->event.event_type = OVERLAY_EVENT_SHOW;
this->event.vpts = vpts;
- this->video_overlay->add_event(this->video_overlay,(void *)&this->event);
+ ovl_manager->add_event(ovl_manager, (void *)&this->event);
}
pthread_mutex_unlock (&this->osd_mutex);
+ this->stream->xine->port_ticket->release(this->stream->xine->port_ticket, 1);
+
return 1;
}
@@ -286,6 +296,7 @@ static int osd_show_unscaled (osd_object_t *osd, int64_t vpts) {
static int osd_hide (osd_object_t *osd, int64_t vpts) {
osd_renderer_t *this = osd->renderer;
+ video_overlay_manager_t *ovl_manager;
lprintf("osd=%p vpts=%lld\n",osd, vpts);
@@ -301,7 +312,11 @@ static int osd_hide (osd_object_t *osd, int64_t vpts) {
this->event.event_type = OVERLAY_EVENT_HIDE;
this->event.vpts = vpts;
- this->video_overlay->add_event(this->video_overlay,(void *)&this->event);
+
+ this->stream->xine->port_ticket->acquire(this->stream->xine->port_ticket, 1);
+ ovl_manager = this->stream->video_out->get_overlay_manager(this->stream->video_out);
+ ovl_manager->add_event(ovl_manager, (void *)&this->event);
+ this->stream->xine->port_ticket->release(this->stream->xine->port_ticket, 1);
pthread_mutex_unlock (&this->osd_mutex);
@@ -1211,6 +1226,7 @@ static void osd_preload_fonts (osd_renderer_t *this, char *path) {
static void osd_free_object (osd_object_t *osd_to_close) {
osd_renderer_t *this = osd_to_close->renderer;
+ video_overlay_manager_t *ovl_manager;
osd_object_t *osd, *last;
if( osd_to_close->handle >= 0 ) {
@@ -1222,8 +1238,12 @@ static void osd_free_object (osd_object_t *osd_to_close) {
memset( this->event.object.overlay, 0, sizeof(this->event.object.overlay) );
this->event.event_type = OVERLAY_EVENT_FREE_HANDLE;
this->event.vpts = 0;
- this->video_overlay->add_event(this->video_overlay,(void *)&this->event);
-
+
+ this->stream->xine->port_ticket->acquire(this->stream->xine->port_ticket, 1);
+ ovl_manager = this->stream->video_out->get_overlay_manager(this->stream->video_out);
+ ovl_manager->add_event(ovl_manager, (void *)&this->event);
+ this->stream->xine->port_ticket->release(this->stream->xine->port_ticket, 1);
+
osd_to_close->handle = -1; /* handle will be freed */
}
@@ -1314,9 +1334,11 @@ static uint32_t osd_get_capabilities (osd_object_t *osd) {
capabilities |= XINE_OSD_CAP_FREETYPE2;
#endif
+ this->stream->xine->port_ticket->acquire(this->stream->xine->port_ticket, 0);
if( this->stream->video_out->get_capabilities(this->stream->video_out) &
VO_CAP_UNSCALED_OVERLAY)
capabilities |= XINE_OSD_CAP_UNSCALED;
+ this->stream->xine->port_ticket->release(this->stream->xine->port_ticket, 0);
return capabilities;
}
@@ -1326,13 +1348,12 @@ static uint32_t osd_get_capabilities (osd_object_t *osd) {
* initialize the osd rendering engine
*/
-osd_renderer_t *_x_osd_renderer_init( video_overlay_manager_t *video_overlay, xine_stream_t *stream ) {
+osd_renderer_t *_x_osd_renderer_init( xine_stream_t *stream ) {
osd_renderer_t *this;
char str[1024];
this = xine_xmalloc(sizeof(osd_renderer_t));
- this->video_overlay = video_overlay;
this->stream = stream;
this->event.object.overlay = xine_xmalloc( sizeof(vo_overlay_t) );