| 1 | Index: 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
|
|---|
| 84 | Index: 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);
|
|---|