From 43243f669e5e6aff88bd8dce3167eb37e645941f Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 12 Apr 2012 16:57:40 +0300 Subject: Make OSD blend buffers 16-byte aligned --- src/xine-engine/alphablend.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'src') 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); -- cgit v1.2.3