[PATCH 2/2] spudec: Increase image data alignment to 16 bytes.

Reimar Döffinger <[email protected]>
Newsgroups gmane.comp.video.mplayer.devel
Message-ID <[email protected]>
Allows using SSE2 aligned loads on the data.
Switch to av_malloc and av_freep as well, so
it also works if native malloc has a smaller
default alignment.
---
 sub/spudec.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/sub/spudec.c b/sub/spudec.c
index a272e5bdc..a392a1294 100644
--- a/sub/spudec.c
+++ b/sub/spudec.c
@@ -148,7 +148,7 @@ static packet_t *spudec_dequeue_packet(spudec_handle_t *this)

 static void spudec_free_packet(packet_t *packet)
 {
-  free(packet->packet);
+  av_freep(&packet->packet);
   free(packet);
 }

@@ -228,19 +228,19 @@ static int spudec_alloc_image(spudec_handle_t *this, int stride, int height)
   this->height = height;
   if (this->image_size < this->stride * this->height) {
     if (this->image != NULL) {
-      free(this->image);
+      av_freep(&this->image);
       this->image = NULL;
-      free(this->pal_image);
+      av_freep(&this->pal_image);
       this->pal_image = NULL;
       this->image_size = 0;
       this->pal_width = this->pal_height  = 0;
     }
-    this->image = malloc(2 * this->stride * this->height);
+    this->image = av_malloc(2 * this->stride * this->height);
     if (this->image) {
       this->image_size = this->stride * this->height;
       this->aimage = this->image + this->image_size;
       // use stride here as well to simplify reallocation checks
-      this->pal_image = malloc(this->stride * this->height);
+      this->pal_image = av_malloc(this->stride * this->height);
     }
   }
   return this->image != NULL;
@@ -279,7 +279,7 @@ static int apply_palette_crop(spudec_handle_t *this,
   int i;
   uint8_t *src;
   uint16_t pal[4];
-  unsigned stride = (crop_w + 7) & ~7;
+  unsigned stride = (crop_w + 15) & ~15;
   int ret = 1;
   if (crop_x > this->pal_width || crop_y > this->pal_height ||
       crop_w > this->pal_width - crop_x || crop_h > this->pal_width - crop_y ||
@@ -530,7 +530,7 @@ static void spudec_process_control(spudec_handle_t *this, int pts100)
 	start_col = a >> 12;
 	end_col = a & 0xfff;
 	width = (end_col < start_col) ? 0 : end_col - start_col + 1;
-	stride = (width + 7) & ~7; /* Kludge: draw_alpha needs width multiple of 8 */
+	stride = (width + 15) & ~15; /* Kludge: draw_alpha needs width multiple of 16 */
 	start_row = b >> 12;
 	end_row = b & 0xfff;
 	height = (end_row < start_row) ? 0 : end_row - start_row /* + 1 */;
@@ -577,7 +577,7 @@ static void spudec_process_control(spudec_handle_t *this, int pts100)
 	packet->alpha[i] = this->alpha[i];
 	packet->palette[i] = this->palette[i];
       }
-      packet->packet = malloc(this->packet_size);
+      packet->packet = av_malloc(this->packet_size);
       memcpy(packet->packet, this->packet, this->packet_size);
       spudec_queue_packet(this, packet);
     }
@@ -698,7 +698,7 @@ void spudec_heartbeat(void *this, unsigned int pts100)
     spu->start_pts = packet->start_pts;
     spu->end_pts = packet->end_pts;
     if (packet->is_decoded) {
-      free(spu->image);
+      av_freep(&spu->image);
       spu->image_size = packet->data_len;
       spu->image      = packet->packet;
       spu->aimage     = packet->packet + packet->stride * packet->height;
@@ -928,14 +928,14 @@ void spudec_draw_scaled(void *me, unsigned int dxs, unsigned int dys, void (*dra
 	spu->scaled_start_row = spu->start_row * scaley / 0x100;
 	spu->scaled_width = spu->width * scalex / 0x100;
 	spu->scaled_height = spu->height * scaley / 0x100;
-	/* Kludge: draw_alpha needs width multiple of 8 */
-	spu->scaled_stride = (spu->scaled_width + 7) & ~7;
+	/* Kludge: draw_alpha needs width multiple of 16 */
+	spu->scaled_stride = (spu->scaled_width + 15) & ~15;
 	if (spu->scaled_image_size < spu->scaled_stride * spu->scaled_height) {
 	  if (spu->scaled_image) {
-	    free(spu->scaled_image);
+	    av_freep(&spu->scaled_image);
 	    spu->scaled_image_size = 0;
 	  }
-	  spu->scaled_image = malloc(2 * spu->scaled_stride * spu->scaled_height);
+	  spu->scaled_image = av_malloc(2 * spu->scaled_stride * spu->scaled_height);
 	  if (spu->scaled_image) {
 	    spu->scaled_image_size = spu->scaled_stride * spu->scaled_height;
 	    spu->scaled_aimage = spu->scaled_image + spu->scaled_image_size;
@@ -1347,12 +1347,12 @@ void spudec_free(void *this)
       spudec_free_packet(spudec_dequeue_packet(spu));
     free(spu->packet);
     spu->packet = NULL;
-    free(spu->scaled_image);
+    av_freep(&spu->scaled_image);
     spu->scaled_image = NULL;
-    free(spu->image);
+    av_freep(&spu->image);
     spu->image = NULL;
     spu->aimage = NULL;
-    free(spu->pal_image);
+    av_freep(&spu->pal_image);
     spu->pal_image = NULL;
     spu->image_size = 0;
     spu->pal_width = spu->pal_height  = 0;
@@ -1374,7 +1374,7 @@ void spudec_set_hw_spu(void *this, const vo_functions_t *hw_spu)
 packet_t *spudec_packet_create(int x, int y, int w, int h)
 {
   packet_t *packet;
-  int stride = (w + 7) & ~7;
+  int stride = (w + 15) & ~15;
   if ((unsigned)w >= 0x8000 || (unsigned)h > 0x4000)
     return NULL;
   packet = calloc(1, sizeof(packet_t));
@@ -1386,7 +1386,7 @@ packet_t *spudec_packet_create(int x, int y, int w, int h)
   packet->start_row = y;
   packet->data_len = 2 * stride * h;
   if (packet->data_len) { // size 0 is a special "clear" packet
-    packet->packet = malloc(packet->data_len);
+    packet->packet = av_malloc(packet->data_len);
     if (!packet->packet) {
       free(packet);
       packet = NULL;
--
2.20.1

_______________________________________________
MPlayer-dev-eng mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.