Ticket #2051: patch.bmovl

File patch.bmovl, 3.9 KB (added by ttsiodras@…, 14 years ago)

Patch sent to me from Nicolas George fixes the problem

Line 
1Index: libmpcodecs/vf_bmovl.c
2===================================================================
3--- libmpcodecs/vf_bmovl.c (révision 34553)
4+++ libmpcodecs/vf_bmovl.c (copie de travail)
5@@ -221,11 +221,13 @@
6 unsigned char red=0, green=0, blue=0;
7 int alpha;
8 mp_image_t* dmpi;
9+ static int halfw;
10
11+ /* get dmpi aligned as mpi */
12 dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP,
13- MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
14- mpi->w, mpi->h);
15-
16+ MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE ,
17+ mpi->w, mpi->height);
18+
19 memcpy_pic( dmpi->planes[0], mpi->planes[0], mpi->width, mpi->height, dmpi->stride[0], mpi->stride[0] );
20 memcpy_pic( dmpi->planes[1], mpi->planes[1], mpi->chroma_width, mpi->chroma_height, dmpi->stride[1], mpi->stride[1] );
21 memcpy_pic( dmpi->planes[2], mpi->planes[2], mpi->chroma_width, mpi->chroma_height, dmpi->stride[2], mpi->stride[2] );
22@@ -346,6 +348,7 @@
23 }
24 return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE);
25 }
26+ halfw = vf->priv->w/2;
27
28 for( buf_y=0 ; (buf_y < imgh) && (buf_y < (vf->priv->h-imgy)) ; buf_y++ ) {
29 for( buf_x=0 ; (buf_x < (imgw*pxsz)) && (buf_x < ((vf->priv->w+imgx)*pxsz)) ; buf_x += pxsz ) {
30@@ -389,7 +392,7 @@
31 vf->priv->bitmap.oa[pos] = alpha;
32 vf->priv->bitmap.a[pos] = INRANGE((alpha+imgalpha),0,255);
33 if((buf_y%2) && ((buf_x/pxsz)%2)) {
34- pos = ( ((buf_y+imgy)/2) * dmpi->stride[1] ) + (((buf_x/pxsz)+imgx)/2);
35+ pos = ( ((buf_y+imgy)/2) * halfw ) + (((buf_x/pxsz)+imgx)/2);
36 vf->priv->bitmap.u[pos] = rgb2u(red,green,blue);
37 vf->priv->bitmap.v[pos] = rgb2v(red,green,blue);
38 }
39@@ -421,34 +424,37 @@
40 } else { // Blit the bitmap to the videoscreen, pixel for pixel
41 for( ypos=vf->priv->y1 ; ypos < vf->priv->y2 ; ypos++ ) {
42 for ( xpos=vf->priv->x1 ; xpos < vf->priv->x2 ; xpos++ ) {
43+ int pos0 = (ypos * vf->priv->w) + xpos;
44 pos = (ypos * dmpi->stride[0]) + xpos;
45
46- alpha = vf->priv->bitmap.a[pos];
47+ alpha = vf->priv->bitmap.a[pos0];
48
49 if (alpha == 0) continue; // Completly transparent pixel
50
51 if (alpha == 255) { // Opaque pixel
52- dmpi->planes[0][pos] = vf->priv->bitmap.y[pos];
53+ dmpi->planes[0][pos] = vf->priv->bitmap.y[pos0];
54 if ((ypos%2) && (xpos%2)) {
55 pos = ( (ypos/2) * dmpi->stride[1] ) + (xpos/2);
56- dmpi->planes[1][pos] = vf->priv->bitmap.u[pos];
57- dmpi->planes[2][pos] = vf->priv->bitmap.v[pos];
58+ pos0 = ( (ypos/2) * halfw ) + (xpos/2);
59+ dmpi->planes[1][pos] = vf->priv->bitmap.u[pos0];
60+ dmpi->planes[2][pos] = vf->priv->bitmap.v[pos0];
61 }
62 } else { // Alphablended pixel
63 dmpi->planes[0][pos] =
64 ((255 - alpha) * (int)dmpi->planes[0][pos] +
65- alpha * (int)vf->priv->bitmap.y[pos]) >> 8;
66+ alpha * (int)vf->priv->bitmap.y[pos0]) >> 8;
67
68 if ((ypos%2) && (xpos%2)) {
69 pos = ( (ypos/2) * dmpi->stride[1] ) + (xpos/2);
70+ pos0 = ( (ypos/2) * halfw ) + (xpos/2);
71
72 dmpi->planes[1][pos] =
73 ((255 - alpha) * (int)dmpi->planes[1][pos] +
74- alpha * (int)vf->priv->bitmap.u[pos]) >> 8;
75+ alpha * (int)vf->priv->bitmap.u[pos0]) >> 8;
76
77 dmpi->planes[2][pos] =
78 ((255 - alpha) * (int)dmpi->planes[2][pos] +
79- alpha * (int)vf->priv->bitmap.v[pos]) >> 8;
80+ alpha * (int)vf->priv->bitmap.v[pos0]) >> 8;
81 }
82 }
83 } // for xpos
84Index: sub/sub.c
85===================================================================
86--- sub/sub.c (révision 34553)
87+++ sub/sub.c (copie de travail)
88@@ -157,8 +157,8 @@
89 obj->allocated = len;
90 free(obj->bitmap_buffer);
91 free(obj->alpha_buffer);
92- obj->bitmap_buffer = memalign(16, len);
93- obj->alpha_buffer = memalign(16, len);
94+ obj->bitmap_buffer = (len ? memalign(16, len) : NULL);
95+ obj->alpha_buffer = (len ? memalign(16, len) : NULL);
96 }
97 memset(obj->bitmap_buffer, sub_bg_color, len);
98 memset(obj->alpha_buffer, sub_bg_alpha, len);