summaryrefslogtreecommitdiff
path: root/src/xine-engine/video_overlay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-engine/video_overlay.c')
-rw-r--r--src/xine-engine/video_overlay.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c
index 04a3034a3..44080c469 100644
--- a/src/xine-engine/video_overlay.c
+++ b/src/xine-engine/video_overlay.c
@@ -15,10 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- * $Id: video_overlay.c,v 1.41 2006/09/26 00:28:14 dgp85 Exp $
- *
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*/
#include <stdlib.h>
@@ -28,11 +25,11 @@
#include <sys/stat.h>
#include <fcntl.h>
-#include "buffer.h"
-#include "xine_internal.h"
+#include <xine/buffer.h>
+#include <xine/xine_internal.h>
#include "bswap.h"
-#include "xineutils.h"
-#include "video_overlay.h"
+#include <xine/xineutils.h>
+#include <xine/video_overlay.h>
/*
#define LOG_DEBUG
@@ -49,10 +46,10 @@ typedef struct video_overlay_showing_s {
typedef struct video_overlay_s {
- xine_t *xine;
-
video_overlay_manager_t video_overlay;
+ xine_t *xine;
+
pthread_mutex_t events_mutex;
video_overlay_events_t events[MAX_EVENTS];
pthread_mutex_t objects_mutex;
@@ -288,10 +285,18 @@ static int32_t video_overlay_add_event(video_overlay_manager_t *this_gen, void
}
if( event->object.overlay ) {
+ int i;
+ for(i = 0; i < OVL_PALETTE_SIZE; i++) {
+ if(event->object.overlay->trans[i] >= OVL_MAX_OPACITY)
+ event->object.overlay->trans[i] = OVL_MAX_OPACITY;
+ if(event->object.overlay->hili_trans[i] >= OVL_MAX_OPACITY)
+ event->object.overlay->hili_trans[i] = OVL_MAX_OPACITY;
+ }
+
this->events[new_event].event->object.overlay = xine_xmalloc (sizeof(vo_overlay_t));
xine_fast_memcpy(this->events[new_event].event->object.overlay,
event->object.overlay, sizeof(vo_overlay_t));
-
+
/* We took the callers rle and data, therefore it will be our job to free it */
/* clear callers overlay so it will not be freed twice */
memset(event->object.overlay,0,sizeof(vo_overlay_t));
@@ -387,6 +392,8 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) {
#endif
/* free any overlay associated with this event */
if (this->events[this_event].event->object.overlay != NULL) {
+ if( this->events[this_event].event->object.overlay->rle != NULL )
+ free( this->events[this_event].event->object.overlay->rle );
free(this->events[this_event].event->object.overlay);
this->events[this_event].event->object.overlay = NULL;
}
@@ -398,9 +405,11 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) {
printf ("video_overlay: FREE SPU NOW\n");
#endif
/* free any overlay associated with this event */
- if (this->events[this_event].event->object.overlay != NULL) {
+ if( this->events[this_event].event->object.overlay != NULL) {
+ if( this->events[this_event].event->object.overlay->rle != NULL )
+ free( this->events[this_event].event->object.overlay->rle );
free(this->events[this_event].event->object.overlay);
- this->events[this_event].event->object.overlay = NULL;
+ this->events[this_event].event->object.overlay = NULL;
}
/* this avoid removing this_event from the queue
* (it will be removed at the end of this loop) */