summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/xine-engine/alphablend.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/xine-engine/alphablend.c b/src/xine-engine/alphablend.c
index 1c26d46a0..34c3f3c67 100644
--- a/src/xine-engine/alphablend.c
+++ b/src/xine-engine/alphablend.c
@@ -1114,7 +1114,10 @@ static uint8_t *(*blend_yuv_grow_extra_data(alphablend_t *extra_data, int osd_wi
uint8_t *data[ 3 ][ 2 ];
} *header = (struct header_s *)extra_data->buffer;
- size_t needed_buffer_size = sizeof (*header) + osd_width * sizeof (uint8_t[ 3 ][ 2 ]);
+ /* align buffers to 16 bytes */
+ size_t header_size = (sizeof(*header) + 15) & (~15);
+ size_t alloc_width = (osd_width + 15) & (~15);
+ size_t needed_buffer_size = 16 + header_size + alloc_width * sizeof (uint8_t[ 3 ][ 2 ]);
if (extra_data->buffer_size < needed_buffer_size) {
@@ -1133,12 +1136,12 @@ static uint8_t *(*blend_yuv_grow_extra_data(alphablend_t *extra_data, int osd_wi
header->id = ME_FOURCC('y', 'u', 'v', 0);
header->max_width = osd_width;
- header->data[ 0 ][ 0 ] = ((uint8_t *)extra_data->buffer) + sizeof (*header);
- header->data[ 0 ][ 1 ] = header->data[ 0 ][ 0 ] + osd_width;
- header->data[ 1 ][ 0 ] = header->data[ 0 ][ 1 ] + osd_width;
- header->data[ 1 ][ 1 ] = header->data[ 1 ][ 0 ] + osd_width;
- header->data[ 2 ][ 0 ] = header->data[ 1 ][ 1 ] + osd_width;
- header->data[ 2 ][ 1 ] = header->data[ 2 ][ 0 ] + osd_width;
+ header->data[ 0 ][ 0 ] = ((uint8_t *)extra_data->buffer) + header_size;
+ header->data[ 0 ][ 1 ] = header->data[ 0 ][ 0 ] + alloc_width;
+ header->data[ 1 ][ 0 ] = header->data[ 0 ][ 1 ] + alloc_width;
+ header->data[ 1 ][ 1 ] = header->data[ 1 ][ 0 ] + alloc_width;
+ header->data[ 2 ][ 0 ] = header->data[ 1 ][ 1 ] + alloc_width;
+ header->data[ 2 ][ 1 ] = header->data[ 2 ][ 0 ] + alloc_width;
}
return &(header->data);
@@ -1556,7 +1559,10 @@ static uint8_t *(*blend_yuy2_grow_extra_data(alphablend_t *extra_data, int osd_w
uint8_t *data[ 3 ];
} *header = (struct header_s *)extra_data->buffer;
- size_t needed_buffer_size = sizeof (*header) + osd_width * sizeof (uint8_t[ 3 ]);
+ /* align buffers to 16 bytes */
+ size_t header_size = (sizeof(*header) + 15) & (~15);
+ size_t alloc_width = (osd_width + 15) & (~15);
+ size_t needed_buffer_size = 16 + header_size + alloc_width * sizeof (uint8_t[ 3 ]);
if (extra_data->buffer_size < needed_buffer_size) {
@@ -1575,9 +1581,9 @@ static uint8_t *(*blend_yuy2_grow_extra_data(alphablend_t *extra_data, int osd_w
header->id = ME_FOURCC('y', 'u', 'y', '2');
header->max_width = osd_width;
- header->data[ 0 ] = ((uint8_t *)extra_data->buffer) + sizeof (*header);
- header->data[ 1 ] = header->data[ 0 ] + osd_width;
- header->data[ 2 ] = header->data[ 1 ] + osd_width;
+ header->data[ 0 ] = ((uint8_t *)extra_data->buffer) + header_size;
+ header->data[ 1 ] = header->data[ 0 ] + alloc_width;
+ header->data[ 2 ] = header->data[ 1 ] + alloc_width;
}
return &(header->data);